Changeset 76290bf in Klonkt for src


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.

Location:
src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/config/database.js

    r78b8e58 r76290bf  
    834834      content TEXT,                 -- sanitized HTML snippet of the mentioning note
    835835      published TEXT,
     836      in_reply_to TEXT,             -- de note waarop dit een antwoord is (AS2 inReplyTo)
    836837      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    837838      UNIQUE(slug, object_uri)
     
    987988  ensureColumn('ap_mentions', 'quote_json', 'TEXT');        // FEP-044f quoted post
    988989  ensureColumn('ap_mentions', 'embed_json', 'TEXT');        // external link preview
     990  // AS2 inReplyTo op een vermelding/bericht. Bestond hier niet, en daarmee ging
     991  // de ouder bij het opslaan verloren: elk ANTWOORD in een gesprek kwam bij de
     992  // client aan alsof het een gesprek begon (Robins melding, 26-8). Bestaande
     993  // rijen blijven leeg -- die ouder is niet meer te achterhalen zonder hem
     994  // opnieuw op te halen, en een verzonnen ouder is erger dan geen.
     995  ensureColumn('ap_mentions', 'in_reply_to', 'TEXT');
    989996  ensureColumn('ap_interactions', 'media_json', 'TEXT');
    990997  ensureColumn('ap_interactions', 'quote_json', 'TEXT');
  • src/routes/activitypub.js

    r78b8e58 r76290bf  
    543543      content: AP.stripLeadingMentions(m.content),
    544544      url: m.note_url || undefined,
     545      // Waar dit een antwoord op is (Robins melding, 26-8). Zonder dit veld
     546      // kwam elk antwoord binnen als het begin van een gesprek: de client kan
     547      // een keten alleen teruglopen langs inReplyTo. De andere twee legs
     548      // (replyItem uit ap_interactions, sentItem via buildNote) droegen hem
     549      // al -- deze was de enige die hem niet eens opsloeg.
     550      inReplyTo: m.in_reply_to || undefined,
    545551      published: AP.isoStamp(m.published || m.created_at),
    546552      // Addressed to us and to nobody we know of: the other recipients of a
  • 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) {
  • src/services/ap-timeline.js

    r78b8e58 r76290bf  
    334334const MESSAGE_COLUMNS = `
    335335      m.object_uri, m.note_url, m.actor_uri, m.actor_name, m.actor_handle, m.actor_icon, m.actor_url,
    336       m.content, m.published, m.created_at, m.wave, m.help_request,
     336      m.content, m.published, m.created_at, m.wave, m.help_request, m.in_reply_to,
    337337      m.emoji_json, m.actor_emoji_json, m.media_json, m.quote_json, m.embed_json`;
    338338
Note: See TracChangeset for help on using the changeset viewer.