Merge branch 'MDL-58311_master' of https://github.com/sk-unikent/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Mon, 10 Apr 2017 04:00:59 +0000 (12:00 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Mon, 10 Apr 2017 04:00:59 +0000 (12:00 +0800)
cache/stores/redis/addinstanceform.php
cache/stores/redis/lang/en/cachestore_redis.php
cache/stores/redis/lib.php
cache/stores/redis/settings.php
cache/stores/redis/version.php
config-dist.php
lib/classes/session/redis.php

index 8da4f1e..ad9bc00 100644 (file)
@@ -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
+}
index a44a156..26aad4e 100644 (file)
@@ -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';
index fd19709..d02938b 100644 (file)
@@ -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);
index 0787815..67f651c 100644 (file)
@@ -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.
 
index 432a85a..3a8afba 100644 (file)
@@ -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';
index 41fd950..a6882a0 100644 (file)
@@ -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;
index d90ed8b..780a3f4 100644 (file)
@@ -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.');
             }