8000 - · symfony/symfony@9de08db · GitHub
[go: up one dir, main page]

Skip to content

Commit 9de08db

Browse files
gam6itkonicolas-grekas
authored andcommitted
-
1 parent 03d0e1a commit 9de08db

File tree

4 files changed

+28
-106
lines changed

4 files changed

+28
-106
lines changed

src/Symfony/Component/Cache/CHANGELOG.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ CHANGELOG
44
6.1
55
---
66

7-
* Add support of DSN username:password section in RedisAdapter which allows using ACL AUTH. Use `default` username for default user.
7+
* Add support for ACL auth in RedisAdapter
88

99
6.0
1010
---
@@ -18,7 +18,6 @@ CHANGELOG
1818
* Deprecate `DoctrineProvider` and `DoctrineAdapter` because these classes have been added to the `doctrine/cache` package
1919
* Add `DoctrineDbalAdapter` identical to `PdoAdapter` for `Doctrine\DBAL\Connection` or DBAL URL
2020
* Deprecate usage of `PdoAdapter` with `Doctrine\DBAL\Connection` or DBAL URL
21-
* added support of DSN username:password section in RedisAdapter which allows using ACL AUTH. Use `default` username for default user.
2221

2322
5.3
2423
---

src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php

Lines changed: 14 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -52,74 +52,34 @@ public function testCreateConnection()
5252
public function testDefaultUserPasswordAuth()
5353
{
5454
$predis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'), ['class' => \Predis\Client::class]);
55-
self::assertInstanceOf(\Predis\Client::class, $predis);
56-
// set password for default user
5755
$predis->config('SET', 'requirepass', 'password');
5856

59-
// connect with only default user password
60-
$predis = RedisAdapter::createConnection('redis://password@'.getenv('REDIS_HOST'));
57+
$predis = RedisAdapter::createConnection('redis://password@'.getenv('REDIS_HOST'), ['class' => \Predis\Client::class]);
58+
$this->assertInstanceOf(\Predis\Client::class, $predis);
6159
$predis->set(__FUNCTION__, 'value1');
62-
self::assertSame('value1', $predis->get(__FUNCTION__));
60+
$this->assertSame('value1', $predis->get(__FUNCTION__));
6361

64-
// remove password
65-
$predis = RedisAdapter::createConnection('redis://password@'.getenv('REDIS_HOST'));
6662
$predis->config('SET', 'requirepass', null);
67-
68-
// connect with no password
69-
$predis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
70-
$predis->set(__FUNCTION__, 'value3');
71-
self::assertSame('value3', $predis->get(__FUNCTION__));
7263
}
7364

7465
public function testAclUserPasswordAuth()
7566
{
76-
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
77-
$redisServerInfo = $redis->info();
78-
if (-1 === version_compare($redisServerInfo['redis_version'], '6.0.0')) {
79-
self::markTestSkipped('Redis server version should be greater than 6.0.0 for testing ACL features');
80-
}
81-
8267
// creating user via php-redis cause Predis (v1.1.10) does not support ACL command yet
83-
self::assertTrue($redis->acl('SETUSER', 'predis', 'on'));
84-
self::assertTrue($redis->acl('SETUSER', 'predis', '>password'));
85-
self::assertTrue($redis->acl('SETUSER', 'predis', 'allkeys'));
86-
self::assertTrue($redis->acl('SETUSER', 'predis', '+@all'));
87-
88-
// auth by ACL user with Predis
89-
$predis = RedisAdapter::createConnection('redis://predis:password@'.getenv('REDIS_HOST'), ['class' => \Predis\Client::class]);
90-
self::assertInstanceOf(\Predis\Client::class, $predis);
91-
self::assertSame('OK', $predis->set(__FUNCTION__, 'value2')->getPayload());
92-
93-
// ACL delete user via php-redis
94-
self::assertSame(1, $redis->acl('DELUSER', 'predis'));
95-
}
96-
97-
public function testAclOnRedisBelowVersion6ShouldNotFall()
98-
{
9968
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
100-
$redisServerInfo = $redis->info();
101-
if (1 === version_compare($redisServerInfo['redis_version'], '6.0.0')) {
102-
self::markTestSkipped('Redis server version should be lower than 6.0.0 for testing for this test case');
69+
70+
if (version_compare($redis->info()['redis_version'], '6.0', '<')) {
71+
$this->markTestSkipped('Redis server >= 6.0 required');
10372
}
10473

105-
// auth by ACL user with Predis
106-
$predis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'), ['class' => \Predis\Client::class]);
107-
self::assertInstanceOf(\Predis\Client::class, $predis);
108-
self::assertSame('OK', $predis->set(__FUNCTION__, 'value2')->getPayload());
109-
}
74+
$this->assertTrue($redis->acl('SETUSER', 'predis', 'on'));
75+
$this->assertTrue($redis->acl('SETUSER', 'predis', '>password'));
76+
$this->assertTrue($redis->acl('SETUSER', 'predis', 'allkeys'));
77+
$this->assertTrue($redis->acl('SETUSER', 'predis', '+@all'));
11078

111-
public function testAclOnRedisBelowVersion6ShouldThrowNoAuth()
112-
{
113-
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
114-
$redisServerInfo = $redis->info('server');
115-
if (1 === version_compare($redisServerInfo['redis_version'], '6.0.0')) {
116-
self::markTestSkipped('Redis server version should be lower than 6.0.0 for testing for this test case');
117-
}
79+
$predis = RedisAdapter::createConnection('redis://predis:password@'.getenv('REDIS_HOST'), ['class' => \Predis\Client::class]);
80+
$this->assertInstanceOf(\Predis\Client::class, $predis);
81+
$this->assertSame('OK', $predis->set(__FUNCTION__, 'value2')->getPayload());
11882

119-
self::expectException(\Predis\Connection\ConnectionException::class);
120-
self::expectExceptionMessageMatches("/^`AUTH` failed: ERR wrong number of arguments for 'auth' command.*$/");
121-
$predis = RedisAdapter::createConnection('redis://username:password@'.getenv('REDIS_HOST'), ['class' => \Predis\Client::class]);
122-
self::assertInstanceOf(\Predis\Client::class, $predis);
123-
self::assertSame('OK', $predis->set(__FUNCTION__, 'value2')->getPayload());
83+
$this->assertSame(1, $redis->acl('DELUSER', 'predis'));
12484
}
12585
}

