Skip to content

Commit eb6cd37

Browse files
committed
feat(perf): add cache for authtoken lookup
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
1 parent 4dc224f commit eb6cd37

File tree

4 files changed

+192
-184
lines changed

4 files changed

+192
-184
lines changed

lib/private/Authentication/Token/PublicKeyTokenMapper.php

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
*/
2828
namespace OC\Authentication\Token;
2929

30+
use Generator;
3031
use OCP\AppFramework\Db\DoesNotExistException;
3132
use OCP\AppFramework\Db\QBMapper;
33+
use OCP\Authentication\Token\IToken;
3234
use OCP\DB\QueryBuilder\IQueryBuilder;
3335
use OCP\IDBConnection;
3436

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

4345
/**
4446
* Invalidate (delete) a given token
45-
*
46-
* @param string $token
4747
*/
48-
public function invalidate(string $token) {
48+
public function invalidate(string $token): void {
4949
/* @var $qb IQueryBuilder */
5050
$qb = $this->db->getQueryBuilder();
5151
$qb->delete($this->tableName)
@@ -55,27 +55,39 @@ public function invalidate(string $token) {
5555
}
5656

5757
/**
58-
* @param int $olderThan
59-
* @param int $remember
58+
* @return Generator<string> Tokens
6059
*/
61-
public function invalidateOld(int $olderThan, int $remember = IToken::DO_NOT_REMEMBER) {
60+
public function listOld(int $olderThan, int $remember = IToken::DO_NOT_REMEMBER): Generator {
6261
/* @var $qb IQueryBuilder */
6362
$qb = $this->db->getQueryBuilder();
64-
$qb->delete($this->tableName)
63+
$result = $qb->select('token')
64+
->from($this->tableName)
6565
->where($qb->expr()->lt('last_activity', $qb->createNamedParameter($olderThan, IQueryBuilder::PARAM_INT)))
6666
->andWhere($qb->expr()->eq('type', $qb->createNamedParameter(IToken::TEMPORARY_TOKEN, IQueryBuilder::PARAM_INT)))
6767
->andWhere($qb->expr()->eq('remember', $qb->createNamedParameter($remember, IQueryBuilder::PARAM_INT)))
6868
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)))
69-
->execute();
69+
->executeQuery();
70+
71+
while ($tokenHash = $result->fetchOne()) {
72+
yield $tokenHash;
73+
}
7074
}
7175

72-
public function invalidateLastUsedBefore(string $uid, int $before): int {
76+
/**
77+
* @return Generator<string> Tokens
78+
*/
79+
public function listLastUsedBefore(string $uid, int $before): Generator {
7380
$qb = $this->db->getQueryBuilder();
74-
$qb->delete($this->tableName)
81+
$result = $qb->select('token')
82+
->from($this->tableName)
7583
->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
7684
->andWhere($qb->expr()->lt('last_activity', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)))
77-
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)));
78-
return $qb->executeStatement();
85+
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)))
86+
->executeQuery();
87+
88+
while ($tokenHash = $result->fetchOne()) {
89+
yield $tokenHash;
90+
}
7991
}
8092

8193
/**
@@ -150,30 +162,31 @@ public function getTokenByUser(string $uid): array {
150162
return $entities;
151163
}
152164

153-
public function deleteById(string $uid, int $id) {
165+
public function getTokenByUserAndId(string $uid, int $id): ?string {
154166
/* @var $qb IQueryBuilder */
155167
$qb = $this->db->getQueryBuilder();
156-
$qb->delete($this->tableName)
168+
$qb->select('token')
169+
->from($this->tableName)
157170
->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
158171
->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
159172
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)));
160-
$qb->execute();
173+
return $qb->executeQuery()->fetchOne() ?: null;
161174
}
162175

163176
/**
164177
* delete all auth token which belong to a specific client if the client was deleted
165178
*
166179
* @param string $name
167180
*/
168-
public function deleteByName(string $name) {
181+
public function deleteByName(string $name): void {
169182
$qb = $this->db->getQueryBuilder();
170183
$qb->delete($this->tableName)
171184
->where($qb->expr()->eq('name', $qb->createNamedParameter($name), IQueryBuilder::PARAM_STR))
172185
->andWhere($qb->expr()->eq('version', $qb->createNamedParameter(PublicKeyToken::VERSION, IQueryBuilder::PARAM_INT)));
173-
$qb->execute();
186+
$qb->executeStatement();
174187
}
175188

176-
public function deleteTempToken(PublicKeyToken $except) {
189+
public function deleteTempToken(PublicKeyToken $except): void {
177190
$qb = $this->db->getQueryBuilder();
178191

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

185-
$qb->execute();
198+
$qb->executeStatement();
186199
}
187200

188201
public function hasExpiredTokens(string $uid): bool {

0 commit comments

Comments
 (0)