Changeset: b51b78a26389 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b51b78a26389
Modified Files:
        monetdb5/mal/mal_runtime.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_user.c
        sql/backends/monet5/sql_user.h
        sql/scripts/22_clients.sql
Branch: userprofile
Log Message:

fix password hash


diffs (203 lines):

diff --git a/monetdb5/mal/mal_runtime.c b/monetdb5/mal/mal_runtime.c
--- a/monetdb5/mal/mal_runtime.c
+++ b/monetdb5/mal/mal_runtime.c
@@ -99,7 +99,7 @@ updateUserStats(Client cntxt, MalBlkPtr 
                USRstats[idx].finished = finished;
                USRstats[idx].maxticks = ticks;
                GDKfree(USRstats[idx].maxquery);
-               USRstats[idx].maxquery= GDKstrdup(query);
+               USRstats[idx].maxquery = GDKstrdup(query);
        }
 }
 
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
@@ -5108,6 +5108,31 @@ SQLstr_column_stop_vacuum(Client cntxt, 
 #include "for.h"
 #include "dict.h"
 #include "mel.h"
+
+
+str
+SQLuser_password(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       mvc *m = NULL;
+       str msg = NULL;
+       str *password = getArgReference_str(stk, pci, 0);
+       const char *username = *getArgReference_str(stk, pci, 1);
+
+       (void) password;
+
+       if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+       if (cntxt->username != username) {
+               // only MAL_ADMIN and user himself can access password
+               if ((msg = AUTHrequireAdmin(cntxt)) != MAL_SUCCEED)
+                       return msg;
+       }
+       *password = monet5_password_hash(m, username);
+       return MAL_SUCCEED;
+}
+
 static mel_func sql_init_funcs[] = {
  pattern("sql", "shutdown", SQLshutdown_wrap, true, "", args(1,3, 
arg("",str),arg("delay",bte),arg("force",bit))),
  pattern("sql", "shutdown", SQLshutdown_wrap, true, "", args(1,3, 
arg("",str),arg("delay",sht),arg("force",bit))),
@@ -5198,7 +5223,7 @@ static mel_func sql_init_funcs[] = {
  pattern("sql", "sql_variables", sql_variables, false, "return the table with 
session variables", args(4,4, 
batarg("sname",str),batarg("name",str),batarg("type",str),batarg("value",str))),
  pattern("sql", "sessions", sql_sessions_wrap, false, "SQL export table of 
active sessions, their timeouts and idle status", args(9,9, 
batarg("id",int),batarg("user",str),batarg("start",timestamp),batarg("idle",timestamp),batarg("optmizer",str),batarg("stimeout",int),batarg("qtimeout",int),batarg("wlimit",int),batarg("mlimit",int))),
 //pattern("sql", "db_users", db_users_wrap, false, "return table of users with 
sql scenario", args(1,1, batarg("",str))),
-//pattern("sql", "password", db_password_wrap, false, "Return password hash of 
user", args(1,2, arg("",str),arg("user",str))),
+pattern("sql", "password", SQLuser_password, false, "Return password hash of 
user", args(1,2, arg("",str),arg("user",str))),
 //pattern("batsql", "password", db_password_wrap, false, "Return password hash 
of user", args(1,2, batarg("",str),batarg("user",str))),
  pattern("sql", "rt_credentials", sql_rt_credentials_wrap, false, "Return the 
remote table credentials for the given table", args(3,4, 
batarg("uri",str),batarg("username",str),batarg("hash",str),arg("tablename",str))),
  pattern("sql", "dump_cache", dump_cache, false, "dump the content of the 
query cache", args(2,2, batarg("query",str),batarg("count",int))),
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
@@ -289,6 +289,7 @@ extern str SQLunionfunc(Client cntxt, Ma
 extern str SQLstr_column_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 extern str SQLstr_column_auto_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 extern str SQLstr_column_stop_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
+extern str SQLuser_password(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 
 sql5_export str getBackendContext(Client cntxt, backend **be);
 
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
@@ -117,6 +117,7 @@ getUserPasswordCallback(Client c, const 
        backend *be = (backend *) c->sqlcontext;
        if (be) {
                mvc *m = be->mvc;
+               // this starts new transaction
                if (mvc_trans(m) == 0) {
                        oid rid = getUserOIDByName(m, user);
                        res = getUserPassword(m, rid);
@@ -530,50 +531,61 @@ db_users_wrap(Client cntxt, MalBlkPtr mb
        return MAL_SUCCEED;
 }
 
+
 str
-db_password_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+monet5_password_hash(mvc *m, const char *username)
 {
-       (void) mb;
-
-       if (stk->stk[pci->argv[0]].vtype == TYPE_bat) {
-               BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1));
-               if (b == NULL)
-                       throw(SQL, "sql.password", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-               BAT *bn = COLnew(b->hseqbase, TYPE_str, BATcount(b), TRANSIENT);
-               if (bn == NULL) {
-                       BBPunfix(b->batCacheid);
-                       throw(SQL, "sql.password", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       str msg, hash = NULL;
+       oid rid = getUserOIDByName(m, username);
+       const char *password = getUserPassword(m, rid);
+       if (password) {
+               if ((msg = AUTHdecypherValue(&hash, password)) != MAL_SUCCEED) {
+                       (void) sql_error(m, 02, SQLSTATE(42000) 
"monet5_password_hash: %s", getExceptionMessage(msg));
+                       freeException(msg);
                }
-               BATiter bi = bat_iterator(b);
-               BUN p, q;
-               BATloop(b, p, q) {
-                       char *hash, *msg;
-                       msg = AUTHgetPasswordHash(&hash, cntxt, BUNtvar(bi, p));
-                       if (msg != MAL_SUCCEED) {
-                               bat_iterator_end(&bi);
-                               BBPunfix(b->batCacheid);
-                               BBPreclaim(bn);
-                               return msg;
-                       }
-                       if (BUNappend(bn, hash, false) != GDK_SUCCEED) {
-                               bat_iterator_end(&bi);
-                               BBPunfix(b->batCacheid);
-                               BBPreclaim(bn);
-                               GDKfree(hash);
-                               throw(SQL, "sql.password", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-                       }
-                       GDKfree(hash);
-               }
-               bat_iterator_end(&bi);
-               BBPunfix(b->batCacheid);
-               BBPkeepref(bn);
-               *getArgReference_bat(stk, pci, 0) = bn->batCacheid;
-               return MAL_SUCCEED;
        }
-       str *hash = getArgReference_str(stk, pci, 0);
-       str *user = getArgReference_str(stk, pci, 1);
+       return hash;
+       // (void) mb;
 
-       return AUTHgetPasswordHash(hash, cntxt, *user);
+       // if (stk->stk[pci->argv[0]].vtype == TYPE_bat) {
+       //      BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1));
+       //      if (b == NULL)
+       //              throw(SQL, "sql.password", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+       //      BAT *bn = COLnew(b->hseqbase, TYPE_str, BATcount(b), TRANSIENT);
+       //      if (bn == NULL) {
+       //              BBPunfix(b->batCacheid);
+       //              throw(SQL, "sql.password", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       //      }
+       //      BATiter bi = bat_iterator(b);
+       //      BUN p, q;
+       //      BATloop(b, p, q) {
+       //              char *hash, *msg;
+       //              msg = AUTHgetPasswordHash(&hash, cntxt, BUNtvar(bi, p));
+       //              if (msg != MAL_SUCCEED) {
+       //                      bat_iterator_end(&bi);
+       //                      BBPunfix(b->batCacheid);
+       //                      BBPreclaim(bn);
+       //                      return msg;
+       //              }
+       //              if (BUNappend(bn, hash, false) != GDK_SUCCEED) {
+       //                      bat_iterator_end(&bi);
+       //                      BBPunfix(b->batCacheid);
+       //                      BBPreclaim(bn);
+       //                      GDKfree(hash);
+       //                      throw(SQL, "sql.password", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       //              }
+       //              GDKfree(hash);
+       //      }
+       //      bat_iterator_end(&bi);
+       //      BBPunfix(b->batCacheid);
+       //      BBPkeepref(bn);
+       //      *getArgReference_bat(stk, pci, 0) = bn->batCacheid;
+       //      return MAL_SUCCEED;
+       // }
+       // str *hash = getArgReference_str(stk, pci, 0);
+       // str *user = getArgReference_str(stk, pci, 1);
+
+       // return AUTHgetPasswordHash(hash, cntxt, *user);
 }
 
 static void
diff --git a/sql/backends/monet5/sql_user.h b/sql/backends/monet5/sql_user.h
--- a/sql/backends/monet5/sql_user.h
+++ b/sql/backends/monet5/sql_user.h
@@ -15,6 +15,6 @@ extern int monet5_user_set_def_schema(mv
 extern int monet5_user_get_def_schema(mvc *m, int user /* sql user id */, str 
*schema);
 
 extern str db_users_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
-extern str db_password_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+extern str monet5_password_hash(mvc *m, const char *username);
 
 #endif /* _SQL_USER_H_ */
diff --git a/sql/scripts/22_clients.sql b/sql/scripts/22_clients.sql
--- a/sql/scripts/22_clients.sql
+++ b/sql/scripts/22_clients.sql
@@ -6,7 +6,8 @@
 
 create function sys.password_hash (username string)
        returns string
-       return select password from users where name = username;
+    external name sql.password;
+       -- return select password from users where name = username;
 
 create function sys.remote_table_credentials (tablename string)
 returns table ("uri" string, "username" string, "hash" string)
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to