Skip to content

Commit db34c42

Browse files
authored
Merge pull request #630 from OpenSignLabs/gmail_provider
feat: add google mail provider
2 parents e578981 + 1d39db6 commit db34c42

File tree

8 files changed

+399
-103
lines changed

8 files changed

+399
-103
lines changed

apps/OpenSignServer/cloud/customRoute/customApp.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import uploadFile from './uploadFile.js';
66
import saveSubscription from './saveSubscription.js';
77
import saveInvoice from './saveInvoice.js';
88
import savePayments from './savePayments.js';
9+
import gooogleauth from './googleauth.js';
910
export const app = express();
1011

1112
dotenv.config();
@@ -18,5 +19,7 @@ app.post('/file_upload', uploadFile);
1819
app.post('/savesubscription', saveSubscription)
1920
app.post('/saveinvoice', saveInvoice)
2021
app.post('/savepayment', savePayments)
22+
app.post('/googleauth', gooogleauth)
23+
2124

2225

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import axios from 'axios';
2+
const appId = process.env.APP_ID;
3+
const serverUrl = process.env.SERVER_URL;
4+
export default async function gooogleauth(request, response) {
5+
const code = request.body.code;
6+
const baseUrl = new URL(process.env.SERVER_URL);
7+
// const sessiontoken = request.headers;
8+
// console.log('sessiontoken', sessiontoken);
9+
// console.log('google code', code);
10+
try {
11+
const userRes = await axios.get(serverUrl + '/users/me', {
12+
headers: {
13+
'X-Parse-Application-Id': appId,
14+
'X-Parse-Session-Token': request.headers['sessiontoken'],
15+
},
16+
});
17+
const userId = userRes.data && userRes.data.objectId;
18+
if (userId) {
19+
const clientId = process.env.GOOGLE_CLIENT_ID; // '918704711393-thhv3re2pfqvve76tgb86ulu1tlpssrk.apps.googleusercontent.com';
20+
const clientSecret = process.env.GOOGLE_CLIENT_SECRET; //'3NqyXVNm4jUhwNE4D8eVosII';
21+
const redirectUri = baseUrl.origin || 'http://localhost:3000'; // Should match the redirect URI used in the authorization request
22+
const tokenEndpoint = 'https://oauth2.googleapis.com/token';
23+
24+
const params = new URLSearchParams();
25+
params.append('code', code);
26+
params.append('client_id', clientId);
27+
params.append('client_secret', clientSecret);
28+
params.append('redirect_uri', redirectUri);
29+
params.append('grant_type', 'authorization_code');
30+
31+
const res = await axios.post(tokenEndpoint, params);
32+
// console.log('oauthres ', res.data);
33+
const refresh_token = res.data.refresh_token;
34+
const extUserCls = new Parse.Query('contracts_Users');
35+
extUserCls.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: userId });
36+
const extUser = await extUserCls.first({ useMasterKey: true });
37+
38+
if (extUser) {
39+
const extUserCls = new Parse.Object('contracts_Users');
40+
extUserCls.id = extUser.id;
41+
extUserCls.set('google_refresh_token', refresh_token);
42+
const updateExtUser = await extUserCls.save(null, { useMasterKey: true });
43+
// console.log('updateExtUser ', updateExtUser);
44+
}
45+
return response.status(200).json({ status: 'success!' });
46+
} else {
47+
return response.status(404).json({ message: 'user not found!' });
48+
}
49+
} catch (err) {
50+
console.log('err in google auth', err.message);
51+
return response.status(404).json({ message: err.message });
52+
}
53+
}

