Changeset: 485057f6d7bf for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=485057f6d7bf
Modified Files:
        sql/backends/monet5/sql.c
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/rel_sequence.c
        sql/server/sql_privileges.c
        sql/server/sql_privileges.h
Branch: default
Log Message:

schema privileges are now also available for the sysadmin role
So a user with the sysadmin role can create schema's etc


diffs (truncated from 329 to 300 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
@@ -396,7 +396,7 @@ create_table_or_view(mvc *sql, char *sna
        if (mvc_bind_table(sql, s, t->base.name)) {
                char *cd = (temp == SQL_DECLARED_TABLE) ? "DECLARE" : "CREATE";
                return sql_message("42S01!%s TABLE: name '%s' already in use", 
cd, t->base.name);
-       } else if (temp != SQL_DECLARED_TABLE && (!schema_privs(sql->role_id, 
s) && !(isTempSchema(s) && temp == SQL_LOCAL_TEMP))) {
+       } else if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) && 
!(isTempSchema(s) && temp == SQL_LOCAL_TEMP))) {
                return sql_message("42000!CREATE TABLE: insufficient privileges 
for user '%s' in schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
        } else if (temp == SQL_DECLARED_TABLE && !list_empty(t->keys.set)) {
                return sql_message("42000!DECLARE TABLE: '%s' cannot have 
constraints", t->base.name);
@@ -503,7 +503,7 @@ alter_table(mvc *sql, char *sname, sql_t
        if ((nt = mvc_bind_table(sql, s, t->base.name)) == NULL) {
                return sql_message("42S02!ALTER TABLE: no such table '%s'", 
t->base.name);
 
-       } else if (!schema_privs(sql->role_id, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)) {
+       } else if (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)) {
                return sql_message("42000!ALTER TABLE: insufficient privileges 
for user '%s' in schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
        }
 
@@ -616,7 +616,7 @@ drop_table(mvc *sql, char *sname, char *
                return sql_message("42000!DROP TABLE: cannot drop VIEW '%s'", 
tname);
        } else if (t->system) {
                return sql_message("42000!DROP TABLE: cannot drop system table 
'%s'", tname);
-       } else if (!schema_privs(sql->role_id, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)) {
+       } else if (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)) {
                return sql_message("42000!DROP TABLE: access denied for %s to 
schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
        }
        if (!drop_action && t->keys.set) {
@@ -661,7 +661,7 @@ drop_view(mvc *sql, char *sname, char *t
 
        t = mvc_bind_table(sql, ss, tname);
 
-       if (!schema_privs(sql->role_id, ss) && !(isTempSchema(ss) && t && 
t->persistence == SQL_LOCAL_TEMP)) {
+       if (!mvc_schema_privs(sql, ss) && !(isTempSchema(ss) && t && 
t->persistence == SQL_LOCAL_TEMP)) {
                return sql_message("42000!DROP VIEW: access denied for %s to 
schema '%s'", stack_get_string(sql, "current_user"), ss->base.name);
        } else if (!t) {
                return sql_message("42S02!DROP VIEW: unknown view '%s'", tname);
@@ -708,7 +708,7 @@ drop_index(mvc *sql, char *sname, char *
        i = mvc_bind_idx(sql, s, iname);
        if (!i) {
                return sql_message("42S12!DROP INDEX: no such index '%s'", 
iname);
-       } else if (!schema_privs(sql->role_id, s)) {
+       } else if (!mvc_schema_privs(sql, s)) {
                return sql_message("42000!DROP INDEX: access denied for %s to 
schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
        } else {
                mvc_drop_idx(sql, s, i);
@@ -727,7 +727,7 @@ create_seq(mvc *sql, char *sname, sql_se
                s = cur_schema(sql);
        if (find_sql_sequence(s, seq->base.name)) {
                return sql_message("42000!CREATE SEQUENCE: name '%s' already in 
use", seq->base.name);
-       } else if (!schema_privs(sql->role_id, s)) {
+       } else if (!mvc_schema_privs(sql, s)) {
                return sql_message("42000!CREATE SEQUENCE: insufficient 
privileges for '%s' in schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
        }
        sql_trans_create_sequence(sql->session->tr, s, seq->base.name, 
seq->start, seq->minvalue, seq->maxvalue, seq->increment, seq->cacheinc, 
seq->cycle, seq->bedropped);
@@ -746,7 +746,7 @@ alter_seq(mvc *sql, char *sname, sql_seq
                s = cur_schema(sql);
        if (!(nseq = find_sql_sequence(s, seq->base.name))) {
                return sql_message("42000!ALTER SEQUENCE: no such sequence 
'%s'", seq->base.name);
-       } else if (!schema_privs(sql->role_id, s)) {
+       } else if (!mvc_schema_privs(sql, s)) {
                return sql_message("42000!ALTER SEQUENCE: insufficient 
privileges for '%s' in schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
        }
 
@@ -769,7 +769,7 @@ drop_seq(mvc *sql, char *sname, char *na
                s = cur_schema(sql);
        if (!(seq = find_sql_sequence(s, name))) {
                return sql_message("42M35!DROP SEQUENCE: no such sequence 
'%s'", name);
-       } else if (!schema_privs(sql->role_id, s)) {
+       } else if (!mvc_schema_privs(sql, s)) {
                return sql_message("42000!DROP SEQUENCE: insufficient 
privileges for '%s' in schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
        }
        if (mvc_check_dependency(sql, seq->base.id, BEDROPPED_DEPENDENCY, NULL))
@@ -799,7 +799,7 @@ drop_func(mvc *sql, char *sname, char *n
                if (n) {
                        sql_func *func = n->data;
 
-                       if (!schema_privs(sql->role_id, s)) {
+                       if (!mvc_schema_privs(sql, s)) {
                                return sql_message("DROP %s%s: access denied 
for %s to schema ;'%s'", KF, F, stack_get_string(sql, "current_user"), 
s->base.name);
                        }
                        if (!action && mvc_check_dependency(sql, func->base.id, 
!IS_PROC(func) ? FUNC_DEPENDENCY : PROC_DEPENDENCY, NULL))
@@ -811,7 +811,7 @@ drop_func(mvc *sql, char *sname, char *n
                node *n = NULL;
                list *list_func = schema_bind_func(sql, s, name, type);
 
-               if (!schema_privs(sql->role_id, s)) {
+               if (!mvc_schema_privs(sql, s)) {
                        list_destroy(list_func);
                        return sql_message("DROP %s%s: access denied for %s to 
schema ;'%s'", KF, F, stack_get_string(sql, "current_user"), s->base.name);
                }
@@ -962,7 +962,7 @@ create_trigger(mvc *sql, char *sname, ch
                return sql_message("3F000!CREATE TRIGGER: no such schema '%s'", 
sname);
        if (!s)
                s = cur_schema(sql);
-       if (!schema_privs(sql->role_id, s))
+       if (!mvc_schema_privs(sql, s))
                return sql_message("3F000!CREATE TRIGGER: access denied for %s 
to schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
        if (mvc_bind_trigger(sql, s, triggername) != NULL)
                return sql_message("3F000!CREATE TRIGGER: name '%s' already in 
use", triggername);
@@ -1012,7 +1012,7 @@ drop_trigger(mvc *sql, char *sname, char
        if (!s)
                s = cur_schema(sql);
        assert(s);
-       if (!schema_privs(sql->role_id, s))
+       if (!mvc_schema_privs(sql, s))
                return sql_message("3F000!DROP TRIGGER: access denied for %s to 
schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
 
        if ((tri = mvc_bind_trigger(sql, s, tname)) == NULL)
@@ -1197,7 +1197,7 @@ SQLcatalog(Client cntxt, MalBlkPtr mb, M
 
                if (!s) {
                        msg = sql_message("3F000!DROP SCHEMA: name %s does not 
exist", sname);
-               } else if (!schema_privs(sql->role_id, s)) {
+               } else if (!mvc_schema_privs(sql, s)) {
                        msg = sql_message("42000!DROP SCHEMA: access denied for 
%s to schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
                } else if (s == cur_schema(sql)) {
                        msg = sql_message("42000!DROP SCHEMA: cannot drop 
current schema");
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -727,7 +727,7 @@ rel_create_func(mvc *sql, dlist *qname, 
                }
        } else {
                list_destroy(type_list);
-               if (create && !schema_privs(sql->role_id, s)) {
+               if (create && !mvc_schema_privs(sql, s)) {
                        return sql_error(sql, 02, "CREATE %s%s: insufficient 
privileges "
                                        "for user '%s' in schema '%s'", KF, F,
                                        stack_get_string(sql, "current_user"), 
s->base.name);
@@ -1032,7 +1032,7 @@ create_trigger(mvc *sql, dlist *qname, i
                                new_name = n;
                }
        }
-       if (create && !schema_privs(sql->role_id, ss)) 
+       if (create && !mvc_schema_privs(sql, ss)) 
                return sql_error(sql, 02, "CREATE TRIGGER: access denied for %s 
to schema ;'%s'", stack_get_string(sql, "current_user"), ss->base.name);
        if (create && mvc_bind_trigger(sql, ss, tname) != NULL) 
                return sql_error(sql, 02, "CREATE TRIGGER: name '%s' already in 
use", tname);
@@ -1092,7 +1092,7 @@ drop_trigger(mvc *sql, dlist *qname)
        char *tname = qname_table(qname);
        sql_schema *ss = cur_schema(sql);
 
-       if (!schema_privs(sql->role_id, ss)) 
+       if (!mvc_schema_privs(sql, ss)) 
                return sql_error(sql, 02, "DROP TRIGGER: access denied for %s 
to schema ;'%s'", stack_get_string(sql, "current_user"), ss->base.name);
        return rel_drop_trigger(sql, ss->base.name, tname);
 }
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -857,7 +857,7 @@ rel_create_table(mvc *sql, sql_schema *s
        if (mvc_bind_table(sql, s, name)) {
                char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE";
                return sql_error(sql, 02, "42S01!%s TABLE: name '%s' already in 
use", cd, name);
-       } else if (temp != SQL_DECLARED_TABLE && (!schema_privs(sql->role_id, 
s) && !(isTempSchema(s) && temp == SQL_LOCAL_TEMP))){
+       } else if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) && 
!(isTempSchema(s) && temp == SQL_LOCAL_TEMP))){
                return sql_error(sql, 02, "42000!CREATE TABLE: insufficient 
privileges for user '%s' in schema '%s'", stack_get_string(sql, 
"current_user"), s->base.name);
        } else if (table_elements_or_subquery->token == SQL_CREATE_TABLE) { 
                /* table element list */
@@ -928,7 +928,7 @@ rel_create_view(mvc *sql, sql_schema *ss
 
        if (create && mvc_bind_table(sql, s, name) != NULL) {
                return sql_error(sql, 02, "42S01!CREATE VIEW: name '%s' already 
in use", name);
-       } else if (create && (!schema_privs(sql->role_id, s) && 
!(isTempSchema(s) && persistent == SQL_LOCAL_TEMP))) {
+       } else if (create && (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && 
persistent == SQL_LOCAL_TEMP))) {
                return sql_error(sql, 02, "42000!CREATE VIEW: access denied for 
%s to schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
        } else if (query) {
                sql_rel *sq = NULL;
diff --git a/sql/server/rel_sequence.c b/sql/server/rel_sequence.c
--- a/sql/server/rel_sequence.c
+++ b/sql/server/rel_sequence.c
@@ -93,7 +93,7 @@ rel_create_seq(
                return sql_error(sql, 02,
                                "CREATE SEQUENCE: "
                                "name '%s' already in use", name);
-       } else if (!schema_privs(sql->role_id, s)) {
+       } else if (!mvc_schema_privs(sql, s)) {
                return sql_error(sql, 02,
                                "CREATE SEQUENCE: insufficient privileges "
                                "for '%s' in schema '%s'", 
stack_get_string(sql, "current_user"), s->base.name);
@@ -223,7 +223,7 @@ rel_alter_seq(
                                "ALTER SEQUENCE: "
                                "no such sequence '%s'", name);
        }
-       if (!schema_privs(sql->role_id, s)) {
+       if (!mvc_schema_privs(sql, s)) {
                return sql_error(sql, 02,
                                "ALTER SEQUENCE: insufficient privileges "
                                "for '%s' in schema '%s'", 
stack_get_string(sql, "current_user"), s->base.name);
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
@@ -66,21 +66,37 @@ sql_insert_all_privs(mvc *sql, int auth_
 static int
 admin_privs(int grantor)
 {
-       if (grantor == USER_MONETDB) {
+       if (grantor == USER_MONETDB || grantor == ROLE_SYSADMIN) {
                return 1;
        }
        return 0;
 }
 
 int
+mvc_schema_privs(mvc *m, sql_schema *s)
+{
+       if (admin_privs(m->user_id) || admin_privs(m->role_id)) 
+               return 1;
+       if (!s)
+               return 0;
+       if (m->user_id == s->auth_id || m->role_id == s->auth_id) 
+               return 1;
+       return 0;
+}
+
+static int
 schema_privs(int grantor, sql_schema *s)
 {
-       if (admin_privs(grantor) || grantor == s->auth_id) {
+       if (admin_privs(grantor)) 
                return 1;
-       }
+       if (!s)
+               return 0;
+       if (grantor == s->auth_id) 
+               return 1;
        return 0;
 }
 
+
 char *
 sql_grant_global_privs( mvc *sql, char *grantee, int privs, int grant, int 
grantor)
 {
@@ -288,7 +304,7 @@ sql_create_role(mvc *m, str auth, int gr
        sql_table *auths = find_sql_table(sys, "auths");
        sql_column *auth_name = find_sql_column(auths, "name");
 
-       if (grantor != USER_MONETDB) 
+       if (admin_privs(grantor)) 
                return sql_message("0P000!CREATE ROLE: insufficient privileges 
to create role '%s'", auth);
 
        if (table_funcs.column_find_row(m->session->tr, auth_name, auth, NULL) 
!= oid_nil)
@@ -345,7 +361,7 @@ sql_privilege(mvc *m, int auth_id, int o
 int
 global_privs(mvc *m, int priv)
 {
-       if (m->user_id == USER_MONETDB || 
+       if (admin_privs(m->user_id) || admin_privs(m->role_id) ||
            sql_privilege(m, m->user_id, GLOBAL_OBJID, priv, 0) == priv || 
            sql_privilege(m, m->role_id, GLOBAL_OBJID, priv, 0) == priv || 
            sql_privilege(m, ROLE_PUBLIC, GLOBAL_OBJID, priv, 0) == priv) {
@@ -360,7 +376,7 @@ table_privs(mvc *m, sql_table *t, int pr
        /* temporary tables are owned by the session user */
        if (t->persistence != SQL_PERSIST || t->commit_action)
                return 1;
-       if (m->user_id == USER_MONETDB || m->user_id == t->s->auth_id || 
m->role_id == t->s->auth_id || sql_privilege(m, m->user_id, t->base.id, priv, 
0) == priv || sql_privilege(m, m->role_id, t->base.id, priv, 0) == priv || 
sql_privilege(m, ROLE_PUBLIC, t->base.id, priv, 0) == priv) {
+       if (admin_privs(m->user_id) || admin_privs(m->role_id) || m->user_id == 
t->s->auth_id || m->role_id == t->s->auth_id || sql_privilege(m, m->user_id, 
t->base.id, priv, 0) == priv || sql_privilege(m, m->role_id, t->base.id, priv, 
0) == priv || sql_privilege(m, ROLE_PUBLIC, t->base.id, priv, 0) == priv) {
                return 1;
        }
        return 0;
@@ -407,7 +423,7 @@ sql_grant_role(mvc *m, str grantee, str 
        auth_id = *(int*)val; 
        _DELETE(val);
 
-       if (grantor != USER_MONETDB && !role_granting_privs(m, rid, auth_id, 
grantor)) 
+       if (!admin_privs(grantor) && !role_granting_privs(m, rid, auth_id, 
grantor)) 
                return sql_message("0P000!GRANT: insufficient privileges to 
grant ROLE '%s'", auth);
        rid = table_funcs.column_find_row(m->session->tr, auths_name, grantee, 
NULL);
        if (rid == oid_nil)
@@ -455,7 +471,7 @@ sql_revoke_role(mvc *m, str grantee, str
        val = table_funcs.column_find_value(m->session->tr, auths_id, rid);
        auth_id = *(int*)val; 
        _DELETE(val);
-       if (grantor != USER_MONETDB && !role_granting_privs(m, rid, auth_id, 
grantor)) 
+       if (!admin_privs(grantor) && !role_granting_privs(m, rid, auth_id, 
grantor)) 
                return sql_message("0P000!GRANT: insufficient privileges to 
grant ROLE '%s'", auth);
 
        if (!admin) { 
@@ -558,7 +574,7 @@ sql_grantable_(mvc *m, int grantorid, in
 int
 sql_grantable(mvc *m, int grantorid, int obj_id, int privs, int sub)
 {
-       if (m->user_id == USER_MONETDB)
+       if (admin_privs(m->user_id) || admin_privs(m->role_id))
                return 1;
        return sql_grantable_(m, grantorid, obj_id, privs, sub);
 }
@@ -626,7 +642,7 @@ sql_create_user(mvc *sql, char *user, ch
        char *err; 
        int schema_id = 0;
 
-       if (sql->user_id != USER_MONETDB) 
+       if (!admin_privs(sql->user_id) && !admin_privs(sql->role_id)) 
                return sql_message("42M31!CREATE USER: insufficient privileges 
to create user '%s'", user);
 
        if (backend_find_user(sql, user) >= 0) {
@@ -679,7 +695,7 @@ sql_alter_user(mvc *sql, char *user, cha
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to