Changeset 34a0053 in Klonkt for src/routes/posts.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
  • src/routes/posts.js

    r4766720 r34a0053  
    333333    return res.status(403).send('No permission');
    334334  }
     335  // Verhuisd = niet meer schrijven. Dit moet HIER staan en niet pas bij
     336  // deliverCreate: die weigert alleen de bezorging, waarna de post gewoon in de
     337  // database belandt met een object-URI op een adres dat je hebt opgezegd. Dan
     338  // lijkt het gelukt, staat het er, en sterft het met het domein. Precies de
     339  // halve toestand die dit slot moet voorkomen.
     340  if (ActivityPubService.movedLock(site).locked) {
     341    return res.status(409).send('Dit account is verhuisd naar ' + ActivityPubService.movedLock(site).movedTo
     342      + '. Nieuwe berichten maak je daar. Wil je terug? Maak het verhuisadres leeg bij Uiterlijk.');
     343  }
    335344
    336345  const { title, slug, content, excerpt, status, pinned, cover_image_url, tags, noindex, type } = req.body;
     
    477486  }
    478487
     488  // Verhuisd: een BESTAANDE post bewerken mag nog -- daar wil je juist "ik ben
     489  // verhuisd naar ..." in kunnen zetten, en die URI bestaat al. Een concept
     490  // alsnog publiceren mag niet: dat is nieuwe inhoud op een adres dat je hebt
     491  // opgezegd.
     492  if (post.status !== 'published' && String(req.body.status || '') === 'published'
     493      && ActivityPubService.movedLock(site).locked) {
     494    return res.status(409).send('Dit account is verhuisd. Publiceren doe je op '
     495      + ActivityPubService.movedLock(site).movedTo + '. Bestaande berichten bewerken kan hier wel.');
     496  }
     497
    479498  const { title, content, excerpt, status, pinned, cover_image_url, tags, noindex, type } = req.body;
    480499  const fanOnly = req.body.fan_only ? 1 : 0;
     
    565584      published_at: publishedAt, created_at: post.created_at, fan_only: fanOnly, paid, paid_min_cents: paidMinCents, excerpt: excerpt || '', nsfw, content_warning: cw, poll_json: pollJson,
    566585    };
     586    // Op een verhuisd account mag een BESTAANDE post nog bewerkt worden -- daar
     587    // wil je juist "ik ben verhuisd naar ..." in kunnen zetten, en die URI
     588    // bestaat al. Wat niet mag is een concept alsnog publiceren: dat is nieuwe
     589    // inhoud op een adres dat je hebt opgezegd. deliverCreate/deliverUpdate
     590    // weigeren zelf ook, dit voorkomt alleen de lokale halve toestand.
    567591    if (post.status !== 'published') ActivityPubService.deliverCreate(site, apPost).catch(() => { /* best-effort */ });
    568592    else ActivityPubService.deliverUpdate(site, apPost).catch(() => { /* best-effort */ });
Note: See TracChangeset for help on using the changeset viewer.