Changeset 72ec6a4 in Klonkt for src/routes/guardian.js


Ignore:
Timestamp:
07/31/2026 06:55:59 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
17546af
Parents:
bfa6fa1
Message:

Hub-modus en guardian-lite eruit

Robins besluit (31-7): een instance is een eigenaar. Twee dingen weg.

HUB-MODUS was al dood: getTenancy() gaf sinds 24-6 hardcoded 'solo'
terug, dus elke tenancy === 'hub'-tak was onbereikbaar. Nu ook echt
verwijderd: getTenancy/setTenancy zelf, de /user/:slug-routing in
resolveSite, de hub-takken in admin, zoeken, audio, posts (neighbours
en related over alle sites), download, en de push-prefix. In de views
verdwijnen de hub-tagline, de hub-navigatie, de sites- en
users-tabellen (die kwamen alleen in hub-modus gevuld en verwezen nu
naar locals die niemand meer meegeeft), de eigenaar-toewijzing bij een
site, de /user/-slugprefix, het hub-brandblok en de hub-thuisknop.

GUARDIAN-LITE was de laatste multi-user-rest: /guardian/invite gaf een
link waarmee iemand via /guardian/join een echte user plus een site met
guardian_only=1 aanmaakte. Dat zette andermans wachtwoordhash, sessie
en PRIVATE actor-sleutel in jouw database, waardoor een verhuizing of
export nooit netjes kon (shaer-qw6q). Routes, formulier, kolom en
uitnodigingstabel zijn weg. Het guardian-DASHBOARD blijft: dat is
FEP-633c en werkt voor guardians met een eigen Klonkt. Bestaande
installaties houden kolom en tabel ongebruikt; nieuwe krijgen ze niet.

Changed files:
src/services/SettingsService.js

  • getTenancy/setTenancy verwijderd; kop herschreven

src/middleware/site.js, src/middleware/render.js

  • /user/:slug-routing weg; tenancy en hubTitle uit de locals

src/routes/admin.js, admin-settings.js, audio.js, download.js,
src/routes/posts.js, search.js

  • hub-takken en hub-queries weg; postNeighbors zonder isHub

src/services/ActivityPubService.js

  • pushPrefix is nu gewoon ; getTenancy-import weg

src/routes/guardian.js

  • /invite en /join verwijderd (dashboard blijft), imports opgeschoond

src/config/database.js

  • guardian_only-kolom en ap_guardian_invites-tabel niet meer aangemaakt

src/views/pages/admin.ejs, admin-users.ejs, admin-site-edit.ejs,
src/views/pages/guardian.ejs, partials/topnav.ejs, chrome.ejs, bottom-tab.ejs

  • alle hub-takken en de uitnodigingsknop weg

