Changeset 8a474ab in Klonkt for test


Ignore:
Timestamp:
09/23/2026 12:13:31 PM (8 hours ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
0ad37a0
Parents:
fa24f7b
Message:

Poorten per soort: ook bij het versturen, en film heeft er nu een

Twee gaten die naast elkaar stonden en elkaar versterkten.

gate_images en gate_music golden alleen bij het SERVEREN (shaer-qc9o). Wat een
ward niet te zien kreeg mocht hij wel plaatsen, dus het stond bij iedereen
behalve bij hemzelf. Dat is geen poort meer maar een filter op zijn eigen
scherm, en dat is niet wat een guardian dichtzet. De innamekant weigert nu met
gated_images / gated_music / gated_video, in dezelfde vorm als compose en
messages.

Weigeren en niet wegknippen: stilletjes de bijlage verwijderen publiceert een
bericht dat het kind niet geschreven heeft.

En film had helemaal geen poort (shaer-mxh2), dus de zwaarste soort van de drie
was de enige die altijd door mocht. Nu een gewone rij in de catalogus met een
eigen kolom, aan beide kanten afgedwongen: gateAttachments knipt video weg als
hij dicht staat (ook als hij als AS2-Video zonder mediaType binnenkomt) en de
outbox neemt hem niet aan. shaer:video staat in de caps, zodat de app het
vooraf weet in plaats van het bij de eerste weigering te ontdekken.

De reddingsboei gaat door alle drie heen, zoals door elke andere dichte deur.
Een hulpvraag draagt juist vaak een schermafdruk.

uploadMedia zelf blijft open, en dat is met opzet: de boei gebruikt dezelfde
poot en de server weet daar nog niet waar een upload voor bedoeld is. Een
bijlage die blijft liggen kost een bestand; een boei die vastloopt kost meer.
De weigering valt bij het innemen van de post, en daar is het wel bekend.

Getoetst in test/gates-family.test.js, naast de poorten die er al stonden.
Tegenproef: met de video-regel en de innamelus eruit vallen precies de twee
nieuwe toetsen om.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/gates-family.test.js

    rfa24f7b r8a474ab  
    175175  db.prepare("UPDATE sites SET gate_replies = NULL WHERE slug = 'kind'").run();
    176176});
     177
     178// ── De soort-poorten: ook bij het VERSTUREN, en film heeft er nu een ──────
     179//
     180// Twee gaten die naast elkaar stonden en elkaar versterkten (shaer-qc9o en
     181// shaer-mxh2). gate_images en gate_music golden alleen bij het SERVEREN: wat
     182// een ward niet te zien kreeg mocht hij wel plaatsen, dus het stond bij
     183// iedereen behalve bij hemzelf. En film had helemaal geen poort, dus de
     184// zwaarste soort van de drie was de enige die altijd door mocht.
     185//
     186// Samen betekende dat: een kind met plaatjes en muziek dicht kon een half uur
     187// video de wereld in sturen, en het paneel van de guardian zei dat alles wat
     188// er te sluiten viel gesloten was.
     189
     190const PUBLIC = 'https://www.w3.org/ns/activitystreams#Public';
     191const beeld = { type: 'Document', mediaType: 'image/jpeg', url: 'https://klonkt.test/media/x.jpg' };
     192const film = { type: 'Document', mediaType: 'video/mp4', url: 'https://klonkt.test/media/x.mp4' };
     193const geluid = { type: 'Audio', mediaType: 'audio/mpeg', url: 'https://klonkt.test/media/x.mp3' };
     194
     195/** Alle poorten open, behalve die je noemt. Zo toetst elke zaak zijn eigen
     196 *  weigering en niet een die van een vorige toets bleef staan. */
     197function poorten(dicht = {}) {
     198  const kolommen = ['gate_compose', 'gate_replies', 'gate_messages', 'gate_images', 'gate_music', 'gate_video'];
     199  const zet = kolommen.map((k) => `${k} = ${dicht[k] === 0 ? 0 : 1}`).join(', ');
     200  db.prepare(`UPDATE sites SET ${zet} WHERE slug = 'kind'`).run();
     201}
     202
     203test('film wordt bij het serveren weggeknipt als de video-poort dicht is', () => {
     204  const atts = [beeld, geluid, film];
     205  assert.deepEqual(AP.gateAttachments(atts, { video: false }).map((a) => a.mediaType), ['image/jpeg', 'audio/mpeg']);
     206  // Ook als hij als AS2-Video binnenkomt zonder mediaType: de soort staat dan
     207  // in `type`, en een poort die alleen naar mediaType kijkt mist hem.
     208  assert.equal(AP.gateAttachments([{ type: 'Video', url: 'https://x/v' }], { video: false }), undefined);
     209});
     210
     211test('een bijlage van een dichte soort wordt aan de outbox geweigerd', async () => {
     212  for (const [kolom, bijlage, fout] of [
     213    ['gate_images', beeld, 'gated_images'],
     214    ['gate_music', geluid, 'gated_music'],
     215    ['gate_video', film, 'gated_video'],
     216  ]) {
     217    poorten({ [kolom]: 0 });
     218    const post = { type: 'Create', object: { type: 'Note', content: '<p>kijk</p>', to: [PUBLIC], attachment: [bijlage] } };
     219    const uit = await AP.ingestOutboxActivity(site(), user, post);
     220    assert.equal(uit.status, 403, `${kolom} dicht hoort te weigeren`);
     221    assert.equal(uit.error, fout);
     222  }
     223});
     224
     225test('een dichte poort raakt alleen zijn eigen soort', async () => {
     226  poorten({ gate_images: 0 });
     227  const post = { type: 'Create', object: { type: 'Note', content: '<p>luister</p>', to: [PUBLIC], attachment: [geluid] } };
     228  const uit = await AP.ingestOutboxActivity(site(), user, post);
     229  assert.notEqual(uit.error, 'gated_images', 'muziek hoort niet op de beeldpoort te stuiten');
     230});
     231
     232test('de reddingsboei gaat door een dichte beeldpoort heen', async () => {
     233  // Een hulpvraag draagt vaak juist een schermafdruk: dat is het bewijs van
     234  // waar het kind van schrikt. Een dichte beeldpoort mag precies het kanaal
     235  // niet sluiten dat hem veilig houdt.
     236  poorten({ gate_images: 0, gate_video: 0, gate_music: 0 });
     237  const boei = {
     238    type: 'Create',
     239    object: {
     240      type: 'Note', content: '<p>help</p>', 'shaer:helpRequest': true,
     241      to: ['https://elders.test/u/oma'], attachment: [beeld],
     242    },
     243  };
     244  const uit = await AP.ingestOutboxActivity(site(), user, boei);
     245  assert.notEqual(uit.error, 'gated_images', 'de boei hoort door elke dichte deur heen te gaan');
     246});
Note: See TracChangeset for help on using the changeset viewer.