btcpayserver/BTCPayServer/wwwroot/js/webauthn/helpers.js
2022-01-18 10:23:07 +09:00

117 lines
3.0 KiB
JavaScript

coerceToArrayBuffer = function (thing, name) {
if (typeof thing === "string") {
// base64url to base64
thing = thing.replace(/-/g, "+").replace(/_/g, "/");
// base64 to Uint8Array
var str = window.atob(thing);
var bytes = new Uint8Array(str.length);
for (var i = 0; i < str.length; i++) {
bytes[i] = str.charCodeAt(i);
}
thing = bytes;
}
// Array to Uint8Array
if (Array.isArray(thing)) {
thing = new Uint8Array(thing);
}
// Uint8Array to ArrayBuffer
if (thing instanceof Uint8Array) {
thing = thing.buffer;
}
// error if none of the above worked
if (!(thing instanceof ArrayBuffer)) {
throw new TypeError("could not coerce '" + name + "' to ArrayBuffer");
}
return thing;
};
coerceToBase64Url = function (thing) {
// Array or ArrayBuffer to Uint8Array
if (Array.isArray(thing)) {
thing = Uint8Array.from(thing);
}
if (thing instanceof ArrayBuffer) {
thing = new Uint8Array(thing);
}
// Uint8Array to base64
if (thing instanceof Uint8Array) {
var str = "";
var len = thing.byteLength;
for (var i = 0; i < len; i++) {
str += String.fromCharCode(thing[i]);
}
thing = window.btoa(str);
}
if (typeof thing !== "string") {
throw new Error("could not coerce to string");
}
// base64 to base64url
// NOTE: "=" at the end of challenge is optional, strip it off here
thing = thing.replace(/\+/g, "-").replace(/\//g, "_").replace(/=*$/g, "");
return thing;
};
// HELPERS
function showErrorAlert(message, error) {
let footermsg = '';
if (error) {
footermsg = 'exception:' + error.toString();
}
console.error(message, footermsg);
const $info = document.getElementById("info-message");
if ($info) $info.classList.add("d-none");
document.getElementById("btn-retry").classList.remove("d-none");
document.getElementById("error-message").textContent = message;
for(let el of document.getElementsByClassName("fido-running")){
el.classList.add("d-none");
}
document.getElementById("error-message").classList.remove("d-none");
}
function detectFIDOSupport() {
if (window.PublicKeyCredential === undefined ||
typeof window.PublicKeyCredential !== "function") {
//$('#register-button').attr("disabled", true);
//$('#login-button').attr("disabled", true);
var el = document.getElementById("error-message");
el.textContent = "Your browser does not support FIDO2/WebAuthN";
el.classList.remove("d-none");
return false;
}
return true;
}
/**
*
* Get a form value
* @param {any} selector
*/
function value(selector) {
var el = document.querySelector(selector);
if (el.type === "checkbox") {
return el.checked;
}
return el.value;
}
function isSafari(){
//https://stackoverflow.com/a/23522755/275504
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
}