Changeset fc40410 in Klonkt for src/config


Ignore:
Timestamp:
07/28/2026 07:43:47 AM (6 weeks ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
b258a79
Parents:
6bc2e31b
Message:

Externe embeds: thumbnail-only, en gated aan de serverkant

Fase 2 van shaer-277. Een note zonder fediverse-quote maar met een externe link
levert nu een embed-kaart op, via dezelfde resolver (oEmbed of een bekende
provider). Twee besluiten zitten erin verankerd:

THUMBNAIL-ONLY. Nooit de iframe van de aanbieder. Een willekeurig
derde-partij-frame in een kindveilige app is een gat dat je niet meer dicht
krijgt, dus de kaart draagt een afbeelding en een titel en niets uitvoerbaars.

GATED AAN DE SERVERKANT. Externe embeds zijn een gated feature: de wereld van
een ward buiten de fediverse is aan de guardians. Cruciaal is WAAR die gate zit:
bij het serialiseren, niet in de client. Een embed die de client alleen maar
verbergt, is wel degelijk al op het toestel afgeleverd. Staat de gate dicht, dan
gaat shaer:embed simpelweg niet mee.

De regel zelf (externalEmbedsAllowed) is puur en apart getest: null = auto, wat
uit staat voor een ward en aan voor ieder ander; een expliciet guardian-besluit
wint beide kanten op.

Changed files:
src/config/database.js

  • ap_timeline.embed_json en sites.external_embeds (NULL = auto)

src/services/guardianship/notes.js

  • externalEmbedsAllowed(setting, isWard), puur en geexporteerd

src/services/guardianship/index.js

  • doorgeexporteerd

src/services/ActivityPubService.js

  • resolveExternalEmbed + firstExternalUrl + timelineEmbed
  • inbound: geen quote maar wel een externe link -> embed resolven (out of band)

src/routes/activitypub.js

  • inbox-read past de gate toe en serveert shaer:embed alleen als die open staat

New file:
test/external-embeds.test.js

  • 5 tests: de auto-regel, het expliciete besluit, link-selectie (mentions en hashtags overslaan), en dat een kaart zonder url geen kaart is

remarks: 205 tests groen. Nog te doen: de clients laten shaer:embed renderen met
de bestaande QuoteCard, en een UI voor guardians om de gate te bedienen (hoort
bij shaer-3kp).

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/config/database.js

    r6bc2e31b rfc40410  
    132132  ensureColumn('sites', 'show_search',     'INTEGER DEFAULT 1');
    133133  ensureColumn('sites', 'show_archive_link', 'INTEGER DEFAULT 1');
    134   ensureColumn('sites', 'og_theme', 'TEXT');               // OG share-card variant: NULL=auto (follow site theme) | 'light' | 'dark'
     134  // Gated feature (FEP-633c): may external (non-fediverse) embeds be shown to
     135  // this account? NULL = auto, which means OFF for a ward and ON for anyone
     136  // else. The guardians flip it; the gate itself lives server-side, so a ward
     137  // never even receives the thumbnail it is not allowed to see.
     138  ensureColumn('sites', 'external_embeds', 'INTEGER');
     139  ensureColumn('sites', 'og_theme', 'TEXT');             // OG share-card variant: NULL=auto (follow site theme) | 'light' | 'dark'
    135140
    136141  // Per-post noindex + type
     
    550555  ensureColumn('ap_timeline', 'link_json', 'TEXT');          // FEP-e232 object-link (quote/ref) tags from the inbound note, served back as `tag`
    551556  ensureColumn('ap_timeline', 'quote_json', 'TEXT');         // FEP-044f resolved quoted-post snapshot (author + content), for the embedded quote card
     557  ensureColumn('ap_timeline', 'embed_json', 'TEXT');         // resolved EXTERNAL embed (oEmbed/provider), thumbnail-only; gated per site (sites.external_embeds)
    552558  ensureColumn('ap_timeline', 'author_emoji_json', 'TEXT');  // FEP-9098 custom emojis in the author's display name (shaer:author.emojis)
    553559  ensureColumn('ap_timeline', 'reblog_emoji_json', 'TEXT');  // FEP-9098 custom emojis in the booster's display name (shaer:booster.emojis)
Note: See TracChangeset for help on using the changeset viewer.