Changeset f63cbc2 in Klonkt for src/services/CircleService.js
- Timestamp:
- 06/16/2026 06:33:38 AM (3 months ago)
- Branches:
- main
- Children:
- 4fee228
- Parents:
- 1b4d5dd
- File:
-
- 1 edited
-
src/services/CircleService.js (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/CircleService.js
r1b4d5dd rf63cbc2 6 6 7 7 import db from '../config/database.js'; 8 import { verifyBody } from './CircleFederation.js';8 import { verifyBody, KLONKT_PROTO, MIN_PROTO } from './CircleFederation.js'; 9 9 import { getTenancy } from './SettingsService.js'; 10 10 … … 25 25 function baseOf(remoteUrl) { 26 26 return String(remoteUrl).replace(/\/+$/, ''); 27 } 28 29 // Bron buiten de cirkel zetten met een leesbare reden (geen stille mislukking). 30 // Aparte status 'outdated' zodat de Beheer-UI er een nette "update vereist"- 31 // melding van kan maken i.p.v. een generieke fout. 32 function markOutdated(link, msg) { 33 db.prepare("UPDATE circle_links SET status='outdated', last_error=?, last_synced=CURRENT_TIMESTAMP WHERE id=?") 34 .run(String(msg).slice(0, 300), link.id); 35 return { ok: false, outdated: true, link: link.remote_url, error: msg }; 27 36 } 28 37 … … 36 45 signal: ac.signal, 37 46 redirect: 'follow', 38 headers: { Accept: 'application/activity+json, application/json' }, 47 headers: { 48 Accept: 'application/activity+json, application/json', 49 // Vertel de publisher onze proto → die kan ons met 426 weren als we te oud zijn. 50 'Klonkt-Proto': String(KLONKT_PROTO), 51 }, 39 52 }); 40 53 if (!res.ok) throw new Error(`HTTP ${res.status}`); … … 84 97 if (originOf(actorId) !== originOf(actorUrl)) throw new Error('actor.id heeft andere origin dan de actor-URL'); 85 98 99 // Protocol-versie-gate. De proto zit óók in de outbox-handtekening-grondslag, 100 // dus liegen in de (ongetekende) actor helpt niet: bij een echte mismatch faalt 101 // de verificatie verderop alsnog. Hier vooral voor een DUIDELIJKE melding + 102 // buitensluiten zonder stille mislukking. 103 const remoteProto = Number(actor.klonkt && actor.klonkt.proto) || 1; 104 if (remoteProto > KLONKT_PROTO) { 105 return markOutdated(link, 106 `Jouw Klonkt (proto ${KLONKT_PROTO}) is ouder dan ${base} (proto ${remoteProto}). Werk je eigen instance bij om te blijven federeren.`); 107 } 108 if (remoteProto < MIN_PROTO) { 109 return markOutdated(link, 110 `${base} draait een oudere Klonkt (proto ${remoteProto}; minimaal ${MIN_PROTO} vereist). Vraag ze te updaten.`); 111 } 112 86 113 // TOFU: een sleutelwissel vereist expliciete herbevestiging (anti-hijack) 87 114 const existing = db.prepare('SELECT public_key FROM remote_actors WHERE id = ?').get(actorId); … … 104 131 const sigHeader = o.headers.get('klonkt-signature') || ''; 105 132 const sig = (sigHeader.match(/ed25519=(.+)\s*$/) || [])[1]; 106 if (!sig || !verifyBody(o.text, sig, pubKey )) {133 if (!sig || !verifyBody(o.text, sig, pubKey, remoteProto)) { 107 134 throw new Error('outbox-handtekening ongeldig of ontbreekt'); 108 135 }
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)