Changeset: f0c84cb94a0e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f0c84cb94a0e
Modified Files:
        sql/server/rel_updates.c
        sql/server/sql_privileges.c
Branch: Oct2020
Log Message:

fixed handling of PRIV_ROLE_ADMIN


diffs (72 lines):

diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -898,7 +898,7 @@ rel_update(mvc *sql, sql_rel *t, sql_rel
 sql_exp *
 update_check_column(mvc *sql, sql_table *t, sql_column *c, sql_exp *v, sql_rel 
*r, char *cname, const char *action)
 {
-       if (!table_privs(sql, t, PRIV_UPDATE) && !sql_privilege(sql, 
sql->user_id, c->base.id, PRIV_UPDATE))
+       if (!table_privs(sql, t, PRIV_UPDATE) && sql_privilege(sql, 
sql->user_id, c->base.id, PRIV_UPDATE) < 0)
                return sql_error(sql, 02, SQLSTATE(42000) "%s: insufficient 
privileges for user '%s' to update table '%s' on column '%s'", action, 
sqlvar_get_string(find_global_var(sql, mvc_bind_schema(sql, "sys"), 
"current_user")), t->base.name, cname);
        if (!v || (v = exp_check_type(sql, &c->type, r, v, type_equal)) == NULL)
                return NULL;
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
@@ -119,7 +119,7 @@ sql_grant_global_privs( mvc *sql, char *
        if (grantee_id <= 0)
                throw(SQL,"sql.grant_global",SQLSTATE(01007) "GRANT: User/role 
'%s' unknown", grantee);
        /* first check if privilege isn't already given */
-       if ((sql_privilege(sql, grantee_id, GLOBAL_OBJID, privs)))
+       if ((sql_privilege(sql, grantee_id, GLOBAL_OBJID, privs) >= 0))
                throw(SQL,"sql.grant_global",SQLSTATE(01007) "GRANT: User/role 
'%s' already has this privilege", grantee);
        sql_insert_priv(sql, grantee_id, GLOBAL_OBJID, privs, grantor, grant);
        tr->schema_updates++;
@@ -168,13 +168,13 @@ sql_grant_table_privs( mvc *sql, char *g
                throw(SQL,"sql.grant_table", SQLSTATE(01007) "GRANT: User/role 
'%s' unknown", grantee);
        /* first check if privilege isn't already given */
        if ((privs == all &&
-           (sql_privilege(sql, grantee_id, t->base.id, PRIV_SELECT) ||
-            sql_privilege(sql, grantee_id, t->base.id, PRIV_UPDATE) ||
-            sql_privilege(sql, grantee_id, t->base.id, PRIV_INSERT) ||
-            sql_privilege(sql, grantee_id, t->base.id, PRIV_DELETE) ||
-            sql_privilege(sql, grantee_id, t->base.id, PRIV_TRUNCATE))) ||
-           (privs != all && !c && sql_privilege(sql, grantee_id, t->base.id, 
privs)) ||
-           (privs != all && c && sql_privilege(sql, grantee_id, c->base.id, 
privs))) {
+           (sql_privilege(sql, grantee_id, t->base.id, PRIV_SELECT) >= 0 ||
+            sql_privilege(sql, grantee_id, t->base.id, PRIV_UPDATE) >= 0 ||
+            sql_privilege(sql, grantee_id, t->base.id, PRIV_INSERT) >= 0 ||
+            sql_privilege(sql, grantee_id, t->base.id, PRIV_DELETE) >= 0 ||
+            sql_privilege(sql, grantee_id, t->base.id, PRIV_TRUNCATE) >= 0)) ||
+           (privs != all && !c && sql_privilege(sql, grantee_id, t->base.id, 
privs) >= 0) ||
+           (privs != all && c && sql_privilege(sql, grantee_id, c->base.id, 
privs) >= 0)) {
                throw(SQL, "sql.grant", SQLSTATE(01007) "GRANT: User/role '%s' 
already has this privilege", grantee);
        }
        if (privs == all) {
@@ -215,7 +215,7 @@ sql_grant_func_privs( mvc *sql, char *gr
        if (grantee_id <= 0)
                throw(SQL, "sql.grant_func", SQLSTATE(01007) "GRANT: User/role 
'%s' unknown", grantee);
        /* first check if privilege isn't already given */
-       if (sql_privilege(sql, grantee_id, f->base.id, privs))
+       if (sql_privilege(sql, grantee_id, f->base.id, privs) >= 0)
                throw(SQL,"sql.grant", SQLSTATE(01007) "GRANT: User/role '%s' 
already has this privilege", grantee);
        sql_insert_priv(sql, grantee_id, f->base.id, privs, grantor, grant);
        tr->schema_updates++;
@@ -428,7 +428,7 @@ int
 sql_privilege(mvc *m, sqlid auth_id, sqlid obj_id, int priv)
 {
        oid rid = sql_privilege_rid(m, auth_id, obj_id, priv);
-       int res = 0;
+       int res = -1;
 
        if (!is_oid_nil(rid)) {
                /* found priv */
@@ -513,7 +513,7 @@ role_granting_privs(mvc *m, oid role_rid
        owner_id = table_funcs.column_find_sqlid(m->session->tr, auths_grantor, 
role_rid);
        if (owner_id == grantor_id)
                return true;
-       if (sql_privilege(m, grantor_id, role_id, PRIV_ROLE_ADMIN))
+       if (sql_privilege(m, grantor_id, role_id, PRIV_ROLE_ADMIN) == 
PRIV_ROLE_ADMIN)
                return true;
        /* check for grant rights in the privs table */
        return false;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to