website-betalen/programmaatjes/ondertekening.js

199 lines
7 KiB
JavaScript

console.info("ondertekening.js geladen");
const publiekeSleutel = `-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZFK5rRYJKwYBBAHaRw8BAQdAMTYOa+tK/1ojqvcwm6COXF17/e7mXJi/zsjM
1CWniLK0IENocmlzIEpvc3RlbiA8YmV0YWxlbkBuZXRzb2oubmw+iJkEExYIAEEW
IQTgjDs2/86n2pVsTdyKiCQFquzvCwUCZFK5rQIbAwUJA8MvcwULCQgHAgIiAgYV
CgkICwIEFgIDAQIeBwIXgAAKCRCKiCQFquzvC2v4AP0T+w0GHfW3GcMgexSLAxYU
XsstC+kzhYoeKkX9MiqQwwD9GSi9J3GgxLzRalsgGDkSK3Ia39RWK9uFkg8UCq/I
xAaJATMEEAEIAB0WIQQLgn4CBXfMJA//RIJxt+XUHlPEMwUCZFK6BAAKCRBxt+XU
HlPEM1ZpCACABZ1Iegb0HWs3s/a7OEQz7ynDmGMCndcRnTMX2RhdEv80Ajgh1cuD
LGBFg6i58jzSp1EzKI7QAkv6UuEce+iH1Axdvfx+XQmbft2eo/YYRqLDsg94oIFb
EsXQqOHCTWf57EUAN4beM+3jnHdmq/4ZEu1mJxps7HDxqlO0nrUyBPcjw5SGrmAv
jucs0DTRwTTS1tAcYcdVAG4LxwpAQNiw73bOp++FBPJg3UvV31RxbW0ZIIZ1goWf
ULWnBpCx7qABuBI+LPNUOKA5poAhGymTOh48muau7kBgC6yJmvR5/WEkyISvcbFa
yF//d4JWgUmo8kFE8eRekxYVWEV3Y6pouDgEZFK5rRIKKwYBBAGXVQEFAQEHQMje
uAuRdPjl/LV4lXgs5yW1AAVkNsJfRxwWJ3Vn2zEwAwEIB4h+BBgWCAAmFiEE4Iw7
Nv/Op9qVbE3ciogkBars7wsFAmRSua0CGwwFCQPDL3MACgkQiogkBars7wvoyAD/
RFNkqCy0d4pv0cHZMLam1El+mefgPs0gd77kRiNLO78BALKCQOtKE1+INMD+dApP
hs9ssb71ob7pPbLispAYsn8O
=SCX7
-----END PGP PUBLIC KEY BLOCK-----`
let TEKST_FOUT_ENGELS = 0;
let TEKST_FOUT_MISSENDE_PARAMETERS = 1;
let TEKST_FOUT_ONJUISTE_HANDTEKENING = 2;
let TEKST_FOUT_CORRUPTE_HANDTEKENING = 3;
let TEKST_FOUT_VERLOPEN = 4;
let TEKST_FOUT_VEROUDERD = 5;
let teksten = [];
teksten[TEKST_FOUT_ENGELS] = "Helaas hebben we alleen een Engelse foutmelding voor deze fout. Als u dit aankunt, lees dan de onderstaande tekst:";
teksten[TEKST_FOUT_MISSENDE_PARAMETERS] = "Ongeldige URL: missende parameters.";
teksten[TEKST_FOUT_ONJUISTE_HANDTEKENING] = "Ongeldige URL: ongeldige handtekening.";
teksten[TEKST_FOUT_CORRUPTE_HANDTEKENING] = "Ongeldige URL: handtekening corrupt.";
teksten[TEKST_FOUT_VERLOPEN] = "Betaalverzoek is verlopen.";
teksten[TEKST_FOUT_VEROUDERD] = "Dit is een verlopen, verouderd betaalverzoek. Vraag de maker om een nieuw betaalverzoek op te sturen.";
let vertaaldeFouten = {};
vertaaldeFouten["Error during parsing. This message / key probably does not conform to a valid OpenPGP format."] = TEKST_FOUT_CORRUPTE_HANDTEKENING;
function toonFout(tekstId, opties) {
vulVeldIn("foutmelding", teksten[tekstId]);
document.getElementById("betaal-fout").style.display = "block";
if (opties) {
if (opties["toonHandtekening"]) {
document.getElementById("fout-handtekening").style.display = "block";
}
if (opties["engelseFout"]) {
vulVeldIn("fout-engels", opties["engelseFout"]);
document.getElementById("fout-engels").style.display = "block";
}
}
}
function vulVeldIn(veld, data) {
let velden = document.querySelectorAll("*[data-veld='" + veld + "']");
for (let i = 0; i < velden.length; i++) {
velden[i].innerText = data;
}
}
function goeieOuweOntkink(object) {
return;
//alert(JSON.stringify(object));
}
function valutaNaarSymbool(valuta) {
switch (valuta.toUpperCase()) {
case "EUR":
return "€";
case "USD":
return "$";
default:
return valuta.toUpperCase();
}
}
document.addEventListener("DOMContentLoaded", function() {
try {
//goeieOuweOntkink("Verkrijgen parameters")
// Verkrijg parameters
let aanvraagParameters = new URLSearchParams(window.location.search);
let aan = aanvraagParameters.get("aan");
let betreft = aanvraagParameters.get("betreft");
let bedrag = aanvraagParameters.get("bedrag");
let iban = aanvraagParameters.get("iban");
let handtekening = aanvraagParameters.get("handtekening");
let valuta = aanvraagParameters.get("valuta");
// Eerdere betaalverzoeken hadden geen valuta parameter, maar wel een datum.
if (valuta === null && aanvraagParameters.get("datum") != null) {
toonFout(TEKST_FOUT_VEROUDERD);
return;
}
goeieOuweOntkink(aanvraagParameters);
//Controleer of ze allemaal zijn ingevuld.
if (aan === null || betreft === null || bedrag === null || iban === null
|| handtekening === null || valuta == null) {
toonFout(TEKST_FOUT_MISSENDE_PARAMETERS);
return;
}
// Maak een tekenreeks van alle parameters
let nakijkParameters = new URLSearchParams();
nakijkParameters.append("aan", aan);
nakijkParameters.append("betreft", betreft);
nakijkParameters.append("bedrag", bedrag);
nakijkParameters.append("iban", iban);
nakijkParameters.append("valuta", valuta);
handtekening = "-----BEGIN PGP SIGNATURE-----\n\n" + handtekening + "\n-----END PGP SIGNATURE-----";
belofte1 = openpgp.cleartext.fromText(nakijkParameters.toString())
belofte2 = openpgp.signature.readArmored(handtekening)
belofte3 = openpgp.key.readArmored(publiekeSleutel)
Promise.all([belofte1, belofte2, belofte3])
.then(function(waardes) {
console.log(waardes);
opties = {
message: waardes[0],
signature: waardes[1],
publicKeys: waardes[2].keys
}
return openpgp.verify(opties).then(function(geverifieerd) {
let handtekening2 = geverifieerd.signatures[0];
vulVeldIn("handtekening-vingerafdruk", handtekening2.keyid.toHex());
vulVeldIn("onderteken-datum", handtekening2.signature.packets[0].created.toLocaleString());
vulVeldIn("handtekening", handtekening);
if (geverifieerd.signatures[0].valid) {
console.info("Handtekekning juist");
return Promise.resolve(geverifieerd.signatures[0]);
} else {
console.info("Handtekening onjuist");
toonFout(TEKST_FOUT_ONJUISTE_HANDTEKENING, {"toonHandtekening": true});
return Promise.reject();
}
});
}, function(fout) {
console.error(fout.message);
fout2 = vertaaldeFouten[fout.message];
if (fout2) {
toonFout(fout2);
} else {
toonFout(TEKST_FOUT_ENGELS, {"engelseFout": fout.name + ": " + fout.message});
}
return Promise.reject();
}).then(function(handtekening2) {
console.log(handtekening2);
vulVeldIn("aan", aan);
vulVeldIn("betreft", betreft);
vulVeldIn("bedrag", bedrag);
vulVeldIn("iban", iban);
vulVeldIn("valuta-symbool", valutaNaarSymbool(valuta));
let betaalLinkParameters = new URLSearchParams();
betaalLinkParameters.append("amount", valuta.toUpperCase() + ":" + bedrag.replaceAll(",", "."));
betaalLinkParameters.append("message", betreft);
betaalLinkParameters.append("receiver-name", aan);
document.getElementById("betaallink-iban").href = "payto://iban/" + iban + "/?"
+ betaalLinkParameters.toString();
document.getElementById("betaallink-contant").href = "payto://void/?"
+ betaalLinkParameters.toString();
document.getElementById("betaal-info").style.display = "block";
let qrValue = `BCD
002
1
SCT
${aan}
${iban}
${valuta}${bedrag.replace(",", ".")}
${betreft}
via betalen.chris.netsoj.nl
`;
// https://www.europeanpaymentscouncil.eu/sites/default/files/KB/files/EPC069-12%20v2.1%20Quick%20Response%20Code%20-%20Guidelines%20to%20Enable%20the%20Data%20Capture%20for%20the%20Initiation%20of%20a%20SCT.pdf
let qr = new QRious({
element: document.getElementById('qr-sepa'),
level: "M",
size: 200,
value: qrValue
});
});
let ondertekendeTekst = nakijkParameters.toString();
console.log(ondertekendeTekst);
} catch(e) {
console.error(e);
toonFout(TEKST_FOUT_ENGELS, {"engelseFout": e.name + ": " + e.message});
}
});