Changeset 5d0d3f35 in Klonkt for src


Ignore:
Timestamp:
10/25/2026 09:51:07 AM (4 hours ago)
Author:
Robin <roboburr@…>
Branches:
main
Parents:
b1d5f3f
Message:

WebFinger op een did:key: welk account zegt dat het deze sleutel is

FEP-c390 zet het identiteitsbewijs op de actor en zegt niets over vinden. Wie
een papieren sleutel vasthoudt (shaer-jpxj) -- bij een verhuizing, of om
iemand na te lopen -- kan nu vragen welk account erbij hoort:

GET /.well-known/webfinger?resource=did:key:z6Mk...

RFC 7033 laat elke URI als resource toe, dus dit is gewoon WebFinger. Het
antwoord is een JRD met per account een self-link naar de actor; 404 als
niemand hier die sleutel draagt.

Alleen wat NU klopt: elke opgeslagen verklaring wordt opnieuw nagelopen tegen
de actor waar ze op staat (een verklaring voor een ander account, of een die
niet meer natelopen is, telt niet), en alleen openbare sites, net als bij
acct:. Twee accounts met dezelfde sleutel staan er allebei: dat is het oude en
het nieuwe na een verhuizing. De vrager leert niets dat niet al openbaar op
die actors staat. Cache 60 seconden, korter dan acct:, zodat weghalen snel
zichtbaar is.

test/webfinger-did.test.js: vier toetsen, met drie mutaties apart gedraaid
(geen eigen controle, ook besloten sites, geen did-tak), elk gevangen. Een
acct:-vraag gaat precies als vroeger. Volledige suite 1350 groen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    rb1d5f3f r5d0d3f35  
    165165        { rel: 'http://purl.org/openwebauth/v1', href: baseUrl(req) + '/owa/token' },
    166166      ],
     167    }));
     168  }
     169  // ── Een did:key: welk account zegt dat het deze sleutel is? ──────
     170  //
     171  // FEP-c390 zet het bewijs op de actor en zegt niets over vinden. Wie een
     172  // papieren sleutel vasthoudt (shaer-jpxj) en wil weten bij welk account hij
     173  // hoort -- bij een verhuizing, of om iemand na te lopen -- vraagt het hier:
     174  // RFC 7033 laat elke URI als resource toe, dus dit is gewoon WebFinger.
     175  //
     176  // Alleen wat NU klopt: elke verklaring wordt opnieuw nagelopen tegen de
     177  // actor waar ze op staat, en alleen openbare sites tellen, net als bij acct:.
     178  // Twee accounts met dezelfde sleutel zijn mogelijk en horen er dan allebei
     179  // te staan: dat is precies het oude en het nieuwe account na een verhuizing.
     180  // De vrager leert niets dat niet al op die actors staat.
     181  const did = String(req.query.resource || '').trim();
     182  if (IdentityProof.publicKeyFromDidKey(did)) {
     183    const base = baseUrl(req);
     184    // De LIKE voorselecteert alleen; base58 bevat geen % of _.
     185    const actors = db.prepare('SELECT * FROM sites WHERE identity_proofs LIKE ? AND (is_public IS NULL OR is_public = 1) ORDER BY slug')
     186      .all(`%${did}%`)
     187      .filter((site) => {
     188        const me = AP.actorId(base, site.slug);
     189        return readProofs(site).some((b) => b && b.subject === did && IdentityProof.checkStatement(b, me).ok);
     190      })
     191      .map((site) => AP.actorId(base, site.slug));
     192    if (!actors.length) return res.status(404).end();
     193    res.type('application/jrd+json; charset=utf-8');
     194    // Korter dan bij acct:: wie een sleutel net weghaalde, hoort dat snel terug te zien.
     195    res.set('Cache-Control', 'public, max-age=60');
     196    return res.send(JSON.stringify({
     197      subject: did,
     198      aliases: actors,
     199      links: actors.map((href) => ({ rel: 'self', type: 'application/activity+json', href })),
    167200    }));
    168201  }
Note: See TracChangeset for help on using the changeset viewer.