Changeset 2220c49 in Klonkt


Ignore:
Timestamp:
08/08/2026 05:18:51 AM (5 weeks ago)
Author:
Robin <roboburr@…>
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)
Message:

Twee dichte deuren in de ontdekking opengezet

Gevonden bij het nalopen van waarom Funkwhale dev niet vond via zijn zoekbalk.
Die zoekbalk bleek gewoon lokaal -- onze kant antwoordde correct -- maar
onderweg stonden er twee deuren dicht die een andere client wel gebruikt.

HOST-META gaf 404. Dat is de klassieke eerste stap van WebFinger (RFC 6415):
een client die het webfinger-pad niet wil raden, vraagt daar de sjabloon op.
Kreeg hij bij ons een 404, dan gaf hij het op -- terwijl de webfinger eronder
prima werkte. Nu in beide vormen: XRD en JRD, want allebei worden gevraagd.

WEBFINGER WAS STRENG in wat hij accepteerde. Alleen acct:naam@host; al het
andere een 400, ook als we prima wisten wie er bedoeld werd. Nu ook zonder
schema en met het apenstaartje dat mensen intypen. Coulant zijn kost hier
niets: het antwoord noemt altijd de canonieke acct:-vorm terug, dus een
slordige vraag levert geen slordig antwoord.

WAT IK BEWUST NIET HEB GEDAAN. Ik had er ook de actor-URI als resource bij
gezet -- Mastodon accepteert die -- tot de suite me op mijn vingers tikte:
test/webfinger-bare-host.test.js legt vast dat juist die vorm een 400 hoort te
geven. Dat is een uitgesproken keuze van eerder, geen vergetelheid, en die
draai ik niet om als bijvangst van een coulance-fix. De tak is eruit en er
staat nu een test die de 400 vastlegt, met de reden erbij.

8 tests.

Co-Authored-By: Claude Opus 5 <noreply@…>

Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r47ca083 r2220c49  
    5757};
    5858
     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).
     67const lrddSjabloon = (req) => `${baseUrl(req)}/.well-known/webfinger?resource={uri}`;
     68
     69router.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
     78router.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
    5984// ── 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 */
     104function 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
    60111router.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');
    64114  let site = publicSite(user);
    65115  // `acct:<host>@<host>` asks for this server's primary actor — the convention
Note: See TracChangeset for help on using the changeset viewer.