Changeset 76290bf in Klonkt for src/services/ap-inbox.js


Ignore:
Timestamp:
08/26/2026 04:49:33 AM (2 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
0d6d266
Parents:
78b8e58
git-author:
Robin <roboburr@…> (08/26/2026 04:49:17 AM)
git-committer:
Robin <roboburr@…> (08/26/2026 04:49:33 AM)
Message:

Inbox: een binnengekomen antwoord houdt zijn inReplyTo

Robins melding, 26-8: de C2S-lezing serveerde antwoorden zonder ouder.

De oorzaak lag een laag dieper dan de serialisatie: ap_mentions had geen
kolom voor inReplyTo, dus de ouder viel al bij het OPSLAAN op de grond en
messageItem had niets te serveren. Een client kan een gesprek alleen
teruglopen langs inReplyTo, dus elk antwoord kwam aan als het begin van
een gesprek -- de ketenlezing in de app kon nooit verder dan een.

Vier plekken, want het is de hele weg: de kolom (met ensureColumn voor
bestaande databases), het schrijven in de inbox, MESSAGE_COLUMNS -- de
ene leesplek die zowel de inbox-lijst als de gesprekken voedt -- en
messageItem.

De ouder gaat door dezelfde poort als de note-url: alleen http(s), en zowel de
string- als de objectvorm die AS2 toestaat. Alleen de string erkennen
zou hetzelfde gat laten voor wie de objectvorm stuurt.

Nagegaan wat WEL goed ging, zodat de reparatie niet breder wordt dan de
kwaal: replyItem droeg hem al uit ap_interactions.parent_uri, sentItem
via buildNote uit ap_outbox.in_reply_to, en de tijdlijn kan hem per
definitie niet missen -- belongsInTimeline weigert alles met inReplyTo.
Deze leg was de enige.

Bestaande rijen blijven leeg: die ouder is niet meer te achterhalen
zonder hem opnieuw op te halen, en een verzonnen ouder is erger dan
geen. Twee toetsen over de hele keten, tegenbewijs gedraaid: allebei
vallen ze tegen de code van hiervoor. Volle suite 1231 groen.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ap-inbox.js

    r78b8e58 r76290bf  
    691691        for (const slug of slugs) {
    692692          try {
    693             const r = db.prepare(`INSERT OR IGNORE INTO ap_mentions (slug, object_uri, note_url, actor_uri, actor_name, actor_handle, actor_icon, actor_url, content, published, help_request, wave, has_guardians, emoji_json, actor_emoji_json, media_json, created_at)
    694                                   VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP)`)
    695               .run(slug, o.id, safeUrl(o.url) || null, actorUri, ai.name, ai.handle, ai.icon, ai.url, html, o.published || null, help ? 1 : 0, wave ? 1 : 0, hasG ? 1 : 0,
     693            // De OUDER gaat mee (Robins melding, 26-8). Hij stond nergens in
     694            // deze rij, dus een antwoord binnen een gesprek kwam bij de client
     695            // aan alsof het een gesprek begon: de app kan een keten alleen
     696            // teruglopen langs inReplyTo, en die was leeg.
     697            //
     698            // Alleen een http(s)-adres, langs dezelfde poort als `url`: een
     699            // inReplyTo komt van een vreemde en mag geen ander schema
     700            // binnensmokkelen. AS2 staat een string of een object toe, dus
     701            // allebei uitpakken -- alleen de string erkennen zou hetzelfde gat
     702            // laten voor iedereen die de objectvorm stuurt.
     703            const ouder = safeUrl(typeof o.inReplyTo === 'string' ? o.inReplyTo : (o.inReplyTo && o.inReplyTo.id)) || null;
     704            const r = db.prepare(`INSERT OR IGNORE INTO ap_mentions (slug, object_uri, note_url, actor_uri, actor_name, actor_handle, actor_icon, actor_url, content, published, in_reply_to, help_request, wave, has_guardians, emoji_json, actor_emoji_json, media_json, created_at)
     705                                  VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP)`)
     706              .run(slug, o.id, safeUrl(o.url) || null, actorUri, ai.name, ai.handle, ai.icon, ai.url, html, o.published || null, ouder, help ? 1 : 0, wave ? 1 : 0, hasG ? 1 : 0,
    696707                extractEmojiTags(o.tag), emojiJsonOf(ai.emojis), mediaFromNote(o));
    697708            if (r.changes) {
Note: See TracChangeset for help on using the changeset viewer.