Changeset 59f404a in Klonkt
- Timestamp:
- 09/04/2026 11:21:16 AM (4 days ago)
- Branches:
- main
- Children:
- 4425cc2
- Parents:
- b5a0268c
- Files:
-
- 1 added
- 6 edited
-
src/assets/js/mod/lib.js (modified) (1 diff)
-
src/assets/js/mod/paid-gate.js (modified) (1 diff)
-
src/assets/js/mod/paid-passkey.js (modified) (1 diff)
-
src/views/pages/paid-gate.ejs (modified) (1 diff)
-
src/views/pages/paid-passkey.ejs (modified) (1 diff)
-
src/views/shell.ejs (modified) (1 diff)
-
test/csp-no-swapped-scripts.test.js (added)
Legend:
- Unmodified
- Added
- Removed
-
src/assets/js/mod/lib.js
rb5a0268c r59f404a 64 64 }); 65 65 } 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 */ 85 export 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 5 5 // interpolatie kan niet in een statisch bestand. 6 6 7 import { pageData } from './lib.js';7 import { pageData, loadWebAuthn } from './lib.js'; 8 8 9 9 // Element-bedrading leeft zo lang als de pagina; de bootstrap roept init() 10 10 // 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. 16 export async function init() { await loadWebAuthn(); run(); } 12 17 13 18 function run() { -
src/assets/js/mod/paid-passkey.js
rb5a0268c r59f404a 5 5 // interpolatie kan niet in een statisch bestand. 6 6 7 import { pageData } from './lib.js';7 import { pageData, loadWebAuthn } from './lib.js'; 8 8 9 9 // Element-bedrading leeft zo lang als de pagina; de bootstrap roept init() 10 10 // 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. 16 export async function init() { await loadWebAuthn(); run(); } 12 17 13 18 function run() { -
src/views/pages/paid-gate.ejs
rb5a0268c r59f404a 38 38 </article> 39 39 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. %> 42 45 43 46 <style> -
src/views/pages/paid-passkey.ejs
rb5a0268c r59f404a 11 11 </section> 12 12 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. %> 15 18 16 19 <style> -
src/views/shell.ejs
rb5a0268c r59f404a 505 505 // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig 506 506 // bumpen kost een bugfix die nooit aankomt. 507 var MOD_V = 6 2;507 var MOD_V = 63; 508 508 509 509 // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)