diff options
author | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2022-11-01 13:53:23 +0300 |
---|---|---|
committer | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2022-11-01 13:53:23 +0300 |
commit | 504810a5d1599c4e5f8c749934de272a625a687f (patch) | |
tree | 1f4bbfe366e217e95b5ec6937174b921a556f28f /redis_commands.c | |
parent | f2cef8be06ed8f308c671df35781e91b16ca3f96 (diff) |
Issue #2068, Refactor ACL command
Diffstat (limited to 'redis_commands.c')
-rw-r--r-- | redis_commands.c | 111 |
1 files changed, 94 insertions, 17 deletions
diff --git a/redis_commands.c b/redis_commands.c index 187a2cdf..5c3dcb90 100644 --- a/redis_commands.c +++ b/redis_commands.c @@ -2100,6 +2100,100 @@ redis_pop_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, return SUCCESS; } +int +redis_acl_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, + char **cmd, int *cmd_len, short *slot, void **ctx) +{ + smart_string cmdstr = {0}; + zend_string *zstr; + zval *z_args; + int argc, i; + + if ((argc = ZEND_NUM_ARGS()) < 1) { + php_error_docref(NULL, E_WARNING, "ACL command requires at least one argument"); + return FAILURE; + } + + z_args = ecalloc(argc, sizeof(*z_args)); + if (zend_get_parameters_array(ht, argc, z_args) == FAILURE) { + goto failure; + } + + zstr = zval_get_string(&z_args[0]); + if (zend_string_equals_literal_ci(zstr, "CAT") || + zend_string_equals_literal_ci(zstr, "LIST") || + zend_string_equals_literal_ci(zstr, "USERS") + ) { + *ctx = NULL; + } else if (zend_string_equals_literal_ci(zstr, "LOAD") || + zend_string_equals_literal_ci(zstr, "SAVE") + ) { + *ctx = PHPREDIS_CTX_PTR; + } else if (zend_string_equals_literal_ci(zstr, "GENPASS") || + zend_string_equals_literal_ci(zstr, "WHOAMI") + ) { + *ctx = PHPREDIS_CTX_PTR + 1; + } else if (zend_string_equals_literal_ci(zstr, "SETUSER")) { + if (argc < 2) { + php_error_docref(NULL, E_WARNING, "ACL SETUSER requires at least one argument"); + zend_string_release(zstr); + goto failure; + } + *ctx = PHPREDIS_CTX_PTR; + } else if (zend_string_equals_literal_ci(zstr, "DELUSER")) { + if (argc < 2) { + php_error_docref(NULL, E_WARNING, "ACL DELUSER requires at least one argument"); + zend_string_release(zstr); + goto failure; + } + *ctx = PHPREDIS_CTX_PTR + 2; + } else if (zend_string_equals_literal_ci(zstr, "GETUSER")) { + if (argc < 2) { + php_error_docref(NULL, E_WARNING, "ACL GETUSER requires at least one argument"); + zend_string_release(zstr); + goto failure; + } + *ctx = PHPREDIS_CTX_PTR + 3; + } else if (zend_string_equals_literal_ci(zstr, "DRYRUN")) { + if (argc < 3) { + php_error_docref(NULL, E_WARNING, "ACL DRYRUN requires at least two arguments"); + zend_string_release(zstr); + goto failure; + } + *ctx = PHPREDIS_CTX_PTR; + } else if (zend_string_equals_literal_ci(zstr, "LOG")) { + if (argc > 1 && Z_TYPE(z_args[1]) == IS_STRING && ZVAL_STRICMP_STATIC(&z_args[1], "RESET")) { + *ctx = PHPREDIS_CTX_PTR; + } else { + *ctx = PHPREDIS_CTX_PTR + 4; + } + } else { + php_error_docref(NULL, E_WARNING, "Unknown ACL operation '%s'", ZSTR_VAL(zstr)); + zend_string_release(zstr); + goto failure; + } + + REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "ACL"); + redis_cmd_append_sstr_zstr(&cmdstr, zstr); + zend_string_release(zstr); + + for (i = 1; i < argc; ++i) { + zstr = zval_get_string(&z_args[i]); + redis_cmd_append_sstr_zstr(&cmdstr, zstr); + zend_string_release(zstr); + } + efree(z_args); + + *cmd = cmdstr.c; + *cmd_len = cmdstr.len; + + return SUCCESS; + +failure: + efree(z_args); + return FAILURE; +} + /* Attempt to pull a long expiry from a zval. We're more restrictave than zval_get_long * because that function will return integers from things like open file descriptors * which should simply fail as a TTL */ @@ -3168,23 +3262,6 @@ int redis_pfcount_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, return SUCCESS; } -char *redis_variadic_str_cmd(char *kw, zval *argv, int argc, int *cmd_len) { - smart_string cmdstr = {0}; - zend_string *zstr; - int i; - - redis_cmd_init_sstr(&cmdstr, argc, kw, strlen(kw)); - - for (i = 0; i < argc; i++) { - zstr = zval_get_string(&argv[i]); - redis_cmd_append_sstr_zstr(&cmdstr, zstr); - zend_string_release(zstr); - } - - *cmd_len = cmdstr.len; - return cmdstr.c; -} - int redis_auth_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char **cmd, int *cmd_len, short *slot, void **ctx) { |