diff --git a/lib/private/Authentication/Token/Manager.php b/lib/private/Authentication/Token/Manager.php index 6953f47b004fb..b55970a497908 100644 --- a/lib/private/Authentication/Token/Manager.php +++ b/lib/private/Authentication/Token/Manager.php @@ -7,7 +7,6 @@ */ namespace OC\Authentication\Token; -use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use OC\Authentication\Exceptions\InvalidTokenException as OcInvalidTokenException; use OC\Authentication\Exceptions\PasswordlessTokenException; use OCP\Authentication\Exceptions\ExpiredTokenException; @@ -15,6 +14,7 @@ use OCP\Authentication\Exceptions\WipeTokenException; use OCP\Authentication\Token\IProvider as OCPIProvider; use OCP\Authentication\Token\IToken as OCPIToken; +use OCP\DB\Exception; class Manager implements IProvider, OCPIProvider { /** @var PublicKeyTokenProvider */ @@ -60,7 +60,10 @@ public function generateToken(string $token, $remember, $scope, ); - } catch (UniqueConstraintViolationException $e) { + } catch (Exception $e) { + if ($e->getReason() !== Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + throw $e; + } // It's rare, but if two requests of the same session (e.g. env-based SAML) // try to create the session token they might end up here at the same time // because we use the session ID as token and the db token is created anew diff --git a/tests/lib/Authentication/Token/ManagerTest.php b/tests/lib/Authentication/Token/ManagerTest.php index 98baffed14bab..f023c959a4e41 100644 --- a/tests/lib/Authentication/Token/ManagerTest.php +++ b/tests/lib/Authentication/Token/ManagerTest.php @@ -9,12 +9,12 @@ namespace Test\Authentication\Token; -use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use OC\Authentication\Exceptions\InvalidTokenException; use OC\Authentication\Token\IToken; use OC\Authentication\Token\Manager; use OC\Authentication\Token\PublicKeyToken; use OC\Authentication\Token\PublicKeyTokenProvider; +use OCP\DB\Exception; use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; @@ -61,9 +61,10 @@ public function testGenerateToken() { $this->assertSame($token, $actual); } - public function testGenerateConflictingToken() { - /** @var MockObject|UniqueConstraintViolationException $exception */ - $exception = $this->createMock(UniqueConstraintViolationException::class); + public function testGenerateConflictingToken(): void { + /** @var MockObject&Exception $exception */ + $exception = $this->createMock(Exception::class); + $exception->method('getReason')->willReturn(Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION); $token = new PublicKeyToken(); $token->setUid('uid');