Changeset: 57663fde97a1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/57663fde97a1
Modified Files:
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_user.c
Branch: userprofile
Log Message:

set/change password in SQL layer


diffs (250 lines):

diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -292,4 +292,7 @@ extern str SQLstr_column_stop_vacuum(Cli
 
 sql5_export str getBackendContext(Client cntxt, backend **be);
 
+#define USER_TABLE_NAME "db_user_info"
+#define USER_PASSWORD_COLUMN "password"
+
 #endif /* _SQL_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
@@ -29,7 +29,7 @@ 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");
+       return find_sql_table(tr, sys, USER_TABLE_NAME);
 }
 
 
@@ -43,8 +43,9 @@ getUserOIDByName(mvc *m, const char *use
        return store->table_api.column_find_row(tr, users_name, user, NULL);
 }
 
+
 static str
-getUserNameByOID(mvc *m, oid rid)
+getUserName(mvc *m, oid rid)
 {
        if (is_oid_nil(rid))
                return NULL;
@@ -56,22 +57,28 @@ getUserNameByOID(mvc *m, oid rid)
 
 
 static str
-getPasswordHash(Client c, const char *user)
+getUserPassword(mvc *m, oid rid)
+{
+       if (is_oid_nil(rid)) {
+               return NULL;
+       }
+       sql_trans *tr = m->session->tr;
+       sqlstore *store = m->session->tr->store;
+       sql_table *users = getUsersTbl(m);
+       return store->table_api.column_find_value(tr, find_sql_column(users, 
USER_PASSWORD_COLUMN), rid);
+}
+
+
+static str
+getUserPasswordCallback(Client c, const char *user)
 {
        str res;
        backend *be = (backend *) c->sqlcontext;
        if (be) {
                mvc *m = be->mvc;
                if (mvc_trans(m) == 0) {
-                       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)) {
-                               sql_trans_end(m->session, SQL_OK);
-                               return NULL;
-                       }
-                       res = store->table_api.column_find_value(tr, 
find_sql_column(users, "password"), rid);
+                       res = getUserPassword(m, rid);
                        sql_trans_end(m->session, SQL_OK);
                        return res;
                }
@@ -80,8 +87,68 @@ getPasswordHash(Client c, const char *us
 }
 
 
+static int
+setUserPassword(mvc *m, oid rid, str value)
+{
+       str err = NULL;
+       str hash = NULL;
+       if (is_oid_nil(rid)) {
+               (void) sql_error(m, 02, SQLSTATE(42000) "setUserPassword: 
invalid user");
+               return LOG_ERR;
+       }
+       if (strNil(value)) {
+               (void) sql_error(m, 02, SQLSTATE(42000) "setUserPassword: 
password cannot be nil");
+               return LOG_ERR;
+       }
+       if ((err = AUTHverifyPassword(value)) != MAL_SUCCEED) {
+               (void) sql_error(m, 02, SQLSTATE(42000) "setUserPassword: %s", 
getExceptionMessage(err));
+               freeException(err);
+               return LOG_ERR;
+       }
+       if ((err = AUTHcypherValue(&hash, value)) != MAL_SUCCEED) {
+               (void) sql_error(m, 02, SQLSTATE(42000) "setUserPassword: %s", 
getExceptionMessage(err));
+               freeException(err);
+               return LOG_ERR;
+       }
+
+       sql_trans *tr = m->session->tr;
+       sqlstore *store = m->session->tr->store;
+       sql_table *users = getUsersTbl(m);
+       return store->table_api.column_update_value(tr, find_sql_column(users, 
USER_PASSWORD_COLUMN), rid, hash);
+}
+
+
+static int
+changeUserPassword(mvc *m, oid rid, str oldpass, str newpass)
+{
+       str err = NULL;
+       str hash = NULL;
+       if (is_oid_nil(rid)) {
+               (void) sql_error(m, 02, SQLSTATE(42000) "changeUserPassword: 
invalid user");
+               return LOG_ERR;
+       }
+       if (strNil(newpass)) {
+               (void) sql_error(m, 02, SQLSTATE(42000) "changeUserPassword: 
password cannot be nil");
+               return LOG_ERR;
+       }
+       if (oldpass) {
+               // validate old password match
+               if ((err = AUTHdecypherValue(&hash, getUserPassword(m, rid))) 
!= MAL_SUCCEED) {
+                       (void) sql_error(m, 02, SQLSTATE(42000) 
"changeUserPassword: %s", getExceptionMessage(err));
+                       freeException(err);
+                       return LOG_ERR;
+               }
+               if (strcmp(oldpass, hash) != 0) {
+                       (void) sql_error(m, 02, SQLSTATE(42000) 
"changeUserPassword: password mismatch");
+                       return LOG_ERR;
+               }
+       }
+       return setUserPassword(m, rid, newpass);
+}
+
+
 static oid
-getUserOID(Client c, const char *user)
+getUserOIDCallback(Client c, const char *user)
 {
        oid res;
        backend *be = (backend *) c->sqlcontext;
@@ -101,8 +168,8 @@ static void
 monet5_set_user_api_hooks(ptr mvc)
 {
        (void) mvc;
-       AUTHRegisterGetPasswordHandler(&getPasswordHash);
-       AUTHRegisterGetUserOIDHandler(&getUserOID);
+       AUTHRegisterGetPasswordHandler(&getUserPasswordCallback);
+       AUTHRegisterGetUserOIDHandler(&getUserOIDCallback);
 }
 
 
@@ -349,7 +416,7 @@ monet5_create_user(ptr _mvc, str user, s
                }
 
        }
-
+       // TODO don't add user in MAL
        /* add the user to the M5 authorisation administration */
        oid grant_user = c->user;
        c->user = MAL_ADMIN;
@@ -593,30 +660,19 @@ monet5_alter_user(ptr _mvc, str user, st
                        pwd = passwd;
                        opwd = oldpasswd;
                }
-               if (user == NULL) {
-                       err = AUTHchangePassword(c, opwd, pwd);
-                       if (!enc) {
-                               free(pwd);
-                               free(opwd);
-                       }
-                       if (err !=MAL_SUCCEED) {
-                               (void) sql_error(m, 02, "ALTER USER: %s", 
getExceptionMessage(err));
-                               freeException(err);
-                               return (FALSE);
-                       }
-               } else {
+
+               if (user) {
+                       // verify query user value is not the session user
                        str username = NULL;
-                       if ((err = AUTHresolveUser(&username, c->user)) 
!=MAL_SUCCEED) {
+                       if ((username = getUserName(m, c->user)) == NULL) {
                                if (!enc) {
                                        free(pwd);
                                        free(opwd);
                                }
-                               (void) sql_error(m, 02, "ALTER USER: %s", 
getExceptionMessage(err));
-                               freeException(err);
+                               (void) sql_error(m, 02, "ALTER USER: invalid 
user");
                                return (FALSE);
                        }
                        if (strcmp(username, user) == 0) {
-                               /* avoid message about changePassword (from MAL 
level) */
                                GDKfree(username);
                                if (!enc) {
                                        free(pwd);
@@ -629,16 +685,36 @@ monet5_alter_user(ptr _mvc, str user, st
                                return (FALSE);
                        }
                        GDKfree(username);
-                       err = AUTHsetPassword(c, user, pwd);
-                       if (!enc) {
-                               free(pwd);
-                               free(opwd);
-                       }
-                       if (err !=MAL_SUCCEED) {
+                       // verify current user is MAL_ADMIN ?
+                       if ((err = AUTHrequireAdmin(c)) != MAL_SUCCEED) {
                                (void) sql_error(m, 02, "ALTER USER: %s", 
getExceptionMessage(err));
                                freeException(err);
+                               if (!enc) {
+                                       free(pwd);
+                                       free(opwd);
+                               }
+                               return (FALSE);
+                       }
+                       if (setUserPassword(m, getUserOIDByName(m, user), pwd) 
!= LOG_OK) {
+                               if (!enc) {
+                                       free(pwd);
+                                       free(opwd);
+                               }
                                return (FALSE);
                        }
+
+               } else {
+                       if (changeUserPassword(m, c->user, opwd, pwd) != 
LOG_OK) {
+                               if (!enc) {
+                                       free(pwd);
+                                       free(opwd);
+                               }
+                               return (FALSE);
+                       }
+               }
+               if (!enc) {
+                       free(pwd);
+                       free(opwd);
                }
        }
 
@@ -838,7 +914,7 @@ monet5_user_set_def_schema(mvc *m, oid u
                return res;
        }
 
-       if ((username = getUserNameByOID(m, user)) == NULL) {
+       if ((username = getUserName(m, user)) == NULL) {
                return -1;
        }
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to