Changeset bedd7a6 in Klonkt for test/forwarded-activities.test.js


Ignore:
Timestamp:
08/06/2026 12:26:27 PM (5 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
279ca0b
Parents:
f4f0a6d
git-author:
Robin <roboburr@…> (08/06/2026 12:26:18 PM)
git-committer:
roboburr <roboburr@…> (08/06/2026 12:26:27 PM)
Message:

Doorstuur-ophaal ondertekenen op de gedeelde inbox, en elke uitgang een reden

Twee dingen die de meting van shaer-drf in de weg stonden.

  1. signedGetJson valt bij een lege slug terug op een ONBETEKENDE GET. Op de gedeelde inbox is slugParam null, en dat is nu juist waar doorstuurverkeer landt, want we adverteren een sharedInbox. Een bron in secure mode was langs die weg dus helemaal niet te dereferencen. Dit is dezelfde fix die verifyRequest in shaer-afq kreeg -- elke lokale actor is een geldige ondertekenaar -- en shaer-afq voorspelde dit gat ook letterlijk, maar nam alleen fetchActor mee. Onbetekend blijft eerst, zodat een vreemde ons geen ondertekend verzoek naar een adres van zijn keuze kan laten sturen.
  1. Vijf van de zes uitgangen van dereferenceForwarded keerden stil terug. Daardoor was een weigering niet te onderscheiden van een versmalling die te ver dicht ging: op boiert stond 5x 'unknown inReplyTo' tegenover 29x signer mismatch, zonder dat te zien was waar de rest bleef. Elke uitgang noemt nu zijn reden, en 'fetch failed' is losgetrokken van 'attributedTo mismatch' -- het eerste is een onbereikbare bron, het tweede zegt de bron zelf dat iemand anders de auteur is.

Gecontroleerd dat de nieuwe test bijt: haal anySigningSlug() eruit en geval 13
valt om. Suite 466/466.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/forwarded-activities.test.js

    rf4f0a6d rbedd7a6  
    199199});
    200200
     201test('op de GEDEELDE inbox wordt de bron ook ondertekend opgehaald', async () => {
     202  // Doorstuurverkeer landt op /ap/inbox, want we adverteren een sharedInbox --
     203  // en daar is slugParam null. signedGetJson valt bij een lege slug terug op een
     204  // ONBETEKENDE GET, dus een bron in secure mode was langs deze weg helemaal niet
     205  // te dereferencen. Elke lokale actor is een geldige ondertekenaar, net als in
     206  // verifyRequest sinds shaer-afq.
     207  const GESLOTEN = 'https://203.0.113.10/notes/secure-mode';   // eigen id: buiten de negatieve cache
     208  const note = {
     209    id: GESLOTEN, type: 'Note', attributedTo: AUTEUR, inReplyTo: ONZE_NOTE,
     210    content: '<p>uit secure mode</p>', to: ['https://www.w3.org/ns/activitystreams#Public'],
     211  };
     212  const stub = globalThis.fetch;
     213  const pogingen = [];
     214  globalThis.fetch = async (url, opts = {}) => {
     215    if (String(url) !== GESLOTEN) return stub(url, opts);
     216    const ondertekend = !!(opts.headers && (opts.headers.Signature || opts.headers.signature));
     217    pogingen.push(ondertekend);
     218    return ondertekend
     219      ? new Response(JSON.stringify(note), { status: 200, headers: { 'content-type': 'application/activity+json' } })
     220      : new Response('unauthorized', { status: 401 });
     221  };
     222  const status = await AP.handleInbox(req(doorgestuurd(note)), null, alsDoorstuurder);
     223  globalThis.fetch = stub;
     224  assert.equal(status, 202, 'de doorgestuurde Create hoort geaccepteerd te worden');
     225  assert.deepEqual(pogingen, [false, true], 'eerst onbetekend, daarna pas ondertekend');
     226});
     227
    201228test.after(() => { globalThis.fetch = echteFetch; });
Note: See TracChangeset for help on using the changeset viewer.