Changeset: d2a165a9daa7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d2a165a9daa7
Modified Files:
monetdb5/mal/mal_authorize.c
monetdb5/mal/mal_authorize.h
sql/backends/monet5/sql_user.c
sql/common/sql_backend.c
sql/common/sql_backend.h
sql/server/sql_mvc.c
sql/server/sql_privileges.c
sql/server/sql_privileges.h
Branch: userprofile
Log Message:
callback maze
diffs (216 lines):
diff --git a/monetdb5/mal/mal_authorize.c b/monetdb5/mal/mal_authorize.c
--- a/monetdb5/mal/mal_authorize.c
+++ b/monetdb5/mal/mal_authorize.c
@@ -47,6 +47,9 @@ static BAT *rt_deleted = NULL;
/* yep, the vault key is just stored in memory */
static str vaultKey = NULL;
static str master_password = NULL;
+static AUTHCallbackCntx authCallbackCntx = {
+ .get_user_password = NULL,
+};
void AUTHreset(void)
{
@@ -1261,3 +1264,10 @@ AUTHdeleteRemoteTableCredentials(const c
AUTHcommit();
return(MAL_SUCCEED);
}
+
+str
+AUTHRegisterGetPasswordHandler(get_user_password_handler callback)
+{
+ authCallbackCntx.get_user_password = callback;
+ return MAL_SUCCEED;
+}
diff --git a/monetdb5/mal/mal_authorize.h b/monetdb5/mal/mal_authorize.h
--- a/monetdb5/mal/mal_authorize.h
+++ b/monetdb5/mal/mal_authorize.h
@@ -41,9 +41,17 @@ mal_export str AUTHdeleteRemoteTableCred
* (the vault) by supplying the master password which is the key for the
* cypher algorithm used to store the data. The BAT will never
* contain the plain hashes, as they will be decyphered on the fly when
- * needed. A locked vault means noone can log into the system, hence, the
+ * needed. A locked vault means none can log into the system, hence, the
* vault needs to be unlocked as part of the server startup ritual.
*/
mal_export str AUTHunlockVault(const char *password);
+typedef str (*get_user_password_handler)(void *mvc, str user);
+
+typedef struct AUTHCallbackCntx {
+ get_user_password_handler get_user_password;
+} AUTHCallbackCntx;
+
+mal_export str AUTHRegisterGetPasswordHandler(get_user_password_handler
callback);
+
#endif /* _MAL_AUTHORIZE_H */
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
@@ -24,6 +24,47 @@
#include "mcrypt.h"
+static inline sql_table*
+getUsersTbl(mvc *m)
+{
+ sql_trans *tr = m->session->tr;
+ sql_schema *sys = find_sql_schema(tr, "sys");
+ return find_sql_table(tr, sys, "db_user_info");
+}
+
+
+static oid
+getUserOIDByName(mvc *m, str user)
+{
+ sql_trans *tr = m->session->tr;
+ sqlstore *store = m->session->tr->store;
+ sql_table *users = getUsersTbl(m);
+ return store->table_api.column_find_row(tr, find_sql_column(users,
"name"), user, NULL);
+}
+
+
+static str
+getPasswordHash(ptr _mvc, str user)
+{
+ mvc *m = (mvc *) _mvc;
+ sql_trans *tr = m->session->tr;
+ sqlstore *store = m->session->tr->store;
+ sql_table *users = getUsersTbl(m);
+ oid rid = getUserOIDByName(m, user);
+ if (is_oid_nil(rid))
+ return NULL;
+ return store->table_api.column_find_value(tr, find_sql_column(users,
"password"), rid);
+}
+
+
+static void
+monet5_set_user_api_hooks(ptr mvc)
+{
+ (void) mvc;
+ AUTHRegisterGetPasswordHandler(&getPasswordHash);
+}
+
+
static int
monet5_find_role(ptr _mvc, str role, sqlid *role_id)
{
@@ -378,6 +419,7 @@ monet5_create_privileges(ptr _mvc, sql_s
mvc_create_column_(&col, m, t, "max_workers", "int", 9);
mvc_create_column_(&col, m, t, "optimizer", "varchar", 1024);
mvc_create_column_(&col, m, t, "default_role", "int", 9);
+ // mvc_create_column_(&col, m, t, "password", "varchar", 256);
uinfo = t;
res = sa_list(m->sa);
@@ -390,7 +432,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
+ // TODO this view should go, remove as part of db_user_info -> users
rename
t = mvc_init_create_view(m, s, "users",
"create view sys.users as select u.\"name\" as
\"name\", "
"ui.\"fullname\", ui.\"default_schema\", "
@@ -599,7 +641,7 @@ monet5_rename_user(ptr _mvc, str olduser
sql_column *auths_name = find_sql_column(auths, "name");
int res = LOG_OK;
- if ((err = AUTHchangeUsername(c, olduser, newuser)) !=MAL_SUCCEED) {
+ if ((err = AUTHchangeUsername(c, olduser, newuser)) != MAL_SUCCEED) {
(void) sql_error(m, 02, "ALTER USER: %s",
getExceptionMessage(err));
freeException(err);
return (FALSE);
@@ -669,6 +711,7 @@ monet5_user_init(backend_functions *be_f
be_funcs->fauser = &monet5_alter_user;
be_funcs->fruser = &monet5_rename_user;
be_funcs->fschuserdep = &monet5_schema_user_dependencies;
+ be_funcs->fset_user_api_hooks = &monet5_set_user_api_hooks;
}
int
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
@@ -122,3 +122,11 @@ backend_find_role(ptr mvc, char *name, s
return be_funcs.ffrole(mvc, name, role_id);
return 0;
}
+
+
+void
+backend_set_user_api_hooks(ptr mvc)
+{
+ if (be_funcs.fset_user_api_hooks != NULL)
+ be_funcs.fset_user_api_hooks(mvc);
+}
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
@@ -28,6 +28,7 @@ typedef int (*resolve_function) (ptr mv
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);
+typedef void (*set_user_api_hooks_fptr)(ptr mvc);
/* backing struct for this interface */
typedef struct _backend_functions {
@@ -44,6 +45,7 @@ typedef struct _backend_functions {
resolve_function fresolve_function;
has_module_function fhas_module_function;
create_sub_backend sub_backend;
+ set_user_api_hooks_fptr fset_user_api_hooks;
} backend_functions;
extern void backend_freecode(const char *mod, int clientid, const char *name);
@@ -59,6 +61,7 @@ extern void* backend_schema_user_depende
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 void backend_set_user_api_hooks(ptr mvc);
extern backend_functions be_funcs;
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -404,6 +404,8 @@ mvc_init(int debug, store_type store_tpe
return NULL;
}
+ // set SQL user callbacks in MAL authorisation
+ sql_set_user_api_hooks(m);
mvc_destroy(m);
return store;
}
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
@@ -990,6 +990,7 @@ sql_create_privileges(mvc *m, sql_schema
sql_subfunc *f = NULL;
sql_trans *tr = m->session->tr;
+ // create db_user_info tbl
backend_create_privileges(m, s);
mvc_create_table(&t, m, s, "user_role", tt_table, 1, SQL_PERSIST, 0,
-1, 0);
@@ -1088,3 +1089,9 @@ sql_create_privileges(mvc *m, sql_schema
return 0;
}
+
+void
+sql_set_user_api_hooks(mvc *m)
+{
+ backend_set_user_api_hooks(m);
+}
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
@@ -44,5 +44,6 @@ extern char * sql_create_user(mvc *sql,
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, char *role);
extern char * sql_rename_user(mvc *sql, char *olduser, char *newuser);
+extern void sql_set_user_api_hooks(mvc *m);
#endif /*_SQL_PRIV_H_ */
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]