fix: bugs in user searching causing remote lookups to fail

This commit is contained in:
Julian Lam
2024-07-29 15:03:51 -04:00
parent 9a54f6bc7d
commit 1f896fb6ba
3 changed files with 6 additions and 4 deletions

View File

@@ -39,7 +39,7 @@ Actors.assert = async (ids, options = {}) => {
ids = (await Promise.all(ids.map(async (id) => { ids = (await Promise.all(ids.map(async (id) => {
const originalId = id; const originalId = id;
if (activitypub.helpers.isWebfinger(id)) { if (activitypub.helpers.isWebfinger(id)) {
const host = id.split('@')[1]; const host = id.replace(/^(acct:|@)/, '').split('@')[1];
if (host === nconf.get('url_parsed').host) { // do not assert loopback ids if (host === nconf.get('url_parsed').host) { // do not assert loopback ids
return 'loopback'; return 'loopback';
} }

View File

@@ -58,10 +58,12 @@ Helpers.query = async (id) => {
// username@host ids use acct: URI schema // username@host ids use acct: URI schema
const uri = isUri ? new URL(id) : new URL(`acct:${id}`); const uri = isUri ? new URL(id) : new URL(`acct:${id}`);
// JS doesn't parse anything other than protocol and pathname from acct: URIs, so we need to just split id manually // JS doesn't parse anything other than protocol and pathname from acct: URIs, so we need to just split id manually
const [username, hostname] = isUri ? [uri.pathname || uri.href, uri.host] : id.split('@'); let [username, hostname] = isUri ? [uri.pathname || uri.href, uri.host] : id.split('@');
if (!username || !hostname) { if (!username || !hostname) {
return false; return false;
} }
username = username.trim();
hostname = hostname.trim();
const cached = webfingerCache.get(id); const cached = webfingerCache.get(id);
if (cached !== undefined) { if (cached !== undefined) {
@@ -159,7 +161,7 @@ Helpers.resolveLocalId = async (input) => {
return { type: null, id: null }; return { type: null, id: null };
} else if (String(input).indexOf('@') !== -1) { // Webfinger } else if (String(input).indexOf('@') !== -1) { // Webfinger
input = decodeURIComponent(input); input = decodeURIComponent(input);
const [slug] = input.replace(/^acct:/, '').split('@'); const [slug] = input.replace(/^(acct:|@)/, '').split('@');
const uid = await user.getUidByUserslug(slug); const uid = await user.getUidByUserslug(slug);
return { type: 'user', id: uid }; return { type: 'user', id: uid };
} }

View File

@@ -45,7 +45,7 @@ module.exports = function (User) {
const handle = activitypub.helpers.isWebfinger(data.query); const handle = activitypub.helpers.isWebfinger(data.query);
if (handle || activitypub.helpers.isUri(data.query)) { if (handle || activitypub.helpers.isUri(data.query)) {
const local = await activitypub.helpers.resolveLocalId(data.query); const local = await activitypub.helpers.resolveLocalId(data.query);
if (local.type === 'user') { if (local.type === 'user' && utils.isNumber(local.id)) {
uids = [local.id]; uids = [local.id];
} else { } else {
const assertion = await activitypub.actors.assert([handle || data.query]); const assertion = await activitypub.actors.assert([handle || data.query]);