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) {