diff --git a/src/activitypub/actors.js b/src/activitypub/actors.js index 759296e73c..41b6a16e99 100644 --- a/src/activitypub/actors.js +++ b/src/activitypub/actors.js @@ -36,6 +36,7 @@ Actors.assert = async (ids, options = {}) => { ids = ids.filter(id => !utils.isNumber(id)); // Translate webfinger handles to uris + const hostMap = new Map(); ids = (await Promise.all(ids.map(async (id) => { const originalId = id; if (activitypub.helpers.isWebfinger(id)) { @@ -45,6 +46,7 @@ Actors.assert = async (ids, options = {}) => { } ({ actorUri: id } = await activitypub.helpers.query(id)); + hostMap.set(id, host); } // ensure the final id is a valid URI if (!id || !activitypub.helpers.isUri(id)) { @@ -130,7 +132,7 @@ Actors.assert = async (ids, options = {}) => { actors = actors.filter(Boolean); // remove unresolvable actors // Build userData object for storage - const profiles = (await activitypub.mocks.profile(actors)).filter(Boolean); + const profiles = (await activitypub.mocks.profile(actors, hostMap)).filter(Boolean); const now = Date.now(); const bulkSet = profiles.reduce((memo, profile) => { diff --git a/src/activitypub/mocks.js b/src/activitypub/mocks.js index dad00dce6d..dadd6c36b0 100644 --- a/src/activitypub/mocks.js +++ b/src/activitypub/mocks.js @@ -29,7 +29,7 @@ const sanitizeConfig = { }, }; -Mocks.profile = async (actors) => { +Mocks.profile = async (actors, hostMap) => { // Should only ever be called by activitypub.actors.assert const profiles = await Promise.all(actors.map(async (actor) => { if (!actor) { @@ -37,18 +37,20 @@ Mocks.profile = async (actors) => { } const uid = actor.id; - let hostname; + let hostname = hostMap.get(uid); let { url, preferredUsername, published, icon, image, name, summary, followers, inbox, endpoints, } = actor; - preferredUsername = preferredUsername || slugify(name); + preferredUsername = slugify(preferredUsername || name); const { followers: followerCount, following: followingCount } = await activitypub.actors.getLocalFollowCounts(uid); - try { - ({ hostname } = new URL(actor.id)); - } catch (e) { - return null; + if (!hostname) { // if not available via webfinger, infer from id + try { + ({ hostname } = new URL(actor.id)); + } catch (e) { + return null; + } } let picture;