Changeset: e53eac684d11 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e53eac684d11
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_user.c
        sql/common/sql_backend.c
        sql/common/sql_backend.h
        sql/server/sql_privileges.c
        sql/server/sql_privileges.h
Branch: userprofile
Log Message:

extend db_user_info with default_role


diffs (241 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -5999,7 +5999,7 @@ static mel_func sql_init_funcs[] = {
  pattern("sqlcatalog", "revoke", SQLrevoke, false, "Catalog operation revoke", 
args(0,7, 
arg("sname",str),arg("tbl",str),arg("grantee",str),arg("privs",int),arg("cname",str),arg("grant",int),arg("grantor",int))),
  pattern("sqlcatalog", "grant_function", SQLgrant_function, false, "Catalog 
operation grant_function", args(0,6, 
arg("sname",str),arg("fcnid",int),arg("grantee",str),arg("privs",int),arg("grant",int),arg("grantor",int))),
  pattern("sqlcatalog", "revoke_function", SQLrevoke_function, false, "Catalog 
operation revoke_function", args(0,6, 
arg("sname",str),arg("fcnid",int),arg("grantee",str),arg("privs",int),arg("grant",int),arg("grantor",int))),
- pattern("sqlcatalog", "create_user", SQLcreate_user, false, "Catalog 
operation create_user", args(0,10, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("fullname",str),
 arg("max_memory", lng), arg("max_workers", int), arg("wlc", bit), 
arg("optimizer", str))),
+ pattern("sqlcatalog", "create_user", SQLcreate_user, false, "Catalog 
operation create_user", args(0,11, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("fullname",str),
 arg("max_memory", lng), arg("max_workers", int), arg("wlc", bit), 
arg("optimizer", str), arg("default_role", str))),
  pattern("sqlcatalog", "drop_user", SQLdrop_user, false, "Catalog operation 
drop_user", args(0,2, arg("sname",str),arg("action",int))),
  pattern("sqlcatalog", "drop_user", SQLdrop_user, false, "Catalog operation 
drop_user", args(0,3, arg("sname",str),arg("auth",str),arg("action",int))),
  pattern("sqlcatalog", "alter_user", SQLalter_user, false, "Catalog operation 
alter_user", args(0,6, 
arg("sname",str),arg("passwrd",str),arg("enc",int),arg("schema",str),arg("schemapath",str),arg("oldpasswrd",str))),
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -1746,10 +1746,11 @@ SQLcreate_user(Client cntxt, MalBlkPtr m
        int max_workers = *getArgReference_int(stk, pci, 8);
        bool wlc = *getArgReference_bit(stk, pci, 9);
        char *optimizer = SaveArgReference(stk, pci, 10);
+       char *default_role = SaveArgReference(stk, pci, 11);
 
        initcontext();
        msg = sql_create_user(sql, sname, passwd, enc, fullname, schema, 
schema_path, max_memory, max_workers, wlc,
-                       optimizer);
+                       optimizer, default_role);
        return msg;
 }
 
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -23,6 +23,24 @@
 #include "mal_authorize.h"
 #include "mcrypt.h"
 
