Changeset 0d6d266 in Klonkt for src


Ignore:
Timestamp:
08/27/2026 07:53:10 AM (13 days ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
9041d35
Parents:
76290bf
Message:

C2S-antwoord: alle mentions van de client, niet alleen de ouder-auteur

Robins bugreport, 26-8: er gingen er drie de deur uit, er stond er een
gepubliceerd.

Geen filter, maar een schakelaar die nooit werd omgezet. deliverReply
kent de mentions-balk van het web: een ARRAY betekent "precies deze
mensen", undefined betekent "oud gedrag -- noem de auteur van de ouder".
De C2S-inname gaf dat veld helemaal niet mee, dus elk antwoord uit een
app viel terug op dat oude gedrag. Dezelfde schakelaar stuurt drie
dingen tegelijk aan, en ze gingen dus alle drie mee: de ankers vooraan
de inhoud, de Mention-tags (die worden uit die ankers afgeleid) en de
inboxen waar bezorgd wordt.

De tags zijn de bron en niet to/cc: daar staan ook de volgerscollectie
en Public in, en dat zijn geen mensen. Ontdubbeld op actor, want de
ouder-auteur zit meestal ook in de tags. Zonder tags blijft het bij het
oude gedrag -- een lege lijst zou "niemand noemen" betekenen, en dat is
een keuze die een client die geen tags kent nooit gemaakt heeft.

Drie toetsen, met tegenbewijs: de twee over het nieuwe gedrag vallen
tegen de code van hiervoor, en die over het oude gedrag slaagt in
allebei -- dat laatste is het bewijs dat het bestaande pad niet
verlegd is. Volle suite 1234 groen.

File:
1 edited

Legend:

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

    r76290bf r0d6d266  
    201201            } : null)
    202202            .filter(Boolean);
     203          // DE MENTIONS VAN DE CLIENT (Robins melding, 26-8). Zonder deze
     204          // regel kreeg deliverReply `mentions: undefined`, en dat betekent
     205          // daar "oud gedrag: noem alleen de auteur van de ouder". Een client
     206          // die er drie stuurde zag er dus een gepubliceerd worden -- niet
     207          // door een filter, maar doordat de andere twee hier nooit aankwamen.
     208          //
     209          // De tags zijn de bron, niet `to`/`cc`: die dragen ook de
     210          // volgerscollectie en Public, en dat zijn geen mensen. `href` is de
     211          // actor, `name` de handle zoals de client hem spelt.
     212          //
     213          // Ontdubbeld op actor, want de ouder-auteur zit meestal ook in de
     214          // tags en zou anders twee keer vooraan komen te staan.
     215          //
     216          // GEEN tags meegestuurd blijft undefined en dus het oude gedrag. Een
     217          // LEGE lijst kan niet: dat betekent in deliverReply "niemand noemen",
     218          // en dat is een keuze die een client die geen tags kent nooit maakte.
     219          const gezien = new Set();
     220          const mentions = (Array.isArray(object.tag) ? object.tag : (object.tag ? [object.tag] : []))
     221            .filter((t) => t && t.type === 'Mention' && typeof t.href === 'string' && /^https?:\/\//i.test(t.href))
     222            .filter((t) => !gezien.has(t.href) && gezien.add(t.href))
     223            .map((t) => ({ uri: t.href, url: t.href, handle: typeof t.name === 'string' ? t.name : undefined }));
    203224          // Honour the client's visibility for the reply: 'friends' (followers-
    204225          // only, the Shaer detail-view Reply) drops Public; anything else stays
     
    208229            html: object.content || null, attachments: atts,
    209230            language: object.language || null, visibility: c2sVisibility(object),
     231            mentions: mentions.length ? mentions : undefined,
    210232          });
    211233          if (!r || !r.id) return { status: 502, error: 'reply_failed' };
Note: See TracChangeset for help on using the changeset viewer.