Changeset 59f404a in Klonkt for src


Ignore:
Timestamp:
09/04/2026 11:21:16 AM (4 days ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
4425cc2
Parents:
b5a0268c
Message:

De laatste twee scripts uit gewisselde inhoud (shaer-0i6)

shaer-bqr haalde de eigen logica van paid-gate en paid-passkey al uit de
pagina naar een module, maar liet de WebAuthn-bibliotheek als losse tag in
de body staan. Beide pagina's gaan via renderPage, dus bij een navigatie
binnen de site komen ze als fragment binnen -- met de nonce van dat
verzoek, die het al geladen document niet kent. Precies de vorm die Bart
destijds gemeld zag.

Het gevolg was stil: de module laadde wel, vond window.SimpleWebAuthn-
Browser niet, en viel terug op "geen WebAuthn hier". De passkey-knop deed
niets; de ontgrendelknop verdween. Alleen na een harde herlading werkte
het, en dat is precies waarom dit lang onzichtbaar bleef.

De modules halen de bibliotheek nu zelf op met loadWebAuthn() in lib.js.
Een dynamische import vanuit een module die de shell met een geldige nonce
startte is toegestaan -- daar is strict-dynamic voor. De UMD-bundel zet
zichzelf zonder CommonJS of AMD op globalThis, dus de global staat er na
afloop. init() wacht erop voordat hij bedraadt, anders zet de terugval de
knop uit terwijl er niets aan de hand is.

Verder nagelopen wat nog meer een scripttag draagt: vijf views hebben er
een van type application/json (een datablok, dat voert de browser nooit
uit) en twee gaan via res.render in plaats van renderPage -- losse
documenten die htmx nooit inwisselt. Die staan als uitzondering in de
nieuwe toets, met een tweede toets die controleert dat ze nog bestaan,
zodat een hernoeming de uitzondering niet stilletjes uitholt.

MOD_V naar 63: er wijzigde iets in mod/.

Location:
src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/lib.js

    rb5a0268c r59f404a  
    6464  });
    6565}
     66
     67/**
     68 * De WebAuthn-bibliotheek erbij halen, vanuit JavaScript (shaer-0i6).
     69 *
     70 * Hij stond als `<script src>` in paid-gate.ejs en paid-passkey.ejs, en dat
     71 * werkt alleen bij een volledige laadbeurt. Kom je op zo'n pagina via een link
     72 * BINNEN de site, dan is het een htmx-fragment met de nonce van een ANDER
     73 * verzoek, en weigert de CSP hem. Het gevolg was stil: de module laadde wel,
     74 * vond `window.SimpleWebAuthnBrowser` niet, en de knop deed niets -- op het
     75 * passkey- en betaalpad.
     76 *
     77 * Een dynamische import vanuit deze module mag wel: de shell startte hem met
     78 * een geldige nonce, en `strict-dynamic` bestaat er juist voor dat vertrouwde
     79 * scripts verder mogen laden. Het bestand is een UMD-bundel; zonder CommonJS
     80 * of AMD zet die zichzelf op globalThis, dus na afloop staat de global er.
     81 *
     82 * Faalt het laden, dan geeft dit undefined terug en niet een fout: beide
     83 * aanroepers hebben al een nette terugval voor "geen WebAuthn hier".
     84 */
     85export async function loadWebAuthn() {
     86  if (window.SimpleWebAuthnBrowser) return window.SimpleWebAuthnBrowser;
     87  try { await import('/assets/vendor/simplewebauthn-browser.umd.min.js'); }
     88  catch (e) { console.warn('[paid] WebAuthn-bibliotheek laadt niet:', e && e.message); }
     89  return window.SimpleWebAuthnBrowser;
     90}
  • src/assets/js/mod/paid-gate.js

    rb5a0268c r59f404a  
    55// interpolatie kan niet in een statisch bestand.
    66
    7 import { pageData } from './lib.js';
     7import { pageData, loadWebAuthn } from './lib.js';
    88
    99// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
    1010// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
    11 export function init() { run(); }
     11//
     12// EERST de bibliotheek, dan pas bedraden (shaer-0i6): die stond als
     13// `<script src>` in de pagina en overleefde een htmx-navigatie niet. Wacht
     14// run() daar niet op, dan valt hij terug op "geen WebAuthn" en verbergt hij
     15// de ontgrendelknop op een pagina waar ontgrendelen gewoon kan.
     16export async function init() { await loadWebAuthn(); run(); }
    1217
    1318function run() {
  • src/assets/js/mod/paid-passkey.js

    rb5a0268c r59f404a  
    55// interpolatie kan niet in een statisch bestand.
    66
    7 import { pageData } from './lib.js';
     7import { pageData, loadWebAuthn } from './lib.js';
    88
    99// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
    1010// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
    11 export function init() { run(); }
     11//
     12// EERST de bibliotheek, dan pas bedraden (shaer-0i6): die stond als
     13// `<script src>` in de pagina en overleefde een htmx-navigatie niet. Wacht
     14// run() daar niet op, dan ziet hij de global nog niet staan en zet hij de
     15// knop uit terwijl er niets aan de hand is.
     16export async function init() { await loadWebAuthn(); run(); }
    1217
    1318function run() {
  • src/views/pages/paid-gate.ejs

    rb5a0268c r59f404a  
    3838</article>
    3939
    40 <script src="/assets/vendor/simplewebauthn-browser.umd.min.js"></script>
    41 <%# Het script staat in assets/js/mod/paid-gate.js; de gegevens via partials/page-data.ejs (shaer-bqr). %>
     40<%# Het script staat in assets/js/mod/paid-gate.js; de gegevens via partials/page-data.ejs (shaer-bqr).
     41    De WebAuthn-bibliotheek stond hier als `<script src>` en is weg (shaer-0i6):
     42    deze pagina komt via een link binnen de site als htmx-fragment binnen, en
     43    dan draagt zo'n tag de nonce van een ander verzoek en weigert de CSP hem.
     44    De module haalt hem nu zelf op met loadWebAuthn() uit lib.js. %>
    4245
    4346<style>
  • src/views/pages/paid-passkey.ejs

    rb5a0268c r59f404a  
    1111</section>
    1212
    13 <script src="/assets/vendor/simplewebauthn-browser.umd.min.js"></script>
    14 <%# Het script staat in assets/js/mod/paid-passkey.js; de gegevens via partials/page-data.ejs (shaer-bqr). %>
     13<%# Het script staat in assets/js/mod/paid-passkey.js; de gegevens via partials/page-data.ejs (shaer-bqr).
     14    De WebAuthn-bibliotheek stond hier als `<script src>` en is weg (shaer-0i6):
     15    deze pagina komt via een link binnen de site als htmx-fragment binnen, en
     16    dan draagt zo'n tag de nonce van een ander verzoek en weigert de CSP hem.
     17    De module haalt hem nu zelf op met loadWebAuthn() uit lib.js. %>
    1518
    1619<style>
  • src/views/shell.ejs

    rb5a0268c r59f404a  
    505505  // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig
    506506  // bumpen kost een bugfix die nooit aankomt.
    507   var MOD_V = 62;
     507  var MOD_V = 63;
    508508
    509509  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note: See TracChangeset for help on using the changeset viewer.