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]