diff --git a/settings/Controller/AuthSettingsController.php b/settings/Controller/AuthSettingsController.php index 0afc37e7cc32a..345a8829cb8ab 100644 --- a/settings/Controller/AuthSettingsController.php +++ b/settings/Controller/AuthSettingsController.php @@ -30,6 +30,7 @@ use BadMethodCallException; use OC\AppFramework\Http; use OC\Authentication\Exceptions\InvalidTokenException; +use OC\Authentication\Exceptions\ExpiredTokenException; use OC\Authentication\Exceptions\PasswordlessTokenException; use OC\Authentication\Token\INamedToken; use OC\Authentication\Token\IProvider; @@ -237,10 +238,13 @@ private function publishActivity(string $subject, int $id, array $parameters = [ * @param int $id * @return IToken * @throws InvalidTokenException - * @throws \OC\Authentication\Exceptions\ExpiredTokenException */ private function findTokenByIdAndUser(int $id): IToken { - $token = $this->tokenProvider->getTokenById($id); + try { + $token = $this->tokenProvider->getTokenById($id); + } catch (ExpiredTokenException $e) { + $token = $e->getToken(); + } if ($token->getUID() !== $this->uid) { throw new InvalidTokenException('This token does not belong to you!'); } diff --git a/tests/Settings/Controller/AuthSettingsControllerTest.php b/tests/Settings/Controller/AuthSettingsControllerTest.php index 198b3a72c3326..f32a71f1e22e8 100644 --- a/tests/Settings/Controller/AuthSettingsControllerTest.php +++ b/tests/Settings/Controller/AuthSettingsControllerTest.php @@ -23,6 +23,7 @@ use OC\AppFramework\Http; use OC\Authentication\Exceptions\InvalidTokenException; +use OC\Authentication\Exceptions\ExpiredTokenException; use OC\Authentication\Token\DefaultToken; use OC\Authentication\Token\IProvider; use OC\Authentication\Token\IToken; @@ -177,6 +178,30 @@ public function testDestroy() { $this->assertEquals([], $this->controller->destroy($tokenId)); } + public function testDestroyExpired() { + $tokenId = 124; + $token = $this->createMock(DefaultToken::class); + + $token->expects($this->exactly(2)) + ->method('getId') + ->willReturn($tokenId); + + $token->expects($this->once()) + ->method('getUID') + ->willReturn($this->uid); + + $this->tokenProvider->expects($this->once()) + ->method('getTokenById') + ->with($this->equalTo($tokenId)) + ->willThrowException(new ExpiredTokenException($token)); + + $this->tokenProvider->expects($this->once()) + ->method('invalidateTokenById') + ->with($this->uid, $tokenId); + + $this->assertSame([], $this->controller->destroy($tokenId)); + } + public function testDestroyWrongUser() { $tokenId = 124; $token = $this->createMock(DefaultToken::class); @@ -307,6 +332,26 @@ public function testUpdateNoChange(): void { $this->assertSame([], $this->controller->update($tokenId, ['filesystem' => true], 'App password')); } + public function testUpdateExpired() { + $tokenId = 42; + $token = $this->createMock(DefaultToken::class); + + $token->expects($this->once()) + ->method('getUID') + ->willReturn($this->uid); + + $this->tokenProvider->expects($this->once()) + ->method('getTokenById') + ->with($this->equalTo($tokenId)) + ->willThrowException(new ExpiredTokenException($token)); + + $this->tokenProvider->expects($this->once()) + ->method('updateToken') + ->with($this->equalTo($token)); + + $this->assertSame([], $this->controller->update($tokenId, ['filesystem' => true], 'App password')); + } + public function testUpdateTokenWrongUser() { $tokenId = 42; $token = $this->createMock(DefaultToken::class);