Changeset f5c3870 in Klonkt for src/routes/posts.js


Ignore:
Timestamp:
06/24/2026 04:08:34 PM (3 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
19a72df
Parents:
d0cab9d
Message:

feat(fediverse-client): block/defederate accounts & domains

Block an @handle or a whole domain (/blokkeren + 🚫 on timeline items): their
inbound activities are silently dropped (202) and their stored content is purged.
New ap_blocks table + isBlockedAny gate in the inbox. Top-bar bell now points to
the fediverse /meldingen (gated to site managers via canManageFedi) instead of the
dead native notifications.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/posts.js

    rd0cab9d rf5c3870  
    8686  'tag', 'type', 'user', 'users', 'artiesten', 'leden', 'favorieten', 'feed.xml', 'atom.xml', 'sitemap.xml',
    8787  'manifest.webmanifest', 'sw.js', 'favicon.ico', 'favicon.svg', 'assets',
    88   'authorize_interaction', 'fediverse', 'tijdlijn', 'meldingen',
     88  'authorize_interaction', 'fediverse', 'tijdlijn', 'meldingen', 'blokkeren',
    8989]);
    9090
     
    613613  const items = site ? ActivityPubService.getNotifications(site.slug, 80) : [];
    614614  renderPage(req, res, 'pages/fedi-notifications', { pageTitle: 'Meldingen', bodyClass: 'on-special', items });
     615});
     616
     617// Blocking / defederation (owner-only).
     618router.get('/blokkeren', requireSiteManager, (req, res) => {
     619  const site = res.locals.site;
     620  const blocks = site ? ActivityPubService.listBlocks(site.slug) : [];
     621  renderPage(req, res, 'pages/blocks', { pageTitle: 'Blokkeren', bodyClass: 'on-special', blocks, success: req.query.success || null, error: req.query.error || null });
     622});
     623
     624router.post('/blokkeren/add', requireSiteManager, async (req, res) => {
     625  const site = res.locals.site;
     626  let q = 'success=' + encodeURIComponent('Geblokkeerd');
     627  if (site) {
     628    try {
     629      const r = await ActivityPubService.blockTarget(site, (req.body.target || '').toString());
     630      if (r && r.error) q = 'error=' + encodeURIComponent(r.error === 'not_found' ? 'Account niet gevonden' : 'Voer een @handle of domein in');
     631      else q = 'success=' + encodeURIComponent(((r && r.label) || '') + ' geblokkeerd');
     632    } catch (e) { q = 'error=' + encodeURIComponent('Blokkeren mislukt'); }
     633  }
     634  const ref = req.get('Referer') || '';
     635  res.redirect((ref.includes('/tijdlijn') ? '/tijdlijn?' : '/blokkeren?') + q);
     636});
     637
     638router.post('/blokkeren/remove', requireSiteManager, (req, res) => {
     639  const site = res.locals.site;
     640  if (site) { try { ActivityPubService.unblock(site, (req.body.target || '').toString()); } catch (e) { /* ignore */ } }
     641  res.redirect('/blokkeren?success=' + encodeURIComponent('Deblokkeerd'));
    615642});
    616643
Note: See TracChangeset for help on using the changeset viewer.