diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index 1257e75b8..73f49d20a 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -48,6 +48,7 @@ import Resolver from "../resolver.js"; import { extractApHashtags } from "./tag.js"; import { resolveNote, extractEmojis } from "./note.js"; import { resolveImage } from "./image.js"; +import { getSubjectHostFromUri } from "@/remote/resolve-user.js" const logger = apLogger; @@ -184,7 +185,7 @@ export async function createPerson( logger.info(`Creating the Person: ${person.id}`); - const host = subjectHost ?? toPuny(new URL(object.id).hostname); + const host = subjectHost ?? await getSubjectHostFromUri(object.id) ?? toPuny(new URL(object.id).hostname); const { fields } = analyzeAttachments(person.attachment || []); diff --git a/packages/backend/src/remote/resolve-user.ts b/packages/backend/src/remote/resolve-user.ts index e1efcd12b..1e83a917c 100644 --- a/packages/backend/src/remote/resolve-user.ts +++ b/packages/backend/src/remote/resolve-user.ts @@ -171,6 +171,22 @@ export async function resolveUser( return user; } +export async function getSubjectHostFromUri( uri: string): Promise<string | null> { + try { + const acct = subjectToAcct((await webFinger(uri)).subject); + const res = await resolveUserWebFinger(acct.toLowerCase()); + const finalAcct = subjectToAcct(res.subject); + const m = finalAcct.match(/^([^@]+)@(.*)/); + if (!m) { + return null; + } + return m[2]; + } + catch { + return null; + } +} + async function resolveUserWebFinger(acctLower: string, recurse: boolean = true): Promise<{ subject: string, self: {