From fa71a9a0ce0c2bf1384ff91b18accd95632735f9 Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Sat, 20 Apr 2019 13:40:40 +0200 Subject: [PATCH 1/3] Improve redis configuration - basic authentication - switch database (0 - 15) --- src/Core/Cache/RedisCacheDriver.php | 16 +++++++++++++--- src/Factory/CacheDriverFactory.php | 6 ++++-- tests/src/Core/Cache/RedisCacheDriverTest.php | 10 ++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/Core/Cache/RedisCacheDriver.php b/src/Core/Cache/RedisCacheDriver.php index 6559cf6a7..ea4eb4390 100644 --- a/src/Core/Cache/RedisCacheDriver.php +++ b/src/Core/Cache/RedisCacheDriver.php @@ -20,11 +20,13 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver private $redis; /** - * @param string $redis_host - * @param int $redis_port + * @param string $redis_host + * @param int $redis_port + * @param int $redis_db (Default = 0, maximum is 15) + * @param string? $redis_pw * @throws Exception */ - public function __construct($redis_host, $redis_port) + public function __construct($redis_host, $redis_port, $redis_db = 0, $redis_pw = null) { if (!class_exists('Redis', false)) { throw new Exception('Redis class isn\'t available'); @@ -35,6 +37,14 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver if (!$this->redis->connect($redis_host, $redis_port)) { throw new Exception('Expected Redis server at ' . $redis_host . ':' . $redis_port . ' isn\'t available'); } + + if (isset($redis_pw) && !$this->redis->auth($redis_pw)) { + throw new Exception('Cannot authenticate redis server at ' . $redis_host . ':' . $redis_port); + } + + if ($redis_db !== 0 && !$this->redis->select($redis_db)) { + throw new Exception('Cannot switch to redis db ' . $redis_db . ' at ' . $redis_host . ':' . $redis_port); + } } /** diff --git a/src/Factory/CacheDriverFactory.php b/src/Factory/CacheDriverFactory.php index 1008b6794..f802d73fa 100644 --- a/src/Factory/CacheDriverFactory.php +++ b/src/Factory/CacheDriverFactory.php @@ -2,9 +2,9 @@ namespace Friendica\Factory; +use Friendica\Core\Cache; use Friendica\Core\Cache\ICacheDriver; use Friendica\Core\Config; -use Friendica\Core\Cache; /** * Class CacheDriverFactory @@ -40,8 +40,10 @@ class CacheDriverFactory case 'redis': $redis_host = Config::get('system', 'redis_host'); $redis_port = Config::get('system', 'redis_port'); + $redis_pw = Config::get('system', 'redis_password'); + $redis_db = Config::get('system', 'redis_db', 0); - return new Cache\RedisCacheDriver($redis_host, $redis_port); + return new Cache\RedisCacheDriver($redis_host, $redis_port, $redis_db, $redis_pw); break; default: return new Cache\DatabaseCacheDriver(); diff --git a/tests/src/Core/Cache/RedisCacheDriverTest.php b/tests/src/Core/Cache/RedisCacheDriverTest.php index 80baa9f4b..6e11c3b8a 100644 --- a/tests/src/Core/Cache/RedisCacheDriverTest.php +++ b/tests/src/Core/Cache/RedisCacheDriverTest.php @@ -22,6 +22,16 @@ class RedisCacheDriverTest extends MemoryCacheTest ->with('system', 'redis_port') ->andReturn(null); + $this->configMock + ->shouldReceive('get') + ->with('system', 'redis_db') + ->andReturn(3); + + $this->configMock + ->shouldReceive('get') + ->with('system', 'redis_password') + ->andReturn(null); + $this->cache = CacheDriverFactory::create('redis'); return $this->cache; } From b83e8683d8c7b2579aad28948546a3adeece81d4 Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Sat, 20 Apr 2019 13:44:27 +0200 Subject: [PATCH 2/3] Add default config for the new redis configuration --- config/defaults.config.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config/defaults.config.php b/config/defaults.config.php index 5540ddbb4..b4471af25 100644 --- a/config/defaults.config.php +++ b/config/defaults.config.php @@ -343,6 +343,14 @@ return [ // Port number of the redis daemon. 'redis_port' => 6379, + // redis_db (Integer) + // The sub-database of redis (0 - 15 possible sub-databases) + 'redis_db' => 0, + + // redis_password (String) + // The authentication password for the redis database + 'redis_password' => null, + // session_handler (database|cache|native) // Whether to use Cache to store session data or to use PHP native session storage. 'session_handler' => 'database', From e062baadf81e2566b7503a904569de4c5e46e8b9 Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Sat, 20 Apr 2019 14:20:31 +0200 Subject: [PATCH 3/3] Fix redis cache lock driver test --- tests/src/Core/Lock/RedisCacheLockDriverTest.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/src/Core/Lock/RedisCacheLockDriverTest.php b/tests/src/Core/Lock/RedisCacheLockDriverTest.php index d21f3b6d8..21bace501 100644 --- a/tests/src/Core/Lock/RedisCacheLockDriverTest.php +++ b/tests/src/Core/Lock/RedisCacheLockDriverTest.php @@ -3,8 +3,8 @@ namespace Friendica\Test\src\Core\Lock; -use Friendica\Factory\CacheDriverFactory; use Friendica\Core\Lock\CacheLockDriver; +use Friendica\Factory\CacheDriverFactory; /** * @requires extension redis @@ -23,6 +23,16 @@ class RedisCacheLockDriverTest extends LockTest ->with('system', 'redis_port') ->andReturn(null); + $this->configMock + ->shouldReceive('get') + ->with('system', 'redis_db') + ->andReturn(3); + + $this->configMock + ->shouldReceive('get') + ->with('system', 'redis_password') + ->andReturn(null); + return new CacheLockDriver(CacheDriverFactory::create('redis')); } }