+
+static int
+monet5_find_role(ptr _mvc, str role, sqlid *role_id)
+{
+       mvc *m = (mvc *) _mvc;
+       sql_trans *tr = m->session->tr;
+       sqlstore *store = m->session->tr->store;
+       sql_schema *sys = find_sql_schema(tr, "sys");
+       sql_table *auths = find_sql_table(tr, sys, "auths");
+       sql_column *auth_name = find_sql_column(auths, "name");
+       oid rid = store->table_api.column_find_row(tr, auth_name, role, NULL);
+       if (is_oid_nil(rid))
+               return -1;
+       *role_id = store->table_api.column_find_sqlid(m->session->tr, 
find_sql_column(auths, "id"), rid);
+       return 1;
+}
+
+
 static int
 monet5_drop_user(ptr _mvc, str user)
 {
@@ -143,7 +161,7 @@ parse_schema_path_str(mvc *m, str schema
 }
 
 static str
-monet5_create_user(ptr _mvc, str user, str passwd, char enc, str fullname, 
sqlid schema_id, str schema_path, sqlid grantorid, lng max_memory, int 
max_workers, bool wlc, str optimizer)
+monet5_create_user(ptr _mvc, str user, str passwd, char enc, str fullname, 
sqlid schema_id, str schema_path, sqlid grantorid, lng max_memory, int 
max_workers, bool wlc, str optimizer, sqlid role_id)
 {
        mvc *m = (mvc *) _mvc;
        oid uid = 0;
@@ -170,7 +188,8 @@ monet5_create_user(ptr _mvc, str user, s
        }
 
        user_id = store_next_oid(m->session->tr->store);
-       if ((log_res = store->table_api.table_insert(m->session->tr, 
db_user_info, &user, &fullname, &schema_id, &schema_path, &max_memory, 
&max_workers, &wlc, &optimizer))) {
+       sqlid default_role_id = role_id > 0 ? role_id : user_id;
+       if ((log_res = store->table_api.table_insert(m->session->tr, 
db_user_info, &user, &fullname, &schema_id, &schema_path, &max_memory, 
&max_workers, &wlc, &optimizer, &default_role_id))) {
                if (!enc)
                        free(pwd);
                throw(SQL, "sql.create_user", SQLSTATE(42000) "Create user 
failed%s", log_res == LOG_CONFLICT ? " due to conflict with another 
transaction" : "");
@@ -295,6 +314,7 @@ monet5_create_privileges(ptr _mvc, sql_s
        mvc_create_column_(&col, m, t, "max_workers", "int", 9);
        mvc_create_column_(&col, m, t, "wlc", "boolean", 1);
        mvc_create_column_(&col, m, t, "optimizer", "varchar", 1024);
+       mvc_create_column_(&col, m, t, "default_role", "int", 9);
        uinfo = t;
 
        res = sa_list(m->sa);
@@ -307,6 +327,7 @@ monet5_create_privileges(ptr _mvc, sql_s
        mvc_create_func(&f, m, NULL, s, "db_users", ops, res, F_UNION, 
FUNC_LANG_MAL, "sql", "db_users", "CREATE FUNCTION db_users () RETURNS TABLE( 
name varchar(2048)) EXTERNAL NAME sql.db_users;", FALSE, FALSE, TRUE, FALSE);
        if (f)
                f->instantiated = TRUE;
+       // TODO include all new columns
        t = mvc_init_create_view(m, s, "users",
                            "create view sys.users as select u.\"name\" as 
\"name\", "
                            "ui.\"fullname\", ui.\"default_schema\", "
@@ -326,6 +347,7 @@ monet5_create_privileges(ptr _mvc, sql_s
        mvc_create_column_(&col, m, t, "max_workers", "int", 9);
        mvc_create_column_(&col, m, t, "wlc", "boolean", 1);
        mvc_create_column_(&col, m, t, "optimizer", "varchar", 1024);
+       mvc_create_column_(&col, m, t, "default_role", "int", 9);
 
        sys = find_sql_schema(m->session->tr, "sys");
        schema_id = sys->base.id;
@@ -340,10 +362,11 @@ monet5_create_privileges(ptr _mvc, sql_s
        lng max_memory = 0;
        int max_workers = 0;
        bool wlc = true;
+       sqlid default_role_id = USER_MONETDB;
 
 
        store->table_api.table_insert(m->session->tr, uinfo, &username, 
&fullname, &schema_id, &schema_path, &max_memory, &max_workers,
-                       &wlc, &optimizer);
+                       &wlc, &optimizer, &default_role_id);
 }
 
 static int
@@ -567,6 +590,7 @@ monet5_user_init(backend_functions *be_f
        be_funcs->fcuser = &monet5_create_user;
        be_funcs->fduser = &monet5_drop_user;
        be_funcs->ffuser = &monet5_find_user;
+       be_funcs->ffrole = &monet5_find_role;
        be_funcs->fcrpriv = &monet5_create_privileges;
        be_funcs->fshuser = &monet5_schema_has_user;
        be_funcs->fauser = &monet5_alter_user;
@@ -728,3 +752,4 @@ monet5_user_set_def_schema(mvc *m, oid u
        }
        return res;
 }
+
diff --git a/sql/common/sql_backend.c b/sql/common/sql_backend.c
--- a/sql/common/sql_backend.c
+++ b/sql/common/sql_backend.c
@@ -35,11 +35,11 @@ backend_freecode(const char *mod, int cl
 }
 
 char *
-backend_create_user(ptr mvc, char *user, char *passwd, char enc, char 
*fullname, sqlid defschemid, char *schema_path, sqlid grantor, lng max_memory, 
int max_workers, bool wlc, char *optimizer)
+backend_create_user(ptr mvc, char *user, char *passwd, char enc, char 
*fullname, sqlid defschemid, char *schema_path, sqlid grantor, lng max_memory, 
int max_workers, bool wlc, char *optimizer, sqlid role_id)
 {
        if (be_funcs.fcuser != NULL)
                return(be_funcs.fcuser(mvc, user, passwd, enc, fullname, 
defschemid, schema_path, grantor, max_memory,
-                                       max_workers, wlc, optimizer));
+                                       max_workers, wlc, optimizer, role_id));
        return(NULL);
 }
 
@@ -114,3 +114,11 @@ backend_has_module(ptr M, char *name)
                return be_funcs.fhas_module_function(M, name);
        return 0;
 }
+
+int
+backend_find_role(ptr mvc, char *name, sqlid *role_id)
+{
+       if (be_funcs.ffrole != NULL)
+               return be_funcs.ffrole(mvc, name, role_id);
+       return 0;
+}
diff --git a/sql/common/sql_backend.h b/sql/common/sql_backend.h
--- a/sql/common/sql_backend.h
+++ b/sql/common/sql_backend.h
@@ -15,7 +15,7 @@
 
 typedef void (*freecode_fptr) (const char *mod, int clientid, const char 
*name);
 
-typedef char *(*create_user_fptr) (ptr mvc, char *user, char *passwd, char 
enc, char *fullname, sqlid schema_id, char *schema_path, sqlid grantor_id, lng 
max_memory, int max_workers, bool wlc, str optimizer);
+typedef char *(*create_user_fptr) (ptr mvc, char *user, char *passwd, char 
enc, char *fullname, sqlid schema_id, char *schema_path, sqlid grantor_id, lng 
max_memory, int max_workers, bool wlc, str optimizer, sqlid role_id);
 typedef int  (*drop_user_fptr) (ptr mvc, char *user);
 typedef int  (*find_user_fptr) (ptr mvc, char *user);
 typedef void (*create_privileges_fptr) (ptr mvc, sql_schema *s);
@@ -27,6 +27,7 @@ typedef void  (*create_function) (ptr mv
 typedef int  (*resolve_function) (ptr mvc, sql_func *f, const char *fimp, bool 
*side_effect);
 typedef int  (*has_module_function) (ptr mvc, char *name);
 typedef void *(*create_sub_backend) (void *mvc, void *client);
+typedef int  (*find_role_fptr) (ptr mvc, char *role, sqlid *role_id);
 
 /* backing struct for this interface */
 typedef struct _backend_functions {
@@ -34,6 +35,7 @@ typedef struct _backend_functions {
        create_user_fptr fcuser;
        drop_user_fptr fduser;
        find_user_fptr ffuser;
+       find_role_fptr ffrole;
        create_privileges_fptr fcrpriv;
        schema_has_user_fptr fshuser;
        alter_user_fptr fauser;
@@ -46,7 +48,7 @@ typedef struct _backend_functions {
 
 extern void backend_freecode(const char *mod, int clientid, const char *name);
 
-extern char *backend_create_user(ptr mvc, char *user, char *passwd, char enc, 
char *fullname, sqlid defschemid, char *schema_path, sqlid grantor, lng 
max_memory, int max_workers, bool wlc, char *optimizer);
+extern char *backend_create_user(ptr mvc, char *user, char *passwd, char enc, 
char *fullname, sqlid defschemid, char *schema_path, sqlid grantor, lng 
max_memory, int max_workers, bool wlc, char *optimizer, sqlid role_id);
 extern int  backend_drop_user(ptr mvc, char *user);
 extern int  backend_find_user(ptr mp, char *user);
 extern void backend_create_privileges(ptr mvc, sql_schema *s);
@@ -56,6 +58,7 @@ extern int    backend_rename_user(ptr mvc, 
 extern void*   backend_schema_user_dependencies(ptr trans, sqlid schema_id);
 extern int     backend_resolve_function(ptr trans, sql_func *f, const char 
*fimp, bool *side_effect);
 extern int     backend_has_module(ptr M, char *name);
+extern int  backend_find_role(ptr mp, char *role, sqlid *role_id);
 
 extern backend_functions be_funcs;
 
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -775,11 +775,16 @@ mvc_set_schema(mvc *m, char *schema)
 }
 
 char *
-sql_create_user(mvc *sql, char *user, char *passwd, char enc, char *fullname, 
char *schema, char *schema_path, lng max_memory, int max_workers, bool wlc, 
char *optimizer)
+sql_create_user(mvc *sql, char *user, char *passwd, char enc, char *fullname, 
char *schema, char *schema_path, lng max_memory, int max_workers, bool wlc, 
char *optimizer, char *role)
 {
        char *err;
        sql_schema *s = NULL;
        sqlid schema_id = 0;
+       sqlid role_id = 0;
+
+       if (role)
+               if (backend_find_role(sql, role, &role_id) < 0)
+                       throw(SQL,"sql.create_user", SQLSTATE(42M31) "CREATE 
USER: no such role '%s'", role);
 
        if (!admin_privs(sql->user_id) && !admin_privs(sql->role_id))
                throw(SQL,"sql.create_user", SQLSTATE(42M31) "Insufficient 
privileges to create user '%s'", user);
@@ -796,7 +801,7 @@ sql_create_user(mvc *sql, char *user, ch
                throw(SQL, "sql.create_user", SQLSTATE(HY013) MAL_MALLOC_FAIL);
 
        if ((err = backend_create_user(sql, user, passwd, enc, fullname, 
schema_id, schema_path, sql->user_id, max_memory,
-                                       max_workers, wlc, optimizer)) != NULL)
+                                       max_workers, wlc, optimizer, role_id)) 
!= NULL)
        {
                /* strip off MAL exception decorations */
                char *r;
diff --git a/sql/server/sql_privileges.h b/sql/server/sql_privileges.h
--- a/sql/server/sql_privileges.h
+++ b/sql/server/sql_privileges.h
@@ -40,7 +40,7 @@ extern char *sql_revoke_role(mvc *m, str
 extern int sql_create_privileges(mvc *m, sql_schema *s);
 extern int sql_schema_has_user(mvc *m, sql_schema *s);
 
-extern char * sql_create_user(mvc *sql, char *user, char *passwd, char enc, 
char *fullname, char *schema, char *schema_path, lng max_memory, int 
max_workers, bool wlc, char *optimizer);
+extern char * sql_create_user(mvc *sql, char *user, char *passwd, char enc, 
char *fullname, char *schema, char *schema_path, lng max_memory, int 
max_workers, bool wlc, char *optimizer, char *default_role);
 extern char * sql_drop_user(mvc *sql, char *user);
 extern char * sql_alter_user(mvc *sql, char *user, char *passwd, char enc, 
char *schema, char *schema_path, char *oldpasswd);
 extern char * sql_rename_user(mvc *sql, char *olduser, char *newuser);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to