Changeset e215090 in Klonkt
- Timestamp:
- 08/10/2026 05:38:55 PM (4 weeks ago)
- Branches:
- main
- Children:
- 383e897
- Parents:
- 21ef238
- Files:
-
- 3 edited
-
src/routes/activitypub.js (modified) (3 diffs)
-
test/feed-changes.test.js (modified) (1 diff)
-
test/gates-capabilities-parity.test.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
r21ef238 re215090 377 377 }, 378 378 }; 379 } 380 381 /** Wat deze lezer mag (FEP-633c 5.6), op EEN plek. 382 * 383 * De verschil-lezing draagt ze net zo goed: een antwoord zonder rechten zou 384 * de client naar zijn standaard laten terugvallen, en die standaard is 385 * 'alles mag'. Dan zet een gesloten poort zichzelf stil open. Dezelfde reden 386 * waarom een 304 de caps met rust laat. 387 */ 388 function capabilitiesOf(p, gate) { 389 return { 390 'shaer:externalEmbeds': p.embedsAllowed, 391 'shaer:externalPlayback': p.playbackAllowed, 392 // Leaving the app is the same decision as playing inside it: with the 393 // gate shut a link is shown but not followed, so the door is closed too 394 // and not just the picture over it. 395 'shaer:externalLinks': p.playbackAllowed, 396 // De rest van de familie (8-8): de app hoort VOORAF te weten wat hij mag 397 // aanbieden in plaats van het bij de eerste weigering te ontdekken. De 398 // (+) kaart leest shaer:compose al (Barts gate); de rest is er voor de 399 // schermen die nog komen. Serveren wat waar is kost hier niets. 400 'shaer:compose': p.composeAllowed, 401 'shaer:replies': p.repliesAllowed, 402 'shaer:messages': p.messagesAllowed, 403 'shaer:images': p.imagesAllowed, 404 'shaer:music': p.musicAllowed, 405 'shaer:quoteCards': p.quotesAllowed, 406 'shaer:customEmoji': p.emojiAllowed, 407 'shaer:externalThreads': p.threadsAllowed, 408 'shaer:following': p.followingAllowed, 409 // Stond in de catalogus mét kolom, en ontbrak hier: de guardian zag de 410 // poort in zijn paneel en de app van het kind heeft er nooit van gehoord. 411 // Gevonden door de pariteitstest, niet door iemand die het toevallig zag. 412 'shaer:accountMove': gate('gate_account_move'), 413 }; 379 414 } 380 415 … … 780 815 partOf: `${base}/ap/users/${auth.site.slug}/inbox`, 781 816 orderedItems: items, 817 // De rechten gaan MEE. Zonder dit valt de client terug op zijn standaard, 818 // en die standaard is 'alles mag' -- dan zet een gesloten poort zichzelf 819 // stil open bij elke verschil-lezing. Dezelfde reden waarom een 304 de 820 // caps met rust laat. 821 'shaer:capabilities': capabilitiesOf(P, gate), 782 822 'shaer:cursor': AP.feedCursor(auth.site.slug), 783 823 }, 'private, no-store'); … … 832 872 // by construction, and never on the public actor document: it says 833 873 // something about a child, and only the child and its guardians need it. 834 'shaer:capabilities': { 835 'shaer:externalEmbeds': embedsAllowed, 836 'shaer:externalPlayback': playbackAllowed, 837 // Leaving the app is the same decision as playing inside it: with the 838 // gate shut a link is shown but not followed, so the door is closed too 839 // and not just the picture over it. 840 'shaer:externalLinks': playbackAllowed, 841 // De rest van de familie (8-8): de app hoort VOORAF te weten wat hij mag 842 // aanbieden in plaats van het bij de eerste weigering te ontdekken. De 843 // (+) kaart leest shaer:compose al (Barts gate); de rest is er voor de 844 // schermen die nog komen. Serveren wat waar is kost hier niets. 845 'shaer:compose': composeAllowed, 846 'shaer:replies': repliesAllowed, 847 'shaer:messages': messagesAllowed, 848 'shaer:images': imagesAllowed, 849 'shaer:music': musicAllowed, 850 'shaer:quoteCards': quotesAllowed, 851 'shaer:customEmoji': emojiAllowed, 852 'shaer:externalThreads': threadsAllowed, 853 'shaer:following': followingAllowed, 854 // Stond in de catalogus mét kolom, en ontbrak hier: de guardian zag de 855 // poort in zijn paneel en de app van het kind heeft er nooit van gehoord. 856 // Gevonden door de pariteitstest, niet door iemand die het toevallig zag. 857 'shaer:accountMove': gate('gate_account_move'), 858 }, 874 'shaer:capabilities': capabilitiesOf(P, gate), 859 875 // Het merk van wat hierin zit. Geef hem terug als `since` om op het 860 876 // volgende te wachten. NA het samenstellen bepaald, zodat hij precies dekt -
test/feed-changes.test.js
r21ef238 re215090 87 87 }); 88 88 89 test('het verschil draagt de rechten mee', async () => { 90 // Zonder dit valt de client terug op zijn standaard, en die standaard is 91 // 'alles mag': een gesloten poort zou zichzelf stil openzetten bij elke 92 // verschil-lezing. 93 const vol = await get(''); 94 db.prepare("UPDATE sites SET gate_images = 0 WHERE slug = 'kind'").run(); 95 db.prepare("INSERT INTO ap_guardianships (slug, other_uri, role, status) VALUES ('kind', 'https://elders/u/oma', 'guardian', 'accepted')").run(); 96 post('https://elders/n/9', '<p>na de poort</p>'); 97 const delta = await get(`?changes=1&since=${encodeURIComponent(vol.body['shaer:cursor'])}`); 98 assert.equal(delta.body['shaer:capabilities']['shaer:images'], false, 'de dichte poort reist mee'); 99 }); 100 89 101 test('niets veranderd is een leeg verschil, niet een leeg antwoord', async () => { 90 102 const vol = await get(''); -
test/gates-capabilities-parity.test.js
r21ef238 re215090 29 29 const SOURCE = 'src/routes/activitypub.js'; 30 30 31 /** De sleutels binnen het shaer:capabilities-blok, gelezen uit de bron. */ 31 /** De sleutels van het rechtenblok, gelezen uit de bron. 32 * 33 * Het blok woont sinds 10-8 in capabilitiesOf(), omdat de verschil-lezing 34 * (?changes=1) dezelfde rechten moet dragen: een antwoord zonder rechten laat 35 * de client terugvallen op zijn standaard, en die standaard is 'alles mag'. 36 * Deze toets kijkt daarom naar die functie en niet meer naar de plek in de 37 * route. */ 32 38 function capabilityKeys() { 33 39 const src = fs.readFileSync(SOURCE, 'utf8'); 34 const start = src.indexOf( "'shaer:capabilities': {");35 assert.notEqual(start, -1, `${SOURCE} heeft nog een shaer:capabilities-blok`);40 const start = src.indexOf('function capabilitiesOf('); 41 assert.notEqual(start, -1, `${SOURCE} heeft geen capabilitiesOf() meer`); 36 42 const open = src.indexOf('{', start); 37 43 let depth = 0;
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)