diff --git a/lib/private/Authentication/Token/DefaultToken.php b/lib/private/Authentication/Token/DefaultToken.php index e06803d0bf..e2753ba979 100644 --- a/lib/private/Authentication/Token/DefaultToken.php +++ b/lib/private/Authentication/Token/DefaultToken.php @@ -1,4 +1,5 @@ addType('uid', 'string'); + $this->addType('loginName', 'string'); + $this->addType('password', 'string'); + $this->addType('name', 'string'); + $this->addType('token', 'string'); $this->addType('type', 'int'); + $this->addType('remember', 'int'); $this->addType('lastActivity', 'int'); $this->addType('lastCheck', 'int'); + $this->addType('scope', 'string'); } - public function getId() { + public function getId(): int { return $this->id; } - public function getUID() { + public function getUID(): string { return $this->uid; } @@ -112,14 +98,14 @@ class DefaultToken extends Entity implements IToken { * * @return string */ - public function getLoginName() { + public function getLoginName(): string { return parent::getLoginName(); } /** * Get the (encrypted) login password * - * @return string + * @return string|null */ public function getPassword() { return parent::getPassword(); @@ -140,7 +126,7 @@ class DefaultToken extends Entity implements IToken { * * @return int */ - public function getLastCheck() { + public function getLastCheck(): int { return parent::getLastCheck(); } @@ -149,15 +135,20 @@ class DefaultToken extends Entity implements IToken { * * @param int $time */ - public function setLastCheck($time) { - return parent::setLastCheck($time); + public function setLastCheck(int $time) { + parent::setLastCheck($time); } - public function getScope() { - return parent::getScope(); + public function getScope(): string { + $scope = parent::getScope(); + if ($scope === null) { + return ''; + } + + return $scope; } - public function getScopeAsArray() { + public function getScopeAsArray(): array { $scope = json_decode($this->getScope(), true); if (!$scope) { return [ @@ -168,10 +159,18 @@ class DefaultToken extends Entity implements IToken { } public function setScope($scope) { - if (is_array($scope)) { + if (\is_array($scope)) { parent::setScope(json_encode($scope)); } else { parent::setScope((string)$scope); } } + + public function getName(): string { + return parent::getName(); + } + + public function getRemember(): int { + return parent::getRemember(); + } } diff --git a/lib/private/Authentication/Token/DefaultTokenMapper.php b/lib/private/Authentication/Token/DefaultTokenMapper.php index 55494d7237..285b043c2c 100644 --- a/lib/private/Authentication/Token/DefaultTokenMapper.php +++ b/lib/private/Authentication/Token/DefaultTokenMapper.php @@ -1,4 +1,5 @@ db->getQueryBuilder(); $qb->delete('authtoken') @@ -59,7 +59,7 @@ class DefaultTokenMapper extends QBMapper { * @param int $olderThan * @param int $remember */ - public function invalidateOld($olderThan, $remember = IToken::DO_NOT_REMEMBER) { + public function invalidateOld(int $olderThan, int $remember = IToken::DO_NOT_REMEMBER) { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); $qb->delete('authtoken') @@ -76,7 +76,7 @@ class DefaultTokenMapper extends QBMapper { * @throws DoesNotExistException * @return DefaultToken */ - public function getToken($token) { + public function getToken(string $token): DefaultToken { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'remember', 'token', 'last_activity', 'last_check', 'scope') @@ -95,11 +95,11 @@ class DefaultTokenMapper extends QBMapper { /** * Get the token for $id * - * @param string $id + * @param int $id * @throws DoesNotExistException * @return DefaultToken */ - public function getTokenById($id) { + public function getTokenById(int $id): DefaultToken { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'token', 'last_activity', 'last_check', 'scope') @@ -124,7 +124,7 @@ class DefaultTokenMapper extends QBMapper { * @param IUser $user * @return DefaultToken[] */ - public function getTokenByUser(IUser $user) { + public function getTokenByUser(IUser $user): array { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'remember', 'token', 'last_activity', 'last_check', 'scope') @@ -146,7 +146,7 @@ class DefaultTokenMapper extends QBMapper { * @param IUser $user * @param int $id */ - public function deleteById(IUser $user, $id) { + public function deleteById(IUser $user, int $id) { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); $qb->delete('authtoken') @@ -160,7 +160,7 @@ class DefaultTokenMapper extends QBMapper { * * @param string $name */ - public function deleteByName($name) { + public function deleteByName(string $name) { $qb = $this->db->getQueryBuilder(); $qb->delete('authtoken') ->where($qb->expr()->eq('name', $qb->createNamedParameter($name), IQueryBuilder::PARAM_STR)); diff --git a/lib/private/Authentication/Token/DefaultTokenProvider.php b/lib/private/Authentication/Token/DefaultTokenProvider.php index 36a8b1d546..747fb8ef6e 100644 --- a/lib/private/Authentication/Token/DefaultTokenProvider.php +++ b/lib/private/Authentication/Token/DefaultTokenProvider.php @@ -1,4 +1,5 @@ @@ -85,7 +86,13 @@ class DefaultTokenProvider implements IProvider { * @param int $remember whether the session token should be used for remember-me * @return IToken */ - public function generateToken($token, $uid, $loginName, $password, $name, $type = IToken::TEMPORARY_TOKEN, $remember = IToken::DO_NOT_REMEMBER) { + public function generateToken(string $token, + string $uid, + string $loginName, + $password, + string $name, + int $type = IToken::TEMPORARY_TOKEN, + int $remember = IToken::DO_NOT_REMEMBER): IToken { $dbToken = new DefaultToken(); $dbToken->setUid($uid); $dbToken->setLoginName($loginName); @@ -145,7 +152,7 @@ class DefaultTokenProvider implements IProvider { * @param IUser $user * @return IToken[] */ - public function getTokenByUser(IUser $user) { + public function getTokenByUser(IUser $user): array { return $this->mapper->getTokenByUser($user); } @@ -154,9 +161,9 @@ class DefaultTokenProvider implements IProvider { * * @param string $tokenId * @throws InvalidTokenException - * @return DefaultToken + * @return IToken */ - public function getToken($tokenId) { + public function getToken(string $tokenId): IToken { try { return $this->mapper->getToken($this->hashToken($tokenId)); } catch (DoesNotExistException $ex) { @@ -167,11 +174,11 @@ class DefaultTokenProvider implements IProvider { /** * Get a token by token id * - * @param string $tokenId + * @param int $tokenId * @throws InvalidTokenException - * @return DefaultToken + * @return IToken */ - public function getTokenById($tokenId) { + public function getTokenById(int $tokenId): IToken { try { return $this->mapper->getTokenById($tokenId); } catch (DoesNotExistException $ex) { @@ -184,7 +191,7 @@ class DefaultTokenProvider implements IProvider { * @param string $sessionId * @throws InvalidTokenException */ - public function renewSessionToken($oldSessionId, $sessionId) { + public function renewSessionToken(string $oldSessionId, string $sessionId) { $token = $this->getToken($oldSessionId); $newToken = new DefaultToken(); @@ -210,7 +217,7 @@ class DefaultTokenProvider implements IProvider { * @throws PasswordlessTokenException * @return string */ - public function getPassword(IToken $savedToken, $tokenId) { + public function getPassword(IToken $savedToken, string $tokenId): string { $password = $savedToken->getPassword(); if (is_null($password)) { throw new PasswordlessTokenException(); @@ -226,7 +233,7 @@ class DefaultTokenProvider implements IProvider { * @param string $password * @throws InvalidTokenException */ - public function setPassword(IToken $token, $tokenId, $password) { + public function setPassword(IToken $token, string $tokenId, string $password) { if (!($token instanceof DefaultToken)) { throw new InvalidTokenException(); } @@ -240,7 +247,7 @@ class DefaultTokenProvider implements IProvider { * * @param string $token */ - public function invalidateToken($token) { + public function invalidateToken(string $token) { $this->mapper->invalidate($this->hashToken($token)); } @@ -250,7 +257,7 @@ class DefaultTokenProvider implements IProvider { * @param IUser $user * @param int $id */ - public function invalidateTokenById(IUser $user, $id) { + public function invalidateTokenById(IUser $user, int $id) { $this->mapper->deleteById($user, $id); } @@ -270,7 +277,7 @@ class DefaultTokenProvider implements IProvider { * @param string $token * @return string */ - private function hashToken($token) { + private function hashToken(string $token) { $secret = $this->config->getSystemValue('secret'); return hash('sha512', $token . $secret); } @@ -284,7 +291,7 @@ class DefaultTokenProvider implements IProvider { * @param string $token * @return string encrypted password */ - private function encryptPassword($password, $token) { + private function encryptPassword(string $password, string $token): string { $secret = $this->config->getSystemValue('secret'); return $this->crypto->encrypt($password, $token . $secret); } @@ -299,7 +306,7 @@ class DefaultTokenProvider implements IProvider { * @throws InvalidTokenException * @return string the decrypted key */ - private function decryptPassword($password, $token) { + private function decryptPassword(string $password, string $token): string { $secret = $this->config->getSystemValue('secret'); try { return $this->crypto->decrypt($password, $token . $secret); diff --git a/lib/private/Authentication/Token/IProvider.php b/lib/private/Authentication/Token/IProvider.php index e1cc8182ff..9b9048b163 100644 --- a/lib/private/Authentication/Token/IProvider.php +++ b/lib/private/Authentication/Token/IProvider.php @@ -1,4 +1,5 @@ mapper = $this->getMockBuilder('\OC\Authentication\Token\DefaultTokenMapper') - ->disableOriginalConstructor() - ->getMock(); + $this->mapper = $this->createMock(DefaultTokenMapper::class); $this->crypto = $this->createMock(ICrypto::class); $this->config = $this->createMock(IConfig::class); $this->logger = $this->createMock(ILogger::class); diff --git a/tests/lib/Authentication/Token/DefaultTokenTest.php b/tests/lib/Authentication/Token/DefaultTokenTest.php index f00c32ccaf..76b976586a 100644 --- a/tests/lib/Authentication/Token/DefaultTokenTest.php +++ b/tests/lib/Authentication/Token/DefaultTokenTest.php @@ -33,14 +33,6 @@ class DefaultTokenTest extends TestCase { $this->assertEquals($scope, $token->getScopeAsArray()); } - public function testSetScopeAsString() { - $scope = ['filesystem' => false]; - $token = new DefaultToken(); - $token->setScope(json_encode($scope)); - $this->assertEquals(json_encode($scope), $token->getScope()); - $this->assertEquals($scope, $token->getScopeAsArray()); - } - public function testDefaultScope() { $scope = ['filesystem' => true]; $token = new DefaultToken(); diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index 9a5a45c46c..24677b57dd 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -581,6 +581,8 @@ class SessionTest extends \Test\TestCase { $tokenObject->expects($this->once()) ->method('getLoginName') ->willReturn('foobar'); + $tokenObject->method('getId') + ->willReturn(42); $this->tokenProvider->expects($this->once()) ->method('getToken') ->with($sessionId) @@ -593,15 +595,22 @@ class SessionTest extends \Test\TestCase { ->method('setMagicInCookie'); $user->expects($this->once()) ->method('updateLastLoginTimestamp'); - $session->expects($this->once()) + $setUID = false; + $session ->method('set') - ->with('user_id', 'foo'); + ->will($this->returnCallback(function ($k, $v) use (&$setUID) { + if ($k === 'user_id' && $v === 'foo') { + $setUID = true; + } + })); $userSession->expects($this->once()) ->method('setLoginName') ->willReturn('foobar'); $granted = $userSession->loginWithCookie('foo', $token, $oldSessionId); + $this->assertTrue($setUID); + $this->assertTrue($granted); }