@@ -2100,6 +2100,100 @@ redis_pop_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
21002100 return SUCCESS ;
21012101}
21022102
2103+ int
2104+ redis_acl_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
2105+ char * * cmd , int * cmd_len , short * slot , void * * ctx )
2106+ {
2107+ smart_string cmdstr = {0 };
2108+ zend_string * zstr ;
2109+ zval * z_args ;
2110+ int argc , i ;
2111+
2112+ if ((argc = ZEND_NUM_ARGS ()) < 1 ) {
2113+ php_error_docref (NULL , E_WARNING , "ACL command requires at least one argument" );
2114+ return FAILURE ;
2115+ }
2116+
2117+ z_args = ecalloc (argc , sizeof (* z_args ));
2118+ if (zend_get_parameters_array (ht , argc , z_args ) == FAILURE ) {
2119+ goto failure ;
2120+ }
2121+
2122+ zstr = zval_get_string (& z_args [0 ]);
2123+ if (zend_string_equals_literal_ci (zstr , "CAT" ) ||
2124+ zend_string_equals_literal_ci (zstr , "LIST" ) ||
2125+ zend_string_equals_literal_ci (zstr , "USERS" )
2126+ ) {
2127+ * ctx = NULL ;
2128+ } else if (zend_string_equals_literal_ci (zstr , "LOAD" ) ||
2129+ zend_string_equals_literal_ci (zstr , "SAVE" )
2130+ ) {
2131+ * ctx = PHPREDIS_CTX_PTR ;
2132+ } else if (zend_string_equals_literal_ci (zstr , "GENPASS" ) ||
2133+ zend_string_equals_literal_ci (zstr , "WHOAMI" )
2134+ ) {
2135+ * ctx = PHPREDIS_CTX_PTR + 1 ;
2136+ } else if (zend_string_equals_literal_ci (zstr , "SETUSER" )) {
2137+ if (argc < 2 ) {
2138+ php_error_docref (NULL , E_WARNING , "ACL SETUSER requires at least one argument" );
2139+ zend_string_release (zstr );
2140+ goto failure ;
2141+ }
2142+ * ctx = PHPREDIS_CTX_PTR ;
2143+ } else if (zend_string_equals_literal_ci (zstr , "DELUSER" )) {
2144+ if (argc < 2 ) {
2145+ php_error_docref (NULL , E_WARNING , "ACL DELUSER requires at least one argument" );
2146+ zend_string_release (zstr );
2147+ goto failure ;
2148+ }
2149+ * ctx = PHPREDIS_CTX_PTR + 2 ;
2150+ } else if (zend_string_equals_literal_ci (zstr , "GETUSER" )) {
2151+ if (argc < 2 ) {
2152+ php_error_docref (NULL , E_WARNING , "ACL GETUSER requires at least one argument" );
2153+ zend_string_release (zstr );
2154+ goto failure ;
2155+ }
2156+ * ctx = PHPREDIS_CTX_PTR + 3 ;
2157+ } else if (zend_string_equals_literal_ci (zstr , "DRYRUN" )) {
2158+ if (argc < 3 ) {
2159+ php_error_docref (NULL , E_WARNING , "ACL DRYRUN requires at least two arguments" );
2160+ zend_string_release (zstr );
2161+ goto failure ;
2162+ }
2163+ * ctx = PHPREDIS_CTX_PTR ;
2164+ } else if (zend_string_equals_literal_ci (zstr , "LOG" )) {
2165+ if (argc > 1 && Z_TYPE (z_args [1 ]) == IS_STRING && ZVAL_STRICMP_STATIC (& z_args [1 ], "RESET" )) {
2166+ * ctx = PHPREDIS_CTX_PTR ;
2167+ } else {
2168+ * ctx = PHPREDIS_CTX_PTR + 4 ;
2169+ }
2170+ } else {
2171+ php_error_docref (NULL , E_WARNING , "Unknown ACL operation '%s'" , ZSTR_VAL (zstr ));
2172+ zend_string_release (zstr );
2173+ goto failure ;
2174+ }
2175+
2176+ REDIS_CMD_INIT_SSTR_STATIC (& cmdstr , argc , "ACL" );
2177+ redis_cmd_append_sstr_zstr (& cmdstr , zstr );
2178+ zend_string_release (zstr );
2179+
2180+ for (i = 1 ; i < argc ; ++ i ) {
2181+ zstr = zval_get_string (& z_args [i ]);
2182+ redis_cmd_append_sstr_zstr (& cmdstr , zstr );
2183+ zend_string_release (zstr );
2184+ }
2185+ efree (z_args );
2186+
2187+ * cmd = cmdstr .c ;
2188+ * cmd_len = cmdstr .len ;
2189+
2190+ return SUCCESS ;
2191+
2192+ failure :
2193+ efree (z_args );
2194+ return FAILURE ;
2195+ }
2196+
21032197/* Attempt to pull a long expiry from a zval. We're more restrictave than zval_get_long
21042198 * because that function will return integers from things like open file descriptors
21052199 * which should simply fail as a TTL */
@@ -3168,23 +3262,6 @@ int redis_pfcount_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
31683262 return SUCCESS ;
31693263}
31703264
3171- char * redis_variadic_str_cmd (char * kw , zval * argv , int argc , int * cmd_len ) {
3172- smart_string cmdstr = {0 };
3173- zend_string * zstr ;
3174- int i ;
3175-
3176- redis_cmd_init_sstr (& cmdstr , argc , kw , strlen (kw ));
3177-
3178- for (i = 0 ; i < argc ; i ++ ) {
3179- zstr = zval_get_string (& argv [i ]);
3180- redis_cmd_append_sstr_zstr (& cmdstr , zstr );
3181- zend_string_release (zstr );
3182- }
3183-
3184- * cmd_len = cmdstr .len ;
3185- return cmdstr .c ;
3186- }
3187-
31883265int redis_auth_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
31893266 char * * cmd , int * cmd_len , short * slot , void * * ctx )
31903267{
0 commit comments