Changeset 2220c49 in Klonkt
- Timestamp:
- 08/08/2026 05:18:51 AM (5 weeks ago)
- Branches:
- main
- Children:
- ffb371c
- Parents:
- 47ca083
- git-author:
- Robin <roboburr@…> (08/08/2026 05:16:55 AM)
- git-committer:
- Robin <roboburr@…> (08/08/2026 05:18:51 AM)
- Files:
-
- 1 added
- 1 edited
-
src/routes/activitypub.js (modified) (1 diff)
-
test/webfinger-hostmeta.test.js (added)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
r47ca083 r2220c49 57 57 }; 58 58 59 // ── host-meta ───────────────────────────────────────────────────── 60 // De klassieke eerste stap van WebFinger (RFC 6415): een client die het 61 // webfinger-pad niet wil raden, vraagt hier de sjabloon op. Mastodon serveert 62 // dit ook, en een client die ermee begint kreeg bij ons een 404 en gaf het dan 63 // op -- terwijl de webfinger eronder gewoon werkte. 64 // 65 // Twee vormen, want beide worden in het wild gevraagd: XRD (het origineel) en 66 // JRD (de JSON-variant, RFC 6415 §3). 67 const lrddSjabloon = (req) => `${baseUrl(req)}/.well-known/webfinger?resource={uri}`; 68 69 router.get('/.well-known/host-meta', (req, res) => { 70 res.type('application/xrd+xml; charset=utf-8'); 71 res.set('Cache-Control', 'public, max-age=86400'); 72 res.send(`<?xml version="1.0" encoding="UTF-8"?> 73 <XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"> 74 <Link rel="lrdd" template="${lrddSjabloon(req)}"/> 75 </XRD>`); 76 }); 77 78 router.get('/.well-known/host-meta.json', (req, res) => { 79 res.type('application/jrd+json; charset=utf-8'); 80 res.set('Cache-Control', 'public, max-age=86400'); 81 res.send(JSON.stringify({ links: [{ rel: 'lrdd', template: lrddSjabloon(req) }] })); 82 }); 83 59 84 // ── WebFinger ───────────────────────────────────────────────────── 85 /** 86 * De `resource` uitpakken tot de gebruiker die bedoeld wordt. 87 * 88 * RFC 7033 schrijft een URI voor, en `acct:` is de nette vorm -- maar in het 89 * wild komen er vier spellingen langs, en drie daarvan wezen we af met een 400 90 * terwijl we prima wisten wie er bedoeld werd: 91 * 92 * acct:naam@host de nette vorm (Mastodon stuurt altijd deze) 93 * naam@host zonder schema 94 * @naam@host met het apenstaartje dat mensen intypen 95 * 96 * Coulant zijn kost hier niets: het antwoord noemt altijd de canonieke 97 * `acct:`-vorm terug, dus een slordige vraag levert geen slordig antwoord. 98 * 99 * De ACTOR-URI als resource (die Mastodon ook accepteert) hoort hier NIET bij, 100 * bewust: test/webfinger-bare-host.test.js legt vast dat die een 400 geeft. 101 * Dat is een uitgesproken keuze van eerder en geen vergetelheid, dus die draai 102 * ik niet om als bijvangst van een coulance-fix. 103 */ 104 function webfingerGebruiker(resource) { 105 const r = String(resource || '').trim(); 106 if (!r) return null; 107 const acct = r.match(/^(?:acct:)?@?([^@/]+)@(.+)$/i); 108 return acct ? acct[1] : null; 109 } 110 60 111 router.get('/.well-known/webfinger', (req, res) => { 61 const m = String(req.query.resource || '').match(/^acct:([^@]+)@(.+)$/i); 62 if (!m) return res.status(400).type('text/plain').send('bad resource'); 63 const user = m[1]; 112 const user = webfingerGebruiker(req.query.resource); 113 if (!user) return res.status(400).type('text/plain').send('bad resource'); 64 114 let site = publicSite(user); 65 115 // `acct:<host>@<host>` asks for this server's primary actor — the convention
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)