Fix logClientIn for non-existing users (#26292)

The check for two factor enforcement would return true for non-existing
users. This fix makes it return false in order to be able to perform
the regular login which will then fail and return false.

This prevents throwing PasswordLoginForbidden for non-existing users.
This commit is contained in:
Vincent Petry 2016-10-07 16:49:57 +02:00 committed by Roeland Jago Douma
parent 1ff328ae65
commit 6d1e858aa4
No known key found for this signature in database
GPG key ID: 1E152838F164D13B
2 changed files with 29 additions and 0 deletions

View file

@ -362,6 +362,9 @@ class Session implements IUserSession, Emitter {
$user = $this->manager->get($username); $user = $this->manager->get($username);
if (is_null($user)) { if (is_null($user)) {
$users = $this->manager->getByEmail($username); $users = $this->manager->getByEmail($username);
if (empty($users)) {
return false;
}
if (count($users) !== 1) { if (count($users) !== 1) {
return true; return true;
} }

View file

@ -401,6 +401,32 @@ class SessionTest extends \Test\TestCase {
$userSession->logClientIn('john', 'doe', $request, $this->throttler); $userSession->logClientIn('john', 'doe', $request, $this->throttler);
} }
public function testLogClientInUnexist() {
$manager = $this->getMockBuilder('\OC\User\Manager')
->disableOriginalConstructor()
->getMock();
$session = $this->createMock('\OCP\ISession');
$request = $this->createMock('\OCP\IRequest');
$user = $this->createMock('\OCP\IUser');
/** @var \OC\User\Session $userSession */
$userSession = $this->getMockBuilder('\OC\User\Session')
->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config])
->setMethods(['login', 'supportsCookies', 'createSessionToken', 'getUser'])
->getMock();
$this->tokenProvider->expects($this->once())
->method('getToken')
->with('doe')
->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException()));
$this->config->expects($this->once())
->method('getSystemValue')
->with('token_auth_enforced', false)
->will($this->returnValue(false));
$this->assertFalse($userSession->logClientIn('unexist', 'doe', $request));
}
public function testLogClientInWithTokenPassword() { public function testLogClientInWithTokenPassword() {
$manager = $this->getMockBuilder('\OC\User\Manager') $manager = $this->getMockBuilder('\OC\User\Manager')
->disableOriginalConstructor() ->disableOriginalConstructor()