Skip to content
Snippets Groups Projects
viamapi-iframe.js 87.1 KiB
Newer Older
  • Learn to ignore specific revisions
  •   var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    
      for (var i = 0; i < len; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    
      return text;
    }
    
    function CryptoData() {
    }
    
    CryptoData.prototype.set = function(obj) {
      for(var member in obj) {
        this[member] = JSON.parse(JSON.stringify(obj[member]))
      }
    }
    
    CryptoData.prototype.serialize = function() {
      return JSON.stringify(this)
    }
    
    CryptoData.prototype.deserialize = function(serialized) {
      var obj = JSON.parse(serialized)
      this.set(obj)
    }
    
    CryptoData.prototype.setPublicKey = function(publicKey) {
      this["publicKey"] = publicKey
    }
    
    CryptoData.prototype.getPublicKey = function() {
      return this["publicKey"]
    }
    
    CryptoData.prototype.setPrivateKey = function(privateKey) {
      this["privateKey"] = privateKey
    }
    
    CryptoData.prototype.getPrivateKey = function() {
      return this["privateKey"]
    }
    
    CryptoData.prototype.setx509Certificate = function(x509Certificate) {
      this["x509Certificate"] = x509Certificate
    }
    
    CryptoData.prototype.getx509Certificate = function() {
      return this["x509Certificate"]
    }
    
    CryptoData.prototype.setKeyUUID = function(keyUUID) {
      this["keyUUID"] = keyUUID
    }
    
    CryptoData.prototype.getKeyUUID = function() {
      return this["keyUUID"]
    }
    
    CryptoData.prototype.setChain = function(chain) {
      this["chain"] = chain
    }
    
    CryptoData.prototype.getChain = function() {
      return this["chain"]
    }
    
    function Identity() {
    }
    
    Identity.prototype.set = function(obj) {
      for(var member in obj) {
        this[member] = JSON.parse(JSON.stringify(obj[member]))
      }
    }
    
    Identity.prototype.serialize = function() {
      return JSON.stringify(this)
    }
    
    Identity.prototype.deserialize = function(serialized) {
      var obj = JSON.parse(serialized)
      this.set(obj)
    }
    
    Identity.prototype.setAuthentication = function(cryptoData) {
      this["authentication"] = cryptoData
    }
    
    Identity.prototype.getAuthentication = function() {
      return this["authentication"]
    }
    
    Identity.prototype.setPinCode = function(pinCode) {
      this["pinCode"] = pinCode
    }
    
    Identity.prototype.getPinCode = function() {
      return this["pinCode"]
    }
    
    Identity.prototype.setPassport = function(passportUUID, cryptoData) {
      if(this["passports"] === undefined || this["passports"] === null) {
        this["passports"] = {}
      }
    
      this["passports"][passportUUID] = cryptoData
    }
    
    Identity.prototype.getPassport = function(passportUUID) {
      if(this["passports"] === undefined || this["passports"] === null) {
        this["passports"] = {}
      }
    
      return this["passports"][passportUUID]
    }
    
    var identityColors = ["#994392", "#cb0767", "#e51d31", "#ec671b", "#fab610"]
    
    function getNextColor() {
      var colorIndex = localStorage.getItem("colorIndex");
      if (colorIndex == null || colorIndex == "") {
        colorIndex = 0
      }
    
      var color = identityColors[colorIndex]
    
      colorIndex++;
    
      colorIndex = colorIndex % identityColors.length
    
      localStorage.setItem("colorIndex", colorIndex)
    
      return color
    }
    
    function setKeyForUUID(uuid, key) {
      var storedIdentityForUuid = localStorage.getItem("keyperuuid/" + uuid)
      if(storedIdentityForUuid != key && storedIdentityForUuid != null && storedIdentityForUuid != "") {
        destroyIdentityFromLocalStorage(storedIdentityForUuid)
      }
    
      localStorage.setItem("keyperuuid/" + uuid, key)
    }
    
    function getColorForIdentity(key) {
      var storedColor = localStorage.getItem("colors/" + key)
    
      if(storedColor == null || storedColor == "") {
        storedColor = getNextColor()
        console.log("Setting new color: " + storedColor)
        localStorage.setItem("colors/" + key, storedColor)
      }
    
      return storedColor
    }
    
    function setIdentityInLocalStorage(identityToStore, extendKey = true) {
      //console.log(getStack())
      var pinCode = identityToStore.pinCode;
      const serializedIdentity = JSON.stringify(identityToStore);
      const key = identityToStore.authentication.publicKey;
    
      if(pinCode == null || pinCode == "") {
        pinCode = getPincode(key)
      }
    
      if(pinCode == null || pinCode == "") {
        console.log("Can not set identity")
        return null;
      }
    
      return encryptMessage(serializedIdentity, pinCode, "identity").then((encryptedIdentity) => {
        var success = true
        if(extendKey === true) {
          success = extendPinCodeTtl(key, pinCode)
        }
        if (success == true) {
          localStorage.setItem(key, encryptedIdentity);
          let serializedIdentitiesList = localStorage.getItem("identities");
          let identities = JSON.parse(serializedIdentitiesList);
          identities[key] = true;
    
          localStorage.setItem("identities", JSON.stringify(identities))
        } else {
          console.log("Can not extend pincode ttl")
        }
      });
    }
    
    function getProfileData(identity) {
      return new Penpal.Promise(executeResultUpper => {
        executeRestfulFunction("private", viamApi,
          viamApi.identityGetIdentityProfileData).then(executeResult => {
          if(executeResult.code == "200") {
            console.log("In promise")
            console.log(executeResult)
            var listItem = {};
    
            console.log(identity)
            listItem.identityColor = getColorForIdentity(identity.authentication.publicKey)
            listItem.initials = executeResult.data.initials
    
            if(listItem.initials === null || listItem.initials === "") {
              listItem.initials = "JD";
            }
            console.log("Item")
            console.log(listItem)
            localStorage.setItem("profiles/" + identity.authentication.publicKey, JSON.stringify(listItem))
            executeResultUpper(listItem)
          } else {
            executeResultUpper({})
          }
        });
      });
    }
    
    function getIdentityFromLocalStorage(key, pinCode, extendTtl = true) {
      const encryptedIdentity = localStorage.getItem(key);
      if (encryptedIdentity == null) {
        console.log("No such identity for public key")
        return Promise.resolve(null)
      }
      return decryptMessage(encryptedIdentity, pinCode).then((serializedIdentity) => {
        var parsedIdentity = JSON.parse(serializedIdentity);
        parsedIdentity["pinCode"] = ""
        //console.log(parsedIdentity)
        if(extendTtl === true) {
          var success = extendPinCodeTtl(key, pinCode)
          if (success == true) {
            return parsedIdentity
          } else {
            console.log("Can not extend pincode ttl")
            return null
          }
        } else {
          return parsedIdentity
        }
      });
    
    }
    
    function listIdentitiesFromLocalStorage() {
      var serializedIdentitiesList = localStorage.getItem("identities")
      var identities = JSON.parse(serializedIdentitiesList)
      var identitiesResult = {}
    
      for(var key in identities) {
        var profile = JSON.parse(JSON.stringify(localStorage.getItem("profiles/" + key)))
        console.log("Getting profile")
        console.log(profile)
        if(profile != null && profile != "") {
          console.log("Setting profile for key: " + key)
          //console.log(profile)
          identitiesResult[key] = JSON.parse(profile)
          //console.log(identitiesResult)
        } else {
          console.log("Setting empty key for profile: " + key)
          identitiesResult[key] = {}
          //console.log(identitiesResult)
        }
      }
    
      console.log("In list identities from local storage")
      console.log(identitiesResult)
      return identitiesResult
    }
    
    function getStack() {
      try {
        throw new Error();
      } catch(e) {
        return e.stack;
      }
    }
    
    
    function extendPinCodeTtl(key, pinCode) {
      //console.log("Extending pincode ttl")
      //console.log(getStack())
      //console.log("Extending pincode ttl for key: " + key)
      //console.log(pinCode)
      if(pinCode == null || pinCode == "") {
        var now = new Date();
        var nowMillis = now.getTime();
        var ttl = window.sessionStorage.getItem("pincodettls/" + key);
        if (ttl == null || ttl == "" || nowMillis >= parseInt(ttl)) {
          clearPinCodeTtl(key)
          return false
        } else {
          var ttl = now.getTime() + 10 * 60 * 1000;
          window.sessionStorage.setItem("pincodettls/" + key, ttl);
        }
      } else {
        var now = new Date();
        var ttl = now.getTime() + 10 * 60 * 1000;
        window.sessionStorage.setItem("pincodettls/" + key, ttl);
        window.sessionStorage.setItem("pincodes/" + key, pinCode);
      }
    
      return true;
    }
    
    window.extendPinCodeTtl = extendPinCodeTtl;
    
    
    function clearPinCodeTtl(key) {
      //console.log("Clearing ttl for key: " + key)
      window.sessionStorage.removeItem("pincodettls/" + key)
      window.sessionStorage.removeItem("pincodes/" + key)
    }
    
    function getPincode(key) {
      var now = new Date();
      var nowMillis = now.getTime();
      var ttl = window.sessionStorage.getItem("pincodettls/" + key);
      if (ttl == null || ttl == "") {
        return null
      } else {
        if(nowMillis >= parseInt(ttl)) {
          clearPinCodeTtl(key)
          return null
        } else {
          return window.sessionStorage.getItem("pincodes/" + key);
        }
      }
    }
    
    function createEvent(actionId, type, payloads) {
      return {
        "actionID": actionId,
        "type": type,
        "stamp": new Date().getTime(),
        "payloads" : payloads
      }
    }
    
    function destroyIdentityFromLocalStorage(key) {
      localStorage.removeItem(key)
      localStorage.removeItem("profiles/" + key)
      localStorage.removeItem("colors/" + key)
    
      var serializedIdentitiesList = localStorage.getItem("identities")
    
      var identities = JSON.parse(serializedIdentitiesList)
    
      identities[key] = null
    
      delete identities[key]
    
      localStorage.setItem("identities", JSON.stringify(identities))
    }
    
    
    window.loadedIdentities = {}
    window.wopiAPI = new WopiAPI();
    window.viamApi = new ViamAPI();
    window.viamAnonymousApi = new ViamAPI();
    window.currentlyAuthenticatedIdentity = null
    window.currentlyLoadedIdentity = null
    window.lastTimeGetProfile = 0
    
    function executeRestfulFunction(type, that, fn, ...args) {
      if(type == "private") {
        return new Penpal.Promise(executeResult => {
          fn.apply(that, args).then((response) => {
            if (response.data.code == "400" && response.data.status == "Bad session") {
              console.log("Trying to login again")
    
              if (currentlyAuthenticatedIdentity != "" && currentlyAuthenticatedIdentity != null
                && localStorage.getItem("didLogout") != "true") {
    
                viamApi.identityLogin("previousaddeddevice").then((response1) => {
                  if (response1.data.code == "200") {
                    //console.log(response.data.data)
                    var uuid = response1.data.data["Uuid"]
                    var token = response1.data.data["Session"]
                    //console.log(uuid + " " + token)
                    viamApi.setSessionData(uuid, token)
                    localStorage.setItem("uuid", uuid)
                    localStorage.setItem("token", token)
                    localStorage.setItem("authenticatedIdentity", currentlyAuthenticatedIdentity.authentication.publicKey)
                    currentlyAuthenticatedIdentity = loadedIdentities[currentlyAuthenticatedIdentity.authentication.publicKey]
                    setKeyForUUID(uuid, currentlyAuthenticatedIdentity.authentication.publicKey)
                    lastTimeGetProfile = 0;
                    fn.apply(null, args).then((response2) => {
                      executeResult(response2.data)
                    });
                  } else {
                    executeResult(response1.data)
                  }
                });
              } else {
    
                if (currentlyLoadedIdentity != "" && currentlyLoadedIdentity != null &&
                  localStorage.getItem("didLogout") != "true") {
    
                  viamApi.identityLogin("previousaddeddevice").then((response1) => {
                    if (response1.data.code == "200") {
                      //console.log(response.data.data)
                      var uuid = response1.data.data["Uuid"]
                      var token = response1.data.data["Session"]
                      //console.log(uuid + " " + token)
                      viamApi.setSessionData(uuid, token)
                      localStorage.setItem("uuid", uuid)
                      localStorage.setItem("token", token)
                      localStorage.setItem("authenticatedIdentity", currentlyLoadedIdentity.authentication.publicKey)
                      currentlyAuthenticatedIdentity = loadedIdentities[currentlyLoadedIdentity.authentication.publicKey]
                      setKeyForUUID(uuid, currentlyLoadedIdentity.authentication.publicKey)
                      lastTimeGetProfile = 0;
                      fn.apply(null, args).then((response2) => {
                        executeResult(response2.data)
                      });
                    } else {
                      executeResult(response1.data)
                    }
                  });
                } else {
                  executeResult(response.data)
                }
              }
            } else {
              executeResult(response.data)
            }
          });
        });
      } else {
        return new Penpal.Promise(executeResult => {
          fn.apply(that, args).then((response) => {
            executeResult(response.data)
          });
        });
      }
    }
    
    window.executeRestfulFunction = executeRestfulFunction;
    
    
    function loadIdentityInternal(identityKey, pinCode) {
      return new Penpal.Promise(result => {
        console.log("Loading identity with pincode: " + pinCode)
        getIdentityFromLocalStorage(identityKey, pinCode).then((loadedIdentity) => {
          if (loadedIdentity == null) {
            result({
              "data": "",
              "code": "400",
              "status": "Can not load identity"
            })
          }
          var copiedIdentity = JSON.parse(JSON.stringify(loadedIdentity))
          loadedIdentities[identityKey] = loadedIdentity
    
          if (identityKey === localStorage.getItem("authenticatedIdentity")) {
            currentlyAuthenticatedIdentity = copiedIdentity
            viamApi.setIdentity(identityKey)
            var uuid = localStorage.getItem("uuid")
            var token = localStorage.getItem("token")
            //console.log("Loading " + uuid + " " + token)
            viamApi.setSessionData(uuid, token)
          }
    
          //console.log("Set loaded identity in load identity")
          currentlyLoadedIdentity = copiedIdentity
          viamAnonymousApi.setIdentity(currentlyLoadedIdentity.authentication.publicKey)
    
          copiedIdentity.pinCode = ""
          copiedIdentity.authentication.privateKey = ""
    
          result({
            "data": copiedIdentity,
            "code": "200",
            "status": "Identity loaded"
          })
        }).catch((e) => {
          result({
            "data": "",
            "code": "400",
            "status": "Can not load entity:" + e
          })
        })
      });
    }
    
    function changeIdentityPinCodeInternal(key, oldPinCode, newPinCode) {
    
      return new Penpal.Promise(result => {
        getIdentityFromLocalStorage(key, oldPinCode, false).then((identity) => {
    
          identity.pinCode = newPinCode;
    
          console.log("Storing identity with pincode: " + identity.pinCode)
          setIdentityInLocalStorage(identity).then(() => {
          }).catch((e) => {
            result({
              "data": "",
              "code": "400",
              "status": "Cannot store identity " + e
            });
          });
        });
      });
    }
    
    function getCertificateForPassport(passportUUID, internal) {
    
      return new Penpal.Promise(certificateResult => {
        if (currentlyAuthenticatedIdentity === null) {
          return {"data" : "",
            "code" : "400",
            "status" : "Identity not authenticated"
          }
        }
    
        var passportIdentity = new Identity()
        passportIdentity.set(currentlyAuthenticatedIdentity)
        //console.log("Getting: " + passportUUID)
        //console.log(identity)
        var passport = passportIdentity.getPassport(passportUUID)
        if(passport === undefined || passport === null) {
          createPassportCertificate(passportUUID).then(function(keys){
            var cryptoData = new CryptoData()
            //console.log(keys)
            cryptoData.setPublicKey(keys["publicKeyPEM"])
            cryptoData.setPrivateKey(keys["privateKeyPEM"])
            var certificate = keys["certificatePEM"]
            //download("passportCertificateBeforeSigning.crt", "text/plain", certificate)
            //console.log(certificate)
            //cryptoData.setx509Certificate(keys["certificate"])
            executeRestfulFunction("private", viamApi, viamApi.signSignCertificate, btoa(certificate), passportUUID).then(executeResult => {
              if(executeResult.code == "200") {
                var signedCertificate = atob(executeResult.data["SignedCertificate"])
                //download("passportCertificateAfterSigning.crt", "text/plain", signedCertificate)
                var keyUUID = executeResult.data["CertificateUUID"]
                var encodedChain = executeResult.data["Chain"]
                //download("rootCertificate.crt", "text/plain", atob(encodedChain[0]))
    
                var chain = []
    
                for(var i = 0; i < encodedChain.length; i++) {
                  chain.push(atob(encodedChain[i]))
                }
    
                //console.log("Chain from server")
                //console.log(chain)
                //console.log(signedCertificate)
                //console.log(certificate)
                //console.log(keyUUID)
                cryptoData.setx509Certificate(signedCertificate)
                cryptoData.setKeyUUID(keyUUID)
                cryptoData.setChain(chain)
    
                passportIdentity.setPassport(passportUUID, cryptoData)
    
                getProfileData(passportIdentity).then(executeResult1 => {
                  console.log("Profile updated in set identity")
                  setIdentityInLocalStorage(passportIdentity).then(() => {
                    currentlyAuthenticatedIdentity = passportIdentity
                    lastTimeGetProfile = 0;
                    //console.log("Set loaded identity in passport");
                    currentlyLoadedIdentity = passportIdentity
                    var copyOfCryptoData = JSON.parse(JSON.stringify(cryptoData))
    
                    if (internal === false) {
                      copyOfCryptoData["privateKey"] = ""
                    }
    
                    certificateResult({
                      "data": copyOfCryptoData,
                      "code": "200",
                      "status": "Certificate got"
                    });
                  }).catch((e) => {
                    certificateResult({
                      "data": "",
                      "code": "400",
                      "status": "Can not store certificate " + e
                    });
                  });
                });
              } else {
                certificateResult(executeResult)
              }
            });
          });
        } else {
          //console.log(passport)
          var copyOfCryptoData = JSON.parse(JSON.stringify(passport))
    
          if(internal === false) {
            copyOfCryptoData["privateKey"] = ""
          }
    
          certificateResult({"data" : copyOfCryptoData,
            "code" : "200",
            "status" : "Certificate got"
          });
        }
      });
    }
    
    const connection = Penpal.connectToParent({
      // Methods child is exposing to parent
      methods: {
    
        initializeApiHost: (apiUrl) => {
          window.API_HOST = apiUrl.charAt(apiUrl.length - 1) === "/" ? apiUrl : apiUrl + "/";
        },
    
        createIdentity(pinCode) {
          return new Penpal.Promise(result => {
            createPassportCertificate(makeid()).then(function(keys){
              var newIdentity = new Identity()
              var cryptoData = new CryptoData()
              cryptoData.setPublicKey(keys["publicKeyPEM"])
              cryptoData.setPrivateKey(keys["privateKeyPEM"])
              cryptoData.setx509Certificate(keys["certificatePEM"])
              newIdentity.setAuthentication(cryptoData)
              newIdentity.setPinCode(pinCode)
    
              //console.log("Set loaded identity in createIdentity")
              currentlyLoadedIdentity = newIdentity
              loadedIdentities[newIdentity.authentication.publicKey] = newIdentity
              extendPinCodeTtl(newIdentity.authentication.publicKey, pinCode)
    
    
              viamAnonymousApi.setIdentity(newIdentity.authentication.publicKey)
    
              result({"data" : newIdentity,
                "code" : "200",
                "status" : "Identity created"
              })
    
          })
        },
        listIdentities() {
          return new Penpal.Promise(result => {
            var identities = listIdentitiesFromLocalStorage()
            console.log("Before return of identities")
            console.log(identities)
            result({"data" : identities,
              "code" : "200",
              "status" : "Identities listed"
            })
          });
        },
        loadIdentity(identityKey, pinCode) {
          return loadIdentityInternal(identityKey, pinCode)
        },
        changeIdentityPinCode(key, oldPinCode, newPinCode) {
          return changeIdentityPinCodeInternal(key, oldPinCode, newPinCode)
        },
        getIdentityProfile(identityKey) {
          return new Penpal.Promise(result => {
            serializedProfile = localStorage.getItem("profiles/" + identityKey)
            if(serializedProfile == null || serializedProfile == "") {
              result({"data" : "",
                "code" : "400",
                "status" : "Profile is empty"
              });
            } else {
              result({"data" : JSON.parse(serializedProfile),
                "code" : "200",
                "status" : "Identities cleared"
              })
            }
          });
        },
        clearIdentities() {
          return new Penpal.Promise(result => {
            var identitiesTemp = listIdentitiesFromLocalStorage()
            //console.log(identitiesTemp.length)
            for(var i in identitiesTemp) {
              destroyIdentityFromLocalStorage(i)
            }
            result({"data" : "",
              "code" : "200",
              "status" : "Identities cleared"
            })
          });
        },
        register(registerIdentity, email, name, surname, family, phoneNumber) {
          return new Penpal.Promise(result => {
            viamApi.setIdentity(registerIdentity.authentication.publicKey)
    
            executeRestfulFunction("public", viamApi, viamApi.identityRegister, email, name,surname, family, phoneNumber).then(executeResult => {
              console.log("Profile updated in set identity")
    
              let sequence = Promise.resolve()
              if (executeResult.code === "200") {
                sequence = sequence.then(() => {
                    setIdentityInLocalStorage(registerIdentity)
                  }
                )
              }
              sequence.then(() => {
                result(executeResult);
              }).catch((e) => {
                result({
                  "data": "",
                  "code": "400",
                  "status": "Can not store identity: " + e
                })
              })
            });
          });
        },
        resendConfirmationCode(identity, identificatorArg) {
          return new Penpal.Promise(result => {
            viamApi.setIdentity(identity.authentication.publicKey)
    
            executeRestfulFunction("public", viamApi, viamApi.identityResendConfirmationCode,identificatorArg).then(executeResult => {
              result(executeResult);
            });
          });
        },
        login(loginIdentity, mode, code, actionID) {
          return new Penpal.Promise(result => {
            if (loadedIdentities[loginIdentity.authentication.publicKey] === null) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not loaded"
              })
            }
    
            //console.log("After loaded check")
    
            viamApi.setIdentity(loginIdentity.authentication.publicKey)
    
            executeRestfulFunction("public", viamApi, viamApi.identityLogin, mode, code, actionID).then(executeResult => {
              // console.log(executeResult)
              //console.log(mode)
              switch(mode) {
                case "sms" : {
                  if (executeResult.code === "200") {
                    //console.log("In if")
                    var uuid = executeResult.data["Uuid"]
                    var token = executeResult.data["Session"]
                    viamApi.setSessionData(uuid, token)
                    localStorage.setItem("uuid", uuid)
                    localStorage.setItem("token", token)
                    localStorage.setItem("authenticatedIdentity",
                      loginIdentity.authentication.publicKey)
    
                    localStorage.removeItem("didLogout")
    
                    setKeyForUUID(uuid, loginIdentity.authentication.publicKey)
                    currentlyAuthenticatedIdentity = loadedIdentities[loginIdentity.authentication.publicKey]
                    lastTimeGetProfile = 0;
                    delete executeResult.data["Uuid"]
                    delete executeResult.data["Session"]
                    getProfileData(loginIdentity).then(executeResult1 => {
                      result(executeResult);
                    });
                  } else {
                    //console.log("In else")
                    result(executeResult);
                  }
    
                  break;
                }
    
                case "previousaddeddevice" : {
                  if (executeResult.code === "200") {
                    //console.log(response.data.data)
                    var uuid = executeResult.data["Uuid"]
                    var token = executeResult.data["Session"]
                    //console.log(uuid + " " + token)
                    viamApi.setSessionData(uuid, token)
                    localStorage.setItem("uuid", uuid)
                    localStorage.setItem("token", token)
                    localStorage.setItem("authenticatedIdentity",
                      loginIdentity.authentication.publicKey)
    
                    localStorage.removeItem("didLogout")
    
                    setKeyForUUID(uuid, loginIdentity.authentication.publicKey)
                    currentlyAuthenticatedIdentity = loadedIdentities[loginIdentity.authentication.publicKey]
                    lastTimeGetProfile = 0;
                    delete executeResult.data["Uuid"]
                    delete executeResult.data["Session"]
                    getProfileData(loginIdentity).then(executeResult1 => {
                      result(executeResult);
                    });
                  } else {
                    result(executeResult);
                  }
    
                  break;
                }
    
                case "newdevice" : {
                  if (executeResult.code === "200") {
                    //console.log(executeResult)
                    var actionID = executeResult.data["ActionID"]
                    var QrCode = executeResult.data["QrCode"]
                    //console.log(uuid + " " + token)
                    QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
                      executeResult.data["image"] = url
                      //console.log(executeResult)
                      result(executeResult);
                    })
                  } else {
                    //console.log(executeResult)
                    result(executeResult);
                  }
                  break;
                }
    
                default : {
                  result(executeResult);
                  break;
                }
              }
            });
          });
        },
        identityAddNewDevice() {
          return new Penpal.Promise(result => {
            authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
    
            if (authenticationPublicKey === null) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not authenticated"
              })
            }
    
            if (loadedIdentities[authenticationPublicKey] === null) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not authenticated"
              })
            }
    
            var success = extendPinCodeTtl(authenticationPublicKey)
    
            if(success == false) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not authenticated"
              })
            }
    
            executeRestfulFunction("private", viamApi, viamApi.identityAddNewDevice).then(executeResult => {
              if (executeResult.code == "200") {
                //console.log(response.data.data)
                var actionID = executeResult.data["ActionID"]
                var QrCode = executeResult.data["QrCode"]
                //console.log(uuid + " " + token)
                QRCode.toDataURL(actionID + "," + QrCode, function (err, url) {
                  executeResult.data["image"] = url
                  result(executeResult);
                })
              } else {
                result(executeResult);
              }
            });
          });
        },
        identityDestroyKeysForDevice(authenticationPublicKeyArg) {
          return new Penpal.Promise(result => {
            authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
            if (authenticationPublicKey === null) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not authenticated"
              })
            }
            if (loadedIdentities[authenticationPublicKey] === null) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not authenticated"
              })
            }
    
            var success = extendPinCodeTtl(authenticationPublicKey)
    
            if(success == false) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not authenticated"
              })
            }
    
            executeRestfulFunction("private", viamApi, viamApi.identityDestroyKeysForDevice, btoa(authenticationPublicKeyArg)).then(executeResult => {
              result(executeResult);
            });
          });
        },
        logout() {
          authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
          if (authenticationPublicKey === null) {
            return {"data" : "",
              "code" : "400",
              "status" : "Identity not loaded"
            }
          }
          if (loadedIdentities[authenticationPublicKey] === null) {
            return {"data" : "",
              "code" : "400",
              "status" : "Identity not loaded"
            }
          }
    
          return new Penpal.Promise(result => {
            executeRestfulFunction("private", viamApi, viamApi.identityLogout).then(executeResult => {
              viamApi.setIdentity("")
              viamApi.setSessionData("", "")
              clearPinCodeTtl(authenticationPublicKey)
    
              authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
              localStorage.removeItem("uuid")
              localStorage.removeItem("token")
              localStorage.removeItem("authenticatedIdentity")
    
              localStorage.setItem("didLogout", "true")
    
              delete loadedIdentities[authenticationPublicKey]
              //console.log("Set loaded identity in logout")
              currentlyLoadedIdentity = null
              currentlyAuthenticatedIdentity = null
              lastTimeGetProfile = 0;
    
              result(executeResult);
            });
          });
        },
        identityRestoreAccess(restoreAccessIdentity, identificator) {
          return new Penpal.Promise(result => {
            viamApi.setIdentity(restoreAccessIdentity.authentication.publicKey)
    
            executeRestfulFunction("public", viamApi, viamApi.identityRestoreAccess, identificator).then(executeResult => {
              if (executeResult.code === "200") {
                setIdentityInLocalStorage(restoreAccessIdentity)
                result(executeResult);
              } else {
                result(executeResult);
              }
            });
          });
        },
        getCurrentlyLoggedInUUID() {
          return new Penpal.Promise(result => {
            authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
            if (authenticationPublicKey === null) {
              return {"data" : "",
                "code" : "400",
                "status" : "Identity not loaded"
              }
            }
            if (loadedIdentities[authenticationPublicKey] === null) {
              return {"data" : "",
                "code" : "400",
                "status" : "Identity not loaded"
              }
            }
    
            var success = extendPinCodeTtl(authenticationPublicKey)
    
            if(success == false) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not authenticated"
              })
            }
    
            if(localStorage.getItem("uuid") === null) {
              result({"data" : "",
                "code" : "400",
                "status" : "Not logged in UUID"
              })
            }
            result({"data" : localStorage.getItem("uuid"),
              "code" : "200",
              "status" : "UUID loaded"
            })
          });
        },
        getCertificateByPassport(passportUUID) {
          return new Penpal.Promise(result => {
            authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
            if (authenticationPublicKey === null) {
              return {"data" : "",
                "code" : "400",
                "status" : "Identity not loaded"
              }
            }
            if (loadedIdentities[authenticationPublicKey] === null) {
              return {"data" : "",
                "code" : "400",
                "status" : "Identity not loaded"
              }
            }
    
            var success = extendPinCodeTtl(authenticationPublicKey)
    
            if(success == false) {
              result({"data" : "",
                "code" : "400",
                "status" : "Identity not authenticated"
              })
            }
    
            getCertificateForPassport(passportUUID, false).then(certificateResult => {
              //console.log(certificateResult)
              result(certificateResult)
            })
          });
        },
        getOneTimeCertificateByPassport(passportUUID, emailArg) {
          return new Penpal.Promise(result => {
            authenticationPublicKey = localStorage.getItem("authenticatedIdentity")
            if (authenticationPublicKey === null) {
              return {"data" : "",
                "code" : "400",
                "status" : "Identity not loaded"
              }