Changeset d97c58c in Klonkt for src


Ignore:
Timestamp:
08/16/2026 06:15:52 PM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
995b100
Parents:
1019a90
Message:

Betaalde posts lekten hun inhoud via de outbox en de volger-backfill

Bart zag de inhoud van een betaalde post op boiert.eu binnenkomen via
@actor@…. De redactie in buildNote werkte, maar kreeg de
gegevens niet: beide paden halen een KOLOMMENLIJST op, en paid stond
daar niet in. Dan is post.paid undefined, valt de vroege return weg, en
gaat de volledige tekst de deur uit -- zonder foutmelding.

  • outboxSlice miste paid en excerpt. Dit is het pad dat Bart zag.
  • backfillNewFollower miste paid, excerpt EN ap_visibility, en filterde alleen op fan_only. Die duwt bij ELKE nieuwe volger twintig posts naar hun inbox: een push, dus niet terug te nemen. Nu filtert hij ook op ap_visibility, want een friends- of direct-post hoort daar niet in.

De bestaande test was groen omdat hij buildOutbox een rij uit SELECT *
gaf -- de echte weg deed hij niet. Vervangen door een test via
outboxSlice, plus een klasse-wacht die de bron nakijkt: elke SELECT die
post.content oplevert moet ook paid ophalen.

Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r1019a90 rd97c58c  
    11421142    // vrienden-post met een publiek etiket erop, en die mag hij dan publiek
    11431143    // boosten. Gevonden tijdens de FEP-1580 end-to-end test (shaer-fuyo).
    1144     `SELECT id, slug, title, content, cover_image_url, cover_video_url, nsfw, content_warning,
     1144    // EN paid + excerpt, om exact dezelfde reden (Barts melding, 15-8). Zonder
     1145    // `paid` is post.paid hier `undefined`, dan slaat buildNote zijn redactie
     1146    // over en gaat de VOLLEDIGE tekst van een betaalde post de outbox uit. Zo
     1147    // kwam een post via een hub-actor gewoon te lezen. `excerpt` moet mee omdat
     1148    // de teaser daaruit komt; zonder dat veld valt hij terug op de eerste
     1149    // alinea van precies de tekst die verborgen hoort te blijven.
     1150    //
     1151    // Dit is een KOLOMMENLIJST, en die faalt stil: een vergeten kolom is
     1152    // `undefined` en niet een fout. Wie hier een veld toevoegt waar buildNote
     1153    // op beslist, moet het HIER ook toevoegen.
     1154    `SELECT id, slug, title, excerpt, content, cover_image_url, cover_video_url, nsfw, content_warning,
    11451155            c2s_attachments, quote_json, embed_json, published_at, created_at,
    1146             fan_only, ap_visibility
     1156            fan_only, ap_visibility, paid, paid_min_cents
    11471157       FROM posts WHERE id IN (${gaten(postIds.length)})`).all(...postIds) : [];
    11481158  const tracks = trackIds.length ? db.prepare(
     
    30143024  const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(slug);
    30153025  if (!site) return;
     3026  // Deze lijst filterde op fan_only maar NIET op paid, en haalde `paid` ook niet
     3027  // op -- dus stond post.paid op undefined, sloeg buildNote zijn redactie over,
     3028  // en duwden we bij ELKE nieuwe volger twintig posts de deur uit met de
     3029  // volledige tekst van de betaalde erbij. Een push, dus onherroepelijk: het
     3030  // staat daarna in hun inbox. Zelfde reden voor ap_visibility, dat hier
     3031  // helemaal ontbrak: een friends- of direct-post hoort niet in een backfill.
     3032  // (Barts melding, 15 augustus 2026.)
    30163033  const recent = db.prepare(
    3017     `SELECT id, slug, title, content, cover_image_url, cover_video_url, nsfw, content_warning, c2s_attachments, published_at, created_at
     3034    `SELECT id, slug, title, excerpt, content, cover_image_url, cover_video_url, nsfw, content_warning,
     3035            c2s_attachments, published_at, created_at, fan_only, ap_visibility, paid, paid_min_cents
    30183036     FROM posts WHERE site_id = ? AND status = 'published' AND (fan_only IS NULL OR fan_only = 0)
     3037       AND IFNULL(ap_visibility, 'public') = 'public'
    30193038     ORDER BY COALESCE(published_at, created_at) DESC LIMIT 20`
    30203039  ).all(site.id).reverse();
Note: See TracChangeset for help on using the changeset viewer.