src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterTest.php

Lines changed: 10 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -134,68 +134,32 @@ public function provideInvalidCreateConnection(): array
134134
public function testDefaultUserPasswordAuth()
135135
{
136136
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
137-
// set password for default user
138137
$redis->config('SET', 'requirepass', 'password');
139138

140-
// connect with only default user password
141139
$redis = RedisAdapter::createConnection('redis://password@'.getenv('REDIS_HOST'));
142140
$redis->set(__FUNCTION__, 'value1');
143-
self::assertSame('value1', $redis->get(__FUNCTION__));
141+
$this->assertSame('value1', $redis->get(__FUNCTION__));
144142

145-
// remove password
146-
$redis = RedisAdapter::createConnection('redis://password@'.getenv('REDIS_HOST'));
147143
$redis->config('SET', 'requirepass', null);
148-
149-
// connect with no password
150-
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
151-
$redis->set(__FUNCTION__, 'value3');
152-
self::assertSame('value3', $redis->get(__FUNCTION__));
153144
}
154145

155146
public function testAclUserPasswordAuth()
156147
{
157148
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
158-
$redisServerInfo = $redis->info();
159-
if (-1 === version_compare($redisServerInfo['redis_version'], '6.0.0')) {
160-
self::markTestSkipped('Redis server version should be greater than 6.0.0 for testing ACL features');
149+
150+
if (version_compare($redis->info()['redis_version'], '6.0', '<')) {
151+
$this->markTestSkipped('Redis server >= 6.0 required');
161152
}
162153

163-
self::assertTrue($redis->acl('SETUSER', 'alice', 'on'));
164-
self::assertTrue($redis->acl('SETUSER', 'alice', '>password'));
165-
self::assertTrue($redis->acl('SETUSER', 'alice', 'allkeys'));
166-
self::assertTrue($redis->acl('SETUSER', 'alice', '+@all'));
154+
$this->assertTrue($redis->acl('SETUSER', 'alice', 'on'));
155+
$this->assertTrue($redis->acl('SETUSER', 'alice', '>password'));
156+
$this->assertTrue($redis->acl('SETUSER', 'alice', 'allkeys'));
157+
$this->assertTrue($redis->acl('SETUSER', 'alice', '+@all'));
167158

168-
// auth by ACL user
169159
$redis = RedisAdapter::createConnection('redis://alice:password@'.getenv('REDIS_HOST'));
170-
self::assertTrue($redis->set(__FUNCTION__, 'value2'));
171-
172-
// ACL delete user
173-
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
174-
self::assertSame(1, $redis->acl('DELUSER', 'alice'));
175-
}
176-
177-
public function testAclOnRedisBelowVersion6ShouldNotFall()
178-
{
179-
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
180-
$redisServerInfo = $redis->info();
181-
if (1 === version_compare($redisServerInfo['redis_version'], '6.0.0')) {
182-
self::markTestSkipped('Redis server version should be lower than 6.0.0 for testing for this test case');
183-
}
184-
185-
self::assertTrue($redis->set(__FUNCTION__, 'value2'));
186-
}
160+
$this->assertTrue($redis->set(__FUNCTION__, 'value2'));
187161

188-
public function testAclOnRedisBelowVersion6ShouldThrowNoAuth()
189-
{
190162
$redis = RedisAdapter::createConnection('redis://'.getenv('REDIS_HOST'));
191-
$redisServerInfo = $redis->info('server');
192-
if (1 === version_compare($redisServerInfo['redis_version'], '6.0.0')) {
193-
self::markTestSkipped('Redis server version should be lower than 6.0.0 for testing for this test case');
194-
}
195-
196-
self::expectException(InvalidArgumentException::class);
197-
self::expectExceptionMessageMatches('/^Redis connection "(?:.+)" failed: wrong number of arguments for \'auth\' command/');
198-
$redis = RedisAdapter::createConnection('redis://username:password@'.getenv('REDIS_HOST'));
199-
self::assertTrue($redis->set(__FUNCTION__, 'value2'));
163+
$this->assertSame(1, $redis->acl('DELUSER', 'alice'));
200164
}
201165
}

src/Symfony/Component/Cache/Traits/RedisTrait.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,10 @@ public static function createConnection(string $dsn, array $options = []): \Redi
9595

9696
$params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:(?<user>[^:@]*+):)?(?<password>[^@]*+)@)?#', function ($m) use (&$auth) {
9797
if (isset($m['password'])) {
98-
if (!empty($m['user'])) {
99-
// ACL
100-
$auth = [$m['user'], $m['password']];
101-
} else {
98+
if (\in_array($m['user'], ['', 'default'], true)) {
10299
$auth = $m['password'];
100+
} else {
101+
$auth = [$m['user'], $m['password']];
103102
}
104103

105104
if ('' === $auth) {

0 commit comments

Comments
 (0)
0