Skip to content

Commit

Permalink
Merge pull request #13869 from nextcloud/enh/clean_pending_2fa_sessio…
Browse files Browse the repository at this point in the history
…n_on_password_change

Clean pending 2FA authentication on password reset
  • Loading branch information
rullzer authored Jan 29, 2019
2 parents 050b913 + ac8a6e2 commit deb7d23
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 3 deletions.
10 changes: 8 additions & 2 deletions core/Controller/LostController.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

namespace OC\Core\Controller;

use OC\Authentication\TwoFactorAuth\Manager;
use OC\HintException;
use \OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
Expand Down Expand Up @@ -58,7 +59,6 @@
* @package OC\Core\Controller
*/
class LostController extends Controller {

/** @var IURLGenerator */
protected $urlGenerator;
/** @var IUserManager */
Expand All @@ -83,6 +83,8 @@ class LostController extends Controller {
protected $crypto;
/** @var ILogger */
private $logger;
/** @var Manager */
private $twoFactorManager;

/**
* @param string $appName
Expand Down Expand Up @@ -112,7 +114,8 @@ public function __construct($appName,
IMailer $mailer,
ITimeFactory $timeFactory,
ICrypto $crypto,
ILogger $logger) {
ILogger $logger,
Manager $twoFactorManager) {
parent::__construct($appName, $request);
$this->urlGenerator = $urlGenerator;
$this->userManager = $userManager;
Expand All @@ -126,6 +129,7 @@ public function __construct($appName,
$this->timeFactory = $timeFactory;
$this->crypto = $crypto;
$this->logger = $logger;
$this->twoFactorManager = $twoFactorManager;
}

/**
Expand Down Expand Up @@ -290,6 +294,8 @@ public function setPassword($token, $userId, $password, $proceed) {

\OC_Hook::emit('\OC\Core\LostPassword\Controller\LostController', 'post_passwordReset', array('uid' => $userId, 'password' => $password));

$this->twoFactorManager->clearTwoFactorPending($userId);

$this->config->deleteUserValue($userId, 'core', 'lostpassword');
@\OC::$server->getUserSession()->unsetMagicInCookie();
} catch (HintException $e){
Expand Down
9 changes: 9 additions & 0 deletions lib/private/Authentication/TwoFactorAuth/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
use function array_filter;
use BadMethodCallException;
use Exception;
use OC\Authentication\Exceptions\ExpiredTokenException;
use OC\Authentication\Exceptions\InvalidTokenException;
use OC\Authentication\Token\IProvider as TokenProvider;
use OCP\Activity\IManager;
Expand Down Expand Up @@ -364,4 +365,12 @@ public function prepareTwoFactorLogin(IUser $user, bool $rememberMe) {
$this->config->setUserValue($user->getUID(), 'login_token_2fa', $token->getId(), $this->timeFactory->getTime());
}

public function clearTwoFactorPending(string $userId) {
$tokensNeeding2FA = $this->config->getUserKeys($userId, 'login_token_2fa');

foreach ($tokensNeeding2FA as $tokenId) {
$this->tokenProvider->invalidateTokenById($userId, $tokenId);
}
}

}
7 changes: 6 additions & 1 deletion tests/Core/Controller/LostControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

namespace Tests\Core\Controller;

use OC\Authentication\TwoFactorAuth\Manager;
use OC\Core\Controller\LostController;
use OC\Mail\Message;
use OCP\AppFramework\Http\JSONResponse;
Expand Down Expand Up @@ -77,6 +78,8 @@ class LostControllerTest extends \Test\TestCase {
private $crypto;
/** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */
private $logger;
/** @var Manager|\PHPUnit_Framework_MockObject_MockObject */
private $twofactorManager;

protected function setUp() {
parent::setUp();
Expand Down Expand Up @@ -128,6 +131,7 @@ protected function setUp() {
->willReturn(true);
$this->crypto = $this->createMock(ICrypto::class);
$this->logger = $this->createMock(ILogger::class);
$this->twofactorManager = $this->createMock(Manager::class);
$this->lostController = new LostController(
'Core',
$this->request,
Expand All @@ -142,7 +146,8 @@ protected function setUp() {
$this->mailer,
$this->timeFactory,
$this->crypto,
$this->logger
$this->logger,
$this->twofactorManager
);
}

Expand Down

0 comments on commit deb7d23

Please sign in to comment.