Changeset: ea9ad9ea3210 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ea9ad9ea3210 Modified Files: monetdb5/mal/mal_authorize.c sql/server/rel_updates.c sql/server/sql_privileges.c sql/test/leaks/Tests/check0.stable.out sql/test/leaks/Tests/check0.stable.out.int128 sql/test/leaks/Tests/check1.stable.out sql/test/leaks/Tests/check1.stable.out.int128 sql/test/leaks/Tests/check2.stable.out sql/test/leaks/Tests/check2.stable.out.int128 sql/test/leaks/Tests/check3.stable.out sql/test/leaks/Tests/check3.stable.out.int128 sql/test/leaks/Tests/check4.stable.out sql/test/leaks/Tests/check4.stable.out.int128 sql/test/leaks/Tests/check5.stable.out sql/test/leaks/Tests/check5.stable.out.int128 sql/test/leaks/Tests/drop3.stable.out sql/test/leaks/Tests/drop3.stable.out.int128 sql/test/leaks/Tests/select1.stable.out.int128 sql/test/leaks/Tests/select2.stable.out.int128 sql/test/leaks/Tests/temp1.stable.out sql/test/leaks/Tests/temp1.stable.out.int128 sql/test/leaks/Tests/temp2.stable.out sql/test/leaks/Tests/temp2.stable.out.int128 sql/test/leaks/Tests/temp3.stable.out sql/test/leaks/Tests/temp3.stable.out.int128 Branch: default Log Message:
merged with jul2015 diffs (truncated from 1008 to 300 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 @@ -34,6 +34,23 @@ static str AUTHverifyPassword(int *ret, static BAT *user = NULL; static BAT *pass = NULL; +static BAT *duser = NULL; + +static BUN +AUTHfindUser(str username) +{ + BATiter cni = bat_iterator(user); + BUN p; + + if (user->T->hash || BAThash(user, 0) == GDK_SUCCEED) { + HASHloop_str(cni, cni.b->T->hash, p, username) { + oid pos = p; + if (BUNfnd(duser, &pos) == BUN_NONE) + return p; + } + } + return BUN_NONE; +} /** * Requires the current client to be the admin user thread. If not the case, @@ -87,7 +104,7 @@ AUTHrequireAdminOrUser(Client *c, str *u static void AUTHcommit(void) { - bat blist[3]; + bat blist[4]; blist[0] = 0; @@ -95,7 +112,9 @@ AUTHcommit(void) blist[1] = abs(user->batCacheid); assert(pass); blist[2] = abs(pass->batCacheid); - TMsubcommit_list(blist, 3); + assert(duser); + blist[3] = abs(duser->batCacheid); + TMsubcommit_list(blist, 4); } /* @@ -110,7 +129,6 @@ AUTHcommit(void) str AUTHinitTables(str *passwd) { bat bid; - BAT *b; int isNew = 1; str msg = MAL_SUCCEED; @@ -125,37 +143,53 @@ AUTHinitTables(str *passwd) { /* load/create users BAT */ bid = BBPindex("M5system_auth_user"); if (!bid) { - b = BATnew(TYPE_void, TYPE_str, 256, PERSISTENT); - if (b == NULL) + user = BATnew(TYPE_void, TYPE_str, 256, PERSISTENT); + if (user == NULL) throw(MAL, "initTables.user", MAL_MALLOC_FAIL " user table"); - BATseqbase(b,0); + BATseqbase(user,0); - BATkey(BATmirror(b), TRUE); - BBPrename(BBPcacheid(b), "M5system_auth_user"); - BATmode(b, PERSISTENT); + BATkey(BATmirror(user), TRUE); + BBPrename(BBPcacheid(user), "M5system_auth_user"); + BATmode(user, PERSISTENT); } else { - b = BATdescriptor(bid); + user = BATdescriptor(bid); isNew = 0; } - assert(b); - user = b; + assert(user); /* load/create password BAT */ bid = BBPindex("M5system_auth_passwd_v2"); if (!bid) { - b = BATnew(TYPE_void, TYPE_str, 256, PERSISTENT); - if (b == NULL) + pass = BATnew(TYPE_void, TYPE_str, 256, PERSISTENT); + if (pass == NULL) throw(MAL, "initTables.passwd", MAL_MALLOC_FAIL " password table"); - BATseqbase(b,0); + BATseqbase(pass,0); - BBPrename(BBPcacheid(b), "M5system_auth_passwd_v2"); - BATmode(b, PERSISTENT); + BBPrename(BBPcacheid(pass), "M5system_auth_passwd_v2"); + BATmode(pass, PERSISTENT); } else { - b = BATdescriptor(bid); + pass = BATdescriptor(bid); isNew = 0; } - assert(b); - pass = b; + assert(pass); + + /* load/create password BAT */ + bid = BBPindex("M5system_auth_deleted"); + if (!bid) { + duser = BATnew(TYPE_void, TYPE_oid, 256, PERSISTENT); + if (duser == NULL) + throw(MAL, "initTables.duser", MAL_MALLOC_FAIL " deleted user table"); + BATseqbase(duser,0); + + BBPrename(BBPcacheid(duser), "M5system_auth_deleted"); + BATmode(duser, PERSISTENT); + if (!isNew) + AUTHcommit(); + } else { + duser = BATdescriptor(bid); + isNew = 0; + } + assert(duser); if (isNew == 1) { /* insert the monetdb/monetdb administrator account on a @@ -196,9 +230,8 @@ AUTHcheckCredentials( str tmp; str pwd = NULL; str hash = NULL; - BUN p, q; - oid *id; - BATiter useri, passi; + BUN p; + BATiter passi; rethrow("checkCredentials", tmp, AUTHrequireAdminOrUser(c, username)); assert(user); @@ -207,13 +240,11 @@ AUTHcheckCredentials( if (*username == NULL || strNil(*username)) throw(INVCRED, "checkCredentials", "invalid credentials for unknown user"); - p = BUNfnd(user, *username); + p = AUTHfindUser(*username); if (p == BUN_NONE) { /* DO NOT reveal that the user doesn't exist here! */ throw(INVCRED, "checkCredentials", INVCRED_INVALID_USER " '%s'", *username); } - useri = bat_iterator(user); - id = (oid*)(BUNhead(useri, p)); /* a NULL password is impossible (since we should be dealing with * hashes here) so we can bail out immediately @@ -224,10 +255,8 @@ AUTHcheckCredentials( } /* find the corresponding password to the user */ - q = BUNfnd(BATmirror(pass), id); - assert (q != BUN_NONE); passi = bat_iterator(pass); - tmp = (str)BUNtail(passi, q); + tmp = (str)BUNtail(passi, p); assert (tmp != NULL); /* decypher the password (we lose the original tmp here) */ rethrow("checkCredentials", tmp, AUTHdecypherValue(&pwd, &tmp)); @@ -242,7 +271,7 @@ AUTHcheckCredentials( } free(hash); - *uid = *id; + *uid = p; return(MAL_SUCCEED); } @@ -251,12 +280,11 @@ AUTHcheckCredentials( * return value of this function is the user id of the added user. */ str -AUTHaddUser(oid *uid, Client *c, str *username, str *passwd) { +AUTHaddUser(oid *uid, Client *c, str *username, str *passwd) +{ BUN p; - oid *id; str tmp; str hash = NULL; - BATiter useri; rethrow("addUser", tmp, AUTHrequireAdmin(c)); assert(user); @@ -270,7 +298,7 @@ AUTHaddUser(oid *uid, Client *c, str *us rethrow("addUser", tmp, AUTHverifyPassword(NULL, passwd)); /* ensure that the username is not already there */ - p = BUNfnd(user, *username); + p = AUTHfindUser(*username); if (p != BUN_NONE) throw(MAL, "addUser", "user '%s' already exists", *username); @@ -278,18 +306,15 @@ AUTHaddUser(oid *uid, Client *c, str *us rethrow("addUser", tmp, AUTHcypherValue(&hash, passwd)); /* needs force, as SQL makes a view over user */ BUNappend(user, *username, TRUE); - BUNappend(pass, hash, FALSE); + BUNappend(pass, hash, TRUE); GDKfree(hash); /* retrieve the oid of the just inserted user */ - p = BUNfnd(user, *username); - assert (p != BUN_NONE); - useri = bat_iterator(user); - id = (oid*)(BUNhead(useri, p)); + p = AUTHfindUser(*username); /* make the stuff persistent */ AUTHcommit(); - *uid = *id; + *uid = p; return(MAL_SUCCEED); } @@ -297,12 +322,11 @@ AUTHaddUser(oid *uid, Client *c, str *us * Removes the given user from the administration. */ str -AUTHremoveUser(Client *c, str *username) { +AUTHremoveUser(Client *c, str *username) +{ BUN p; - BAT *b; oid id; str tmp; - BATiter useri; rethrow("removeUser", tmp, AUTHrequireAdmin(c)); assert(user); @@ -313,27 +337,20 @@ AUTHremoveUser(Client *c, str *username) throw(ILLARG, "removeUser", "username should not be nil"); /* ensure that the username exists */ - p = BUNfnd(user, *username); + p = AUTHfindUser(*username); if (p == BUN_NONE) throw(MAL, "removeUser", "no such user: '%s'", *username); - useri = bat_iterator(user); - id = *(oid*)(BUNhead(useri, p)); + id = p; /* find the name of the administrator and see if it equals username */ if (id == (*c)->user) throw(MAL, "removeUser", "cannot remove yourself"); /* now, we got the oid, start removing the related tuples */ - b = BATmirror(BATselect(BATmirror(user), &id, &id)); - assert(BATcount(b) != 0); - BATdel(user, b, TRUE); - b = BATmirror(BATselect(BATmirror(pass), &id, &id)); - assert(BATcount(b) != 0); - BATdel(pass, b, FALSE); + BUNappend(duser, &id, TRUE); /* make the stuff persistent */ AUTHcommit(); - return(MAL_SUCCEED); } @@ -347,7 +364,6 @@ AUTHchangeUsername(Client *c, str *oldus { BUN p, q; str tmp; - BATiter useri; oid id; rethrow("addUser", tmp, AUTHrequireAdminOrUser(c, olduser)); @@ -359,20 +375,19 @@ AUTHchangeUsername(Client *c, str *oldus throw(ILLARG, "changeUsername", "new username should not be nil"); /* see if the olduser is valid */ - p = BUNfnd(user, *olduser); + p = AUTHfindUser(*olduser); if (p == BUN_NONE) throw(MAL, "changeUsername", "user '%s' does not exist", *olduser); /* ... and if the newuser is not there yet */ - q = BUNfnd(user, *newuser); + q = AUTHfindUser(*newuser); if (q != BUN_NONE) throw(MAL, "changeUsername", "user '%s' already exists", *newuser); /* ok, just do it! (with force, because sql makes view over it) */ - useri = bat_iterator(user); - id = *(oid*)BUNhead(useri, p); + id = p; + assert(id == p); BUNinplace(user, p, &id, *newuser, TRUE); AUTHcommit(); - return(MAL_SUCCEED); } @@ -382,7 +397,8 @@ AUTHchangeUsername(Client *c, str *oldus _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list