Skip to content

Commit

Permalink
feat(perf): add cache for authtoken lookup
Browse files Browse the repository at this point in the history
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
  • Loading branch information
Altahrim committed Jan 25, 2024
1 parent f108ed9 commit 07112b8
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 184 deletions.
51 changes: 32 additions & 19 deletions lib/private/Authentication/Token/PublicKeyTokenMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@
*/
namespace OC\Authentication\Token;

use Generator;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\QBMapper;
use OCP\Authentication\Token\IToken;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;

Expand All @@ -42,10 +44,8 @@ public function __construct(IDBConnection $db) {

/**
* Invalidate (delete) a given token
*
* @param string $token
*/
public function invalidate(string $token) {
public function invalidate(string $token): void {
/* @var $qb IQueryBuilder */
$qb = $this->db->getQueryBuilder();
$qb->delete($this->tableName)
Expand All @@ -55,27 +55,39 @@ public function invalidate(string $token) {
}

/**
* @param int $olderThan
* @param int $remember
* @return Generator<string> Tokens
*/
public function invalidateOld(int $olderThan, int $remember = IToken::DO_NOT_REMEMBER) {
public function listOld(int $olderThan, int $remember = IToken::DO_NOT_REMEMBER): Generator {
/* @var $qb IQueryBuilder */
$qb = $this->db->getQueryBuilder();
$qb->delete($this->tableName)
$result = $qb->select('token')
->from($this->tableName)
->where($qb->expr()->lt('last_activity', $qb->createNamedParameter($olderThan, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('type', $qb->createNamedParameter(IToken::TEMPORARY_TOKEN, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('remember', $qb->createNamedParameter($remember, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)))
->execute();
->executeQuery();

while ($tokenHash = $result->fetchOne()) {
yield $tokenHash;
}
}

public function invalidateLastUsedBefore(string $uid, int $before): int {
/**
* @return Generator<string> Tokens
*/
public function listLastUsedBefore(string $uid, int $before): Generator {
$qb = $this->db->getQueryBuilder();
$qb->delete($this->tableName)
$result = $qb->select('token')
->from($this->tableName)
->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
->andWhere($qb->expr()->lt('last_activity', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)));
return $qb->executeStatement();
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)))
->executeQuery();

while ($tokenHash = $result->fetchOne()) {
yield $tokenHash;
}
}

/**
Expand Down Expand Up @@ -150,30 +162,31 @@ public function getTokenByUser(string $uid): array {
return $entities;
}

public function deleteById(string $uid, int $id) {
public function getTokenByUserAndId(string $uid, int $id): ?string {
/* @var $qb IQueryBuilder */
$qb = $this->db->getQueryBuilder();
$qb->delete($this->tableName)
$qb->select('token')
->from($this->tableName)
->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)));
$qb->execute();
return $qb->executeQuery()->fetchOne() ?: null;
}

/**
* delete all auth token which belong to a specific client if the client was deleted
*
* @param string $name
*/
public function deleteByName(string $name) {
public function deleteByName(string $name): void {
$qb = $this->db->getQueryBuilder();
$qb->delete($this->tableName)
->where($qb->expr()->eq('name', $qb->createNamedParameter($name), IQueryBuilder::PARAM_STR))
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)));
$qb->execute();
$qb->executeStatement();
}

public function deleteTempToken(PublicKeyToken $except) {
public function deleteTempToken(PublicKeyToken $except): void {
$qb = $this->db->getQueryBuilder();

$qb->delete($this->tableName)
Expand All @@ -182,7 +195,7 @@ public function deleteTempToken(PublicKeyToken $except) {
->andWhere($qb->expr()->neq('id', $qb->createNamedParameter($except->getId())))
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)));

$qb->execute();
$qb->executeStatement();
}

public function hasExpiredTokens(string $uid): bool {
Expand Down
Loading

0 comments on commit 07112b8

Please sign in to comment.