Browse Source
Warn for password reset when files_encryption is enabled
Warn for password reset when files_encryption is enabled
This patch wil warn the user of the consequences when resetting the password and requires checking a checkbox (as we had in the past) to reset a password. Furthermore I updated the code to use our new classes and added some unit tests for it 👯 Fixes https://github.com/owncloud/core/issues/11438remotes/origin/fix-10825
10 changed files with 341 additions and 149 deletions
-
64core/application.php
-
19core/js/lostpassword.js
-
164core/lostpassword/controller/lostcontroller.php
-
14core/lostpassword/encrypteddataexception.php
-
20core/lostpassword/templates/lostpassword.php
-
9core/lostpassword/templates/resetpassword.php
-
195tests/core/lostpassword/controller/lostcontrollertest.php
-
1tests/phpunit-autotest.xml
-
2tests/phpunit.xml.dist
-
2tests/settings/controller/mailsettingscontrollertest.php
@ -1,14 +0,0 @@ |
|||
<?php |
|||
/** |
|||
* @author Victor Dubiniuk |
|||
* @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com |
|||
* |
|||
* This file is licensed under the Affero General Public License version 3 or |
|||
* later. |
|||
* See the COPYING-README file. |
|||
*/ |
|||
|
|||
namespace OC\Core\LostPassword; |
|||
|
|||
class EncryptedDataException extends \Exception{ |
|||
} |
|||
@ -1,20 +0,0 @@ |
|||
<?php |
|||
//load the file we need
|
|||
OCP\Util::addStyle('lostpassword', 'lostpassword'); ?>
|
|||
<form action="<?php print_unescaped($_['link']) ?>" method="post"> |
|||
<fieldset> |
|||
<div class="update"><?php p($l->t('You will receive a link to reset your password via Email.')); ?></div>
|
|||
<p> |
|||
<input type="text" name="user" id="user" placeholder="<?php p($l->t( 'Username' )); ?>" value="" autocomplete="off" required autofocus /> |
|||
<label for="user" class="infield"><?php p($l->t( 'Username' )); ?></label>
|
|||
<img class="svg" src="<?php print_unescaped(image_path('', 'actions/user.svg')); ?>" alt=""/> |
|||
<?php if ($_['isEncrypted']): ?>
|
|||
<br /> |
|||
<p class="warning"><?php p($l->t("Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset. If you are not sure what to do, please contact your administrator before you continue. Do you really want to continue?")); ?><br />
|
|||
<input type="checkbox" name="continue" value="Yes" /> |
|||
<?php p($l->t('Yes, I really want to reset my password now')); ?></p>
|
|||
<?php endif; ?>
|
|||
</p> |
|||
<input type="submit" id="submit" value="<?php p($l->t('Reset')); ?>" /> |
|||
</fieldset> |
|||
</form> |
|||
@ -0,0 +1,195 @@ |
|||
<?php |
|||
/** |
|||
* Copyright (c) 2014 Lukas Reschke <lukas@owncloud.com> |
|||
* This file is licensed under the Affero General Public License version 3 or |
|||
* later. |
|||
* See the COPYING-README file. |
|||
*/ |
|||
|
|||
namespace OC\Core\LostPassword\Controller; |
|||
use OC\Core\Application; |
|||
use OCP\AppFramework\Http\TemplateResponse; |
|||
|
|||
/** |
|||
* Class LostControllerTest |
|||
* |
|||
* @package OC\Core\LostPassword\Controller |
|||
*/ |
|||
class LostControllerTest extends \PHPUnit_Framework_TestCase { |
|||
|
|||
private $container; |
|||
/** @var LostController */ |
|||
private $lostController; |
|||
|
|||
protected function setUp() { |
|||
$app = new Application(); |
|||
$this->container = $app->getContainer(); |
|||
$this->container['AppName'] = 'core'; |
|||
$this->container['Config'] = $this->getMockBuilder('\OCP\IConfig') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->container['L10N'] = $this->getMockBuilder('\OCP\IL10N') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->container['Defaults'] = $this->getMockBuilder('\OC_Defaults') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->container['UserManager'] = $this->getMockBuilder('\OCP\IUserManager') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->container['Config'] = $this->getMockBuilder('\OCP\IConfig') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->container['URLGenerator'] = $this->getMockBuilder('\OCP\IURLGenerator') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->container['SecureRandom'] = $this->getMockBuilder('\OCP\Security\ISecureRandom') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$this->container['IsEncryptionEnabled'] = true; |
|||
$this->lostController = $this->container['LostController']; |
|||
} |
|||
|
|||
public function testResetFormUnsuccessful() { |
|||
$userId = 'admin'; |
|||
$token = 'MySecretToken'; |
|||
|
|||
$this->container['URLGenerator'] |
|||
->expects($this->once()) |
|||
->method('linkToRouteAbsolute') |
|||
->with('core.lost.setPassword', array('userId' => 'admin', 'token' => 'MySecretToken')) |
|||
->will($this->returnValue('https://ownCloud.com/index.php/lostpassword/')); |
|||
|
|||
$response = $this->lostController->resetform($token, $userId); |
|||
$expectedResponse = new TemplateResponse('core/lostpassword', |
|||
'resetpassword', |
|||
array( |
|||
'link' => 'https://ownCloud.com/index.php/lostpassword/', |
|||
), |
|||
'guest'); |
|||
$this->assertEquals($expectedResponse, $response); |
|||
} |
|||
|
|||
public function testEmailUnsucessful() { |
|||
$existingUser = 'ExistingUser'; |
|||
$nonExistingUser = 'NonExistingUser'; |
|||
$this->container['UserManager'] |
|||
->expects($this->any()) |
|||
->method('userExists') |
|||
->will($this->returnValueMap(array( |
|||
array(true, $existingUser), |
|||
array(false, $nonExistingUser) |
|||
))); |
|||
$this->container['L10N'] |
|||
->expects($this->any()) |
|||
->method('t') |
|||
->will( |
|||
$this->returnValueMap( |
|||
array( |
|||
array('Couldn\'t send reset email. Please make sure your username is correct.', array(), |
|||
'Couldn\'t send reset email. Please make sure your username is correct.'), |
|||
|
|||
) |
|||
)); |
|||
|
|||
// With a non existing user
|
|||
$response = $this->lostController->email($nonExistingUser); |
|||
$expectedResponse = array('status' => 'error', 'msg' => 'Couldn\'t send reset email. Please make sure your username is correct.'); |
|||
$this->assertSame($expectedResponse, $response); |
|||
|
|||
// With no mail address
|
|||
$this->container['Config'] |
|||
->expects($this->any()) |
|||
->method('getUserValue') |
|||
->with($existingUser, 'settings', 'email') |
|||
->will($this->returnValue(null)); |
|||
$response = $this->lostController->email($existingUser); |
|||
$expectedResponse = array('status' => 'error', 'msg' => 'Couldn\'t send reset email. Please make sure your username is correct.'); |
|||
$this->assertSame($expectedResponse, $response); |
|||
} |
|||
|
|||
public function testEmailSuccessful() { |
|||
$randomToken = $this->container['SecureRandom']; |
|||
$this->container['SecureRandom'] |
|||
->expects($this->once()) |
|||
->method('generate') |
|||
->with('21') |
|||
->will($this->returnValue('ThisIsMaybeANotSoSecretToken!')); |
|||
$this->container['UserManager'] |
|||
->expects($this->once()) |
|||
->method('userExists') |
|||
->with('ExistingUser') |
|||
->will($this->returnValue(true)); |
|||
$this->container['Config'] |
|||
->expects($this->once()) |
|||
->method('getUserValue') |
|||
->with('ExistingUser', 'settings', 'email') |
|||
->will($this->returnValue('test@example.com')); |
|||
$this->container['SecureRandom'] |
|||
->expects($this->once()) |
|||
->method('getMediumStrengthGenerator') |
|||
->will($this->returnValue($randomToken)); |
|||
$this->container['Config'] |
|||
->expects($this->once()) |
|||
->method('setUserValue') |
|||
->with('ExistingUser', 'owncloud', 'lostpassword', 'ThisIsMaybeANotSoSecretToken!'); |
|||
$this->container['URLGenerator'] |
|||
->expects($this->once()) |
|||
->method('linkToRouteAbsolute') |
|||
->with('core.lost.setPassword', array('userId' => 'ExistingUser', 'token' => 'ThisIsMaybeANotSoSecretToken!')) |
|||
->will($this->returnValue('https://ownCloud.com/index.php/lostpassword/')); |
|||
|
|||
$response = $this->lostController->email('ExistingUser', true); |
|||
$expectedResponse = array('status' => 'success'); |
|||
$this->assertSame($expectedResponse, $response); |
|||
} |
|||
|
|||
public function testSetPasswordUnsuccessful() { |
|||
$this->container['L10N'] |
|||
->expects($this->any()) |
|||
->method('t') |
|||
->will( |
|||
$this->returnValueMap( |
|||
array( |
|||
array('Couldn\'t reset password because the token is invalid', array(), |
|||
'Couldn\'t reset password because the token is invalid'), |
|||
) |
|||
)); |
|||
$this->container['Config'] |
|||
->expects($this->once()) |
|||
->method('getUserValue') |
|||
->with('InvalidTokenUser', 'owncloud', 'lostpassword') |
|||
->will($this->returnValue('TheOnlyAndOnlyOneTokenToResetThePassword')); |
|||
|
|||
// With an invalid token
|
|||
$userName = 'InvalidTokenUser'; |
|||
$response = $this->lostController->setPassword('wrongToken', $userName, 'NewPassword', true); |
|||
$expectedResponse = array('status' => 'error', 'msg' => 'Couldn\'t reset password because the token is invalid'); |
|||
$this->assertSame($expectedResponse, $response); |
|||
|
|||
// With a valid token and no proceed
|
|||
$response = $this->lostController->setPassword('TheOnlyAndOnlyOneTokenToResetThePassword!', $userName, 'NewPassword', false); |
|||
$expectedResponse = array('status' => 'error', 'msg' => '', 'encryption' => true); |
|||
$this->assertSame($expectedResponse, $response); |
|||
} |
|||
|
|||
public function testSetPasswordSuccessful() { |
|||
$this->container['Config'] |
|||
->expects($this->once()) |
|||
->method('getUserValue') |
|||
->with('ValidTokenUser', 'owncloud', 'lostpassword') |
|||
->will($this->returnValue('TheOnlyAndOnlyOneTokenToResetThePassword')); |
|||
$user = $this->getMockBuilder('\OCP\IUser') |
|||
->disableOriginalConstructor()->getMock(); |
|||
$user->expects($this->once()) |
|||
->method('setPassword') |
|||
->with('NewPassword') |
|||
->will($this->returnValue(true)); |
|||
$this->container['UserManager'] |
|||
->expects($this->once()) |
|||
->method('get') |
|||
->with('ValidTokenUser') |
|||
->will($this->returnValue($user)); |
|||
$this->container['Config'] |
|||
->expects($this->once()) |
|||
->method('deleteUserValue') |
|||
->with('ValidTokenUser', 'owncloud', 'lostpassword'); |
|||
|
|||
$response = $this->lostController->setPassword('TheOnlyAndOnlyOneTokenToResetThePassword', 'ValidTokenUser', 'NewPassword', true); |
|||
$expectedResponse = array('status' => 'success'); |
|||
$this->assertSame($expectedResponse, $response); |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue