source: Klonkt/test/owner-follow-gate.test.js

main
Last change on this file was 56d74bb, checked in by Robin <roboburr@…>, 3 weeks ago

Poort op Connect én standaard aan

De aan/uit-toggle staat nu op de Connect-pagina, waar de volgverzoeken
toch al wonen — de checkbox in het sitebeheer blijft ook werken. En de
poort staat voortaan STANDAARD AAN: een nieuwe of bijgewerkte klonkt
beschermt zijn eigenaar meteen; uitzetten is de bewuste keuze. De
kolom-default regelt bestaande sites bij de upgrade vanzelf mee.

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

  • Property mode set to 100644
File size: 3.5 KB
Line 
1// De eigenaarspoort (Robins wens, 18-8): met approve_followers aan wordt een
2// inkomende Follow NIET auto-geaccepteerd maar vastgehouden tot de eigenaar
3// beslist op /connect — zodat niemand een klonkt ongevraagd aan een hub of
4// ander verzamelplatform kan hangen. Zonder de instelling verandert er niets.
5//
6// De fetch is gestubd: het gaat om de poort, niet om echte HTTP.
7import { test, after } from 'node:test';
8import assert from 'node:assert/strict';
9
10process.env.DATABASE_PATH = ':memory:';
11process.env.PUBLIC_BASE_URL = 'https://klonkt.test';
12
13const dbMod = await import('../src/config/database.js');
14const db = dbMod.default;
15dbMod.initializeDatabase();
16const APmod = await import('../src/services/ActivityPubService.js');
17const AP = APmod.default;
18const G = await import('../src/services/guardianship/index.js');
19
20db.prepare("INSERT INTO users (id, username, email, password_hash, role) VALUES ('u1','u1','u1@t','x','god')").run();
21db.prepare("INSERT INTO sites (id, slug, title, owner_id, is_public, approve_followers) VALUES ('s1','dev','Dev','u1',1,1)").run();
22db.prepare("INSERT INTO sites (id, slug, title, owner_id, is_public, approve_followers) VALUES ('s2','open','Open','u1',1,0)").run();
23
24// IP-literal: safeFetch slaat dan de DNS-lookup over en de stub vangt de rest.
25const HUB = 'https://203.0.113.77/ap/actor';
26const echteFetch = globalThis.fetch;
27globalThis.fetch = async () => new Response(JSON.stringify({
28 id: HUB, type: 'Application', preferredUsername: 'hub', inbox: `${HUB}/inbox`,
29}), { status: 200, headers: { 'content-type': 'application/activity+json' } });
30after(() => { globalThis.fetch = echteFetch; });
31
32const follow = (slug) => AP.handleInbox({
33 body: {
34 '@context': 'https://www.w3.org/ns/activitystreams',
35 id: `${HUB}#follow-${slug}`, type: 'Follow', actor: HUB,
36 object: `https://klonkt.test/ap/users/${slug}`,
37 },
38 headers: {}, get: () => undefined, socket: {},
39}, slug, { id: HUB });
40
41const volgers = (slug) =>
42 db.prepare('SELECT COUNT(*) c FROM ap_followers WHERE slug = ? AND actor_uri = ?').get(slug, HUB).c;
43
44test('approve_followers aan: de Follow wacht op de eigenaar', async () => {
45 await follow('dev');
46 assert.equal(volgers('dev'), 0, 'geen auto-accept');
47 const wachtend = G.follows.listForWard('dev');
48 assert.equal(wachtend.length, 1);
49 assert.equal(wachtend[0].follower_uri, HUB);
50 assert.equal(wachtend[0].status, 'pending');
51});
52
53test('goedkeuren: volger erbij, wachtrij leeg', async () => {
54 const pending = G.follows.listForWard('dev')[0];
55 await AP.acceptGatedFollow(pending);
56 G.follows.remove(pending.id);
57 assert.equal(volgers('dev'), 1);
58 assert.equal(G.follows.listForWard('dev').length, 0);
59});
60
61test('zonder de instelling blijft auto-accept gewoon werken', async () => {
62 await follow('open');
63 assert.equal(volgers('open'), 1);
64});
65
66test('standaard staat de poort AAN — uitzetten is de bewuste keuze', () => {
67 db.prepare("INSERT INTO sites (id, slug, title, owner_id, is_public) VALUES ('s3','vers','Vers','u1',1)").run();
68 assert.equal(db.prepare("SELECT approve_followers FROM sites WHERE slug = 'vers'").get().approve_followers, 1);
69});
70
71test('de actor adverteert manuallyApprovesFollowers eerlijk', () => {
72 const dicht = db.prepare("SELECT * FROM sites WHERE slug = 'dev'").get();
73 const open = db.prepare("SELECT * FROM sites WHERE slug = 'open'").get();
74 const build = APmod.buildActor || AP.buildActor;
75 assert.equal(build('https://klonkt.test', dicht).manuallyApprovesFollowers, true);
76 assert.equal(build('https://klonkt.test', open).manuallyApprovesFollowers, false);
77});
Note: See TracBrowser for help on using the repository browser.