diff --git a/public/src/modules/search.js b/public/src/modules/search.js index 0d87e398f4..df47c7b8a9 100644 --- a/public/src/modules/search.js +++ b/public/src/modules/search.js @@ -26,6 +26,7 @@ define('search', [ const quickSearchContainer = searchFields.find('#quick-search-container'); const toggleVisibility = searchFields.hasClass('hidden'); + const webfingerRegex = /^(@|acct:)?[\w-]+@.+$/; // should match src/activitypub/helpers.js if (toggleVisibility) { searchInput.off('blur').on('blur', function dismissSearch() { @@ -70,6 +71,12 @@ define('search', [ const data = Search.getSearchPreferences(); data.term = input.val(); data.in = searchOptions.in; + + // Override search target if webfinger handle entered + if (webfingerRegex.test(data.term)) { + data.in = 'users'; + } + hooks.fire('action:search.submit', { searchOptions: data, searchElements: searchElements, diff --git a/src/search.js b/src/search.js index 5bceb87b7b..5e9b3c8e47 100644 --- a/src/search.js +++ b/src/search.js @@ -92,7 +92,14 @@ async function searchInContent(data) { if (local.type === 'post') { result = [[local.id], []]; } else { - result = await fetchRemoteObject(data.uid, data.query); + try { + result = await fetchRemoteObject(data); + if (result.hasOwnProperty('users')) { + return result; + } + } catch (e) { + // ... + } } } @@ -146,7 +153,9 @@ async function searchInContent(data) { return Object.assign(returnData, metadata); } -async function fetchRemoteObject(uid, uri) { +async function fetchRemoteObject(data) { + const { uid, query: uri } = data; + try { let id = uri; let exists = await posts.exists(id); @@ -161,6 +170,9 @@ async function fetchRemoteObject(uid, uri) { } else { tid = await posts.getPostField(id, 'tid'); } + } else if (activitypub._constants.acceptableActorTypes.has(type)) { + data.searchIn = 'users'; + return await user.search(data); } }