remarks: 320 regels weg, 63 erbij. Suite 372 groen; alle 85 templates
compileren; en met een wegwerp-kopie van de database daadwerkelijk
gedraaid en ingelogd: /, /admin, /admin/users, /admin/sites,
/admin/settings, /admin/sites/demo/edit, /admin/media en /guardian
geven alle 200 zonder fouten in het log, en /guardian/invite en
/guardian/join geven nu 404.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/guardian.js

    rbfa6fa1 r72ec6a4  
    1010 */
    1111import express from 'express';
    12 import crypto from 'crypto';
    13 import bcrypt from 'bcryptjs';
    1412import path from 'path';
    1513import { fileURLToPath } from 'url';
     
    595593});
    596594
    597 // ── Losse guardians (Guardian 2): uitnodigen en aansluiten ───────────────
    598 // De familie nodigt oma uit; zij kiest naam + wachtwoord en heeft daarmee een
    599 // guardian-only account: user + minimale site (guardian_only=1). Alles wat al
    600 // per slug werkt (actor, inbox, offers, push, deze PWA) werkt dan meteen.
    601 
    602 router.post('/invite', requireAuth, (req, res) => {
    603   const token = crypto.randomBytes(16).toString('base64url');
    604   db.prepare('INSERT INTO ap_guardian_invites (token, created_by) VALUES (?,?)')
    605     .run(token, req.session.user.id);
    606   const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
    607   const url = `${base}/guardian/join/${token}`;
    608   res.send(`<!doctype html><meta charset="utf-8"><body style="font-family:sans-serif;max-width:480px;margin:40px auto">
    609     <h2>Invite a guardian</h2>
    610     <p>Share this link. It lets one person create a guardian account here:</p>
    611     <p><a href="${url}">${url}</a></p>
    612     <p><a href="/guardian">Back</a></p></body>`);
    613 });
    614 
    615 function joinForm(token, error) {
    616   return `<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
    617   <body style="font-family:sans-serif;max-width:420px;margin:40px auto">
    618   <h2>Become a guardian</h2>
    619   <p>Watch over someone you care about. Pick a name and a password; that is all.</p>
    620   ${error ? `<p style="color:#b00">${error}</p>` : ''}
    621   <form method="post" action="/guardian/join/${token}">
    622     <p><input name="name" placeholder="your name (grandma)" required pattern="[a-z0-9_-]{1,32}"
    623        style="width:100%;padding:10px" autocapitalize="none"></p>
    624     <p><input name="password" type="password" placeholder="password" required minlength="8"
    625        style="width:100%;padding:10px"></p>
    626     <p><button style="width:100%;padding:12px">Create my guardian account</button></p>
    627   </form></body>`;
    628 }
    629 
    630 router.get('/join/:token', (req, res) => {
    631   const inv = db.prepare('SELECT * FROM ap_guardian_invites WHERE token = ? AND used_at IS NULL')
    632     .get(req.params.token);
    633   if (!inv) return res.status(404).send('This invite is no longer valid.');
    634   res.send(joinForm(req.params.token));
    635 });
    636 
    637 router.post('/join/:token', express.urlencoded({ extended: false }), (req, res) => {
    638   const inv = db.prepare('SELECT * FROM ap_guardian_invites WHERE token = ? AND used_at IS NULL')
    639     .get(req.params.token);
    640   if (!inv) return res.status(404).send('This invite is no longer valid.');
    641   const name = String(req.body.name || '').trim().toLowerCase();
    642   const password = String(req.body.password || '');
    643   if (!/^[a-z0-9_-]{1,32}$/.test(name)) return res.status(400).send(joinForm(req.params.token, 'Only lowercase letters, digits, - and _.'));
    644   if (password.length < 8) return res.status(400).send(joinForm(req.params.token, 'Password: at least 8 characters.'));
    645   if (db.prepare('SELECT 1 FROM sites WHERE slug = ?').get(name) || db.prepare('SELECT 1 FROM users WHERE username = ?').get(name)) {
    646     return res.status(409).send(joinForm(req.params.token, 'That name is taken, pick another.'));
    647   }
    648   const userId = crypto.randomUUID();
    649   db.prepare('INSERT INTO users (id, username, email, password_hash, role) VALUES (?,?,?,?,?)')
    650     .run(userId, name, `${name}@guardian.invalid`, bcrypt.hashSync(password, 10), 'member');
    651   db.prepare('INSERT INTO sites (id, slug, title, owner_id, is_primary, guardian_only) VALUES (?,?,?,?,0,1)')
    652     .run(crypto.randomUUID(), name, name, userId);
    653   db.prepare('UPDATE ap_guardian_invites SET used_by = ?, used_at = CURRENT_TIMESTAMP WHERE token = ?')
    654     .run(userId, req.params.token);
    655   req.session.user = { id: userId, username: name, role: 'member' };
    656   res.redirect('/guardian');
    657 });
     595// Losse guardian-accounts (guardian-lite: /invite + /join, user + site met
     596// guardian_only=1) zijn verwijderd op 31-7-2026. Een instance is een eigenaar;
     597// zo'n account was de laatste multi-user-rest en zette bovendien andermans
     598// wachtwoordhash, sessie en PRIVATE actor-sleutel in jouw database, wat een
     599// verhuizing (shaer-qw6q) onmogelijk netjes maakte. Een guardian hoort een
     600// eigen Klonkt te hebben; de adoptie loopt dan gewoon over de federatie.
    658601
    659602export default router;
Note: See TracChangeset for help on using the changeset viewer.