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