Adding Simple UI

Adding UI to authenticate and verify
Fixed bugs
This commit is contained in:
sairajzero 2020-03-04 22:23:46 +05:30
parent 54def5c2eb
commit c6c8e3d9c8

View File

@ -2,8 +2,19 @@
<html>
<head>
<title>FLO Standard Operators</title>
<title>FLO Authenticator</title>
<style>
#qr_input, #qr_output{
height: 200px;
width: 200px;
border: 1px solid gray;
display: inline-block;
}
#text_input, #text_output{
height: 200px;
width: 200px;
}
</style>
<script id="floGlobals">
/* Constants for FLO blockchain operations !!Make sure to add this at begining!! */
const floGlobals = {
@ -19,7 +30,86 @@
</head>
<body onload="onLoadStartUp()">
TEST_MODE_Authenticator
<div>
<div>
<span id="greet">Login to authorize</span><br/>
<button id="login_qr">Login (QR)</button>
<button id="login_text">Login (Text)</button>
</div><br/>
<div>
INPUT <br/>
<video id="qr_input"></video>
(OR)
<textarea id="text_input"></textarea>
</div>
<div>
<button id="authorize_qr">Authorize(QR)</button>
<button id="verify_qr">Verify(QR)</button>
<button id="authorize_text">Authorize(Text)</button>
<button id="verify_text">Verify(Text)</button>
</div>
<div>
OUTPUT <br/>
<span id="output_log"></span><br/>
<textarea id="text_output" disabled></textarea>
(OR)
<div id="qr_output"></div>
</div>
</div>
<script>
function clearOuputs(){
document.getElementById("output_log").innerHTML = ""
document.getElementById("text_output").innerHTML = ""
document.getElementById("qr_output").innerHTML = ""
}
document.getElementById("login_qr").onclick = function(){
floAuthenticator.scanQRCode("qr_input").then(result =>{
simpleLogin(result)
.then(result => document.getElementById("greet").innerHTML = "Logined in as "+myFloID)
.catch(error => alert(error))
}).catch(error => console.log(error))
};
document.getElementById("login_text").onclick = function(){
let text = prompt("Enter Private Key: ")
if(text)
simpleLogin(text)
.then(result => document.getElementById("greet").innerHTML = "Logined in as "+myFloID)
.catch(error => alert(error))
};
document.getElementById("authorize_qr").onclick = function(){
clearOuputs()
floAuthenticator.generateFromQR("qr_input", "text_output", "qr_output", 200)
.then(result => document.getElementById("output_log").innerHTML = result)
.catch(error => document.getElementById("output_log").innerHTML = error)
};
document.getElementById("authorize_text").onclick = function(){
clearOuputs()
floAuthenticator.generateFromText("text_input", "text_output", "qr_output", 200)
.then(result => document.getElementById("output_log").innerHTML = result)
.catch(error => document.getElementById("output_log").innerHTML = error)
};
document.getElementById("verify_qr").onclick = function(){
clearOuputs()
floAuthenticator.verifyFromQR("qr_input")
.then(result => {
document.getElementById("output_log").innerHTML = "Verification Successful"
document.getElementById("text_output").innerHTML = JSON.stringify(result)
}).catch(error => document.getElementById("output_log").innerHTML = error)
};
document.getElementById("verify_text").onclick = function(){
clearOuputs()
floAuthenticator.verifyFromText("text_input")
.then(result => {
document.getElementById("output_log").innerHTML = "Verification Successful"
document.getElementById("text_output").innerHTML = JSON.stringify(result)
}).catch(error => document.getElementById("output_log").innerHTML = error)
};
</script>
<script id="init_lib">
//All util libraries required for Standard operations (DO NOT EDIT ANY)
@ -7289,7 +7379,7 @@ Bitcoin.Util = {
setDefaultDB: function (dbName) {
this.dbName = dbName;
},
},
initDB: function (dbName, objectStores = {}) {
return new Promise((resolve, reject) => {
@ -7322,6 +7412,10 @@ Bitcoin.Util = {
openDB: function (dbName = this.dbName) {
return new Promise((resolve, reject) => {
var idb = indexedDB.open(dbName);
idb.onupgradeneeded = (event) => {
event.target.transaction.abort();
reject("Database doesnot exist")
}
idb.onerror = (event) => reject("Error in opening IndexedDB!");
idb.onsuccess = (event) => resolve(event.target.result);
});
@ -7329,7 +7423,7 @@ Bitcoin.Util = {
deleteDB: function (dbName = this.dbName) {
return new Promise((resolve, reject) => {
var deleteReq = indexedDB.deleteDatabase(dbName);;
var deleteReq = indexedDB.deleteDatabase(dbName);
deleteReq.onerror = (event) => reject("Error deleting database!");
deleteReq.onsuccess = (event) => resolve("Database deleted successfully");
});
@ -7387,6 +7481,19 @@ Bitcoin.Util = {
});
},
readIndex: function (obsName, key, index, dbName = this.dbName) {
return new Promise((resolve, reject) => {
this.openDB(dbName).then(db => {
var ind = db.transaction(obsName, "readonly").objectStore(obsName).index(index);
let getReq = ind.get(key);
getReq.onsuccess = (evt) => resolve(evt.target.result);
getReq.onerror = (evt) => reject(
`Read data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`);
db.close();
}).catch(error => reject(error));
});
},
readAllData: function (obsName, dbName = this.dbName) {
return new Promise((resolve, reject) => {
this.openDB(dbName).then(db => {
@ -7462,7 +7569,6 @@ Bitcoin.Util = {
} catch (err) {
throw Error("Unable to decode data")
}
if (data.floID !== floCrypto.getFloIDfromPubkeyHex(data.pubKey))
throw Error("Invalid pubKey/floID combination")
if (!floCrypto.verifySign(`${data.time}_${data.message}`, data.sign, data.pubKey))
@ -7488,7 +7594,7 @@ Bitcoin.Util = {
generateFromQR: function (videoInputID, textOutputID, qrOutputID, qrOutputSize) {
return new Promise((resolve, reject) => {
this.scanQRCode(videoInputID).then(message => {
let signedData = this.generateRawAuthenticator(message)
let signedData = this.generateRaw(message)
document.getElementById(textOutputID).innerHTML = signedData;
if (qrOutputID)
this.createQRCode(signedData, qrOutputID, qrOutputSize)
@ -7501,7 +7607,7 @@ Bitcoin.Util = {
return new Promise((resolve, reject) => {
try {
let message = document.getElementById(textInputID).value
let signedData = this.generateRawAuthenticator(message)
let signedData = this.generateRaw(message)
document.getElementById(textOutputID).innerHTML = signedData;
if (qrOutputID)
this.createQRCode(signedData, qrOutputID, qrOutputSize)
@ -7515,9 +7621,7 @@ Bitcoin.Util = {
verifyFromQR: function (videoInputID) {
return new Promise((resolve, reject) => {
this.scanQRCode(videoInputID).then(data => {
this.verifyRaw(data)
.then(result => resolve(result))
.catch(err => reject(err))
resolve(this.verifyRaw(data))
}).catch(err => reject(err))
})
},
@ -7526,9 +7630,7 @@ Bitcoin.Util = {
return new Promise((resolve, reject) => {
try {
let data = document.getElementById(textInputID).value
this.verifyRaw(data)
.then(result => resolve(result))
.catch(err => reject(err))
resolve(this.verifyRaw(data))
} catch (err) {
reject(err)
}
@ -7536,71 +7638,17 @@ Bitcoin.Util = {
}
}
</script>
<script>
function Login(privKey) {
myPrivKey = privKey
myPubKey = floCrypto.getPubKeyHex(myPrivKey)
myFloID = floCrypto.getFloIDfromPubkeyHex(myPubKey)
}
function retriveCredentials(pinInput) {
if (typeof pinInput !== "function") {
pinInput = function () {
return new Promise((resolve, reject) => {
var input = prompt("Enter PIN")
if (input !== null)
resolve(input)
else
reject(null)
})
}
}
const readSharesFromIDB = function (pin, indexArr) {
return new Promise((resolve, reject) => {
var tableArr = []
for (var i = 0; i < indexArr.length; i++)
tableArr[i] = pin[i % pin.length]
var promises = []
for (var i = 0; i < indexArr.length; i++)
promises.push(compactIDB.readData(tableArr[i], indexArr[i], floGlobals.application))
Promise.all(promises).then(shares => {
var secret = floCrypto.retrieveShamirSecret(shares)
if (secret)
resolve(secret)
else
reject("Incorrect PIN or Insufficient Shares")
}).catch(error => reject(error))
})
}
const retrivePrivKey = function () {
return new Promise((resolve, reject) => {
let indexArr = localStorage.getItem(`${floGlobals.application}#privKey`)
if (indexArr) {
pinInput().then(pin => {
if (!pin)
return reject("Empty PIN")
if (!isNaN(pin))
return reject("Invalid PIN")
readSharesFromIDB(pin, JSON.parse(indexArr))
.then(result => resolve(result))
.catch(error => reject(error))
}).catch(error => reject("PIN not entered"))
} else
reject("No Credentials Stored")
})
}
function simpleLogin(privKey) {
return new Promise((resolve, reject) => {
retrivePrivKey().then(privKey => {
myPrivKey = privKey
myPubKey = floCrypto.getPubKeyHex(myPrivKey)
try{
myPubKey = floCrypto.getPubKeyHex(privKey)
myFloID = floCrypto.getFloIDfromPubkeyHex(myPubKey)
resolve('Login Credentials loaded successful')
}).catch(error => reject(error))
myPrivKey = privKey
resolve("Login Successful")
}catch(error){
reject("Invalid Private-Key")
}
})
}
</script>