Changeset 86cfa1a in Klonkt
- Timestamp:
- 09/30/2026 07:00:30 AM (97 minutes ago)
- Branches:
- main
- Children:
- fd8faf5
- Parents:
- 9eb6e1b
- Files:
-
- 4 edited
-
src/routes/posts.js (modified) (1 diff)
-
src/routes/search.js (modified) (1 diff)
-
src/services/ap-following.js (modified) (1 diff)
-
test/search-fediverse.test.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/posts.js
r9eb6e1b r86cfa1a 881 881 try { target = await ActivityPubService.resolveRemoteNote(uri, site ? { asSlug: site.slug } : {}); } catch { /* ignore */ } 882 882 // Not a post? Maybe the URI is a profile/actor → offer Follow, not reply. 883 if (!target) { try { followTarget = await ActivityPubService.resolveRemoteActor(uri ); } catch { /* ignore */ } }883 if (!target) { try { followTarget = await ActivityPubService.resolveRemoteActor(uri, site ? { asSlug: site.slug } : {}); } catch { /* ignore */ } } 884 884 } 885 885 renderPage(req, res, 'pages/authorize-interaction', { -
src/routes/search.js
r9eb6e1b r86cfa1a 120 120 if (remote) remoteKind = 'note'; 121 121 if (!remote) { 122 try { remote = await ActivityPubService.resolveRemoteActor(remoteUri); } catch { /* onbereikbaar */ } 122 // Ook ondertekend: een profiel op een instance met authorized fetch 123 // (mastodon.social) geeft anders een 401 en leek dan niet te bestaan. 124 try { remote = await ActivityPubService.resolveRemoteActor(remoteUri, { asSlug: site.slug }); } catch { /* onbereikbaar */ } 123 125 if (remote) remoteKind = 'actor'; 124 126 } -
src/services/ap-following.js
r9eb6e1b r86cfa1a 172 172 // authorize_interaction "Follow" flow). Returns display fields + inbox, or null 173 173 // when it isn't a reachable actor (e.g. the input was a post, not a profile). 174 export async function resolveRemoteActor(input) { 174 // 175 // ONDERTEKEND ALLEEN ALS DE AANROEPER DE SITE NOEMT (opts.asSlug). Een instance 176 // met authorized fetch (mastodon.social) geeft een onbetekende GET een 401, en 177 // dan leek een bestaand profiel te ontbreken -- terwijl een ander Mastodon 178 // zonder die instelling het wel toonde. fetchActor probeert eerst onbetekend en 179 // tekent pas als dat niet lukt. 180 // 181 // Tekenen is deze site die voor het verzoek instaat, met haar eigen sleutel. 182 // Dat mag alleen namens een ingelogde beheerder van die site: de zoekbalk 183 // (achter mayLookUp) en /authorize_interaction (requireSiteManager) zijn de 184 // enige die asSlug meegeven. Zonder opts blijft dit onbetekend. 185 export async function resolveRemoteActor(input, opts = {}) { 175 186 const s = String(input || '').trim(); 176 187 const actorUrl = /^https?:\/\//i.test(s) ? (safeUrl(s) || null) : await webfingerResolve(s); 177 188 if (!actorUrl) return null; 178 const actor = await fetchActor(actorUrl ).catch(() => null);189 const actor = await fetchActor(actorUrl, opts.asSlug ? { asSlug: opts.asSlug } : {}).catch(() => null); 179 190 if (!actor || !actor.id || !actor.inbox) return null; 180 191 const ai = actorInfo(actor, actor.id); -
test/search-fediverse.test.js
r9eb6e1b r86cfa1a 51 51 }; 52 52 }; 53 AP.resolveRemoteActor = async (uri) => { 53 let actorOpties = []; 54 AP.resolveRemoteActor = async (uri, opts) => { 54 55 gevraagd.push(['actor', uri]); 56 actorOpties.push(opts || {}); 55 57 if (!uri.includes('/u/')) return null; 56 58 return { … … 281 283 }); 282 284 285 // ── Een profiel op een instance met authorized fetch ──────────────────────── 286 // 287 // mastodon.social geeft een onbetekende GET van een profiel een 401; arvr.social 288 // niet. Het profiel werd onbetekend opgehaald, dus het ene Mastodon toonde een 289 // profiel en het andere "niet gevonden". De post-kant was al ondertekend, de 290 // profiel-kant niet (gemeten op dev, 30-9: onbetekend niets, als dev gevonden). 291 // 292 // En de regel eronder: ondertekenen is deze site die voor het verzoek instaat, 293 // en dat mag alleen namens een INGELOGDE beheerder. Een bezoeker laat niets 294 // ophalen, ondertekend of niet. 295 296 test('een profiel wordt ondertekend opgehaald, op de zoekpagina en in de preview', async () => { 297 actorOpties = []; 298 await zoek('https://elders.test/u/oma'); 299 assert.equal(actorOpties[0] && actorOpties[0].asSlug, 'robo', 'de zoekpagina haalt het profiel als de site op'); 300 actorOpties = []; 301 await preview('https://elders.test/u/oma'); 302 assert.equal(actorOpties[0] && actorOpties[0].asSlug, 'robo', 'de preview ook'); 303 }); 304 305 test('ook de interactiepagina haalt een profiel ondertekend op', async () => { 306 actorOpties = []; 307 await fetch(`http://127.0.0.1:${poort2}/authorize_interaction?uri=${encodeURIComponent('https://elders.test/u/oma')}`, 308 { signal: AbortSignal.timeout(10000) }); 309 assert.equal(actorOpties[0] && actorOpties[0].asSlug, 'robo'); 310 }); 311 312 test('niet ingelogd gaat er geen enkel verzoek uit, dus ook geen ondertekend', async () => { 313 ingelogd = false; 314 try { 315 actorOpties = []; 316 await zoek('https://elders.test/u/oma'); 317 await preview('https://elders.test/u/oma'); 318 assert.deepEqual(gevraagd, [], 'geen post- en geen profielopvraging'); 319 assert.deepEqual(actorOpties, [], 'en dus niets dat de sleutel van de site gebruikt'); 320 } finally { 321 ingelogd = true; 322 } 323 }); 324
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)