From 16bbd3fd7c3956b48a0f85d9479a27ccc5d9ecf2 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 8 Dec 2016 11:38:23 +0100 Subject: [PATCH] fix password reset if encryption is enabled Signed-off-by: Bjoern Schiessle --- core/Controller/LostController.php | 8 +++- tests/Core/Controller/LostControllerTest.php | 39 ++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/core/Controller/LostController.php b/core/Controller/LostController.php index 01c107e832..b12abf3814 100644 --- a/core/Controller/LostController.php +++ b/core/Controller/LostController.php @@ -30,6 +30,7 @@ namespace OC\Core\Controller; +use OCA\Encryption\Exceptions\PrivateKeyMissingException; use \OCP\AppFramework\Controller; use \OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Utility\ITimeFactory; @@ -154,7 +155,7 @@ class LostController extends Controller { * @param string $userId * @throws \Exception */ - private function checkPasswordResetToken($token, $userId) { + protected function checkPasswordResetToken($token, $userId) { $user = $this->userManager->get($userId); if($user === null) { throw new \Exception($this->l10n->t('Couldn\'t reset password because the token is invalid')); @@ -241,6 +242,11 @@ class LostController extends Controller { $this->config->deleteUserValue($userId, 'core', 'lostpassword'); @\OC_User::unsetMagicInCookie(); + } catch (PrivateKeyMissingException $e) { + // in this case it is OK if we couldn't reset the users private key + // They chose explicitely to continue at the password reset dialog + // (see $proceed flag) + return $this->success(); } catch (\Exception $e){ return $this->error($e->getMessage()); } diff --git a/tests/Core/Controller/LostControllerTest.php b/tests/Core/Controller/LostControllerTest.php index 605298b66c..3e7456648e 100644 --- a/tests/Core/Controller/LostControllerTest.php +++ b/tests/Core/Controller/LostControllerTest.php @@ -23,6 +23,7 @@ namespace Tests\Core\Controller; use OC\Core\Controller\LostController; use OC\Mail\Message; +use OCA\Encryption\Exceptions\PrivateKeyMissingException; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Encryption\IManager; @@ -590,4 +591,42 @@ class LostControllerTest extends \Test\TestCase { $this->assertSame($expectedResponse, $response); } + public function testSetPasswordEncryptionProceed() { + + /** @var LostController | PHPUnit_Framework_MockObject_MockObject $lostController */ + $lostController = $this->getMockBuilder(LostController::class) + ->setConstructorArgs( + [ + 'Core', + $this->request, + $this->urlGenerator, + $this->userManager, + $this->defaults, + $this->l10n, + $this->config, + $this->secureRandom, + 'lostpassword-noreply@localhost', + $this->encryptionManager, + $this->mailer, + $this->timeFactory, + $this->crypto + ] + )->setMethods(['checkPasswordResetToken'])->getMock(); + + $lostController->expects($this->once())->method('checkPasswordResetToken')->willReturn(true); + + $user = $this->createMock(IUser::class); + $user->method('setPassword')->willReturnCallback( + function() { + throw new PrivateKeyMissingException('user'); + } + ); + $this->userManager->method('get')->with('user')->willReturn($user); + + $response = $lostController->setPassword('myToken', 'user', 'newpass', true); + + $expectedResponse = ['status' => 'success']; + $this->assertSame($expectedResponse, $response); + } + }