Skip to content

Commit 4cd3791

Browse files
authored
Merge pull request #759 from OpenSignLabs/feat_resendmail
2 parents 4c16267 + ca390bd commit 4cd3791

21 files changed

+103
-256
lines changed

β€Žapps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.jsβ€Ž

Lines changed: 103 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
import SignPDF from './SignPDF.min.cjs';
21
import fs from 'node:fs';
32
import axios from 'axios';
4-
import { pdflibAddPlaceholder } from './customSignPdf/pdflibplaceholder.min.js';
3+
import { SignPdf } from '@signpdf/signpdf';
4+
import { P12Signer } from '@signpdf/signer-p12';
5+
import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib';
56
import { PDFDocument } from 'pdf-lib';
67
import { replaceMailVaribles, saveFileUsage } from '../../../Utils.js';
78
import GenerateCertificate from './GenerateCertificate.js';
89
const serverUrl = process.env.SERVER_URL,
910
APPID = process.env.APP_ID,
10-
masterKEY = process.env.MASTER_KEY;
11+
masterKEY = process.env.MASTER_KEY,
12+
eSignName = 'opensign',
13+
eSigncontact = '[email protected]';
1114
async function uploadFile(e, t) {
1215
try {
1316
var a = fs.readFileSync(t),
@@ -18,31 +21,31 @@ async function uploadFile(e, t) {
1821
console.log('Err ', e), fs.unlinkSync(t);
1922
}
2023
}
21-
async function updateDoc(a, r, i, s, o, n, l) {
24+
async function updateDoc(a, r, i, n, s, o, l) {
2225
try {
2326
var c,
2427
d,
2528
p = {
26-
UserPtr: { __type: 'Pointer', className: n, objectId: i },
29+
UserPtr: { __type: 'Pointer', className: o, objectId: i },
2730
SignedUrl: r,
2831
Activity: 'Signed',
29-
ipAddress: s,
32+
ipAddress: n,
3033
SignedOn: new Date(),
3134
Signature: l,
3235
};
3336
let e;
3437
var m = (e =
35-
o.AuditTrail && 0 < o.AuditTrail.length
38+
s.AuditTrail && 0 < s.AuditTrail.length
3639
? (-1 !==
37-
(d = (c = JSON.parse(JSON.stringify(o.AuditTrail))).findIndex(
40+
(d = (c = JSON.parse(JSON.stringify(s.AuditTrail))).findIndex(
3841
e => e.UserPtr.objectId === i && 'Created' !== e.Activity
3942
))
4043
? (c[d] = { ...c[d], ...p })
4144
: c.push(p),
4245
c)
4346
: [p]).filter(e => 'Signed' === e.Activity);
4447
let t = !1;
45-
!((o.Signers && 0 < o.Signers.length && m.length !== o.Signers.length) || !(t = !0));
48+
!((s.Signers && 0 < s.Signers.length && m.length !== s.Signers.length) || !(t = !0));
4649
var g = { SignedUrl: r, AuditTrail: e, IsCompleted: t };
4750
await axios.put(serverUrl + '/classes/contracts_Document/' + a, g, {
4851
headers: {
@@ -61,9 +64,9 @@ async function sendCompletedMail(e) {
6164
a = e.doc,
6265
r = e.doc.ExtUserPtr,
6366
i = a.Name,
64-
s = r.Email;
65-
let o = `Document "${i}" has been signed by all parties`,
66-
n =
67+
n = r.Email;
68+
let s = `Document "${i}" has been signed by all parties`,
69+
o =
6770
"<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body> <div style='background-color:#f5f5f5;padding:20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background-color:white;'> <div><img src=https://qikinnovation.ams3.digitaloceanspaces.com/logo.png height='50' style='padding:20px'/> </div><div style='padding:2px;font-family:system-ui; background-color: #47a3ad;'> <p style='font-size:20px;font-weight:400;color:white;padding-left:20px',> Document signed successfully</p></div><div><p style='padding:20px;font-family:system-ui;font-size:14px'>All parties have successfully signed the document " +
6871
`<b>"${i}"</b>` +
6972
'. Kindly download the document from the attachment.</p></div> </div><div><p>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) {
8083
g.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: r.UserId.objectId });
8184
const f = await g.first();
8285
f &&
83-
((l = JSON.parse(JSON.stringify(f)))?.CompletionSubject && (o = l?.CompletionSubject),
84-
l?.CompletionBody && (n = l?.CompletionBody),
86+
((l = JSON.parse(JSON.stringify(f)))?.CompletionSubject && (s = l?.CompletionSubject),
87+
l?.CompletionBody && (o = l?.CompletionBody),
8588
(c = a.ExpiryDate.iso),
8689
(d = new Date(c).toLocaleDateString('en-US', {
8790
day: 'numeric',
@@ -99,20 +102,20 @@ async function sendCompletedMail(e) {
99102
expiry_date: d,
100103
company_name: r.Company,
101104
}),
102-
(m = replaceMailVaribles(o, n, p)),
103-
(o = m.subject),
104-
(n = m.body));
105+
(m = replaceMailVaribles(s, o, p)),
106+
(s = m.subject),
107+
(o = m.body));
105108
} catch (e) {
106109
console.log('error in fetch tenant in signpdf', e.message);
107110
}
108111
g = {
109112
extUserId: r.objectId,
110113
url: t,
111114
from: 'OpenSignβ„’',
112-
recipient: s,
113-
subject: o,
115+
recipient: n,
116+
subject: s,
114117
pdfName: i,
115-
html: n,
118+
html: o,
116119
mailProvider: e.mailProvider,
117120
};
118121
await axios.post(serverUrl + '/functions/sendmailv3', g, {
@@ -124,17 +127,17 @@ async function sendCompletedMail(e) {
124127
});
125128
}
126129
async function sendDoctoWebhook(a, e, t, r, i) {
127-
let s = [];
128-
(s = r
130+
let n = [];
131+
(n = r
129132
? { name: r?.Name, email: r?.Email, phone: r?.Phone }
130133
: a?.Signers?.map(e => ({ name: e.Name, email: e.Email, phone: e.Phone })) || [
131134
{ name: a?.ExtUserPtr?.Name, email: a?.ExtUserPtr?.Email, phone: a?.ExtUserPtr?.Phone },
132135
]),
133136
a.ExtUserPtr?.Webhook &&
134137
((r =
135138
'signed' === t
136-
? { signer: s, signedAt: new Date() }
137-
: { signers: s, completedAt: new Date() }),
139+
? { signer: n, signedAt: new Date() }
140+
: { signers: n, completedAt: new Date() }),
138141
(t = {
139142
event: t,
140143
objectId: a?.objectId,
@@ -178,24 +181,27 @@ async function sendDoctoWebhook(a, e, t, r, i) {
178181
}
179182
}));
180183
}
181-
const sendMailsaveCertifcate = async (e, t, a, r, i, s) => {
182-
var o = await GenerateCertificate(e),
183-
o = await PDFDocument.load(o),
184-
o =
184+
const sendMailsaveCertifcate = async (e, t, a, r, i, n) => {
185+
var s = await GenerateCertificate(e),
186+
s = await PDFDocument.load(s),
187+
t = new P12Signer(t, { passphrase: process.env.PASS_PHRASE || null }),
188+
s =
185189
(pdflibAddPlaceholder({
186-
pdfDoc: o,
190+
pdfDoc: s,
187191
reason: 'Digitally signed by OpenSign.',
188192
location: 'n/a',
193+
name: eSignName,
194+
contactInfo: eSigncontact,
189195
signatureLength: 15e3,
190196
}),
191-
await o.save()),
192-
o = Buffer.from(o),
193-
t = await new SignPDF(o, t).signPDF(),
197+
await s.save()),
198+
s = Buffer.from(s),
199+
t = await new SignPdf().sign(s, t),
194200
t =
195201
(fs.writeFileSync('./exports/certificate.pdf', t),
196202
await uploadFile('certificate.pdf', './exports/certificate.pdf')),
197-
n = { CertificateUrl: t.imageUrl };
198-
await axios.put(serverUrl + '/classes/contracts_Document/' + e.objectId, n, {
203+
o = { CertificateUrl: t.imageUrl };
204+
await axios.put(serverUrl + '/classes/contracts_Document/' + e.objectId, o, {
199205
headers: {
200206
'Content-Type': 'application/json',
201207
'X-Parse-Application-Id': APPID,
@@ -205,20 +211,20 @@ const sendMailsaveCertifcate = async (e, t, a, r, i, s) => {
205211
e.IsSendMail && !1 === e.IsSendMail
206212
? console.log("don't send mail")
207213
: sendCompletedMail({ url: a, isCustomMail: r, doc: e, mailProvider: i }),
208-
saveFileUsage(o.length, t.imageUrl, s),
214+
saveFileUsage(s.length, t.imageUrl, n),
209215
sendDoctoWebhook(e, a, 'completed', '', t.imageUrl);
210216
};
211-
async function PDF(o) {
217+
async function PDF(s) {
212218
try {
213-
if (!o?.user)
219+
if (!s?.user)
214220
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.');
215221
{
216-
var n = o?.user?.toJSON(),
217-
e = o.params.docId;
218-
const F = o.params.userId;
219-
var l = o.params.isCustomCompletionMail || !1,
220-
c = o.params.mailProvider || '',
221-
d = o.params.signature || '',
222+
var o = s?.user?.toJSON(),
223+
e = s.params.docId;
224+
const C = s.params.userId;
225+
var l = s.params.isCustomCompletionMail || !1,
226+
c = s.params.mailProvider || '',
227+
d = s.params.signature || '',
222228
t = new Parse.Query('contracts_Document'),
223229
a =
224230
(t.include('ExtUserPtr,Signers'),
@@ -227,95 +233,100 @@ async function PDF(o) {
227233
if (!a) throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Document not found.');
228234
var r,
229235
p = a?.toJSON();
230-
let i, s;
231-
F
232-
? ((r = p.Signers.find(e => e.objectId === F)),
236+
let i, n;
237+
C
238+
? ((r = p.Signers.find(e => e.objectId === C)),
233239
console.log('_contractUser ', r),
234-
r && ((i = r), (s = 'contracts_Contactbook')))
235-
: ((s = 'contracts_Users'), (i = p.ExtUserPtr));
240+
r && ((i = r), (n = 'contracts_Contactbook')))
241+
: ((n = 'contracts_Users'), (i = p.ExtUserPtr));
236242
var m,
237243
g = i.Name,
238244
f = i.Email;
239-
if (!o.params.pdfFile) throw (((m = new Error('Pdf file not present!')).code = 400), m);
245+
if (!s.params.pdfFile) throw (((m = new Error('Pdf file not present!')).code = 400), m);
240246
{
241-
let e = Buffer.from(o.params.pdfFile, 'base64');
247+
let e = Buffer.from(s.params.pdfFile, 'base64');
242248
var u = process.env.PFX_BASE64,
243249
h = Buffer.from(u, 'base64'),
244-
y = {
245-
UserPtr: { __type: 'Pointer', className: s, objectId: i.objectId },
250+
y = new P12Signer(h, { passphrase: process.env.PASS_PHRASE || null }),
251+
P = {
252+
UserPtr: { __type: 'Pointer', className: n, objectId: i.objectId },
246253
SignedUrl: '',
247254
Activity: 'Signed',
248-
ipAddress: o.headers['x-real-ip'],
255+
ipAddress: s.headers['x-real-ip'],
249256
};
250257
let t;
251-
var P = (t = p.AuditTrail && 0 < p.AuditTrail.length ? [...p.AuditTrail, y] : [y]).filter(
258+
var v = (t = p.AuditTrail && 0 < p.AuditTrail.length ? [...p.AuditTrail, P] : [P]).filter(
252259
e => 'Signed' === e.Activity
253260
);
254261
let a = !1;
255-
!((p.Signers && 0 < p.Signers.length && P.length !== p.Signers.length) || !(a = !0));
256-
var v,
262+
!((p.Signers && 0 < p.Signers.length && v.length !== p.Signers.length) || !(a = !0));
263+
var S,
257264
b,
258-
S,
259265
w,
260266
U,
261-
D,
262-
I = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
263-
_ = './exports/' + I;
267+
I,
268+
_,
269+
E = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
270+
D = './exports/' + E;
264271
let r = e.length;
265272
r = (
266273
a
267-
? ((v = p.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
274+
? ((S = p.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
268275
(e =
269-
v && 0 < v.length
276+
S && 0 < S.length
270277
? ((b = await PDFDocument.load(e)),
271278
pdflibAddPlaceholder({
272279
pdfDoc: b,
273-
reason: 'Digitally signed by OpenSign for ' + v?.join(', '),
280+
reason: 'Digitally signed by OpenSign for ' + S?.join(', '),
274281
location: 'n/a',
282+
name: eSignName,
283+
contactInfo: eSigncontact,
275284
signatureLength: 15e3,
276285
}),
277-
(S = await b.save()),
278-
Buffer.from(S))
279-
: ((w = await PDFDocument.load(e)),
286+
(w = await b.save()),
287+
Buffer.from(w))
288+
: ((U = await PDFDocument.load(e)),
280289
pdflibAddPlaceholder({
281-
pdfDoc: w,
290+
pdfDoc: U,
282291
reason: 'Digitally signed by OpenSign for ' + g + ' <' + f + '>',
283292
location: 'n/a',
293+
name: eSignName,
294+
contactInfo: eSigncontact,
284295
signatureLength: 15e3,
285296
}),
286-
(U = await w.save()),
287-
Buffer.from(U))),
288-
(D = await new SignPDF(e, h).signPDF()),
289-
fs.writeFileSync(_, D),
290-
D)
291-
: (fs.writeFileSync(_, e), e)
297+
(I = await U.save()),
298+
Buffer.from(I))),
299+
(_ = await new SignPdf().sign(e, y)),
300+
fs.writeFileSync(D, _),
301+
_)
302+
: (fs.writeFileSync(D, e), e)
292303
).length;
293-
var E = await uploadFile(I, _);
294-
if (E && E.imageUrl) {
304+
var A = await uploadFile(E, D);
305+
if (A && A.imageUrl) {
295306
var x,
296-
A,
297-
j = await updateDoc(
298-
o.params.docId,
299-
E.imageUrl,
307+
j,
308+
N = await updateDoc(
309+
s.params.docId,
310+
A.imageUrl,
300311
i.objectId,
301-
o.headers['x-real-ip'],
312+
s.headers['x-real-ip'],
302313
p,
303-
s,
314+
n,
304315
d
305316
);
306317
if (
307-
(sendDoctoWebhook(p, E.imageUrl, 'signed', i),
308-
saveFileUsage(r, E.imageUrl, n.objectId),
309-
j &&
310-
j.isCompleted &&
311-
((x = { ...p, AuditTrail: j.AuditTrail }),
312-
sendMailsaveCertifcate(x, h, E.imageUrl, l, c, n.objectId)),
313-
fs.unlinkSync(_),
314-
console.log('New Signed PDF created called: ' + _),
315-
'success' === j.message)
318+
(sendDoctoWebhook(p, A.imageUrl, 'signed', i),
319+
saveFileUsage(r, A.imageUrl, o.objectId),
320+
N &&
321+
N.isCompleted &&
322+
((x = { ...p, AuditTrail: N.AuditTrail }),
323+
sendMailsaveCertifcate(x, h, A.imageUrl, l, c, o.objectId)),
324+
fs.unlinkSync(D),
325+
console.log('New Signed PDF created called: ' + D),
326+
'success' === N.message)
316327
)
317-
return { status: 'success', data: E.imageUrl };
318-
throw (((A = new Error('Please provide required parameters!')).code = 400), A);
328+
return { status: 'success', data: A.imageUrl };
329+
throw (((j = new Error('Please provide required parameters!')).code = 400), j);
319330
}
320331
}
321332
}

β€Žapps/OpenSignServer/cloud/parsefunction/pdf/SignPDF.min.cjsβ€Ž

Lines changed: 0 additions & 1 deletion
This file was deleted.

β€Žapps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFAbstractReference.min.jsβ€Ž

Lines changed: 0 additions & 1 deletion
This file was deleted.

β€Žapps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/PDFKitReferenceMock.min.jsβ€Ž

Lines changed: 0 additions & 1 deletion
This file was deleted.

β€Žapps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/SignPdfError.min.jsβ€Ž

Lines changed: 0 additions & 20 deletions
This file was deleted.

β€Žapps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/const.min.jsβ€Ž

Lines changed: 0 additions & 1 deletion
This file was deleted.

β€Žapps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferPageWithAnnotation.min.jsβ€Ž

Lines changed: 0 additions & 3 deletions
This file was deleted.

β€Žapps/OpenSignServer/cloud/parsefunction/pdf/customSignPdf/createBufferRootWithAcroform.min.jsβ€Ž

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
Β (0)