diff --git a/bun.lockb b/bun.lockb index 48afa614..a640a5dd 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 06e7029e..20939698 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "@json2csv/plainjs": "^7.0.6", "@logtape/logtape": "npm:@jsr/logtape__logtape@0.4.2", "@lysand-org/client": "^0.2.4", - "@lysand-org/federation": "^2.1.1", + "@lysand-org/federation": "^2.1.2", "@oclif/core": "^4.0.12", "@tufjs/canonical-json": "^2.0.0", "altcha-lib": "^0.4.0", diff --git a/server/api/well-known/webfinger/index.ts b/server/api/well-known/webfinger/index.ts index 58022380..b295a6cf 100644 --- a/server/api/well-known/webfinger/index.ts +++ b/server/api/well-known/webfinger/index.ts @@ -7,6 +7,12 @@ import { import { errorResponse, jsonResponse } from "@/response"; import type { Hono } from "@hono/hono"; import { zValidator } from "@hono/zod-validator"; +import { getLogger } from "@logtape/logtape"; +import { SignatureConstructor } from "@lysand-org/federation"; +import { + FederationRequester, + type ResponseError, +} from "@lysand-org/federation/requester"; import { eq } from "drizzle-orm"; import { lookup } from "mime-types"; import { z } from "zod"; @@ -70,6 +76,35 @@ export default (app: Hono) => return errorResponse("User not found", 404); } + let activityPubUrl = ""; + + if (config.federation.bridge.enabled) { + const requester = await User.getServerActor(); + + const signatureConstructor = + await SignatureConstructor.fromStringKey( + requester.data.privateKey ?? "", + requester.getUri(), + ); + + const manager = new FederationRequester( + new URL(config.federation.bridge.url ?? ""), + signatureConstructor, + ); + + try { + activityPubUrl = await manager.webFinger( + user.data.username, + new URL(config.http.base_url).host, + ); + } catch (e) { + const error = e as ResponseError; + + getLogger("federation") + .error`Error from bridge: ${await error.response.data}`; + } + } + return jsonResponse({ subject: `acct:${ isUuid ? user.id : user.data.username @@ -84,12 +119,17 @@ export default (app: Hono) => config.http.base_url, ).toString(), }, + activityPubUrl && { + rel: "self", + type: "application/activity+json", + href: activityPubUrl, + }, { rel: "avatar", type: lookup(user.getAvatarUrl(config)), href: user.getAvatarUrl(config), }, - ], + ].filter(Boolean), }); }, );