| 1 | // De passkey-ontgrendeling -- verplaatst uit inline script, shaer-bqr.
|
|---|
| 2 | //
|
|---|
| 3 | // Inline script wordt door de CSP geweigerd zodra deze pagina via een link
|
|---|
| 4 | // BINNEN de site binnenkomt (shaer-0i6). Servergegevens komen uit pageData();
|
|---|
| 5 | // interpolatie kan niet in een statisch bestand.
|
|---|
| 6 |
|
|---|
| 7 | import { pageData, loadWebAuthn } from './lib.js';
|
|---|
| 8 |
|
|---|
| 9 | // Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
|
|---|
| 10 | // aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
|
|---|
| 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(); }
|
|---|
| 17 |
|
|---|
| 18 | function run() {
|
|---|
| 19 | (function () {
|
|---|
| 20 | var _d = pageData();
|
|---|
| 21 | var options = _d.options || {};
|
|---|
| 22 | var blob = _d.blob || "";
|
|---|
| 23 | var I = _d.i18n || {};
|
|---|
| 24 | var postUrl = _d.postUrl || "";
|
|---|
| 25 | var btn = document.getElementById('pk-go');
|
|---|
| 26 | var status = document.getElementById('pk-status');
|
|---|
| 27 | function say(msg, err) { status.hidden = false; status.textContent = msg; status.classList.toggle('is-err', !!err); }
|
|---|
| 28 |
|
|---|
| 29 | if (!window.SimpleWebAuthnBrowser || !window.PublicKeyCredential) {
|
|---|
| 30 | btn.disabled = true;
|
|---|
| 31 | say(I.unsupported, true);
|
|---|
| 32 | return;
|
|---|
| 33 | }
|
|---|
| 34 | btn.addEventListener('click', function () {
|
|---|
| 35 | btn.disabled = true;
|
|---|
| 36 | say(I.follow);
|
|---|
| 37 | window.SimpleWebAuthnBrowser.startRegistration({ optionsJSON: options })
|
|---|
| 38 | .then(function (response) {
|
|---|
| 39 | return fetch('/paid/register', {
|
|---|
| 40 | method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|---|
| 41 | body: JSON.stringify({ response: response, blob: blob }),
|
|---|
| 42 | });
|
|---|
| 43 | })
|
|---|
| 44 | .then(function (r) { return r.json(); })
|
|---|
| 45 | .then(function (j) {
|
|---|
| 46 | if (j && j.ok) { say(I.done); setTimeout(function () { location.href = postUrl; }, 900); }
|
|---|
| 47 | else { btn.disabled = false; say(I.failed.replace('{err}', (j && j.error) || '?'), true); }
|
|---|
| 48 | })
|
|---|
| 49 | .catch(function (e) { btn.disabled = false; say(e && e.name === 'NotAllowedError' ? I.cancelled : I.error, true); });
|
|---|
| 50 | });
|
|---|
| 51 | })();
|
|---|
| 52 | }
|
|---|