Changeset 407353e in Klonkt
- Timestamp:
- 09/23/2026 03:13:00 PM (82 minutes ago)
- Branches:
- main
- Parents:
- 0ad37a0
- Files:
-
- 2 edited
-
src/services/guardianship/delivery.js (modified) (3 diffs)
-
test/c2s-direct.test.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/services/guardianship/delivery.js
r0ad37a0 r407353e 35 35 } 36 36 37 /** 38 * Heeft dit directe bericht iets te zeggen? Puur, zodat de regel te toetsen is 39 * zonder database, netwerk of scherm. 40 * 41 * EEN FOTO KAN HET HELE BERICHT ZIJN. Hier stond alleen `!text.trim()`, en dat 42 * betekende: een direct bericht zonder woorden gaf null terug, waar de inname 43 * "502 direct_failed" van maakte. Precies wat je kreeg als je een foto op een 44 * gesprek liet vallen en niets typte -- de inname liet een bijlage-only note 45 * door, en deze laag eronder weigerde hem alsnog. Twee lagen die het niet eens 46 * waren over wat een bericht is. 47 * 48 * Een leeg bericht blijft geweigerd: geen tekst, geen opmaak en geen bijlage is 49 * niets, en dat hoort niet de deur uit te gaan. 50 */ 51 export function directNoteHasContent({ text, html, attachments } = {}) { 52 if (String(text || '').trim()) return true; 53 if (String(html || '').trim()) return true; 54 return Array.isArray(attachments) && attachments.length > 0; 55 } 56 37 57 // A direct note: a NEW conversation (or a direct reply) addressed to specific 38 58 // actors only. Stored in ap_outbox with visibility 'direct' + the recipient … … 53 73 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 54 74 const list = [...new Set((recipients || []).filter((u) => /^https?:\/\//i.test(String(u || ''))))].slice(0, 8); 55 if (!base || !site || !site.slug || !list.length || !String(text || '').trim()) return null; 75 if (!base || !site || !site.slug || !list.length) return null; 76 if (!directNoteHasContent({ text, html, attachments })) return null; 56 77 const me = actorId(base, site.slug); 57 78 // Resolve every recipient for a mention anchor + a delivery inbox. … … 108 129 const richClean = html ? deps.sanitizeHtml(String(html)) : ''; 109 130 const rich = richClean && deps.htmlToPlainText(richClean).trim() ? richClean : ''; 110 const body = escHtml(String(text ).trim()).replace(/\r?\n/g, '<br>');131 const body = escHtml(String(text || '').trim()).replace(/\r?\n/g, '<br>'); 111 132 // De mention-anker blijft een eigen alinea vooraan: de ontvanger moet in het 112 133 // bericht genoemd staan, ook als de rijke inhoud met een kop of lijst begint. -
test/c2s-direct.test.js
r0ad37a0 r407353e 77 77 assert.equal(like.status, 403); 78 78 }); 79 80 // Een bijlage KAN het hele bericht zijn (shaer-6lcc). 81 // 82 // Twee lagen waren het oneens over wat een bericht is: de inname liet een 83 // note met alleen een bijlage door, en deliverDirectNote weigerde hem een 84 // laag lager op `!text.trim()`. Wie een foto op een gesprek liet vallen en 85 // niets typte kreeg daardoor "502 direct_failed". 86 test('een direct bericht met alleen een bijlage telt als inhoud', async () => { 87 const { directNoteHasContent } = await import('../src/services/guardianship/delivery.js'); 88 89 assert.equal(directNoteHasContent({ text: 'hallo' }), true); 90 assert.equal(directNoteHasContent({ html: '<p>hallo</p>' }), true); 91 assert.equal(directNoteHasContent({ 92 text: '', 93 attachments: [{ url: '/media/reply-media/x.png', mediaType: 'image/png' }], 94 }), true, 'een foto zonder woorden is een bericht'); 95 assert.equal(directNoteHasContent({ 96 text: ' \n ', 97 attachments: [{ url: '/media/reply-media/x.png', mediaType: 'image/png' }], 98 }), true, 'witruimte is geen tekst, maar de bijlage draagt hem'); 99 100 // En leeg blijft leeg: dit mag de deur niet uit. 101 assert.equal(directNoteHasContent({}), false); 102 assert.equal(directNoteHasContent({ text: ' ', html: '', attachments: [] }), false); 103 assert.equal(directNoteHasContent(), false); 104 }); 105 106 // De inname en de bezorging horen dezelfde grens te trekken. Loopt er eentje 107 // weg, dan is dat precies de 502 hierboven, en die valt buiten de tests om. 108 test('inname en bezorging zijn het eens over een leeg bericht', async () => { 109 const { directNoteHasContent } = await import('../src/services/guardianship/delivery.js'); 110 const src = (await import('fs')).readFileSync('src/services/ap-c2s.js', 'utf8'); 111 assert.ok(src.includes("error: 'empty_note'"), 'de inname heeft nog een lege-bericht-controle'); 112 // De inname laat een bijlage-only note door; de bezorging hoort dat ook te doen. 113 assert.equal(directNoteHasContent({ text: '', attachments: [{ url: '/media/x.png' }] }), true); 114 });
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)