diff --git a/cache/stores/redis/addinstanceform.php b/cache/stores/redis/addinstanceform.php index 8da4f1e3577..ad9bc005359 100644 --- a/cache/stores/redis/addinstanceform.php +++ b/cache/stores/redis/addinstanceform.php @@ -44,6 +44,10 @@ class cachestore_redis_addinstance_form extends cachestore_addinstance_form { $form->addHelpButton('server', 'server', 'cachestore_redis'); $form->addRule('server', get_string('required'), 'required'); + $form->addElement('passwordunmask', 'password', get_string('password', 'cachestore_redis')); + $form->setType('password', PARAM_RAW); + $form->addHelpButton('password', 'password', 'cachestore_redis'); + $form->addElement('text', 'prefix', get_string('prefix', 'cachestore_redis'), array('size' => 16)); $form->setType('prefix', PARAM_TEXT); // We set to text but we have a rule to limit to alphanumext. $form->addHelpButton('prefix', 'prefix', 'cachestore_redis'); @@ -55,4 +59,4 @@ class cachestore_redis_addinstance_form extends cachestore_addinstance_form { $form->setDefault('serializer', Redis::SERIALIZER_PHP); $form->setType('serializer', PARAM_INT); } -} \ No newline at end of file +} diff --git a/cache/stores/redis/lang/en/cachestore_redis.php b/cache/stores/redis/lang/en/cachestore_redis.php index a44a1562e37..26aad4e9aa2 100644 --- a/cache/stores/redis/lang/en/cachestore_redis.php +++ b/cache/stores/redis/lang/en/cachestore_redis.php @@ -34,8 +34,12 @@ $string['serializer_igbinary'] = 'The igbinary serializer.'; $string['serializer_php'] = 'The default PHP serializer.'; $string['server'] = 'Server'; $string['server_help'] = 'This sets the hostname or IP address of the Redis server to use.'; +$string['password'] = 'Password'; +$string['password_help'] = 'This sets the password of the Redis server.'; $string['test_server'] = 'Test server'; $string['test_server_desc'] = 'Redis server to use for testing.'; +$string['test_password'] = 'Test server password'; +$string['test_password_desc'] = 'Redis test server password.'; $string['test_serializer'] = 'Serializer'; $string['test_serializer_desc'] = 'Serializer to use for testing.'; $string['useserializer'] = 'Use serializer'; diff --git a/cache/stores/redis/lib.php b/cache/stores/redis/lib.php index fd19709ecf6..d02938bbac4 100644 --- a/cache/stores/redis/lib.php +++ b/cache/stores/redis/lib.php @@ -134,8 +134,9 @@ class cachestore_redis extends cache_store implements cache_is_key_aware, cache_ if (array_key_exists('serializer', $configuration)) { $this->serializer = (int)$configuration['serializer']; } + $password = !empty($configuration['password']) ? $configuration['password'] : ''; $prefix = !empty($configuration['prefix']) ? $configuration['prefix'] : ''; - $this->redis = $this->new_redis($configuration['server'], $prefix); + $this->redis = $this->new_redis($configuration['server'], $prefix, $password); } /** @@ -144,9 +145,10 @@ class cachestore_redis extends cache_store implements cache_is_key_aware, cache_ * * @param string $server The server connection string * @param string $prefix The key prefix + * @param string $password The server connection password * @return Redis */ - protected function new_redis($server, $prefix = '') { + protected function new_redis($server, $prefix = '', $password = '') { $redis = new Redis(); $port = null; if (strpos($server, ':')) { @@ -155,6 +157,9 @@ class cachestore_redis extends cache_store implements cache_is_key_aware, cache_ $port = $serverconf[1]; } if ($redis->connect($server, $port)) { + if (!empty($password)) { + $redis->auth($password); + } $redis->setOption(Redis::OPT_SERIALIZER, $this->serializer); if (!empty($prefix)) { $redis->setOption(Redis::OPT_PREFIX, $prefix); diff --git a/cache/stores/redis/settings.php b/cache/stores/redis/settings.php index 078781511b4..67f651cfa24 100644 --- a/cache/stores/redis/settings.php +++ b/cache/stores/redis/settings.php @@ -34,6 +34,14 @@ $settings->add( 16 ) ); +$settings->add( + new admin_setting_configpasswordunmask( + 'cachestore_redis/test_password', + get_string('test_password', 'cachestore_redis'), + get_string('test_password_desc', 'cachestore_redis'), + '' + ) +); if (class_exists('Redis')) { // Only if Redis is available. diff --git a/cache/stores/redis/version.php b/cache/stores/redis/version.php index 432a85a0639..3a8afba6229 100644 --- a/cache/stores/redis/version.php +++ b/cache/stores/redis/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2016120500; +$plugin->version = 2017031900; $plugin->requires = 2016112900; // Requires this Moodle version (3.0.4). $plugin->maturity = MATURITY_STABLE; $plugin->component = 'cachestore_redis'; diff --git a/config-dist.php b/config-dist.php index 41fd9509b85..a6882a05a23 100644 --- a/config-dist.php +++ b/config-dist.php @@ -265,6 +265,7 @@ $CFG->admin = 'admin'; // $CFG->session_redis_host = '127.0.0.1'; // $CFG->session_redis_port = 6379; // Optional. // $CFG->session_redis_database = 0; // Optional, default is db 0. +// $CFG->session_redis_auth = ''; // Optional, default is don't set one. // $CFG->session_redis_prefix = ''; // Optional, default is don't set one. // $CFG->session_redis_acquire_lock_timeout = 120; // $CFG->session_redis_lock_expire = 7200; diff --git a/lib/classes/session/redis.php b/lib/classes/session/redis.php index d90ed8b2001..780a3f4b836 100644 --- a/lib/classes/session/redis.php +++ b/lib/classes/session/redis.php @@ -44,6 +44,8 @@ class redis extends handler { protected $host = ''; /** @var int $port The port to connect to */ protected $port = 6379; + /** @var string $auth redis password */ + protected $auth = ''; /** @var int $database the Redis database to store sesions in */ protected $database = 0; /** @var array $servers list of servers parsed from save_path */ @@ -81,6 +83,10 @@ class redis extends handler { $this->port = (int)$CFG->session_redis_port; } + if (isset($CFG->session_redis_auth)) { + $this->auth = $CFG->session_redis_auth; + } + if (isset($CFG->session_redis_database)) { $this->database = (int)$CFG->session_redis_database; } @@ -156,6 +162,13 @@ class redis extends handler { if (!$this->connection->connect($this->host, $this->port, 1)) { throw new RedisException('Unable to connect to host.'); } + + if ($this->auth !== '') { + if (!$this->connection->auth($this->auth)) { + throw new RedisException('Unable to authenticate.'); + } + } + if (!$this->connection->setOption(\Redis::OPT_SERIALIZER, $this->serializer)) { throw new RedisException('Unable to set Redis PHP Serializer option.'); }