From e29fe18b93276734c67a8ee728288f28f4b99933 Mon Sep 17 00:00:00 2001 From: tamaina Date: Thu, 28 Aug 2025 23:19:06 +0900 Subject: [PATCH] WIP --- .../src/server/api/endpoints/ap/show.ts | 39 ++++++++++++++----- .../test-federation/test/api/ap/show.test.ts | 4 +- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts index b89687acce..867a2bc71e 100644 --- a/packages/backend/src/server/api/endpoints/ap/show.ts +++ b/packages/backend/src/server/api/endpoints/ap/show.ts @@ -25,6 +25,7 @@ import { FetchAllowSoftFailMask } from '@/core/activitypub/misc/check-against-ur import { RemoteUserResolveService } from '@/core/RemoteUserResolveService.js'; import { DI } from '@/di-symbols.js'; import type { MiMeta } from '@/models/_.js'; +import { ApiLoggerService } from '../../ApiLoggerService.js'; export const meta = { tags: ['federation'], @@ -68,6 +69,11 @@ export const meta = { code: 'SOMETHING_HAPPENED_IN_FETCHING_URI', id: '14d45054-9df7-4f85-9e60-343b22f16b05', }, + uriIsAcctLikeButThisIsOnlyUriFetchMode: { + message: 'URI is acct-like but onlyUriFetch is true.', + code: 'URI_IS_ACCT_LIKE_BUT_THIS_IS_ONLY_URI_FETCH_MODE', + id: 'b224ffe3-ae5c-44e2-9df4-f0b8662bb085', + }, }, res: { @@ -130,28 +136,43 @@ export default class extends Endpoint { // eslint- private apPersonService: ApPersonService, private apNoteService: ApNoteService, private remoteUserResolveService: RemoteUserResolveService, + private apiLoggerService: ApiLoggerService, ) { super(meta, paramDef, async (ps, me) => { - let object: SchemaType | null; + let object: SchemaType | null = null; + let acct: misskey.acct.Acct | null = null; - if (!ps.onlyUriFetch) { + try { + acct = misskey.acct.parseAcctOrUrl(ps.uri); + } catch (err) { + // nothing to do + } + + if (!ps.onlyUriFetch && acct) { try { - object = await this.fetchAcct(misskey.acct.parseAcctOrUrl(ps.uri), me); + object = await this.fetchAcct(acct, me); } catch (err) { if (err instanceof IdentifiableError && err.id === 'bddd9f4c-f0a8-4cac-9c0a-4e6d2fc43408') { // Signin required throw new ApiError(meta.errors.noSuchObject); } + + this.apiLoggerService.logger.warn('ap/show: fetchAcct failed', { uri: ps.uri, error: err }); } } - try { - object = await this.fetchAnyUri(ps.uri, me); - } catch (err) { - if (err instanceof ApiError) { - throw err; + if (object == null) { + try { + object = await this.fetchAnyUri(ps.uri, me); + } catch (err) { + if (err instanceof ApiError) { + throw err; + } + if (acct) { + throw new ApiError(meta.errors.uriIsAcctLikeButThisIsOnlyUriFetchMode); + } + throw new ApiError(meta.errors.somethingHappenedInFetchingUri, err); } - throw new ApiError(meta.errors.somethingHappenedInFetchingUri); } if (object) { diff --git a/packages/backend/test-federation/test/api/ap/show.test.ts b/packages/backend/test-federation/test/api/ap/show.test.ts index 7c35026269..a7839f5d6e 100644 --- a/packages/backend/test-federation/test/api/ap/show.test.ts +++ b/packages/backend/test-federation/test/api/ap/show.test.ts @@ -39,11 +39,11 @@ describe('API ap/show', () => { strictEqual(res.object.uri, `https://b.test/users/${bob.id}`); }); - test('onlyUriFetch=true with acct string should fail with URI_INVALID', async () => { + test('onlyUriFetch=true with acct string returns generic fetch error', async () => { await rejects( async () => await alice.client.request('ap/show', { uri: `${bob.username}@b.test`, onlyUriFetch: true }), (err: any) => { - strictEqual(err.code, 'URI_INVALID'); + strictEqual(err.code, 'URI_IS_ACCT_LIKE_BUT_THIS_IS_ONLY_URI_FETCH_MODE'); return true; }, );