diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index f7866d420..d29c624c9 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -1,13 +1,16 @@ -import SignPDF from './SignPDF.min.cjs'; import fs from 'node:fs'; import axios from 'axios'; -import { pdflibAddPlaceholder } from './customSignPdf/pdflibplaceholder.min.js'; +import { SignPdf } from '@signpdf/signpdf'; +import { P12Signer } from '@signpdf/signer-p12'; +import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib'; import { PDFDocument } from 'pdf-lib'; import { replaceMailVaribles, saveFileUsage } from '../../../Utils.js'; import GenerateCertificate from './GenerateCertificate.js'; const serverUrl = process.env.SERVER_URL, APPID = process.env.APP_ID, - masterKEY = process.env.MASTER_KEY; + masterKEY = process.env.MASTER_KEY, + eSignName = 'opensign', + eSigncontact = 'hello@opensignlabs.com'; async function uploadFile(e, t) { try { var a = fs.readFileSync(t), @@ -18,23 +21,23 @@ async function uploadFile(e, t) { console.log('Err ', e), fs.unlinkSync(t); } } -async function updateDoc(a, r, i, s, o, n, l) { +async function updateDoc(a, r, i, n, s, o, l) { try { var c, d, p = { - UserPtr: { __type: 'Pointer', className: n, objectId: i }, + UserPtr: { __type: 'Pointer', className: o, objectId: i }, SignedUrl: r, Activity: 'Signed', - ipAddress: s, + ipAddress: n, SignedOn: new Date(), Signature: l, }; let e; var m = (e = - o.AuditTrail && 0 < o.AuditTrail.length + s.AuditTrail && 0 < s.AuditTrail.length ? (-1 !== - (d = (c = JSON.parse(JSON.stringify(o.AuditTrail))).findIndex( + (d = (c = JSON.parse(JSON.stringify(s.AuditTrail))).findIndex( e => e.UserPtr.objectId === i && 'Created' !== e.Activity )) ? (c[d] = { ...c[d], ...p }) @@ -42,7 +45,7 @@ async function updateDoc(a, r, i, s, o, n, l) { c) : [p]).filter(e => 'Signed' === e.Activity); let t = !1; - !((o.Signers && 0 < o.Signers.length && m.length !== o.Signers.length) || !(t = !0)); + !((s.Signers && 0 < s.Signers.length && m.length !== s.Signers.length) || !(t = !0)); var g = { SignedUrl: r, AuditTrail: e, IsCompleted: t }; await axios.put(serverUrl + '/classes/contracts_Document/' + a, g, { headers: { @@ -61,9 +64,9 @@ async function sendCompletedMail(e) { a = e.doc, r = e.doc.ExtUserPtr, i = a.Name, - s = r.Email; - let o = `Document "${i}" has been signed by all parties`, - n = + n = r.Email; + let s = `Document "${i}" has been signed by all parties`, + o = "
Document signed successfully
All parties have successfully signed the document " + `"${i}"` + '. Kindly download the document from the attachment.
This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender ' +
@@ -80,8 +83,8 @@ async function sendCompletedMail(e) {
g.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: r.UserId.objectId });
const f = await g.first();
f &&
- ((l = JSON.parse(JSON.stringify(f)))?.CompletionSubject && (o = l?.CompletionSubject),
- l?.CompletionBody && (n = l?.CompletionBody),
+ ((l = JSON.parse(JSON.stringify(f)))?.CompletionSubject && (s = l?.CompletionSubject),
+ l?.CompletionBody && (o = l?.CompletionBody),
(c = a.ExpiryDate.iso),
(d = new Date(c).toLocaleDateString('en-US', {
day: 'numeric',
@@ -99,9 +102,9 @@ async function sendCompletedMail(e) {
expiry_date: d,
company_name: r.Company,
}),
- (m = replaceMailVaribles(o, n, p)),
- (o = m.subject),
- (n = m.body));
+ (m = replaceMailVaribles(s, o, p)),
+ (s = m.subject),
+ (o = m.body));
} catch (e) {
console.log('error in fetch tenant in signpdf', e.message);
}
@@ -109,10 +112,10 @@ async function sendCompletedMail(e) {
extUserId: r.objectId,
url: t,
from: 'OpenSign™',
- recipient: s,
- subject: o,
+ recipient: n,
+ subject: s,
pdfName: i,
- html: n,
+ html: o,
mailProvider: e.mailProvider,
};
await axios.post(serverUrl + '/functions/sendmailv3', g, {
@@ -124,8 +127,8 @@ async function sendCompletedMail(e) {
});
}
async function sendDoctoWebhook(a, e, t, r, i) {
- let s = [];
- (s = r
+ let n = [];
+ (n = r
? { name: r?.Name, email: r?.Email, phone: r?.Phone }
: a?.Signers?.map(e => ({ name: e.Name, email: e.Email, phone: e.Phone })) || [
{ name: a?.ExtUserPtr?.Name, email: a?.ExtUserPtr?.Email, phone: a?.ExtUserPtr?.Phone },
@@ -133,8 +136,8 @@ async function sendDoctoWebhook(a, e, t, r, i) {
a.ExtUserPtr?.Webhook &&
((r =
'signed' === t
- ? { signer: s, signedAt: new Date() }
- : { signers: s, completedAt: new Date() }),
+ ? { signer: n, signedAt: new Date() }
+ : { signers: n, completedAt: new Date() }),
(t = {
event: t,
objectId: a?.objectId,
@@ -178,24 +181,27 @@ async function sendDoctoWebhook(a, e, t, r, i) {
}
}));
}
-const sendMailsaveCertifcate = async (e, t, a, r, i, s) => {
- var o = await GenerateCertificate(e),
- o = await PDFDocument.load(o),
- o =
+const sendMailsaveCertifcate = async (e, t, a, r, i, n) => {
+ var s = await GenerateCertificate(e),
+ s = await PDFDocument.load(s),
+ t = new P12Signer(t, { passphrase: process.env.PASS_PHRASE || null }),
+ s =
(pdflibAddPlaceholder({
- pdfDoc: o,
+ pdfDoc: s,
reason: 'Digitally signed by OpenSign.',
location: 'n/a',
+ name: eSignName,
+ contactInfo: eSigncontact,
signatureLength: 15e3,
}),
- await o.save()),
- o = Buffer.from(o),
- t = await new SignPDF(o, t).signPDF(),
+ await s.save()),
+ s = Buffer.from(s),
+ t = await new SignPdf().sign(s, t),
t =
(fs.writeFileSync('./exports/certificate.pdf', t),
await uploadFile('certificate.pdf', './exports/certificate.pdf')),
- n = { CertificateUrl: t.imageUrl };
- await axios.put(serverUrl + '/classes/contracts_Document/' + e.objectId, n, {
+ o = { CertificateUrl: t.imageUrl };
+ await axios.put(serverUrl + '/classes/contracts_Document/' + e.objectId, o, {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APPID,
@@ -205,20 +211,20 @@ const sendMailsaveCertifcate = async (e, t, a, r, i, s) => {
e.IsSendMail && !1 === e.IsSendMail
? console.log("don't send mail")
: sendCompletedMail({ url: a, isCustomMail: r, doc: e, mailProvider: i }),
- saveFileUsage(o.length, t.imageUrl, s),
+ saveFileUsage(s.length, t.imageUrl, n),
sendDoctoWebhook(e, a, 'completed', '', t.imageUrl);
};
-async function PDF(o) {
+async function PDF(s) {
try {
- if (!o?.user)
+ if (!s?.user)
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.');
{
- var n = o?.user?.toJSON(),
- e = o.params.docId;
- const F = o.params.userId;
- var l = o.params.isCustomCompletionMail || !1,
- c = o.params.mailProvider || '',
- d = o.params.signature || '',
+ var o = s?.user?.toJSON(),
+ e = s.params.docId;
+ const C = s.params.userId;
+ var l = s.params.isCustomCompletionMail || !1,
+ c = s.params.mailProvider || '',
+ d = s.params.signature || '',
t = new Parse.Query('contracts_Document'),
a =
(t.include('ExtUserPtr,Signers'),
@@ -227,95 +233,100 @@ async function PDF(o) {
if (!a) throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Document not found.');
var r,
p = a?.toJSON();
- let i, s;
- F
- ? ((r = p.Signers.find(e => e.objectId === F)),
+ let i, n;
+ C
+ ? ((r = p.Signers.find(e => e.objectId === C)),
console.log('_contractUser ', r),
- r && ((i = r), (s = 'contracts_Contactbook')))
- : ((s = 'contracts_Users'), (i = p.ExtUserPtr));
+ r && ((i = r), (n = 'contracts_Contactbook')))
+ : ((n = 'contracts_Users'), (i = p.ExtUserPtr));
var m,
g = i.Name,
f = i.Email;
- if (!o.params.pdfFile) throw (((m = new Error('Pdf file not present!')).code = 400), m);
+ if (!s.params.pdfFile) throw (((m = new Error('Pdf file not present!')).code = 400), m);
{
- let e = Buffer.from(o.params.pdfFile, 'base64');
+ let e = Buffer.from(s.params.pdfFile, 'base64');
var u = process.env.PFX_BASE64,
h = Buffer.from(u, 'base64'),
- y = {
- UserPtr: { __type: 'Pointer', className: s, objectId: i.objectId },
+ y = new P12Signer(h, { passphrase: process.env.PASS_PHRASE || null }),
+ P = {
+ UserPtr: { __type: 'Pointer', className: n, objectId: i.objectId },
SignedUrl: '',
Activity: 'Signed',
- ipAddress: o.headers['x-real-ip'],
+ ipAddress: s.headers['x-real-ip'],
};
let t;
- var P = (t = p.AuditTrail && 0 < p.AuditTrail.length ? [...p.AuditTrail, y] : [y]).filter(
+ var v = (t = p.AuditTrail && 0 < p.AuditTrail.length ? [...p.AuditTrail, P] : [P]).filter(
e => 'Signed' === e.Activity
);
let a = !1;
- !((p.Signers && 0 < p.Signers.length && P.length !== p.Signers.length) || !(a = !0));
- var v,
+ !((p.Signers && 0 < p.Signers.length && v.length !== p.Signers.length) || !(a = !0));
+ var S,
b,
- S,
w,
U,
- D,
- I = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
- _ = './exports/' + I;
+ I,
+ _,
+ E = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
+ D = './exports/' + E;
let r = e.length;
r = (
a
- ? ((v = p.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
+ ? ((S = p.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
(e =
- v && 0 < v.length
+ S && 0 < S.length
? ((b = await PDFDocument.load(e)),
pdflibAddPlaceholder({
pdfDoc: b,
- reason: 'Digitally signed by OpenSign for ' + v?.join(', '),
+ reason: 'Digitally signed by OpenSign for ' + S?.join(', '),
location: 'n/a',
+ name: eSignName,
+ contactInfo: eSigncontact,
signatureLength: 15e3,
}),
- (S = await b.save()),
- Buffer.from(S))
- : ((w = await PDFDocument.load(e)),
+ (w = await b.save()),
+ Buffer.from(w))
+ : ((U = await PDFDocument.load(e)),
pdflibAddPlaceholder({
- pdfDoc: w,
+ pdfDoc: U,
reason: 'Digitally signed by OpenSign for ' + g + ' <' + f + '>',
location: 'n/a',
+ name: eSignName,
+ contactInfo: eSigncontact,
signatureLength: 15e3,
}),
- (U = await w.save()),
- Buffer.from(U))),
- (D = await new SignPDF(e, h).signPDF()),
- fs.writeFileSync(_, D),
- D)
- : (fs.writeFileSync(_, e), e)
+ (I = await U.save()),
+ Buffer.from(I))),
+ (_ = await new SignPdf().sign(e, y)),
+ fs.writeFileSync(D, _),
+ _)
+ : (fs.writeFileSync(D, e), e)
).length;
- var E = await uploadFile(I, _);
- if (E && E.imageUrl) {
+ var A = await uploadFile(E, D);
+ if (A && A.imageUrl) {
var x,
- A,
- j = await updateDoc(
- o.params.docId,
- E.imageUrl,
+ j,
+ N = await updateDoc(
+ s.params.docId,
+ A.imageUrl,
i.objectId,
- o.headers['x-real-ip'],
+ s.headers['x-real-ip'],
p,
- s,
+ n,
d
);
if (
- (sendDoctoWebhook(p, E.imageUrl, 'signed', i),
- saveFileUsage(r, E.imageUrl, n.objectId),
- j &&
- j.isCompleted &&
- ((x = { ...p, AuditTrail: j.AuditTrail }),
- sendMailsaveCertifcate(x, h, E.imageUrl, l, c, n.objectId)),
- fs.unlinkSync(_),
- console.log('New Signed PDF created called: ' + _),
- 'success' === j.message)
+ (sendDoctoWebhook(p, A.imageUrl, 'signed', i),
+ saveFileUsage(r, A.imageUrl, o.objectId),
+ N &&
+ N.isCompleted &&
+ ((x = { ...p, AuditTrail: N.AuditTrail }),
+ sendMailsaveCertifcate(x, h, A.imageUrl, l, c, o.objectId)),
+ fs.unlinkSync(D),
+ console.log('New Signed PDF created called: ' + D),
+ 'success' === N.message)
)
- return { status: 'success', data: E.imageUrl };
- throw (((A = new Error('Please provide required parameters!')).code = 400), A);
+ return { status: 'success', data: A.imageUrl };
+ throw (((j = new Error('Please provide required parameters!')).code = 400), j);
}
}
}
diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjs b/apps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjs
deleted file mode 100644
index b84ba4c9b..000000000
--- a/apps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjs
+++ /dev/null
@@ -1 +0,0 @@
-const signer=require("node-signpdf").default;class SignPDF{constructor(e,t){this.pdfDoc=e,this.certificate=t}async signPDF(){return signer.sign(this.pdfDoc,this.certificate, process.env.PASS_PHRASE ? {passphrase : process.env.PASS_PHRASE}: null)}static unit8ToBuffer(e){var t=Buffer.alloc(e.byteLength),r=new Uint8Array(e);for(let e=0;e