|
|
@@ -11,9 +11,11 @@ namespace Test\User; |
|
|
|
use OC\AppFramework\Http\Request; |
|
|
|
use OC\Authentication\Events\LoginFailed; |
|
|
|
use OC\Authentication\Exceptions\InvalidTokenException; |
|
|
|
use OC\Authentication\Exceptions\PasswordlessTokenException; |
|
|
|
use OC\Authentication\Exceptions\PasswordLoginForbiddenException; |
|
|
|
use OC\Authentication\Token\IProvider; |
|
|
|
use OC\Authentication\Token\IToken; |
|
|
|
use OC\Authentication\Token\PublicKeyToken; |
|
|
|
use OC\Security\CSRF\CsrfTokenManager; |
|
|
|
use OC\Session\Memory; |
|
|
|
use OC\User\LoginException; |
|
|
@@ -35,6 +37,8 @@ use OCP\Security\ISecureRandom; |
|
|
|
use OCP\User\Events\PostLoginEvent; |
|
|
|
use PHPUnit\Framework\MockObject\MockObject; |
|
|
|
use Psr\Log\LoggerInterface; |
|
|
|
use function array_diff; |
|
|
|
use function get_class_methods; |
|
|
|
|
|
|
|
/** |
|
|
|
* @group DB |
|
|
@@ -309,6 +313,80 @@ class SessionTest extends \Test\TestCase { |
|
|
|
$userSession->login('foo', 'bar'); |
|
|
|
} |
|
|
|
|
|
|
|
public function testPasswordlessLoginNoLastCheckUpdate(): void { |
|
|
|
$session = $this->getMockBuilder(Memory::class)->setConstructorArgs([''])->getMock(); |
|
|
|
$managerMethods = get_class_methods(Manager::class); |
|
|
|
// Keep following methods intact in order to ensure hooks are working |
|
|
|
$mockedManagerMethods = array_diff($managerMethods, ['__construct', 'emit', 'listen']); |
|
|
|
$manager = $this->getMockBuilder(Manager::class) |
|
|
|
->setMethods($mockedManagerMethods) |
|
|
|
->setConstructorArgs([ |
|
|
|
$this->config, |
|
|
|
$this->createMock(ICacheFactory::class), |
|
|
|
$this->createMock(IEventDispatcher::class), |
|
|
|
]) |
|
|
|
->getMock(); |
|
|
|
$userSession = new Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config, $this->random, $this->lockdownManager, $this->logger, $this->dispatcher); |
|
|
|
|
|
|
|
$session->expects($this->never()) |
|
|
|
->method('set'); |
|
|
|
$session->expects($this->once()) |
|
|
|
->method('regenerateId'); |
|
|
|
$token = new PublicKeyToken(); |
|
|
|
$token->setLoginName('foo'); |
|
|
|
$token->setLastCheck(0); // Never |
|
|
|
$token->setUid('foo'); |
|
|
|
$this->tokenProvider |
|
|
|
->method('getPassword') |
|
|
|
->with($token) |
|
|
|
->willThrowException(new PasswordlessTokenException()); |
|
|
|
$this->tokenProvider |
|
|
|
->method('getToken') |
|
|
|
->with('app-password') |
|
|
|
->willReturn($token); |
|
|
|
$this->tokenProvider->expects(self::never()) |
|
|
|
->method('updateToken'); |
|
|
|
|
|
|
|
$userSession->login('foo', 'app-password'); |
|
|
|
} |
|
|
|
|
|
|
|
public function testLoginLastCheckUpdate(): void { |
|
|
|
$session = $this->getMockBuilder(Memory::class)->setConstructorArgs([''])->getMock(); |
|
|
|
$managerMethods = get_class_methods(Manager::class); |
|
|
|
// Keep following methods intact in order to ensure hooks are working |
|
|
|
$mockedManagerMethods = array_diff($managerMethods, ['__construct', 'emit', 'listen']); |
|
|
|
$manager = $this->getMockBuilder(Manager::class) |
|
|
|
->setMethods($mockedManagerMethods) |
|
|
|
->setConstructorArgs([ |
|
|
|
$this->config, |
|
|
|
$this->createMock(ICacheFactory::class), |
|
|
|
$this->createMock(IEventDispatcher::class), |
|
|
|
]) |
|
|
|
->getMock(); |
|
|
|
$userSession = new Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config, $this->random, $this->lockdownManager, $this->logger, $this->dispatcher); |
|
|
|
|
|
|
|
$session->expects($this->never()) |
|
|
|
->method('set'); |
|
|
|
$session->expects($this->once()) |
|
|
|
->method('regenerateId'); |
|
|
|
$token = new PublicKeyToken(); |
|
|
|
$token->setLoginName('foo'); |
|
|
|
$token->setLastCheck(0); // Never |
|
|
|
$token->setUid('foo'); |
|
|
|
$this->tokenProvider |
|
|
|
->method('getPassword') |
|
|
|
->with($token) |
|
|
|
->willReturn('secret'); |
|
|
|
$this->tokenProvider |
|
|
|
->method('getToken') |
|
|
|
->with('app-password') |
|
|
|
->willReturn($token); |
|
|
|
$this->tokenProvider->expects(self::once()) |
|
|
|
->method('updateToken'); |
|
|
|
|
|
|
|
$userSession->login('foo', 'app-password'); |
|
|
|
} |
|
|
|
|
|
|
|
public function testLoginNonExisting() { |
|
|
|
$session = $this->getMockBuilder(Memory::class)->setConstructorArgs([''])->getMock(); |
|
|
|
$manager = $this->createMock(Manager::class); |