3232
3333extern zend_class_entry * redis_ce ;
3434
35- RedisArray *
36- ra_load_hosts (RedisArray * ra , HashTable * hosts , long retry_interval , zend_bool b_lazy_connect TSRMLS_DC )
35+ static RedisArray *
36+ ra_load_hosts (RedisArray * ra , HashTable * hosts , zend_string * auth , long retry_interval , zend_bool b_lazy_connect TSRMLS_DC )
3737{
3838 int i = 0 , host_len ;
3939 char * host , * p ;
@@ -77,6 +77,9 @@ ra_load_hosts(RedisArray *ra, HashTable *hosts, long retry_interval, zend_bool b
7777 /* create socket */
7878 redis -> sock = redis_sock_create (host , host_len , port , ra -> connect_timeout , ra -> read_timeout , ra -> pconnect , NULL , retry_interval );
7979
80+ /* copy password is specified */
81+ if (auth ) redis -> sock -> auth = zend_string_copy (auth );
82+
8083 if (!b_lazy_connect )
8184 {
8285 /* connect */
@@ -178,9 +181,10 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
178181 zval z_params_read_timeout ;
179182 zval z_params_lazy_connect ;
180183 zval z_params_consistent ;
184+ zval z_params_auth ;
181185 RedisArray * ra = NULL ;
182186
183- zend_string * algorithm = NULL ;
187+ zend_string * algorithm = NULL , * auth = NULL ;
184188 zend_bool b_index = 0 , b_autorehash = 0 , b_pconnect = 0 , consistent = 0 ;
185189 long l_retry_interval = 0 ;
186190 zend_bool b_lazy_connect = 0 ;
@@ -338,16 +342,25 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
338342 }
339343 }
340344
345+ /* find auth option */
346+ array_init (& z_params_auth );
347+ if ((iptr = INI_STR ("redis.arrays.auth" )) != NULL ) {
348+ sapi_module .treat_data (PARSE_STRING , estrdup (iptr ), & z_params_auth TSRMLS_CC );
349+ }
350+ if ((z_data = zend_hash_str_find (Z_ARRVAL (z_params_auth ), name , name_len )) != NULL ) {
351+ auth = zval_get_string (z_data );
352+ }
341353
342354 /* create RedisArray object */
343- ra = ra_make_array (hHosts , & z_fun , & z_dist , hPrev , b_index , b_pconnect , l_retry_interval , b_lazy_connect , d_connect_timeout , read_timeout , consistent , algorithm TSRMLS_CC );
355+ ra = ra_make_array (hHosts , & z_fun , & z_dist , hPrev , b_index , b_pconnect , l_retry_interval , b_lazy_connect , d_connect_timeout , read_timeout , consistent , algorithm , auth TSRMLS_CC );
344356 if (ra ) {
345357 ra -> auto_rehash = b_autorehash ;
346358 if (ra -> prev ) ra -> prev -> auto_rehash = b_autorehash ;
347359 }
348360
349361 /* cleanup */
350362 if (algorithm ) zend_string_release (algorithm );
363+ if (auth ) zend_string_release (auth );
351364
352365 zval_dtor (& z_params_hosts );
353366 zval_dtor (& z_params_prev );
@@ -362,6 +375,7 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
362375 zval_dtor (& z_params_read_timeout );
363376 zval_dtor (& z_params_lazy_connect );
364377 zval_dtor (& z_params_consistent );
378+ zval_dtor (& z_params_auth );
365379 zval_dtor (& z_dist );
366380 zval_dtor (& z_fun );
367381
@@ -409,8 +423,8 @@ ra_make_continuum(zend_string **hosts, int nb_hosts)
409423}
410424
411425RedisArray *
412- ra_make_array (HashTable * hosts , zval * z_fun , zval * z_dist , HashTable * hosts_prev , zend_bool b_index , zend_bool b_pconnect , long retry_interval , zend_bool b_lazy_connect , double connect_timeout , double read_timeout , zend_bool consistent , zend_string * algorithm TSRMLS_DC ) {
413-
426+ ra_make_array (HashTable * hosts , zval * z_fun , zval * z_dist , HashTable * hosts_prev , zend_bool b_index , zend_bool b_pconnect , long retry_interval , zend_bool b_lazy_connect , double connect_timeout , double read_timeout , zend_bool consistent , zend_string * algorithm , zend_string * auth TSRMLS_DC )
427+ {
414428 int i , count ;
415429 RedisArray * ra ;
416430
@@ -430,7 +444,7 @@ ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev
430444 ra -> continuum = NULL ;
431445 ra -> algorithm = NULL ;
432446
433- if (ra_load_hosts (ra , hosts , retry_interval , b_lazy_connect TSRMLS_CC ) == NULL || !ra -> count ) {
447+ if (ra_load_hosts (ra , hosts , auth , retry_interval , b_lazy_connect TSRMLS_CC ) == NULL || !ra -> count ) {
434448 for (i = 0 ; i < ra -> count ; ++ i ) {
435449 zval_dtor (& ra -> redis [i ]);
436450 zend_string_release (ra -> hosts [i ]);
@@ -440,7 +454,7 @@ ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev
440454 efree (ra );
441455 return NULL ;
442456 }
443- ra -> prev = hosts_prev ? ra_make_array (hosts_prev , z_fun , z_dist , NULL , b_index , b_pconnect , retry_interval , b_lazy_connect , connect_timeout , read_timeout , consistent , algorithm TSRMLS_CC ) : NULL ;
457+ ra -> prev = hosts_prev ? ra_make_array (hosts_prev , z_fun , z_dist , NULL , b_index , b_pconnect , retry_interval , b_lazy_connect , connect_timeout , read_timeout , consistent , algorithm , auth TSRMLS_CC ) : NULL ;
444458
445459 /* init array data structures */
446460 ra_init_function_table (ra );
0 commit comments