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 -- [email protected]
To unsubscribe send an email to [email protected]