diff --git a/server/core/lib/activitypub/actors/webfinger.ts b/server/core/lib/activitypub/actors/webfinger.ts index 4b734df17..6fcc269db 100644 --- a/server/core/lib/activitypub/actors/webfinger.ts +++ b/server/core/lib/activitypub/actors/webfinger.ts @@ -1,11 +1,11 @@ +import WebFinger from 'webfinger.js' +import { WebFingerData } from '@peertube/peertube-models' import { isProdInstance } from '@peertube/peertube-node-utils' import { isActivityPubUrlValid } from '@server/helpers/custom-validators/activitypub/misc.js' import { REQUEST_TIMEOUTS, WEBSERVER } from '@server/initializers/constants.js' import { ActorModel } from '@server/models/actor/actor.js' import { MActorFull } from '@server/types/models/index.js' -import WebFinger from 'webfinger.js' -// eslint-disable-next-line new-cap const webfinger = new WebFinger({ webfist_fallback: false, tls_only: isProdInstance(), @@ -13,7 +13,7 @@ const webfinger = new WebFinger({ request_timeout: REQUEST_TIMEOUTS.DEFAULT }) -export async function loadActorUrlOrGetFromWebfinger (uriArg: string) { +async function loadActorUrlOrGetFromWebfinger (uriArg: string) { // Handle strings like @toto@example.com const uri = uriArg.startsWith('@') ? uriArg.slice(1) : uriArg @@ -31,15 +31,37 @@ export async function loadActorUrlOrGetFromWebfinger (uriArg: string) { return getUrlFromWebfinger(uri) } -export async function getUrlFromWebfinger (uri: string) { - const { object } = await webfinger.lookup(uri) +async function getUrlFromWebfinger (uri: string) { + const webfingerData: WebFingerData = await webfingerLookup(uri) + return getLinkOrThrow(webfingerData) +} - if (Array.isArray(object.links) === false) throw new Error('WebFinger links is not an array.') +// --------------------------------------------------------------------------- - const selfLink = object.links.find(l => l.rel === 'self') - if (selfLink === undefined || isActivityPubUrlValid(selfLink.href as string) === false) { +export { + getUrlFromWebfinger, + loadActorUrlOrGetFromWebfinger +} + +// --------------------------------------------------------------------------- + +function getLinkOrThrow (webfingerData: WebFingerData) { + if (Array.isArray(webfingerData.links) === false) throw new Error('WebFinger links is not an array.') + + const selfLink = webfingerData.links.find(l => l.rel === 'self') + if (selfLink === undefined || isActivityPubUrlValid(selfLink.href) === false) { throw new Error('Cannot find self link or href is not a valid URL.') } - return selfLink.href as string + return selfLink.href +} + +function webfingerLookup (handle: string) { + return new Promise((res, rej) => { + webfinger.lookup(handle, (err, p) => { + if (err) return rej(err) + + return res(p.object) + }) + }) }