diff --git a/javascript/src/constants/statuses.js b/javascript/src/constants/statuses.js index 64fe340b5b9cbac714070c61ae1a3bceba23af3e..856d7c47f82097c8156b9f08e235e8a50a0a19c2 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 5b3e7eb4c4db7ffc53beac571610621cbaac1524..9f58f3481ad8f2020735aae93455433e6eb4a8f6 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"); @@ -318,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 && @@ -535,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( @@ -1071,7 +1081,7 @@ const connection = Penpal.connectToParent({ ); }); }, - verifySMIME: async (smimeString) => { + verifySMIME: async smimeString => { const authenticationPublicKey = localStorage.getItem( "authenticatedIdentity" ); @@ -1100,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 || @@ -1119,7 +1135,8 @@ const connection = Penpal.connectToParent({ window.viamApi.documentValidateDocumentByUUID, null, documentUUID, - contentType); + contentType + ); if (validateDocumentResponse.code !== "200") { return encodeResponse("400", "", validateDocumentResponse.status); @@ -1128,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; } } @@ -1331,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" ); @@ -1424,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" ); @@ -1469,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( @@ -1492,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) { @@ -1521,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) { @@ -1536,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); @@ -1592,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 @@ -1636,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) => { @@ -1956,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; @@ -1985,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; },