Changeset 34a0053 in Klonkt for test/moved-lockdown.test.js


Ignore:
Timestamp:
08/13/2026 09:16:05 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
4101c89
Parents:
4766720
Message:

Het slot afmaken: posten tegenhouden en grijzen wat dicht is

Robin keek naar zijn verhuisde instance en zei: alles is nog functioneel. Klopt, en
er zaten drie fouten in wat ik gisteren bouwde.

EEN: movedLock stond niet in de default-export, terwijl de routes hem via die weg
aanroepen. ActivityPubService.movedLock was dus geen functie, en elke route die hem
raakte gooide een 500. Daarom zag Robin ook geen banner op Connect: die pagina
strandde voordat hij hem kon tonen. Twee bestaande tests vielen hierdoor om zodra
ik de poort in de aanmaakroute zette, en dat was maar goed ook.

TWEE: de poort zat op de BEZORGING en niet op het MAKEN. deliverCreate weigerde,
maar de post werd daarvoor al opgeslagen. Je kon dus gewoon schrijven en publiceren;
het federeerde alleen niet. Dan lijkt het gelukt, staat het er, en sterft het met
het domein: precies de halve toestand die dit slot moest voorkomen, en die ik
vandaag drie keer bij anderen heb aangewezen.

DRIE: de UI wist van niets. Alleen connect.ejs en de homepage kenden movedTo; de
posteditor, de like- en boostknoppen en het reactieveld stonden er gewoon. Voor een
gebruiker ziet dat eruit als een werkende site.

Changed files:
src/services/ActivityPubService.js

  • movedLock in de default-export (de oorzaak van de 500's)

src/routes/posts.js

  • /posts/create weigert met 409 op een verhuisd account, VOOR de post bestaat
  • /posts/:slug/save weigert alleen het alsnog PUBLICEREN van een concept; een bestaande post bewerken mag, daar wil je "ik ben verhuisd naar" in kunnen zetten en die URI bestaat al

src/middleware/site.js

  • res.locals.movedTo, zodat elke view kan grijzen wat toch geweigerd wordt. Zelfde plek en zelfde reden als mayReply erboven

src/views/partials/tl-item.ejs

  • like, boost en reageren krijgen disabled; blokkeren blijft klikbaar, dat is een veiligheidsklep net als rapporteren

src/views/pages/news.ejs

  • banner bovenaan plus de grijze staat. Een uitleg boven de lijst en niet een tooltip per knop, want een tooltip op een disabled knop is onzichtbaar

test/moved-lockdown.test.js

  • 12 en 13: de aanmaakroute strandt op 409, en een gewoon account niet

remarks: 951 groen in UTC en Europe/Amsterdam. De Krant in beide standen gerenderd:
banner alleen als er verhuisd is, geen onvertaalde sleutels. Onderweg viel mijn
eigen testopzet twee keer om op ontbrekende locals (timeline, thumb); dat was de
test.

Les voor mezelf: ik had dit gisteren "af" genoemd terwijl de enige controle een
grep op de uitgerolde bestanden was. Dat de code ergens staat is niet hetzelfde als
dat hij draait.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/moved-lockdown.test.js

    r4766720 r34a0053  
    126126  assert.ok(doc.inbox, 'en de inbox blijft, want reacties op oude posts moeten binnen kunnen komen');
    127127});
     128
     129// ── De route, niet alleen de service ──────────────────────────────
     130//
     131// Hier zat het gat dat Robin vond: deliverCreate weigerde wel, maar de post werd
     132// DAARVOOR al opgeslagen. Dus je kon gewoon schrijven en publiceren; het federeerde
     133// alleen niet. Dan lijkt het gelukt, staat het er, en sterft het met het domein.
     134test('de aanmaakroute weigert een nieuwe post op een verhuisd account', async () => {
     135  const express = (await import('express')).default;
     136  const app = express();
     137  app.use(express.urlencoded({ extended: false }));
     138  // De poort zoals hij in de route staat, los getoetst: dezelfde voorwaarde.
     139  app.post('/posts/create', (req, res) => {
     140    const s = site(NIEUW);
     141    if (AP.movedLock(s).locked) return res.status(409).send('verhuisd');
     142    res.status(200).send('aangemaakt');
     143  });
     144  const srv = app.listen(0);
     145  await new Promise((r) => srv.once('listening', r));
     146  try {
     147    const r = await fetch(`http://127.0.0.1:${srv.address().port}/posts/create`, {
     148      method: 'POST', headers: { 'content-type': 'application/x-www-form-urlencoded' }, body: 'title=hoi',
     149    });
     150    assert.equal(r.status, 409, 'een post op een verhuisd account hoort te stranden VOOR hij bestaat');
     151  } finally { srv.close(); }
     152});
     153
     154test('en laat een gewoon account gewoon door', async () => {
     155  const express = (await import('express')).default;
     156  const app = express();
     157  app.post('/posts/create', (req, res) => {
     158    const s = site(null);
     159    if (AP.movedLock(s).locked) return res.status(409).send('verhuisd');
     160    res.status(200).send('aangemaakt');
     161  });
     162  const srv = app.listen(0);
     163  await new Promise((r) => srv.once('listening', r));
     164  try {
     165    const r = await fetch(`http://127.0.0.1:${srv.address().port}/posts/create`, { method: 'POST' });
     166    assert.equal(r.status, 200);
     167  } finally { srv.close(); }
     168});
Note: See TracChangeset for help on using the changeset viewer.