From c26e6e24ce19530d63dd0e11b4d7257422a752c0 Mon Sep 17 00:00:00 2001
From: Sasha Ilieva <sasha.ilieva@vereign.com>
Date: Mon, 27 Jan 2020 13:10:42 +0200
Subject: [PATCH 1/3] Log error

---
 javascript/src/iframe/viamapi-iframe.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index 5b3e7eb..366f96a 100644
--- a/javascript/src/iframe/viamapi-iframe.js
+++ b/javascript/src/iframe/viamapi-iframe.js
@@ -290,6 +290,7 @@ async function executeRestfulFunction(type, that, fn, config, ...args) {
   try {
     response = await fn.apply(that, [config, ...args]);
   } catch (error) {
+    console.log({error});
     if (error.response) {
       //Resposnse with status code != 2xx still has valid response
       response = error.response;
@@ -306,7 +307,7 @@ async function executeRestfulFunction(type, that, fn, config, ...args) {
 
   const identity = currentlyAuthenticatedIdentity || currentlyLoadedIdentity;
   const { code, status } = response.data;
-
+  console.log({code, status})
   const deviceRevoked =
     type === "private" && code === "401" && status === STATUS_DEVICE_REVOKED;
   if (deviceRevoked) {
-- 
GitLab


From f8204658a58d3866dca373b6e10fa9b48603d3b6 Mon Sep 17 00:00:00 2001
From: Sasha Ilieva <sasha.ilieva@vereign.com>
Date: Tue, 28 Jan 2020 13:35:05 +0200
Subject: [PATCH 2/3] Catch user not activated error in executeRestfulFunction

---
 javascript/src/constants/statuses.js    |   1 +
 javascript/src/iframe/viamapi-iframe.js | 165 ++++++++++++++++--------
 2 files changed, 113 insertions(+), 53 deletions(-)

diff --git a/javascript/src/constants/statuses.js b/javascript/src/constants/statuses.js
index 64fe340..856d7c4 100644
--- a/javascript/src/constants/statuses.js
+++ b/javascript/src/constants/statuses.js
@@ -1 +1,2 @@
 export const STATUS_DEVICE_REVOKED = "Device revoked";
+export const STATUS_USER_NOT_ACTIVATED = 'User not activated';
diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index 366f96a..d8eb973 100644
--- a/javascript/src/iframe/viamapi-iframe.js
+++ b/javascript/src/iframe/viamapi-iframe.js
@@ -1,7 +1,4 @@
-import {
-  parseSMIME,
-  prepareVCardParts
-} from "../utilities/emailUtilities";
+import { parseSMIME, prepareVCardParts } from "../utilities/emailUtilities";
 import {
   stringToUtf8ByteArray,
   utf8ByteArrayToString,
@@ -29,15 +26,19 @@ import {
   createOneTimePassportCertificate,
   createPassportCertificate,
   decryptMessage,
-  encryptMessage, parseCertificate,
+  encryptMessage,
+  parseCertificate,
   signEmail,
   verifySMIME
 } from "../utilities/signingUtilities";
 import { signPdf } from "../utilities/pdfUtilities";
 import CryptoData from "../CryptoData";
 import Identity from "../Identity";
-import { STATUS_DEVICE_REVOKED } from "../constants/statuses";
-import generateQrCode from '../utilities/generateQrCode';
+import {
+  STATUS_DEVICE_REVOKED,
+  STATUS_USER_NOT_ACTIVATED
+} from "../constants/statuses";
+import generateQrCode from "../utilities/generateQrCode";
 
 const penpalMethods = require("../../temp/penpal-methods").default;
 const WopiAPI = require("./wopiapi-iframe");
@@ -290,7 +291,6 @@ async function executeRestfulFunction(type, that, fn, config, ...args) {
   try {
     response = await fn.apply(that, [config, ...args]);
   } catch (error) {
-    console.log({error});
     if (error.response) {
       //Resposnse with status code != 2xx still has valid response
       response = error.response;
@@ -307,7 +307,7 @@ async function executeRestfulFunction(type, that, fn, config, ...args) {
 
   const identity = currentlyAuthenticatedIdentity || currentlyLoadedIdentity;
   const { code, status } = response.data;
-  console.log({code, status})
+  console.log({ code, status });
   const deviceRevoked =
     type === "private" && code === "401" && status === STATUS_DEVICE_REVOKED;
   if (deviceRevoked) {
@@ -319,6 +319,20 @@ async function executeRestfulFunction(type, that, fn, config, ...args) {
     return response.data;
   }
 
+  const userNotActivated =
+    type === "private" &&
+    code === "400" &&
+    status === STATUS_USER_NOT_ACTIVATED;
+
+  if (userNotActivated) {
+    destroyIdentity();
+
+    const event = createEvent("", "UserNotActivated");
+    iframeParent.onEvent(event);
+
+    return response.data;
+  }
+
   const badSession =
     type === "private" &&
     identity &&
@@ -536,14 +550,9 @@ const connection = Penpal.connectToParent({
           newIdentity.setPinCode(pinCode);
 
           window.currentlyLoadedIdentity = newIdentity;
-          const {
-            publicKey,
-            x509Certificate
-          } = newIdentity.authentication;
+          const { publicKey, x509Certificate } = newIdentity.authentication;
 
-          window.loadedIdentities[
-            publicKey
-          ] = newIdentity;
+          window.loadedIdentities[publicKey] = newIdentity;
           extendPinCodeTtl(newIdentity.authentication.publicKey, pinCode);
 
           window.viamAnonymousApi.setIdentity(
@@ -1072,7 +1081,7 @@ const connection = Penpal.connectToParent({
         );
       });
     },
-    verifySMIME: async (smimeString) => {
+    verifySMIME: async smimeString => {
       const authenticationPublicKey = localStorage.getItem(
         "authenticatedIdentity"
       );
@@ -1101,10 +1110,16 @@ const connection = Penpal.connectToParent({
       const rootCaPem = rootCaResponse.data;
       const verificationResult = await verifySMIME(smimeString, rootCaPem);
 
-      return encodeResponse("200", verificationResult.verified, verificationResult.message);
+      return encodeResponse(
+        "200",
+        verificationResult.verified,
+        verificationResult.message
+      );
     },
     validateDocument: async (documentUUID, contentType) => {
-      const authenticationPublicKey = localStorage.getItem("authenticatedIdentity");
+      const authenticationPublicKey = localStorage.getItem(
+        "authenticatedIdentity"
+      );
 
       if (
         !authenticationPublicKey ||
@@ -1120,7 +1135,8 @@ const connection = Penpal.connectToParent({
         window.viamApi.documentValidateDocumentByUUID,
         null,
         documentUUID,
-        contentType);
+        contentType
+      );
 
       if (validateDocumentResponse.code !== "200") {
         return encodeResponse("400", "", validateDocumentResponse.status);
@@ -1129,11 +1145,13 @@ const connection = Penpal.connectToParent({
       const signatures = validateDocumentResponse.data;
       if (signatures) {
         for (const signature of signatures) {
-          const certificateChain = signature.certificateChainPEM.map((certificatePEM) => {
-            const certificate = parseCertificate(certificatePEM);
-            const certificateData = new CertificateData(certificate);
-            return certificateData;
-          });
+          const certificateChain = signature.certificateChainPEM.map(
+            certificatePEM => {
+              const certificate = parseCertificate(certificatePEM);
+              const certificateData = new CertificateData(certificate);
+              return certificateData;
+            }
+          );
           signature.certificateChain = certificateChain;
         }
       }
@@ -1332,7 +1350,11 @@ const connection = Penpal.connectToParent({
 
       return encodeResponse("200", "", "Document signed");
     },
-    signDocumentJava: async (passportUUID, documentUUID, documentContentType) => {
+    signDocumentJava: async (
+      passportUUID,
+      documentUUID,
+      documentContentType
+    ) => {
       const authenticationPublicKey = localStorage.getItem(
         "authenticatedIdentity"
       );
@@ -1425,7 +1447,14 @@ const connection = Penpal.connectToParent({
     //   body: String if it is a text part (Content-Type = "text/...") or Uint8Array otherwise; filled for leaf MIME nodes
     //   parts: array of instances of the same object; filled for container MIME nodes (Content-Type = "multipart/...")
     // }
-    signVCard: async (passportUUID, senderEmail, attribs, textBody, htmlBody, parts) => {
+    signVCard: async (
+      passportUUID,
+      senderEmail,
+      attribs,
+      textBody,
+      htmlBody,
+      parts
+    ) => {
       const authenticationPublicKey = localStorage.getItem(
         "authenticatedIdentity"
       );
@@ -1470,12 +1499,17 @@ const connection = Penpal.connectToParent({
       }
 
       let qrCodeImageData;
-      let qrCodeCoordinates = {fromL: -1, fromR:-1, toL: -1, toR: -1};
+      let qrCodeCoordinates = { fromL: -1, fromR: -1, toL: -1, toR: -1 };
 
-      if (vCardImageClaimValue && "state" in vCardImageClaimValue && vCardImageClaimValue.state === "disabled") {
+      if (
+        vCardImageClaimValue &&
+        "state" in vCardImageClaimValue &&
+        vCardImageClaimValue.state === "disabled"
+      ) {
         vCardImageData = new ImageData({
           contentType: "image/png",
-          contentBase64: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" //1x1px transparent pixel
+          contentBase64:
+            "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" //1x1px transparent pixel
         });
       } else {
         const vCardImageResponse = await executeRestfulFunction(
@@ -1493,17 +1527,21 @@ const connection = Penpal.connectToParent({
         }
         vCardImageData = new ImageData(vCardImageResponse.data.Image);
         if (vCardImageData.contentType !== "image/png") {
-          return encodeResponse("400", "", "Content type of vCard mmust be 'image/png'");
+          return encodeResponse(
+            "400",
+            "",
+            "Content type of vCard mmust be 'image/png'"
+          );
         }
 
         qrCodeCoordinates = vCardImageResponse.data.QRCodeCoordinates;
-        const qrCodeBase64Content = await generateQrCode("https://" + location.host + "/check/" + messageUUID);
-        qrCodeImageData = new ImageData(
-          {
-            contentType: "image/png",
-            content: qrCodeBase64Content
-          }
+        const qrCodeBase64Content = await generateQrCode(
+          "https://" + location.host + "/check/" + messageUUID
         );
+        qrCodeImageData = new ImageData({
+          contentType: "image/png",
+          content: qrCodeBase64Content
+        });
       }
 
       if (typeof parts === "undefined" || parts === null) {
@@ -1522,7 +1560,9 @@ const connection = Penpal.connectToParent({
         };
         parts.unshift(htmlPart);
       } else {
-        console.log("Html body is not passed to signVCard, its value is ", {html: htmlBody});
+        console.log("Html body is not passed to signVCard, its value is ", {
+          html: htmlBody
+        });
       }
 
       if (textBody) {
@@ -1537,7 +1577,9 @@ const connection = Penpal.connectToParent({
         };
         parts.unshift(textPart);
       } else {
-        console.log("Text body is not passed to signVCard, its value is ", {text: textBody});
+        console.log("Text body is not passed to signVCard, its value is ", {
+          text: textBody
+        });
       }
 
       const count = prepareVCardParts(parts);
@@ -1593,17 +1635,21 @@ const connection = Penpal.connectToParent({
         parts,
         vCardAttribs,
         qrCodeImageData,
-        qrCodeCoordinates,
+        qrCodeCoordinates
       );
       if (signVCardResponse.code !== "200") {
         return encodeResponse("400", "", signVCardResponse.status);
       }
 
       const signedVCardImageData = new ImageData(signVCardResponse.data);
-      return encodeResponse("200", {
-        image: signedVCardImageData,
-        messageUUID: messageUUID
-      }, "vCard signed");
+      return encodeResponse(
+        "200",
+        {
+          image: signedVCardImageData,
+          messageUUID: messageUUID
+        },
+        "vCard signed"
+      );
     },
     // mime - String - the MIME of the email message
     // vCardAttribs - optional attributes for the verification procedure in format
@@ -1637,19 +1683,25 @@ const connection = Penpal.connectToParent({
       }
 
       const validationResult = validateVMimeResponse.data;
-      const {signatures} = validationResult;
+      const { signatures } = validationResult;
       if (signatures) {
         for (const signature of signatures) {
-          const certificateChain = signature.certificateChainPEM.map((certificatePEM) => {
-            const certificate = parseCertificate(certificatePEM);
-            const certificateData = new CertificateData(certificate);
-            return certificateData;
-          });
+          const certificateChain = signature.certificateChainPEM.map(
+            certificatePEM => {
+              const certificate = parseCertificate(certificatePEM);
+              const certificateData = new CertificateData(certificate);
+              return certificateData;
+            }
+          );
           signature.certificateChain = certificateChain;
         }
       }
 
-      return encodeResponse("200", validationResult, "Validation result retrieved");
+      return encodeResponse(
+        "200",
+        validationResult,
+        "Validation result retrieved"
+      );
     },
     generateQrCode,
     documentCreateDocument: async (passportUUID, path, contentType, title) => {
@@ -1957,7 +2009,10 @@ const connection = Penpal.connectToParent({
 
       const resourceID = createDocumentResult.data;
 
-      const accessTokenResponse = await wopiAPI.getAccessToken(passportUUID, resourceID);
+      const accessTokenResponse = await wopiAPI.getAccessToken(
+        passportUUID,
+        resourceID
+      );
 
       if (accessTokenResponse.data.code !== "200") {
         return accessTokenResponse.data;
@@ -1986,7 +2041,11 @@ const connection = Penpal.connectToParent({
         return encodeResponse("400", "", "Identity not authenticated");
       }
 
-      const response = await wopiAPI.getAccessToken(passportUUID, resourceID, contentType);
+      const response = await wopiAPI.getAccessToken(
+        passportUUID,
+        resourceID,
+        contentType
+      );
       return response.data;
     },
 
-- 
GitLab


From e39032415a77c595005055b8e98944bab87bae3b Mon Sep 17 00:00:00 2001
From: Sasha Ilieva <sasha.ilieva@vereign.com>
Date: Tue, 28 Jan 2020 14:29:03 +0200
Subject: [PATCH 3/3] Remove console log

---
 javascript/src/iframe/viamapi-iframe.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js
index d8eb973..9f58f34 100644
--- a/javascript/src/iframe/viamapi-iframe.js
+++ b/javascript/src/iframe/viamapi-iframe.js
@@ -307,7 +307,7 @@ async function executeRestfulFunction(type, that, fn, config, ...args) {
 
   const identity = currentlyAuthenticatedIdentity || currentlyLoadedIdentity;
   const { code, status } = response.data;
-  console.log({ code, status });
+
   const deviceRevoked =
     type === "private" && code === "401" && status === STATUS_DEVICE_REVOKED;
   if (deviceRevoked) {
-- 
GitLab