diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js index 1c89a9efd41ed464014ebb6b9a13c4e58efe6980..43bb11975575dcc19d459600ddabfb97fa763c46 100644 --- a/javascript/src/iframe/viamapi-iframe.js +++ b/javascript/src/iframe/viamapi-iframe.js @@ -996,6 +996,83 @@ const connection = Penpal.connectToParent({ return encodeResponse("200", response.data, "PDF signed"); }, + signDocument: async (passportUUID, documentUUID, documentContentType) => { + + //TODO api is not finished + + const authenticationPublicKey = localStorage.getItem("authenticatedIdentity"); + + if ( + !authenticationPublicKey || + !window.loadedIdentities[authenticationPublicKey] || + !extendPinCodeTtl(authenticationPublicKey) + ) { + return encodeResponse("400", "", "Identity not authenticated"); + } + + const response = await getCertificateForPassport(passportUUID, true); + + if (response.code !== "200") { + return encodeResponse("400", "", response.status); + } + + const { + x509Certificate: passportCertificate, + privateKey: passportPrivateKey, + chain: passportChain + } = response.data; + + const keys = + await createOneTimePassportCertificate( + makeid() + "-" + passportUUID, null, passportPrivateKey, passportCertificate); + + const { privateKeyPEM: privateKeyOneTime, certificatePEM: certificateOneTime } = keys; + + passportChain.push(passportCertificate); + + const pdfContentType = 'application/pdf'; + + if (documentContentType !== pdfContentType) { + const convResponse = await executeRestfulFunction( + "private", window.viamApi, window.viamApi.documentConvertDocumentByUUID, null, documentUUID, documentContentType, pdfContentType); + if (convResponse.code !== "200") { + return encodeResponse("400", "", convResponse.status); + } + } + + const downloadResponse = await executeRestfulFunction( + "private", window.viamApi, window.viamApi.documentGetDocumentByUUID, null, documentUUID, pdfContentType) + + if (downloadResponse.code !== "200") { + return encodeResponse("400", "", downloadResponse.status); + } + + let pdfRaw = this.base64ToByteArray(downloadResponse.data); + + const signedPdf = await signPdf(pdfRaw, certificateOneTime, passportChain, privateKeyOneTime); + + //for test + response.data.signedPdf = signedPdf; + //for test + + // response = await executeRestfulFunction( + // "private", window.viamApi, window.viamApi.passportGetEmailWithHeaderByPassport, null, passportUUID, emailMessage); + // + // if (response.code !== "200") { + // return encodeResponse("400", "", response.status); + // } + // + // const signedEmail = await signEmail(response.data, certificateOneTime, passportChain, privateKeyOneTime); + // + // response = await executeRestfulFunction( + // "private", window.viamApi, window.viamApi.signResignEmail, null, passportUUID, signedEmail); + // + // if (response.code !== "200") { + // return encodeResponse("400", "", response.status); + // } + + return encodeResponse("200", response.data, "PDF signed"); + }, documentCreateDocument: async (path, passportUUID, contenttype) => { const authenticationPublicKey = localStorage.getItem("authenticatedIdentity"); if ( diff --git a/javascript/src/utilities/pdfUtilities.js b/javascript/src/utilities/pdfUtilities.js index 952b374279ff3c58b81c8b96882f7dacb41d1b63..d7109fe2ea6fcc48238174583b60a9e1191d971c 100644 --- a/javascript/src/utilities/pdfUtilities.js +++ b/javascript/src/utilities/pdfUtilities.js @@ -706,7 +706,11 @@ async function sign_pki(signingCert, certificateChain, privateKey, data, date) { async function signPdfObjects (pdfRaw, signingCert, certificateChain, privateKey, date) { - date = typeof date !== 'undefined' ? date : new Date(); + date = ((typeof date !== 'undefined') && (date !== null)) ? date : new Date(); + + if (pdfRaw instanceof Buffer) { + pdfRaw = new Uint8Array(pdfRaw); + } else if(pdfRaw instanceof ArrayBuffer) { pdfRaw = new Uint8Array(pdfRaw); }