mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2024-11-20 10:40:29 +01:00
86956c1e7b
* Fix CSP issue with time format switch on wallet transactions page * Fix CSP issue with invoice modal link on invoices list page * Fix CSP issue on FIDO2 auth page * Fix JS error on FIDO2 auth page * Minor UI code improvements
59 lines
2.0 KiB
JavaScript
59 lines
2.0 KiB
JavaScript
|
|
if (detectFIDOSupport() && makeAssertionOptions){
|
|
login(makeAssertionOptions);
|
|
}
|
|
|
|
async function login(makeAssertionOptions) {
|
|
const challenge = makeAssertionOptions.challenge.replace(/-/g, "+").replace(/_/g, "/");
|
|
makeAssertionOptions.challenge = Uint8Array.from(atob(challenge), c => c.charCodeAt(0));
|
|
|
|
// fix escaping. Change this to coerce
|
|
makeAssertionOptions.allowCredentials.forEach(function (listItem) {
|
|
var fixedId = listItem.id.replace(/\_/g, "/").replace(/\-/g, "+");
|
|
listItem.id = Uint8Array.from(atob(fixedId), c => c.charCodeAt(0));
|
|
});
|
|
|
|
let credential;
|
|
try {
|
|
credential = await navigator.credentials.get({ publicKey: makeAssertionOptions })
|
|
} catch (err) {
|
|
showErrorAlert(err.message ? err.message : err);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await verifyAssertionWithServer(credential);
|
|
} catch (e) {
|
|
showErrorAlert("Could not verify assertion", e);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Sends the credential to the the FIDO2 server for assertion
|
|
* @param {any} assertedCredential
|
|
*/
|
|
async function verifyAssertionWithServer(assertedCredential) {
|
|
// Move data into Arrays incase it is super long
|
|
let authData = new Uint8Array(assertedCredential.response.authenticatorData);
|
|
let clientDataJSON = new Uint8Array(assertedCredential.response.clientDataJSON);
|
|
let rawId = new Uint8Array(assertedCredential.rawId);
|
|
let sig = new Uint8Array(assertedCredential.response.signature);
|
|
const data = {
|
|
id: assertedCredential.id,
|
|
rawId: coerceToBase64Url(rawId),
|
|
type: assertedCredential.type,
|
|
extensions: assertedCredential.getClientExtensionResults(),
|
|
response: {
|
|
authenticatorData: coerceToBase64Url(authData),
|
|
clientDataJson: coerceToBase64Url(clientDataJSON),
|
|
signature: coerceToBase64Url(sig)
|
|
}
|
|
};
|
|
|
|
document.getElementById("Response").value = JSON.stringify(data);
|
|
document.getElementById("fidoForm").submit();
|
|
}
|
|
|
|
|