Merge pull request #24686 from owncloud/query-user-authtokens
add method to query all user auth tokens
This commit is contained in:
commit
e1a9a26bf5
|
@ -26,6 +26,7 @@ use OCP\AppFramework\Db\DoesNotExistException;
|
||||||
use OCP\AppFramework\Db\Mapper;
|
use OCP\AppFramework\Db\Mapper;
|
||||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
|
use OCP\IUser;
|
||||||
|
|
||||||
class DefaultTokenMapper extends Mapper {
|
class DefaultTokenMapper extends Mapper {
|
||||||
|
|
||||||
|
@ -83,4 +84,31 @@ class DefaultTokenMapper extends Mapper {
|
||||||
return DefaultToken::fromRow($data);
|
return DefaultToken::fromRow($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all token of a user
|
||||||
|
*
|
||||||
|
* The provider may limit the number of result rows in case of an abuse
|
||||||
|
* where a high number of (session) tokens is generated
|
||||||
|
*
|
||||||
|
* @param IUser $user
|
||||||
|
* @return DefaultToken[]
|
||||||
|
*/
|
||||||
|
public function getTokenByUser(IUser $user) {
|
||||||
|
/* @var $qb IQueryBuilder */
|
||||||
|
$qb = $this->db->getQueryBuilder();
|
||||||
|
$qb->select('id', 'uid', 'password', 'name', 'type', 'token', 'last_activity')
|
||||||
|
->from('authtoken')
|
||||||
|
->where($qb->expr()->eq('uid', $qb->createNamedParameter($user->getUID())))
|
||||||
|
->setMaxResults(1000);
|
||||||
|
$result = $qb->execute();
|
||||||
|
$data = $result->fetchAll();
|
||||||
|
$result->closeCursor();
|
||||||
|
|
||||||
|
$entities = array_map(function ($row) {
|
||||||
|
return DefaultToken::fromRow($row);
|
||||||
|
}, $data);
|
||||||
|
|
||||||
|
return $entities;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ use OCP\AppFramework\Db\DoesNotExistException;
|
||||||
use OCP\AppFramework\Utility\ITimeFactory;
|
use OCP\AppFramework\Utility\ITimeFactory;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
use OCP\ILogger;
|
use OCP\ILogger;
|
||||||
|
use OCP\IUser;
|
||||||
use OCP\Security\ICrypto;
|
use OCP\Security\ICrypto;
|
||||||
|
|
||||||
class DefaultTokenProvider implements IProvider {
|
class DefaultTokenProvider implements IProvider {
|
||||||
|
@ -102,6 +103,19 @@ class DefaultTokenProvider implements IProvider {
|
||||||
$this->mapper->update($token);
|
$this->mapper->update($token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all token of a user
|
||||||
|
*
|
||||||
|
* The provider may limit the number of result rows in case of an abuse
|
||||||
|
* where a high number of (session) tokens is generated
|
||||||
|
*
|
||||||
|
* @param IUser $user
|
||||||
|
* @return IToken[]
|
||||||
|
*/
|
||||||
|
public function getTokenByUser(IUser $user) {
|
||||||
|
return $this->mapper->getTokenByUser($user);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a token by token id
|
* Get a token by token id
|
||||||
*
|
*
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
namespace OC\Authentication\Token;
|
namespace OC\Authentication\Token;
|
||||||
|
|
||||||
use OC\Authentication\Exceptions\InvalidTokenException;
|
use OC\Authentication\Exceptions\InvalidTokenException;
|
||||||
|
use OCP\IUser;
|
||||||
|
|
||||||
interface IProvider {
|
interface IProvider {
|
||||||
|
|
||||||
|
@ -68,6 +69,17 @@ interface IProvider {
|
||||||
*/
|
*/
|
||||||
public function updateToken(IToken $token);
|
public function updateToken(IToken $token);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all token of a user
|
||||||
|
*
|
||||||
|
* The provider may limit the number of result rows in case of an abuse
|
||||||
|
* where a high number of (session) tokens is generated
|
||||||
|
*
|
||||||
|
* @param IUser $user
|
||||||
|
* @return IToken[]
|
||||||
|
*/
|
||||||
|
public function getTokenByUser(IUser $user);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the (unencrypted) password of the given token
|
* Get the (unencrypted) password of the given token
|
||||||
*
|
*
|
||||||
|
|
|
@ -141,4 +141,22 @@ class DefaultTokenMapperTest extends TestCase {
|
||||||
$this->mapper->getToken($token);
|
$this->mapper->getToken($token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetTokenByUser() {
|
||||||
|
$user = $this->getMock('\OCP\IUser');
|
||||||
|
$user->expects($this->once())
|
||||||
|
->method('getUID')
|
||||||
|
->will($this->returnValue('user1'));
|
||||||
|
|
||||||
|
$this->assertCount(2, $this->mapper->getTokenByUser($user));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetTokenByUserNotFound() {
|
||||||
|
$user = $this->getMock('\OCP\IUser');
|
||||||
|
$user->expects($this->once())
|
||||||
|
->method('getUID')
|
||||||
|
->will($this->returnValue('user1000'));
|
||||||
|
|
||||||
|
$this->assertCount(0, $this->mapper->getTokenByUser($user));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,6 +104,16 @@ class DefaultTokenProviderTest extends TestCase {
|
||||||
$this->assertEquals($this->time, $tk->getLastActivity());
|
$this->assertEquals($this->time, $tk->getLastActivity());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetTokenByUser() {
|
||||||
|
$user = $this->getMock('\OCP\IUser');
|
||||||
|
$this->mapper->expects($this->once())
|
||||||
|
->method('getTokenByUser')
|
||||||
|
->with($user)
|
||||||
|
->will($this->returnValue(['token']));
|
||||||
|
|
||||||
|
$this->assertEquals(['token'], $this->tokenProvider->getTokenByUser($user));
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetPassword() {
|
public function testGetPassword() {
|
||||||
$token = 'token1234';
|
$token = 'token1234';
|
||||||
$tk = new DefaultToken();
|
$tk = new DefaultToken();
|
||||||
|
|
Loading…
Reference in New Issue