From fc733a4a86fa617d2c47164cea2ac9fffd825524 Mon Sep 17 00:00:00 2001 From: Johann150 Date: Tue, 19 Mar 2024 18:40:34 +0100 Subject: [PATCH] server: properly expire public key cache Changelog: Fixed --- .../src/remote/activitypub/misc/auth-user.ts | 13 +------------ packages/backend/src/services/user-cache.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/backend/src/remote/activitypub/misc/auth-user.ts b/packages/backend/src/remote/activitypub/misc/auth-user.ts index b2901823d..110884060 100644 --- a/packages/backend/src/remote/activitypub/misc/auth-user.ts +++ b/packages/backend/src/remote/activitypub/misc/auth-user.ts @@ -1,8 +1,6 @@ -import { Cache } from '@/misc/cache.js'; -import { UserPublickeys } from '@/models/index.js'; import { IRemoteUser } from '@/models/entities/user.js'; import { UserPublickey } from '@/models/entities/user-publickey.js'; -import { uriPersonCache, userByIdCache } from '@/services/user-cache.js'; +import { uriPersonCache, userByIdCache, publicKeyCache, publicKeyByUserIdCache } from '@/services/user-cache.js'; import { createPerson } from '@/remote/activitypub/models/person.js'; import { Resolver } from '@/remote/activitypub/resolver.js'; import { HOUR } from '@/const.js'; @@ -12,15 +10,6 @@ export type AuthUser = { key: UserPublickey; }; -const publicKeyCache = new Cache( - 2 * HOUR, - (keyId) => UserPublickeys.findOneBy({ keyId }).then(x => x ?? undefined), -); -const publicKeyByUserIdCache = new Cache( - 2 * HOUR, - (userId) => UserPublickeys.findOneBy({ userId }).then(x => x ?? undefined), -); - function authUserFromApId(uri: string): Promise { return uriPersonCache.fetch(uri) .then(async user => { diff --git a/packages/backend/src/services/user-cache.ts b/packages/backend/src/services/user-cache.ts index 36ce444c8..b7919d008 100644 --- a/packages/backend/src/services/user-cache.ts +++ b/packages/backend/src/services/user-cache.ts @@ -17,6 +17,15 @@ export const uriPersonCache = new Cache( 15 * MINUTE, async (uri) => await Users.findOneBy({ uri, isDeleted: IsNull() }) ?? undefined, ); +export const publicKeyCache = new Cache( + 2 * HOUR, + (keyId) => UserPublickeys.findOneBy({ keyId }).then(x => x ?? undefined), +); +export const publicKeyByUserIdCache = new Cache( + 2 * HOUR, + (userId) => UserPublickeys.findOneBy({ userId }).then(x => x ?? undefined), +); + subscriber.on('message', async (_, data) => { const obj = JSON.parse(data); @@ -35,6 +44,12 @@ subscriber.on('message', async (_, data) => { if (Users.isLocalUser(user)) { localUserByNativeTokenCache.delete(user.token); } + // using get here because it does not fetch from the database + const publicKey = publicKeyByUserIdCache.get(user.id); + if (publicKey != null) { + publicKeyByUserIdCache.delete(user.id); + publicKeyCache.delete(publicKey.keyId); + } } else { userByIdCache.set(user.id, user); uriPersonCache.set(user.uri, user);