diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js index 4cf84a9efc8e154f4af1b295b12399e2562acb62..1c0ede632df4f1708a04611a09f29df32926ea54 100644 --- a/javascript/src/iframe/viamapi-iframe.js +++ b/javascript/src/iframe/viamapi-iframe.js @@ -544,17 +544,83 @@ function encryptMessage(message, password, label) { //********************************************************************************* function decryptMessage(message, password) { - const secret = pvutils.stringToArrayBuffer(password); - const buffer = decodePEM(message); - - const asn1 = asn1js.fromBER(buffer); - const content = new pkijs.ContentInfo({schema: asn1.result}); - const enveloped = new pkijs.EnvelopedData({schema: content.content}); - return enveloped.decrypt(0, {preDefinedData: secret}).then(result => { - return pvutils.arrayBufferToString(result); - }).catch(() => { - throw("Wrong pincode") - }) + if (canTryPincode()) { + const secret = pvutils.stringToArrayBuffer(password); + const buffer = decodePEM(message); + + const asn1 = asn1js.fromBER(buffer); + const content = new pkijs.ContentInfo({schema: asn1.result}); + const enveloped = new pkijs.EnvelopedData({schema: content.content}); + return enveloped.decrypt(0, {preDefinedData: secret}).then(result => { + return pvutils.arrayBufferToString(result); + }).catch(() => { + failPincodeAttempt(password); + }); + } else { + return new Promise(function () { + const message = getTimeLeftInLocalStorage(); + throw(message); + }); + } +} + +//********************************************************************************* +function getBlockFinishTimeInLocalStorage() { + return localStorage.getItem("blockFinishTime") ? localStorage.getItem("blockFinishTime") : getCurrentTime(); +} + +function getCurrentTime() { + return Math.floor(new Date().getTime() / 1000); +} + +function getTimeLeftInLocalStorage() { + const blockFinishTime = getBlockFinishTimeInLocalStorage(); + console.log("blockFinishTime:", blockFinishTime); + const timeNow = getCurrentTime(); + const seconds = (blockFinishTime - timeNow) % 60; + let minutes = Math.floor((blockFinishTime - timeNow) / 60); + minutes %= 60; + + const left = "Your identity has been blocked. Try again in " + minutes + " minutes and " + seconds + " seconds."; + return left; +} + +function failPincodeAttempt(password) { + let message = "Wrong pincode"; + if (password !== '00000000') { + let attempt = localStorage.getItem("attempt") || 1; + attempt = parseInt(attempt); + if (attempt === 9) { + var identitiesTemp = listIdentitiesFromLocalStorage(); + for(var i in identitiesTemp) { + destroyIdentityFromLocalStorage(i) + } + message = "9 failed attempts. Identity is revoked!"; + localStorage.removeItem("attempt"); + console.log("identity is revoked!"); + } else if (attempt % 3 === 0) { + const timeNow = getCurrentTime(); + const blockFinishTime = timeNow + 10; + localStorage.setItem("blockFinishTime", blockFinishTime); + localStorage.setItem("attempt", attempt + 1); + message = "3 failed attempts. Identity is blocked!"; + } else { + localStorage.setItem("attempt", attempt + 1); + } + console.log("Total Attempts:", attempt); + } + throw(message); +} + +function canTryPincode() { + const timeNow = getCurrentTime(); + const blockFinishTime = localStorage.getItem("blockFinishTime") || timeNow; + if (blockFinishTime <= timeNow) { + localStorage.removeItem("blockFinishTime"); + return true; + } else { + return false; + } } //********************************************************************************* @@ -1190,6 +1256,7 @@ function getProfileData(identity) { executeRestfulFunction("private", viamApi, viamApi.identityGetIdentityProfileData).then(executeResult => { if(executeResult.code === "200") { + localStorage.removeItem("attempt"); console.log("In promise"); console.log(executeResult); var listItem = {};