Skip to content
Snippets Groups Projects

Implement validation of VCard

Merged Damyan Mitev requested to merge 32-implement-validation-of-vcard into master
Files
3
import { parseSMIME } from "../utilities/emailUtilities";
import {
parseSMIME,
prepareVCardParts
} from "../utilities/emailUtilities";
import {
stringToUtf8ByteArray,
utf8ByteArrayToString,
@@ -1406,17 +1409,17 @@ const connection = Penpal.connectToParent({
return encodeResponse("200", "", "Document signed");
},
// passportUUID - passport to sign the vCard
// text, html - the text and html part of the email
// related, attachments - array of objects, containing hashes of images/objects, related to the html in format:
// passportUUID - String - passport to sign the vCard
// text, html - String - the text and html part of the email, both optional
// parts - array of objects, representing the MIME structure in format:
// {
// headers: {
// "Content-Type": "application/hash; algorithm=SHA-256",
// "Original-Content-Type": "image/jpeg", //original content type
// "Content-Disposition": "inline" or "attachment",
// ... //other headers
// "Content-Type": "image/jpeg",
// "Content-Disposition": "inline" or "attachment" with additional attributes,
// ... //other headers from MIME
// },
// body: "base64 encoded hash"
// 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, text, html, parts = null) => {
const authenticationPublicKey = localStorage.getItem(
@@ -1431,6 +1434,13 @@ const connection = Penpal.connectToParent({
return encodeResponse("400", "", "Identity not authenticated");
}
const messageUUID = makeid();
const vCardAttribs = {
passportUUID: passportUUID,
messageUUID: messageUUID
};
let vCardImageData;
let vCardImageClaimValue;
@@ -1454,7 +1464,8 @@ const connection = Penpal.connectToParent({
vCardImageClaimValue = vCardClaimResponse.data;
}
var coordinates = {fromL: -1, fromR:-1, toL: -1, toR: -1}
let qrCodeImageData;
let qrCodeCoordinates = {fromL: -1, fromR:-1, toL: -1, toR: -1};
if (vCardImageClaimValue && "state" in vCardImageClaimValue && vCardImageClaimValue.state === "disabled") {
vCardImageData = new ImageData({
@@ -1480,21 +1491,16 @@ const connection = Penpal.connectToParent({
return encodeResponse("400", "", "Content type of vCard mmust be 'image/png'");
}
coordinates = vCardImageResponse.data.QRCodeCoordinates
qrCodeCoordinates = vCardImageResponse.data.QRCodeCoordinates;
const qrCodeBase64Content = await generateQrCode("https://" + location.host + "/check/" + messageUUID);
qrCodeImageData = new ImageData(
{
contentType: "image/png",
content: qrCodeBase64Content
}
);
}
var messageUUID = makeid()
var qrCodeBase64Content = await generateQrCode("https://" + location.host + "/check/" + messageUUID)
var qrCode = new ImageData(
{
contentType: "image/png",
content: qrCodeBase64Content,
}
)
if (!parts) {
parts = [];
}
@@ -1504,7 +1510,7 @@ const connection = Penpal.connectToParent({
headers: {
"Content-Type": "text/html"
},
body: stringToUtf8Base64(html)
body: html
};
parts.unshift(htmlPart);
}
@@ -1514,11 +1520,13 @@ const connection = Penpal.connectToParent({
headers: {
"Content-Type": "text/plain"
},
body: stringToUtf8Base64(text)
body: text
};
parts.unshift(textPart);
}
prepareVCardParts(parts);
const certResponse = await getCertificateForPassport(passportUUID, true);
if (certResponse.code !== "200") {
@@ -1550,8 +1558,8 @@ const connection = Penpal.connectToParent({
passportChain.reverse();
console.log(qrCode);
console.log(coordinates);
console.log(qrCodeImageData);
console.log(qrCodeCoordinates);
const signVCardResponse = await executeRestfulFunction(
"private",
@@ -1562,8 +1570,9 @@ const connection = Penpal.connectToParent({
privateKeyOneTime,
passportChain,
parts,
qrCode,
coordinates,
vCardAttribs,
qrCodeImageData,
qrCodeCoordinates,
);
if (signVCardResponse.code !== "200") {
return encodeResponse("400", "", signVCardResponse.status);
@@ -1572,9 +1581,43 @@ const connection = Penpal.connectToParent({
const signedVCardImageData = new ImageData(signVCardResponse.data);
return encodeResponse("200", {
image: signedVCardImageData,
messageUUID: messageUUID,
messageUUID: messageUUID
}, "vCard signed");
},
// mime - String - the MIME of the email message
// vCardAttribs - optional attributes for the verification procedure in format
// {
// passportUUID: passportUUID,
// messageUUID: messageUUID
// };
validateVMime: async (vMime, vCardAttribs = null) => {
const authenticationPublicKey = localStorage.getItem(
"authenticatedIdentity"
);
if (
!authenticationPublicKey ||
!window.loadedIdentities[authenticationPublicKey] ||
!extendPinCodeTtl(authenticationPublicKey)
) {
return encodeResponse("400", "", "Identity not authenticated");
}
const validateVMimeResponse = await executeRestfulFunction(
"private",
window.viamApi,
window.viamApi.signValidateVMime,
null,
vMime,
vCardAttribs
);
if (validateVMimeResponse.code !== "200") {
return encodeResponse("400", "", validateVMimeResponse.status);
}
const validationResult = validateVMimeResponse.data;
return encodeResponse("200", validationResult, "Validation result retrieved");
},
generateQrCode,
documentCreateDocument: async (passportUUID, path, contentType, title) => {
const authenticationPublicKey = localStorage.getItem(
Loading