apps/OpenSignServer/cloud/parsefunction/getUserDetails.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ async function getUserDetails(request) {
55
userQuery.equalTo('Email', request.params.email);
66
userQuery.include('TenantId');
77
userQuery.include('UserId');
8+
userQuery.exclude('google_refresh_token')
89
if (userId) {
910
userQuery.equalTo('CreatedBy', { __type: 'Pointer', className: '_User', objectId: userId });
1011
}

apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js

Lines changed: 75 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,17 @@ async function sendCompletedMail(e) {
9494
} catch (e) {
9595
console.log('error in fetch tenant in signpdf', e.message);
9696
}
97-
e = {
97+
g = {
9898
extUserId: s.objectId,
9999
url: a,
100100
from: 'OpenSign™',
101101
recipient: i,
102102
subject: o,
103103
pdfName: r,
104104
html: n,
105+
mailProvider: e.mailProvider,
105106
};
106-
await axios.post(serverUrl + '/functions/sendmailv3', e, {
107+
await axios.post(serverUrl + '/functions/sendmailv3', g, {
107108
headers: {
108109
'Content-Type': 'application/json',
109110
'X-Parse-Application-Id': APPID,
@@ -173,8 +174,9 @@ async function PDF(o) {
173174
try {
174175
var n = o.params.docId,
175176
e = o.params.userId,
176-
l = o.params.isCustomCompletionMail,
177-
d = await axios.get(
177+
l = o.params.isCustomCompletionMail || !1,
178+
d = o.params.mailProvider || '',
179+
c = await axios.get(
178180
serverUrl + '/classes/contracts_Document/' + n + '?include=ExtUserPtr,Signers',
179181
{
180182
headers: {
@@ -184,33 +186,33 @@ async function PDF(o) {
184186
},
185187
}
186188
),
187-
c = await axios.get(serverUrl + '/users/me', {
189+
p = await axios.get(serverUrl + '/users/me', {
188190
headers: {
189191
'X-Parse-Application-Id': APPID,
190192
'X-Parse-Session-Token': o.headers.sessiontoken,
191193
},
192194
});
193-
if (!c.data || !c.data.objectId) return { status: 'error', message: 'This user not allowed!' };
195+
if (!p.data || !p.data.objectId) return { status: 'error', message: 'This user not allowed!' };
194196
{
195197
var a,
196198
t,
197199
s,
198-
p = JSON.stringify({ objectId: e });
200+
m = JSON.stringify({ objectId: e });
199201
let r, i;
200202
i = e
201-
? (a = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + p, {
203+
? (a = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + m, {
202204
headers: {
203205
'X-Parse-Application-Id': APPID,
204206
'X-Parse-Session-Token': o.headers.sessiontoken,
205207
},
206208
})).data && 0 < a.data.results.length
207209
? ((r = a), 'contracts_Contactbook')
208-
: ((r = await axios.get(serverUrl + '/classes/contracts_Users?where=' + p, {
210+
: ((r = await axios.get(serverUrl + '/classes/contracts_Users?where=' + m, {
209211
headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY },
210212
})),
211213
'contracts_Users')
212214
: ((t = JSON.stringify({
213-
UserId: { __type: 'Pointer', className: '_User', objectId: c.data.objectId },
215+
UserId: { __type: 'Pointer', className: '_User', objectId: p.data.objectId },
214216
})),
215217
(s = await axios.get(serverUrl + '/classes/contracts_Users?where=' + t, {
216218
headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY },
@@ -223,125 +225,130 @@ async function PDF(o) {
223225
},
224226
})),
225227
'contracts_Contactbook'));
226-
var m = r.data.results[0].Name,
227-
g = r.data.results[0].Email;
228+
var g = r.data.results[0].Name,
229+
u = r.data.results[0].Email;
228230
if (!o.params.pdfFile) return { status: 'error', message: 'Pdf file not present!' };
229231
{
230232
let e = Buffer.from(o.params.pdfFile, 'base64');
231-
var u = process.env.PFX_BASE64,
232-
h = Buffer.from(u, 'base64'),
233-
f = {
233+
var h = process.env.PFX_BASE64,
234+
f = Buffer.from(h, 'base64'),
235+
P = {
234236
UserPtr: { __type: 'Pointer', className: i, objectId: r.data.results[0].objectId },
235237
SignedUrl: '',
236238
Activity: 'Signed',
237239
ipAddress: o.headers['x-real-ip'],
238240
};
239241
let a;
240-
var P = (a =
241-
d.data.AuditTrail && 0 < d.data.AuditTrail.length
242-
? [...d.data.AuditTrail, f]
243-
: [f]).filter(e => 'Signed' === e.Activity);
242+
var y = (a =
243+
c.data.AuditTrail && 0 < c.data.AuditTrail.length
244+
? [...c.data.AuditTrail, P]
245+
: [P]).filter(e => 'Signed' === e.Activity);
244246
let t = !1;
245247
!(
246-
(d.data.Signers && 0 < d.data.Signers.length && P.length !== d.data.Signers.length) ||
248+
(c.data.Signers && 0 < c.data.Signers.length && y.length !== c.data.Signers.length) ||
247249
!(t = !0)
248250
);
249-
var y,
251+
var v,
250252
b,
251-
v,
252253
U,
253254
I,
254255
w,
255-
D = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
256-
S = './exports/' + D;
256+
D,
257+
S = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
258+
_ = './exports/' + S;
257259
let s = e.length;
258260
s = (
259261
t
260-
? ((y = d.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
262+
? ((v = c.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
261263
(e =
262-
y && 0 < y.length
264+
v && 0 < v.length
263265
? ((b = await PDFDocument.load(e)),
264266
pdflibAddPlaceholder({
265267
pdfDoc: b,
266-
reason: 'Digitally signed by OpenSign for ' + y?.join(', '),
268+
reason: 'Digitally signed by OpenSign for ' + v?.join(', '),
267269
location: 'n/a',
268270
signatureLength: 15e3,
269271
}),
270-
(v = await b.save()),
271-
Buffer.from(v))
272-
: ((U = await PDFDocument.load(e)),
272+
(U = await b.save()),
273+
Buffer.from(U))
274+
: ((I = await PDFDocument.load(e)),
273275
pdflibAddPlaceholder({
274-
pdfDoc: U,
275-
reason: 'Digitally signed by OpenSign for ' + m + ' <' + g + '>',
276+
pdfDoc: I,
277+
reason: 'Digitally signed by OpenSign for ' + g + ' <' + u + '>',
276278
location: 'n/a',
277279
signatureLength: 15e3,
278280
}),
279-
(I = await U.save()),
280-
Buffer.from(I))),
281-
(w = await new SignPDF(e, h).signPDF()),
282-
fs.writeFileSync(S, w),
283-
w)
284-
: (fs.writeFileSync(S, e), e)
281+
(w = await I.save()),
282+
Buffer.from(w))),
283+
(D = await new SignPDF(e, f).signPDF()),
284+
fs.writeFileSync(_, D),
285+
D)
286+
: (fs.writeFileSync(_, e), e)
285287
).length;
286-
var _,
287-
A,
288+
var A,
288289
x,
289290
E,
290291
j,
291292
k,
292293
F,
293294
C,
294295
T,
295-
N = await uploadFile(D, S);
296-
if (N && N.imageUrl)
296+
N,
297+
M = await uploadFile(S, _);
298+
if (M && M.imageUrl)
297299
return (
298-
(_ = await updateDoc(
300+
(A = await updateDoc(
299301
o.params.docId,
300-
N.imageUrl,
302+
M.imageUrl,
301303
r.data.results[0].objectId,
302304
o.headers['x-real-ip'],
303-
d.data,
305+
c.data,
304306
i
305307
)),
306-
sendDoctoWebhook(d, N.imageUrl, 'signed', r?.data.results?.[0]),
307-
saveFileUsage(s, N.imageUrl, c.data.objectId),
308-
_ &&
309-
_.isCompleted &&
310-
((A = { ...d.data, AuditTrail: _.AuditTrail }),
311-
(x = await GenerateCertificate(A)),
312-
(E = await PDFDocument.load(x)),
308+
sendDoctoWebhook(c, M.imageUrl, 'signed', r?.data.results?.[0]),
309+
saveFileUsage(s, M.imageUrl, p.data.objectId),
310+
A &&
311+
A.isCompleted &&
312+
((x = { ...c.data, AuditTrail: A.AuditTrail }),
313+
(E = await GenerateCertificate(x)),
314+
(j = await PDFDocument.load(E)),
313315
pdflibAddPlaceholder({
314-
pdfDoc: E,
316+
pdfDoc: j,
315317
reason: 'Digitally signed by OpenSign.',
316318
location: 'n/a',
317319
signatureLength: 15e3,
318320
}),
319-
(j = await E.save()),
320-
(k = Buffer.from(j)),
321-
(F = await new SignPDF(k, h).signPDF()),
322-
fs.writeFileSync('./exports/certificate.pdf', F),
323-
(T = {
324-
CertificateUrl: (C = await uploadFile(
321+
(k = await j.save()),
322+
(F = Buffer.from(k)),
323+
(C = await new SignPDF(F, f).signPDF()),
324+
fs.writeFileSync('./exports/certificate.pdf', C),
325+
(N = {
326+
CertificateUrl: (T = await uploadFile(
325327
'certificate.pdf',
326328
'./exports/certificate.pdf'
327329
)).imageUrl,
328330
}),
329-
await axios.put(serverUrl + '/classes/contracts_Document/' + n, T, {
331+
await axios.put(serverUrl + '/classes/contracts_Document/' + n, N, {
330332
headers: {
331333
'Content-Type': 'application/json',
332334
'X-Parse-Application-Id': APPID,
333335
'X-Parse-Master-Key': masterKEY,
334336
},
335337
}),
336-
d.data.IsSendMail && !1 === d.data.IsSendMail
338+
c.data.IsSendMail && !1 === c.data.IsSendMail
337339
? console.log("don't send mail")
338-
: sendCompletedMail({ url: N.imageUrl, isCustomMail: l, doc: d.data }),
339-
saveFileUsage(k.length, C.imageUrl, c.data.objectId),
340-
sendDoctoWebhook(d, N.imageUrl, 'completed')),
341-
fs.unlinkSync(S),
342-
console.log('New Signed PDF created called: ' + S),
343-
'success' === _.message
344-
? { status: 'success', data: N.imageUrl }
340+
: sendCompletedMail({
341+
url: M.imageUrl,
342+
isCustomMail: l,
343+
doc: c.data,
344+
mailProvider: d,
345+
}),
346+
saveFileUsage(F.length, T.imageUrl, p.data.objectId),
347+
sendDoctoWebhook(c, M.imageUrl, 'completed')),
348+
fs.unlinkSync(_),
349+
console.log('New Signed PDF created called: ' + _),
350+
'success' === A.message
351+
? { status: 'success', data: M.imageUrl }
345352
: { status: 'error', message: 'Please provide required parameters!' }
346353
);
347354
}

0 commit comments

Comments
 (0)