From 5e1ef0854842ca8a6993491723a01fe8951d8111 Mon Sep 17 00:00:00 2001 From: hazycora <hazysu@riseup.net> Date: Thu, 31 Aug 2023 10:58:55 -0500 Subject: [PATCH] Implement delegated domain check --- create-circle.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/create-circle.js b/create-circle.js index ca65ec8..8ce0d6d 100644 --- a/create-circle.js +++ b/create-circle.js @@ -21,6 +21,7 @@ async function apiRequest(url, options = null) /** * @typedef {{ + * handle: string, * name: string, * instance: string, * }} Handle @@ -189,7 +190,7 @@ class MastodonApiClient extends ApiClient { } async getUserIdFromHandle(handle) { - const url = `https://${this._instance}/api/v1/accounts/lookup?acct=${handle.name}@${handle.instance}`; + const url = `https://${this._instance}/api/v1/accounts/lookup?acct=${handle.handle}`; const response = await apiRequest(url, null); if (!response) { @@ -547,11 +548,25 @@ function parseHandle(fediHandle, fallbackInstance = "") { const [name, instance] = fediHandle.split("@", 2); return { + handle: fediHandle, name: name, instance: instance || fallbackInstance, }; } +/** + * @typedef @param {Handle} handle + * @returns {Promise<string>} instance + */ +async function getDelegateInstance(handle) { + // We're checking webfinger to see which URL is for the user, + // since that may be on a different domain than the webfinger request + const response = await apiRequest(`https://${handle.instance}/.well-known/webfinger?resource=acct:${handle.handle}`) + const selfLink = response.links.find(link => link.rel == 'self') + const url = new URL(selfLink.href) + return url.hostname; +} + /** * @typedef {FediUser & {conStrength: number}} RatedUser */ @@ -566,6 +581,8 @@ async function circleMain() { let fediHandle = document.getElementById("txt_mastodon_handle"); const selfUser = parseHandle(fediHandle.value); + selfUser.instance = await getDelegateInstance(selfUser) + let form = document.getElementById("generateForm"); let backend = form.backend; for (const radio of backend) {