diff options
author | Michael Grunder <michael.grunder@gmail.com> | 2020-06-25 03:00:01 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-25 03:00:01 +0300 |
commit | a311cc4ec3cecdbaf83ba66985efa82137e37cc0 (patch) | |
tree | 078ca80c140e3a77e088a213066b27d0b350c7c6 /redis_commands.c | |
parent | 04def9fbe2194b3b711362de57260a6cd5216e69 (diff) |
Support for Redis 6 ACLs (#1791)
Add support for Redis 6 ACLs in the `Redis`, `RedisCluster`, and `RedisArray` classes.
On a related note, it adds a mechanism for users to customize how we generate persistent connection IDs such that they can be grouped in different ways depending on the specific use case required (e.g. it would allow connections to be grouped by username, or by user-defined persistent_id, or both).
Diffstat (limited to 'redis_commands.c')
-rw-r--r-- | redis_commands.c | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/redis_commands.c b/redis_commands.c index 97442de3..3b191944 100644 --- a/redis_commands.c +++ b/redis_commands.c @@ -2047,26 +2047,47 @@ 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) { - char *pw; - size_t pw_len; + zend_string *user = NULL, *pass = NULL; + zval *ztest; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pw, &pw_len) - ==FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z!", &ztest) == FAILURE || + redis_extract_auth_info(ztest, &user, &pass) == FAILURE) { return FAILURE; } - // Construct our AUTH command - *cmd_len = REDIS_CMD_SPPRINTF(cmd, "AUTH", "s", pw, pw_len); + /* Construct either AUTH <user> <pass> or AUTH <pass> */ + if (user && pass) { + *cmd_len = REDIS_CMD_SPPRINTF(cmd, "AUTH", "SS", user, pass); + } else { + *cmd_len = REDIS_CMD_SPPRINTF(cmd, "AUTH", "S", pass); + } - // Free previously allocated password, and update - if (redis_sock->auth) zend_string_release(redis_sock->auth); - redis_sock->auth = zend_string_init(pw, pw_len, 0); + redis_sock_set_auth(redis_sock, user, pass); + + if (user) zend_string_release(user); + if (pass) zend_string_release(pass); - // Success return SUCCESS; } |