You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
4.4 KiB

if(!$.fn.initTOTPScanner){
jQuery.fn.initTOTPScanner = function (videoId){
var elementContainer = this;
elementContainer.find(".send-file").click(function(){
elementContainer.find(".file-chooser").click();
elementContainer.find(".file-chooser").change(function (e){
var reader = new FileReader();
reader.onload = function (event) {
const codeReader = new ZXing.BrowserQRCodeReader();
codeReader
.decodeFromImage(undefined, event.target.result)
.then(result => addNewTOTP(result.text, elementContainer.find(".send-file")))
.catch(err => {
alert("Invalid QRCode image.");
console.error(err);
});
}
reader.readAsDataURL(e.target.files[0]);
});
});
if(window.location.protocol === 'https:'){
elementContainer.find(".camera").click(function(){
elementContainer.find(".video").show();
codeRead(elementContainer, videoId);
});
}else{
elementContainer.find(".camera").hide();
}
}
function codeRead(elementContainer, videoId){
const codeReader = new ZXing.BrowserQRCodeReader();
codeReader
.listVideoInputDevices()
.then(videoInputDevices => {
codeReader
.decodeOnceFromVideoDevice(undefined, videoId)
.then(result => addNewTOTP(result.text, elementContainer.find(".video")))
.catch(err => console.error(err));
})
.catch(err => console.error(err));
}
function addNewTOTP(url, loadingElm){
var params = getUrlVars(url);
var data = {action: "add_totp", ...params};
loadingElm.tikiModal(" ");
$.ajax({
type: "POST",
dataType: "json",
data, // serializes the form's elements.
success: function(data, header, s)
{
location.reload()
},
error: function(data, header, s)
{
alert("Error adding totp");
location.reload()
}
});
}
function getUrlVars(url) {
var vars = {};
var parts = url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = decodeURIComponent(value);
});
return vars;
}
}
if(!$.fn.initTOTP){
$.fn.initTOTP = function(){
var time = -1;
var elementContainer = this;
var doingRequest = false;
function refreshCode(){
doingRequest = true;
elementContainer.find(".code").tikiModal(" ");
$.ajax({
type: "POST",
dataType: "json",
data: {
action: "get_code"
}, // serializes the form's elements.
success: function(data, header, s)
{
doingRequest = false;
elementContainer.find(".code").tikiModal();
time = getTime(data.interval);
elementContainer.find(".code").html(data.code);
}
});
}
setInterval(updateExpire, 1000);
function getTime(interval)
{
var d = new Date();
return Math.ceil((((Math.floor(d.getTime()/(interval*1000))+1)*(interval*1000)) - d.getTime()) / 1000);
}
function updateExpire(){
if(time >= 0){
elementContainer.find(".time").html(time);
}else if(!doingRequest){
elementContainer.find(".time").html("--");
refreshCode();
}
time = time-1 ;
}
var showQRCode = false;
elementContainer.find(".twoFactorAuthShow").click(function(){
showQRCode = !showQRCode;
if(showQRCode){
elementContainer.find(".twoFactorAuthShow").text("Hide QRCode");
}else{
elementContainer.find(".twoFactorAuthShow").text("Show QRCode");
}
elementContainer.find(".twoFactorAuthCard").slideToggle(400);
return false;
})
}
}