Ignore:
Timestamp:
08/18/2026 05:46:13 PM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
56d74bb
Parents:
e854ace
Message:

Eigenaarspoort: volgers eerst goedkeuren, op z'n fediverse (Robins wens, 18-8)

Een site met approve_followers aan accepteert een Follow niet meer
automatisch: de actor adverteert manuallyApprovesFollowers, het verzoek
wacht in de bestaande wachtrij (ap_pending_follows, quorum 'owner') en
de eigenaar beslist op /connect — accepteren stuurt de Accept en de
backfill, weigeren een Reject. Zo kan niemand een klonkt ongevraagd aan
een hub of ander verzamelplatform hangen. Wards blijven bij hun
guardianpoort: die gaat vóór, en de eigenaarsroute weigert daar hard.
Instelbaar per site in het sitebeheer, teksten in NL/EN/DE.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    re854ace racbc9fc  
    390390    url: channelUrls(base, site),
    391391    ...(channelCategory(site) ? { category: channelCategory(site) } : {}),
    392     manuallyApprovesFollowers: isWard,
     392    // …and the same honesty for the OWNER gate (Robins wens, 18-8): a site
     393    // with approve_followers on holds follows pending until the owner decides.
     394    manuallyApprovesFollowers: isWard || !!site.approve_followers,
    393395    discoverable: true,
    394396    inbox: `${id}/inbox`,
     
    24742476      }
    24752477      console.log('[AP] Follow', who, '→ ward', slug, '(gated, awaiting guardians)');
     2478      return 202;
     2479    }
     2480    // De eigenaarspoort (Robins wens, 18-8): met approve_followers aan wordt
     2481    // een Follow niet automatisch geaccepteerd — hij wacht in dezelfde
     2482    // wachtrij als een ward-follow, maar hier beslist de EIGENAAR, op
     2483    // /connect. Zo kan niemand een klonkt zomaar aan een hub of ander
     2484    // verzamelplatform hangen zonder dat de eigenaar ja heeft gezegd.
     2485    // Wards vallen hier nooit: de guardianpoort hierboven gaat vóór.
     2486    const ownerGate = db.prepare('SELECT approve_followers FROM sites WHERE slug = ?').get(slug);
     2487    if (ownerGate && ownerGate.approve_followers) {
     2488      const followId = (typeof act.id === 'string' && act.id) || `${who}#follow-${Date.now()}-${rid()}`;
     2489      Guardianship.follows.recordPending(slug, {
     2490        id: followId, follower: who, inbox: remote.inbox, sharedInbox,
     2491        name: fi.name, handle: fi.handle, icon: fi.icon, activity: act, quorum: 'owner',
     2492      });
     2493      const L = pushLang(slug);
     2494      pushEvent(slug, {
     2495        type: 'follow',
     2496        title: i18nT(L, 'push.n_folreq_t'),
     2497        body: i18nT(L, 'push.n_folreq_b', { who: fi.name || fi.handle || i18nT(L, 'notif.someone') }),
     2498        url: `${pushPrefix(slug)}/connect`,
     2499      });
     2500      console.log('[AP] Follow', who, '→', slug, '(awaiting owner approval)');
    24762501      return 202;
    24772502    }
Note: See TracChangeset for help on using the changeset viewer.