source: Klonkt/src/routes/federation.js@ 25d4041

main
Last change on this file since 25d4041 was b300682, checked in by roboburr <roboburr@…>, 3 months ago

Circles v1 — foundation: migration + signed own publication

Steps 1+2 of the Circles federation (3rd tenancy mode alongside solo/hub):

  • DB: circle_links / remote_actors / remote_posts (idempotent in initializeDatabase)
  • SettingsService: tenancy now accepts 'circle'
  • CircleFederation.js: per-instance Ed25519 keypair (app_settings) + actor/outbox builders + sign/verify (SPKI-DER pubkey, signature over raw body)
  • routes/federation.js: GET /.klonkt/actor.json + signed /.klonkt/outbox.json, mounted in server.js before resolveSite
  • docs/cirkels-v1-spec.md: full v1 spec

Still to do: CircleService.sync (pull+verify), Admin UI, /cirkel feed, hardening.
Ed25519 sign/verify round-trip verified in isolation; syntax clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@…>

  • Property mode set to 100644
File size: 1.2 KB
RevLine 
[b300682]1// routes/federation.js — publieke Cirkels-endpoints (v1, publicatie-kant).
2//
3// GET /.klonkt/actor.json — ActivityStreams-actor + Ed25519-pubkey
4// GET /.klonkt/outbox.json — publieke posts als AS Create-objecten,
5// getekend via de Klonkt-Signature-header
6//
7// Site-agnostisch en zonder auth — alleen lezen. Zie docs/cirkels-v1-spec.md.
8
9import express from 'express';
10import { buildActor, buildOutbox, signBody } from '../services/CircleFederation.js';
11
12const router = express.Router();
13
14function baseUrl(req) {
15 const b = process.env.PUBLIC_BASE_URL || `${req.protocol}://${req.get('host')}`;
16 return b.replace(/\/+$/, '');
17}
18
19router.get('/.klonkt/actor.json', (req, res) => {
20 const body = JSON.stringify(buildActor(baseUrl(req)), null, 2);
21 res.type('application/activity+json; charset=utf-8');
22 res.set('Cache-Control', 'public, max-age=300');
23 res.send(body);
24});
25
26router.get('/.klonkt/outbox.json', (req, res) => {
27 const body = JSON.stringify(buildOutbox(baseUrl(req)), null, 2);
28 res.type('application/activity+json; charset=utf-8');
29 res.set('Cache-Control', 'public, max-age=300');
30 res.set('Klonkt-Signature', `ed25519=${signBody(body)}`);
31 res.send(body);
32});
33
34export default router;
Note: See TracBrowser for help on using the repository browser.