From fea19eeb2e8389a8ae2b0b65b1af019a79c0882d Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Wed, 17 Jul 2024 14:46:43 +0200 Subject: [PATCH] feat(federation): :sparkles: Add WebFinger forwarding to bridge for ActivityPub requests --- bun.lockb | Bin 258436 -> 258436 bytes package.json | 2 +- server/api/well-known/webfinger/index.ts | 42 ++++++++++++++++++++++- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/bun.lockb b/bun.lockb index 48afa614c1c0f5ec0e7f10ed76284cee032a5bc5..a640a5ddb47021a51666bcd952ecb53159157114 100755 GIT binary patch delta 153 zcmV;K0A~M$;}3-650EY(!?y60*_D?ZyUxL0RspxYRsvK-0W!A|oC4zGmnByNAeWGY0|>Vq HfCFf8x3fd# delta 153 zcmV;K0A~M$;}3-650EY(W)gr@=_xZ>7dG|^O#=m_TXSji?Sm@{|4V#_Dd4b&u}-RU zlejxDvnX^`;y@V=k3xYDVtPNn+Uy-{DyP`g1#w|FtIfB2yRhi}5Baw3FciDrzzZsN z6m>xQdDW_?95SpDHW@^8;wK!NpvQ;3RspxYRsvK-0Wr4{oC4zGmlTNuAeWGY0|>Vq HfCFf8it 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), }); }, );