mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
ACL: key matching implemented.
This commit is contained in:
parent
0db42d4ba8
commit
f78b3ede27
23
src/acl.c
23
src/acl.c
@ -330,6 +330,29 @@ int ACLCheckCommandPerm(client *c) {
|
||||
if (!(c->user->flags & USER_FLAG_ALLKEYS) &&
|
||||
(c->cmd->getkeys_proc || c->cmd->firstkey))
|
||||
{
|
||||
int numkeys;
|
||||
int *keyidx = getKeysFromCommand(c->cmd,c->argv,c->argc,&numkeys);
|
||||
for (int j = 0; j < numkeys; j++) {
|
||||
listIter li;
|
||||
listNode *ln;
|
||||
listRewind(u->passwords,&li);
|
||||
|
||||
/* Test this key against every pattern. */
|
||||
match = 0;
|
||||
while((ln = listNext(&li))) {
|
||||
sds pattern = listNodeValue(ln);
|
||||
size_t plen = sdslen(pattern);
|
||||
int idx = keyidx[j];
|
||||
if (stringmatchlen(pattern,plen,c->argv[idx]->ptr,
|
||||
sdslen(c->argv[idx]->ptr),0))
|
||||
{
|
||||
match = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!match) return C_ERR;
|
||||
}
|
||||
getKeysFreeResult(keyidx);
|
||||
}
|
||||
|
||||
/* If we survived all the above checks, the user can execute the
|
||||
|
Loading…
Reference in New Issue
Block a user