diff --git a/packages/backend/src/core/activitypub/ApDbResolverService.ts b/packages/backend/src/core/activitypub/ApDbResolverService.ts index 75c2241233..973394683f 100644 --- a/packages/backend/src/core/activitypub/ApDbResolverService.ts +++ b/packages/backend/src/core/activitypub/ApDbResolverService.ts @@ -146,9 +146,10 @@ export class ApDbResolverService implements OnApplicationShutdown { * @param uri AP Actor id * @param keyId Key id to find. If not specified, main key will be selected. * @returns - * 1. ユーザーとキーのホストが一致しない場合`null` - * 2. userが見つからない場合`{ user: null, key: null }` - * 3. keyが見つからない場合`{ user, key: null }` + * 1. `null` if the user and key host do not match + * 2. `{ user: null, key: null }` if the user is not found + * 3. `{ user: MiRemoteUser, key: null }` if key is not found + * 4. `{ user: MiRemoteUser, key: MiUserPublickey }` if both are found */ @bindThis public async getAuthUserFromApId(uri: string, keyId?: string): Promise<{ @@ -165,11 +166,21 @@ export class ApDbResolverService implements OnApplicationShutdown { * keyIdはURL形式かつkeyIdのホストはuriのホストと一致するはず * (ApPersonService.validateActorに由来) * - * ただ、Mastodonはリプライ関連で他人のノートをHTTP Signature署名して送ってくることがある + * ただ、Mastodonはリプライ関連で他人のトゥートをHTTP Signature署名して送ってくることがある * そのような署名は有効性に疑問があるので無視することにする * ここではuriとkeyIdのホストが一致しない場合は無視する * ハッシュをなくしたkeyIdとuriの同一性を比べてみてもいいが、`uri#*-key`というkeyIdを設定するのが * 決まりごとというわけでもないため幅を持たせることにする + * + * + * The keyId should be in URL format and its host should match the host of the uri + * (derived from ApPersonService.validateActor) + * + * However, Mastodon sometimes sends toots from other users with HTTP Signature signing for reply-related purposes + * Such signatures are of questionable validity, so we choose to ignore them + * Here, we ignore cases where the hosts of uri and keyId do not match + * We could also compare the equality of keyId without the hash and uri, but since setting a keyId like `uri#*-key` + * is not a strict rule, we decide to allow for some flexibility */ this.logger.warn(`actor uri and keyId are not matched uri=${uri} keyId=${keyId}`); return null; @@ -187,7 +198,7 @@ export class ApDbResolverService implements OnApplicationShutdown { } if (!keyId) { - // mainっぽいのを選ぶ + // Choose the main-like const mainKey = keys.find(x => { try { const url = new URL(x.keyId); @@ -209,15 +220,20 @@ export class ApDbResolverService implements OnApplicationShutdown { const exactKey = keys.find(x => x.keyId === keyId); if (exactKey) return { user, key: exactKey }; - // keyIdで見つからない場合 - // まずはキャッシュを更新して再取得 + /** + * keyIdで見つからない場合、まずはキャッシュを更新して再取得 + * If not found with keyId, update cache and reacquire + */ const cacheRaw = this.publicKeyByUserIdCache.cache.get(user.id); if (cacheRaw && cacheRaw.date > Date.now() - 1000 * 60 * 12) { const exactKey = await this.refreshAndFindKey(user.id, keyId); if (exactKey) return { user, key: exactKey }; } - // lastFetchedAtでの更新制限を弱めて再取得 + /** + * lastFetchedAtでの更新制限を弱めて再取得 + * Reacquisition with weakened update limit at lastFetchedAt + */ if (user.lastFetchedAt == null || user.lastFetchedAt < new Date(Date.now() - 1000 * 60 * 12)) { this.logger.info(`Fetching user to find public key uri=${uri} userId=${user.id} keyId=${keyId}`); const renewed = await this.apPersonService.fetchPersonWithRenewal(uri, 0);