diff options
author | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2023-03-31 15:29:26 +0200 |
---|---|---|
committer | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2023-03-31 17:01:17 +0200 |
commit | 997c2a2a79a97527f2dd3979e3d815ee6ce9fb51 (patch) | |
tree | 429c4dd057987ff442f7caee7dba6158c0b4ff7c | |
parent | a1aa4491acac6217061a1cecc8cb9d807292376c (diff) | |
download | nextcloud-server-997c2a2a79a97527f2dd3979e3d815ee6ce9fb51.tar.gz nextcloud-server-997c2a2a79a97527f2dd3979e3d815ee6ce9fb51.zip |
fix DBAL exception handling in setValues
This seems to be a left over after abstracting DBAL. Nowadays,
IQueryBuilder::executeStatement() only throws a \OCP\DB\Exception, where
previously original DBAL exceptions where thrown. These are now wrapped,
the orignal classes are now mapped to a reason.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
-rw-r--r-- | lib/private/DB/Connection.php | 18 | ||||
-rw-r--r-- | tests/lib/Security/CredentialsManagerTest.php | 23 |
2 files changed, 32 insertions, 9 deletions
diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php index ceaffbcfa9a..85c6a72dfdb 100644 --- a/lib/private/DB/Connection.php +++ b/lib/private/DB/Connection.php @@ -40,8 +40,6 @@ use Doctrine\DBAL\Cache\QueryCacheProfile; use Doctrine\DBAL\Configuration; use Doctrine\DBAL\Driver; use Doctrine\DBAL\Exception; -use Doctrine\DBAL\Exception\ConstraintViolationException; -use Doctrine\DBAL\Exception\NotNullConstraintViolationException; use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Platforms\OraclePlatform; use Doctrine\DBAL\Platforms\PostgreSQL94Platform; @@ -381,10 +379,10 @@ class Connection extends \Doctrine\DBAL\Connection { * @param array $values (column name => value) * @param array $updatePreconditionValues ensure values match preconditions (column name => value) * @return int number of new rows - * @throws \Doctrine\DBAL\Exception + * @throws \OCP\DB\Exception * @throws PreConditionNotMetException */ - public function setValues($table, array $keys, array $values, array $updatePreconditionValues = []) { + public function setValues(string $table, array $keys, array $values, array $updatePreconditionValues = []): int { try { $insertQb = $this->getQueryBuilder(); $insertQb->insert($table) @@ -394,9 +392,15 @@ class Connection extends \Doctrine\DBAL\Connection { }, array_merge($keys, $values)) ); return $insertQb->executeStatement(); - } catch (NotNullConstraintViolationException $e) { - throw $e; - } catch (ConstraintViolationException $e) { + } catch (\OCP\DB\Exception $e) { + if (!in_array($e->getReason(), [ + \OCP\DB\Exception::REASON_CONSTRAINT_VIOLATION, + \OCP\DB\Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION, + ]) + ) { + throw $e; + } + // value already exists, try update $updateQb = $this->getQueryBuilder(); $updateQb->update($table); diff --git a/tests/lib/Security/CredentialsManagerTest.php b/tests/lib/Security/CredentialsManagerTest.php index 6f535c84275..bb4feb8b6a9 100644 --- a/tests/lib/Security/CredentialsManagerTest.php +++ b/tests/lib/Security/CredentialsManagerTest.php @@ -24,6 +24,9 @@ declare(strict_types=1); namespace Test\Security; +use OCP\Security\ICredentialsManager; +use OCP\Server; + /** * @group DB */ @@ -32,7 +35,7 @@ class CredentialsManagerTest extends \Test\TestCase { * @dataProvider credentialsProvider */ public function testWithDB($userId, $identifier) { - $credentialsManager = \OC::$server->getCredentialsManager(); + $credentialsManager = Server::get(ICredentialsManager::class); $secrets = 'Open Sesame'; @@ -45,7 +48,23 @@ class CredentialsManagerTest extends \Test\TestCase { $this->assertSame(1, $removedRows); } - public function credentialsProvider() { + /** + * @dataProvider credentialsProvider + */ + public function testUpdate($userId, $identifier): void { + $credentialsManager = Server::get(ICredentialsManager::class); + + $secrets = 'Open Sesame'; + $secretsRev = strrev($secrets); + + $credentialsManager->store($userId, $identifier, $secrets); + $credentialsManager->store($userId, $identifier, $secretsRev); + $received = $credentialsManager->retrieve($userId, $identifier); + + $this->assertSame($secretsRev, $received); + } + + public function credentialsProvider(): array { return [ [ 'alice', |