Changeset 1a2f206 in Klonkt for src/routes/activitypub.js


Ignore:
Timestamp:
07/30/2026 11:17:05 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
ef519a3
Parents:
55eca8b
Message:

Follow: gesigneerd resolven, fouten naar de app, guardians ingelicht, volg-QR

Robins meldingen (31-7). Vier dingen aan de volg-kant.

Een: followActor haalde het actor-document anoniem op; een
authorized-fetch-instance weigert dat, waardoor volgen vanaf een boost
faalde. De fetch is nu gesigneerd als de eigen actor.

Twee: de C2S-ingest slikte followActor-fouten in en gaf altijd 202,
dus een mislukte follow zag er in de app uit als een gelukte. Fouten
komen nu als 502 follow_failed (met detail) bij de app aan, met test.

Drie: de guardians worden ingelicht als hun ward iemand gaat volgen:
een follow brengt nieuwe content het kind binnen, en het dorp hoort te
weten dat de deur openging. Een directe note per guardian,
best-effort. FEP-633c 5.3 gate't inkomende follows; deze uitgaande
melding is Shaer-beleid (spec-vraag als bead).

Vier: GET /ap/users/:slug/follow-qr.png serveert een QR-PNG van
share:social/follow/AP/@slug@host (npm qrcode, puur JS). Publiek met
opzet: er staat alleen de publieke handle in, en de plain image-loaders
van de apps dragen geen bearer.

Changed files:
src/services/ActivityPubService.js

  • followActor: signedGetJson voor het actor-doc; guardian-notice
  • C2S Follow-case: fouten door naar de app

src/routes/activitypub.js

  • follow-qr.png-route (cache 1 dag)

package.json / package-lock.json

  • qrcode-dependency

test/c2s-compose.test.js

  • onbereikbare follow geeft 502 follow_failed/unreachable

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r55eca8b r1a2f206  
    121121  }
    122122  AP.sendAP(res, ob, audience === 'friend' ? 'private, no-store' : undefined);
     123});
     124
     125// ── Follow-QR (Robins verzoek, 31-7) ──────────────────────────────
     126// A PNG QR of share:social/follow/AP/@slug@host: the ward shows it in
     127// Account, a friend scans the SCREEN with the ordinary camera app and their
     128// Shaer opens with the follow question. Public on purpose: it encodes only
     129// the public handle, and the app's plain image loaders carry no bearer.
     130router.get('/ap/users/:slug/follow-qr.png', async (req, res) => {
     131  const site = db.prepare('SELECT slug FROM sites WHERE slug = ?').get(req.params.slug);
     132  if (!site) return res.status(404).end();
     133  try {
     134    const host = new URL(baseUrl(req)).host;
     135    const { default: QRCode } = await import('qrcode');
     136    const png = await QRCode.toBuffer(`share:social/follow/AP/@${site.slug}@${host}`, { width: 600, margin: 1 });
     137    res.set('Content-Type', 'image/png');
     138    res.set('Cache-Control', 'public, max-age=86400');
     139    res.send(png);
     140  } catch (e) {
     141    console.warn('[AP] follow-qr failed:', e && e.message);
     142    res.status(500).end();
     143  }
    123144});
    124145
Note: See TracChangeset for help on using the changeset viewer.