Changeset: 4c25f517a2d8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4c25f517a2d8
Modified Files:
sql/backends/monet5/sql_user.c
sql/server/sql_privileges.c
Branch: Nov2019
Log Message:
When deleting a privileged user, look for users created by him and delete them
recursively
diffs (135 lines):
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
@@ -203,7 +203,6 @@ monet5_create_privileges(ptr _mvc, sql_s
{
sql_table *t, *uinfo;
mvc *m = (mvc *) _mvc;
- char *err = NULL;
sqlid schema_id = 0;
str monetdbuser = "monetdb";
list *res, *ops;
@@ -215,7 +214,6 @@ monet5_create_privileges(ptr _mvc, sql_s
mvc_create_column_(m, t, "default_schema", "int", 9);
uinfo = t;
- (void) err;
res = sa_list(m->sa);
list_append(res, sql_create_arg(m->sa, "name", sql_bind_subtype(m->sa,
"varchar", 2048, 0), ARG_OUT));
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
@@ -805,10 +805,15 @@ sql_create_user(mvc *sql, char *user, ch
return NULL;
}
-char *
-sql_drop_user(mvc *sql, char *user)
+static int
+id_cmp(sqlid *id1, sqlid *id2)
{
- sqlid user_id = sql_find_auth(sql, user);
+ return *id1 == *id2;
+}
+
+static char *
+sql_drop_granted_users(mvc *sql, sqlid user_id, char *user, list
*deleted_users)
+{
sql_schema *ss = mvc_bind_schema(sql, "sys");
sql_table *privs = mvc_bind_table(sql, ss, "privileges");
sql_table *user_roles = mvc_bind_table(sql, ss, "user_role");
@@ -817,33 +822,70 @@ sql_drop_user(mvc *sql, char *user)
rids *A;
oid rid;
- if (mvc_check_dependency(sql, user_id, OWNER_DEPENDENCY, NULL))
- throw(SQL,"sql.drop_user",SQLSTATE(M1M05) "DROP USER: '%s' owns
a schema", user);
- if (backend_drop_user(sql, user) == FALSE)
- throw(SQL,"sql.drop_user",SQLSTATE(M0M27) "%s", sql->errstr);
+ if (!list_find(deleted_users, &user_id, (fcmp) &id_cmp)) {
+ if (mvc_check_dependency(sql, user_id, OWNER_DEPENDENCY, NULL))
+ throw(SQL,"sql.drop_user",SQLSTATE(M1M05) "DROP USER:
'%s' owns a schema", user);
+ if (backend_drop_user(sql, user) == FALSE)
+ throw(SQL,"sql.drop_user",SQLSTATE(M0M27) "%s",
sql->errstr);
+
+ /* select privileges of this user_id */
+ A = table_funcs.rids_select(tr, find_sql_column(privs,
"auth_id"), &user_id, &user_id, NULL);
+ /* remove them */
+ for(rid = table_funcs.rids_next(A); !is_oid_nil(rid); rid =
table_funcs.rids_next(A))
+ table_funcs.table_delete(tr, privs, rid);
+ table_funcs.rids_destroy(A);
- /* select privileges of this user_id */
- A = table_funcs.rids_select(tr, find_sql_column(privs, "auth_id"),
&user_id, &user_id, NULL);
- /* remove them */
- for(rid = table_funcs.rids_next(A); !is_oid_nil(rid); rid =
table_funcs.rids_next(A))
- table_funcs.table_delete(tr, privs, rid);
- table_funcs.rids_destroy(A);
+ /* select privileges granted by this user_id */
+ A = table_funcs.rids_select(tr, find_sql_column(privs,
"grantor"), &user_id, &user_id, NULL);
+ /* remove them */
+ for(rid = table_funcs.rids_next(A); !is_oid_nil(rid); rid =
table_funcs.rids_next(A))
+ table_funcs.table_delete(tr, privs, rid);
+ table_funcs.rids_destroy(A);
+
+ /* delete entry from auths table */
+ rid = table_funcs.column_find_row(tr, find_sql_column(auths,
"name"), user, NULL);
+ if (is_oid_nil(rid))
+ throw(SQL, "sql.drop_user", SQLSTATE(0P000) "DROP USER:
no such user role '%s'", user);
+ table_funcs.table_delete(tr, auths, rid);
- /* delete entry from auths table */
- rid = table_funcs.column_find_row(tr, find_sql_column(auths, "name"),
user, NULL);
- if (is_oid_nil(rid))
- throw(SQL, "sql.drop_user", SQLSTATE(0P000) "DROP USER: no such
user role '%s'", user);
- table_funcs.table_delete(tr, auths, rid);
+ /* select user roles of this user_id */
+ A = table_funcs.rids_select(tr, find_sql_column(user_roles,
"login_id"), &user_id, &user_id, NULL);
+ /* remove them */
+ for(rid = table_funcs.rids_next(A); !is_oid_nil(rid); rid =
table_funcs.rids_next(A))
+ table_funcs.table_delete(tr, user_roles, rid);
+ table_funcs.rids_destroy(A);
+
+ list_append(deleted_users, &user_id);
+
+ /* select users created by this user_id */
+ A = table_funcs.rids_select(tr, find_sql_column(auths,
"grantor"), &user_id, &user_id, NULL);
+ /* remove them and continue the deletion */
+ for(rid = table_funcs.rids_next(A); !is_oid_nil(rid); rid =
table_funcs.rids_next(A)) {
+ sqlid nuid = *(sqlid*)table_funcs.column_find_value(tr,
find_sql_column(auths, "id"), rid);
+ char* nname = table_funcs.column_find_value(tr,
find_sql_column(auths, "name"), rid);
- /* select user roles of this user_id */
- A = table_funcs.rids_select(tr, find_sql_column(user_roles,
"login_id"), &user_id, &user_id, NULL);
- /* remove them */
- for(rid = table_funcs.rids_next(A); !is_oid_nil(rid); rid =
table_funcs.rids_next(A))
- table_funcs.table_delete(tr, user_roles, rid);
- table_funcs.rids_destroy(A);
+ sql_drop_granted_users(sql, nuid, nname, deleted_users);
+ table_funcs.table_delete(tr, auths, rid);
+ }
+ table_funcs.rids_destroy(A);
+ }
+ return NULL;
+}
- tr->schema_updates++;
- return NULL;
+char *
+sql_drop_user(mvc *sql, char *user)
+{
+ sqlid user_id = sql_find_auth(sql, user);
+ list *deleted = list_create(NULL);
+ str msg = NULL;
+
+ if (!deleted)
+ throw(SQL, "sql.drop_user", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ msg = sql_drop_granted_users(sql, user_id, user, deleted);
+ list_destroy(deleted);
+
+ sql->session->tr->schema_updates++;
+ return msg;
}
char *
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list