diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js index 1be8826ce13b02b17bd30dfddd717ef996827b1d..bd882695704604341c336e6b7c9acdea51d13bc9 100644 --- a/javascript/src/iframe/viamapi-iframe.js +++ b/javascript/src/iframe/viamapi-iframe.js @@ -544,17 +544,77 @@ 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(() => { + return Promise.reject(failPincodeAttempt(password)); + }); + } else { + return Promise.reject(getTimeLeftInLocalStorage()); + } +} + +//********************************************************************************* +function getBlockFinishTimeInLocalStorage() { + return localStorage.getItem("blockFinishTime") || getCurrentTime(); +} + +function getCurrentTime() { + return Math.floor(new Date().getTime() / 1000); +} + +function getTimeLeftInLocalStorage() { + const blockFinishTime = getBlockFinishTimeInLocalStorage(); + const timeNow = getCurrentTime(); + const seconds = (blockFinishTime - timeNow) % 60; + let minutes = Math.floor((blockFinishTime - timeNow) / 60); + minutes %= 60; + + const left = "Your identity has been locked. 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) { + const identitiesTemp = listIdentitiesFromLocalStorage(); + for (let i in identitiesTemp) { + destroyIdentityFromLocalStorage(i); + } + message = "9 failed attempts. Identity is revoked!"; + localStorage.removeItem("attempt"); + } else if (attempt % 3 === 0) { + const timeNow = getCurrentTime(); + const blockFinishTime = timeNow + 300; + localStorage.setItem("blockFinishTime", blockFinishTime); + localStorage.setItem("attempt", attempt + 1); + message = "3 failed attempts. Identity is locked!"; + } else { + localStorage.setItem("attempt", attempt + 1); + } + } + return message; +} + +function canTryPincode() { + const timeNow = getCurrentTime(); + const blockFinishTime = getBlockFinishTimeInLocalStorage(); + if (blockFinishTime <= timeNow) { + localStorage.removeItem("blockFinishTime"); + return true; + } else { + return false; + } } //********************************************************************************* @@ -1404,9 +1464,10 @@ function loadIdentityInternal(identityKey, pinCode) { result({ "data": "", "code": "400", - "status": "Can not load identity" + "status": "Please restore or authorize your account via another device." }); } + localStorage.removeItem("attempt"); const copiedIdentity = JSON.parse(JSON.stringify(loadedIdentity)); window.loadedIdentities[identityKey] = loadedIdentity; @@ -1435,7 +1496,7 @@ function loadIdentityInternal(identityKey, pinCode) { result({ "data": "", "code": "400", - "status": "Can not load entity:" + e + "status": "" + e }); }); });