From b9c97c0b2e58826efe797e53fec4558fd7f7b95d Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 12 Feb 2019 17:02:45 +0100 Subject: [PATCH] ACL: CAT subcommand implemented. --- src/acl.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/acl.c b/src/acl.c index f5e132727..e4122fd2c 100644 --- a/src/acl.c +++ b/src/acl.c @@ -1437,6 +1437,32 @@ void aclCommand(client *c) { sdsfree(errors); } } + } else if (!strcasecmp(sub,"cat") && c->argc == 2) { + void *dl = addReplyDeferredLen(c); + int j; + for (j = 0; ACLCommandCategories[j].flag != 0; j++) + addReplyBulkCString(c,ACLCommandCategories[j].name); + setDeferredArrayLen(c,dl,j); + } else if (!strcasecmp(sub,"cat") && c->argc == 3) { + uint64_t cflag = ACLGetCommandCategoryFlagByName(c->argv[2]->ptr); + if (cflag == 0) { + addReplyErrorFormat(c, "Unknown category '%s'", c->argv[2]->ptr); + return; + } + int arraylen = 0; + void *dl = addReplyDeferredLen(c); + dictIterator *di = dictGetIterator(server.orig_commands); + dictEntry *de; + while ((de = dictNext(di)) != NULL) { + struct redisCommand *cmd = dictGetVal(de); + if (cmd->flags & CMD_MODULE) continue; + if (cmd->flags & cflag) { + addReplyBulkCString(c,cmd->name); + arraylen++; + } + } + dictReleaseIterator(di); + setDeferredArrayLen(c,dl,arraylen); } else if (!strcasecmp(sub,"help")) { const char *help[] = { "LIST -- Show user details in config file format.",