Changeset 0ca7e9a4 in Klonkt for src/routes


Ignore:
Timestamp:
07/31/2026 05:43:16 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
bfa6fa1
Parents:
f434294
Message:

Account-verhuizingen slice 2: de uitgaande Move (FEP-7628)

De vertrekkende helft van shaer-0j2: deze Klonkt als het oude huis. Twee
eisen voordat er iets de deur uit gaat. Een: geen guardians; een warded
account verhuizen zonder de guardianship te hertargeten zou het vangnet
van het kind stil breken, dus tot shaer-tge er is weigert een bewaakt
account met een heldere melding. Twee: het nieuwe profiel claimt dit
adres in alsoKnownAs, dezelfde back-reference die elke ontvangende
server (onze slice 1 incluis) eist; zonder die claim is de Move overal
dood bij aankomst.

De Move gaat duurzaam (retry-queue) naar elke volger-inbox; hun servers
doen de re-follow. moved_to wordt vastgelegd; het serveren ervan op de
actor en het beleid van de oude site zijn slice 3. In Beheer > Sites >
bewerken zit de aankondiging als eigen formulier met bevestiging, nooit
als bijeffect van Opslaan: een verhuizing is een deur die je achter je
dichttrekt.

Changed files:
src/services/ActivityPubService.js

  • moveAccount(site, target, {fetchActorFn, deliverFn}): guardian- weigering, resolutie (URL/handle), back-reference-check, moved_to, Move naar alle volger-inboxen (shared inbox de-dupe)

src/config/database.js

  • sites.moved_to (TEXT)

src/routes/admin-sites.js

  • POST /:slug/move met per-fout een heldere redirect-melding

src/views/pages/admin-site-edit.ejs

  • Verhuizen-sectie (eigen form + confirm), toont moved_to

src/services/i18n.js

  • asite.move* in nl/en/de

test/move-actor.test.js

  • guarded weigert (niets vastgelegd), zonder back-reference weigert, happy path: moved_to + een Move per volger-inbox (shared voorop)

remarks: gebouwd op vps/main (f434294) in een worktree, los van de
lopende boost-toggle-sessie in de hoofd-clone. Suite op 370 groen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/admin-sites.js

    rf434294 r0ca7e9a4  
    296296    error: req.query.error || null,
    297297  });
     298});
     299
     300// ==================== MOVE (FEP-7628, slice 2) ====================
     301// The explicit departure: announce to every follower that this account now
     302// lives elsewhere. Deliberately its own POST with its own button, never a
     303// side effect of Save: a Move is a door you close behind you.
     304router.post('/:slug/move', requireSiteManagerBySlug, async (req, res) => {
     305  const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(req.params.slug);
     306  if (!site) return res.redirect('/admin/sites?error=Not+found');
     307  const r = await AP.moveAccount(site, req.body.move_target || '');
     308  if (r && r.ok) {
     309    return res.redirect(`/admin/sites/${req.params.slug}/edit?success=` + encodeURIComponent(`Verhuizing aangekondigd naar ${r.target} (${r.inboxes} inboxen).`));
     310  }
     311  const msg = {
     312    guarded_account: 'Dit account heeft guardians; verhuizen kan pas als de guardianship mee kan (shaer-tge).',
     313    no_backreference: 'Het nieuwe profiel claimt dit account niet in zijn aliassen. Zet daar eerst dit adres als alias.',
     314    not_found: 'Nieuw adres niet gevonden. Gebruik @naam@server of een actor-URL.',
     315    unreachable: 'Het nieuwe profiel is niet bereikbaar.',
     316    self: 'Dat is dit account zelf.',
     317  }[r && r.error] || 'Verhuizen mislukte; probeer het opnieuw.';
     318  res.redirect(`/admin/sites/${req.params.slug}/edit?error=` + encodeURIComponent(msg));
    298319});
    299320
Note: See TracChangeset for help on using the changeset viewer.