Unverified Commit 7782e661 authored by Mike Olsen's avatar Mike Olsen Committed by Skylar Kelty
Browse files

MDL-58311 cache: Add password support for redis

add password support for redis connects in cache and session
parent 98c4094e
...@@ -44,6 +44,10 @@ class cachestore_redis_addinstance_form extends cachestore_addinstance_form { ...@@ -44,6 +44,10 @@ class cachestore_redis_addinstance_form extends cachestore_addinstance_form {
$form->addHelpButton('server', 'server', 'cachestore_redis'); $form->addHelpButton('server', 'server', 'cachestore_redis');
$form->addRule('server', get_string('required'), 'required'); $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->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->setType('prefix', PARAM_TEXT); // We set to text but we have a rule to limit to alphanumext.
$form->addHelpButton('prefix', 'prefix', 'cachestore_redis'); $form->addHelpButton('prefix', 'prefix', 'cachestore_redis');
...@@ -55,4 +59,4 @@ class cachestore_redis_addinstance_form extends cachestore_addinstance_form { ...@@ -55,4 +59,4 @@ class cachestore_redis_addinstance_form extends cachestore_addinstance_form {
$form->setDefault('serializer', Redis::SERIALIZER_PHP); $form->setDefault('serializer', Redis::SERIALIZER_PHP);
$form->setType('serializer', PARAM_INT); $form->setType('serializer', PARAM_INT);
} }
} }
\ No newline at end of file
...@@ -34,8 +34,12 @@ $string['serializer_igbinary'] = 'The igbinary serializer.'; ...@@ -34,8 +34,12 @@ $string['serializer_igbinary'] = 'The igbinary serializer.';
$string['serializer_php'] = 'The default PHP serializer.'; $string['serializer_php'] = 'The default PHP serializer.';
$string['server'] = 'Server'; $string['server'] = 'Server';
$string['server_help'] = 'This sets the hostname or IP address of the Redis server to use.'; $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'] = 'Test server';
$string['test_server_desc'] = 'Redis server to use for testing.'; $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'] = 'Serializer';
$string['test_serializer_desc'] = 'Serializer to use for testing.'; $string['test_serializer_desc'] = 'Serializer to use for testing.';
$string['useserializer'] = 'Use serializer'; $string['useserializer'] = 'Use serializer';
......
...@@ -134,8 +134,9 @@ class cachestore_redis extends cache_store implements cache_is_key_aware, cache_ ...@@ -134,8 +134,9 @@ class cachestore_redis extends cache_store implements cache_is_key_aware, cache_
if (array_key_exists('serializer', $configuration)) { if (array_key_exists('serializer', $configuration)) {
$this->serializer = (int)$configuration['serializer']; $this->serializer = (int)$configuration['serializer'];
} }
$password = !empty($configuration['password']) ? $configuration['password'] : '';
$prefix = !empty($configuration['prefix']) ? $configuration['prefix'] : ''; $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_ ...@@ -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 $server The server connection string
* @param string $prefix The key prefix * @param string $prefix The key prefix
* @param string $password The server connection password
* @return Redis * @return Redis
*/ */
protected function new_redis($server, $prefix = '') { protected function new_redis($server, $prefix = '', $password = '') {
$redis = new Redis(); $redis = new Redis();
$port = null; $port = null;
if (strpos($server, ':')) { if (strpos($server, ':')) {
...@@ -155,6 +157,9 @@ class cachestore_redis extends cache_store implements cache_is_key_aware, cache_ ...@@ -155,6 +157,9 @@ class cachestore_redis extends cache_store implements cache_is_key_aware, cache_
$port = $serverconf[1]; $port = $serverconf[1];
} }
if ($redis->connect($server, $port)) { if ($redis->connect($server, $port)) {
if (!empty($password)) {
$redis->auth($password);
}
$redis->setOption(Redis::OPT_SERIALIZER, $this->serializer); $redis->setOption(Redis::OPT_SERIALIZER, $this->serializer);
if (!empty($prefix)) { if (!empty($prefix)) {
$redis->setOption(Redis::OPT_PREFIX, $prefix); $redis->setOption(Redis::OPT_PREFIX, $prefix);
......
...@@ -34,6 +34,14 @@ $settings->add( ...@@ -34,6 +34,14 @@ $settings->add(
16 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. if (class_exists('Redis')) { // Only if Redis is available.
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
defined('MOODLE_INTERNAL') || die(); defined('MOODLE_INTERNAL') || die();
$plugin->version = 2016120500; $plugin->version = 2017031900;
$plugin->requires = 2016112900; // Requires this Moodle version (3.0.4). $plugin->requires = 2016112900; // Requires this Moodle version (3.0.4).
$plugin->maturity = MATURITY_STABLE; $plugin->maturity = MATURITY_STABLE;
$plugin->component = 'cachestore_redis'; $plugin->component = 'cachestore_redis';
......
...@@ -265,6 +265,7 @@ $CFG->admin = 'admin'; ...@@ -265,6 +265,7 @@ $CFG->admin = 'admin';
// $CFG->session_redis_host = '127.0.0.1'; // $CFG->session_redis_host = '127.0.0.1';
// $CFG->session_redis_port = 6379; // Optional. // $CFG->session_redis_port = 6379; // Optional.
// $CFG->session_redis_database = 0; // Optional, default is db 0. // $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_prefix = ''; // Optional, default is don't set one.
// $CFG->session_redis_acquire_lock_timeout = 120; // $CFG->session_redis_acquire_lock_timeout = 120;
// $CFG->session_redis_lock_expire = 7200; // $CFG->session_redis_lock_expire = 7200;
......
...@@ -44,6 +44,8 @@ class redis extends handler { ...@@ -44,6 +44,8 @@ class redis extends handler {
protected $host = ''; protected $host = '';
/** @var int $port The port to connect to */ /** @var int $port The port to connect to */
protected $port = 6379; protected $port = 6379;
/** @var string $auth redis password */
protected $auth = '';
/** @var int $database the Redis database to store sesions in */ /** @var int $database the Redis database to store sesions in */
protected $database = 0; protected $database = 0;
/** @var array $servers list of servers parsed from save_path */ /** @var array $servers list of servers parsed from save_path */
...@@ -81,6 +83,10 @@ class redis extends handler { ...@@ -81,6 +83,10 @@ class redis extends handler {
$this->port = (int)$CFG->session_redis_port; $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)) { if (isset($CFG->session_redis_database)) {
$this->database = (int)$CFG->session_redis_database; $this->database = (int)$CFG->session_redis_database;
} }
...@@ -156,6 +162,13 @@ class redis extends handler { ...@@ -156,6 +162,13 @@ class redis extends handler {
if (!$this->connection->connect($this->host, $this->port, 1)) { if (!$this->connection->connect($this->host, $this->port, 1)) {
throw new RedisException('Unable to connect to host.'); 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)) { if (!$this->connection->setOption(\Redis::OPT_SERIALIZER, $this->serializer)) {
throw new RedisException('Unable to set Redis PHP Serializer option.'); throw new RedisException('Unable to set Redis PHP Serializer option.');
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment