Skip to content

Commit ca1b873

Browse files
Merge pull request #2011 from OpenSignLabs/updates-18996309218
feat: handle undefine username/password for SMTP
2 parents e8b3c7f + 0b45481 commit ca1b873

File tree

11 files changed

+318
-112
lines changed

11 files changed

+318
-112
lines changed

apps/OpenSign/src/constant/Utils.js

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2980,34 +2980,34 @@ export const saveLanguageInLocal = (i18n) => {
29802980
const detectedLanguage = i18n.language || "en";
29812981
localStorage.setItem("i18nextLng", detectedLanguage);
29822982
};
2983-
//function to get default signatur eof current user from `contracts_Signature` class
2983+
2984+
// function to get default signature of current user from `contracts_Signature` class
29842985
export const getDefaultSignature = async (objectId) => {
29852986
try {
2986-
const query = new Parse.Query("contracts_Signature");
2987-
query.equalTo("UserId", {
2988-
__type: "Pointer",
2989-
className: "_User",
2990-
objectId: objectId
2991-
});
2992-
2993-
const result = await query.first();
2994-
if (result) {
2995-
const res = JSON.parse(JSON.stringify(result));
2996-
const defaultSignature = res?.ImageURL
2997-
? await getBase64FromUrl(res?.ImageURL, true)
2998-
: "";
2999-
const defaultInitial = res?.Initials
3000-
? await getBase64FromUrl(res?.Initials, true)
3001-
: "";
2987+
if (objectId) {
2988+
const result = await Parse.Cloud.run("getdefaultsignature", {
2989+
userId: objectId
2990+
});
2991+
if (result) {
2992+
const res = JSON.parse(JSON.stringify(result));
2993+
const defaultSignature = res?.ImageURL
2994+
? await getBase64FromUrl(res?.ImageURL, true)
2995+
: "";
2996+
const defaultInitial = res?.Initials
2997+
? await getBase64FromUrl(res?.Initials, true)
2998+
: "";
30022999

3003-
return {
3004-
status: "success",
3005-
res: {
3006-
id: result?.id,
3007-
defaultSignature: defaultSignature,
3008-
defaultInitial: defaultInitial
3009-
}
3010-
};
3000+
return {
3001+
status: "success",
3002+
res: {
3003+
id: result?.id,
3004+
defaultSignature: defaultSignature,
3005+
defaultInitial: defaultInitial
3006+
}
3007+
};
3008+
}
3009+
} else {
3010+
return { status: "error" };
30113011
}
30123012
} catch (err) {
30133013
console.log(

apps/OpenSign/src/pages/Managesign.jsx

Lines changed: 20 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,9 @@ const ManageSign = () => {
4646
objectId: User.id
4747
};
4848
try {
49-
const signCls = "contracts_Signature";
50-
const signQuery = new Parse.Query(signCls);
51-
signQuery.equalTo("UserId", userId);
52-
const signRes = await signQuery.first();
49+
const signRes = await Parse.Cloud.run("getdefaultsignature", {
50+
userId: User.id
51+
});
5352
if (signRes) {
5453
const res = signRes.toJSON();
5554
setId(res.objectId);
@@ -226,44 +225,23 @@ const ManageSign = () => {
226225
};
227226

228227
const saveEntry = async (obj) => {
229-
const signCls = "contracts_Signature";
230-
const User = Parse?.User?.current()?.id;
231-
const userId = { __type: "Pointer", className: "_User", objectId: User };
232-
if (id) {
233-
try {
234-
const updateSign = new Parse.Object(signCls);
235-
updateSign.id = id;
236-
updateSign.set("Initials", obj.initialsUrl ? obj.initialsUrl : "");
237-
updateSign.set("ImageURL", obj.url ? obj.url : "");
238-
updateSign.set("SignatureName", obj.name);
239-
updateSign.set("UserId", userId);
240-
const res = await updateSign.save();
241-
setIsAlert({ type: "success", message: t("signature-saved-alert") });
242-
return res;
243-
} catch (err) {
244-
console.log(err);
245-
setIsAlert({ type: "danger", message: `${err.message}` });
246-
} finally {
247-
setIsLoader(false);
248-
setTimeout(() => setIsAlert({}), 2000);
249-
}
250-
} else {
251-
try {
252-
const updateSign = new Parse.Object(signCls);
253-
updateSign.set("Initials", obj.initialsUrl ? obj.initialsUrl : "");
254-
updateSign.set("ImageURL", obj.url);
255-
updateSign.set("SignatureName", obj.name);
256-
updateSign.set("UserId", userId);
257-
const res = await updateSign.save();
258-
setIsAlert({ type: "success", message: t("signature-saved-alert") });
259-
return res;
260-
} catch (err) {
261-
console.log(err);
262-
setIsAlert({ type: "success", message: `${err.message}` });
263-
} finally {
264-
setIsLoader(false);
265-
setTimeout(() => setIsAlert({}), 2000);
266-
}
228+
try {
229+
const User = Parse?.User?.current()?.id;
230+
const res = await Parse.Cloud.run("managesign", {
231+
signature: obj.url,
232+
userId: User,
233+
initials: obj.initialsUrl,
234+
id: id,
235+
title: obj.name
236+
});
237+
setIsAlert({ type: "success", message: t("signature-saved-alert") });
238+
return res;
239+
} catch (err) {
240+
console.log(err);
241+
setIsAlert({ type: "danger", message: `${err.message}` });
242+
} finally {
243+
setIsLoader(false);
244+
setTimeout(() => setIsAlert({}), 2000);
267245
}
268246
};
269247

apps/OpenSign/src/utils/widgetUtils.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,20 @@ export const saveToMySign = async (widget) => {
1616
: `${replaceSpace}__initials`;
1717
const file = base64StringtoFile(base64, fileName);
1818
const fileUrl = await uploadFile(file, User?.id);
19-
// below code is used to save or update default signature, initials, stamp
20-
const signCls = new Parse.Object("contracts_Signature");
21-
if (widget?.defaultSignId) {
22-
signCls.id = widget.defaultSignId;
23-
}
19+
const params = {
20+
id: widget?.defaultSignId, // pass id to update existing signature/initials
21+
userId: User.id
22+
};
2423
if (widget?.type === "initials") {
25-
signCls.set("Initials", fileUrl);
24+
params.initials = fileUrl; // save initials image url
2625
} else if (widget?.type === "signature") {
27-
signCls.set("ImageURL", fileUrl);
26+
params.signature = fileUrl; // save signature image url
2827
}
29-
signCls.set("UserId", Parse.User.createWithoutData(User.id));
30-
const signRes = await signCls.save();
28+
const signRes = await Parse.Cloud.run("savesignature", params);
3129
return { base64File: base64, id: signRes?.id };
3230
} catch (err) {
3331
console.log("Err while saving signature", err);
34-
return url;
32+
return err;
3533
}
3634
}
3735
};

apps/OpenSignServer/cloud/main.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ import addUser from './parsefunction/addUser.js';
5757
import filterDocs from './parsefunction/filterDocs.js';
5858
import sendDeleteUserMail from './parsefunction/sendDeleteUserMail.js';
5959
import resetPassword from './parsefunction/resetPassword.js';
60+
import saveSignature from './parsefunction/saveSignature.js';
61+
import manageSign from './parsefunction/manageSign.js';
62+
import getSignature from './parsefunction/getSignature.js';
6063

6164
// This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic.
6265
Parse.Cloud.afterSave('contracts_Document', DocumentAftersave);
@@ -124,3 +127,6 @@ Parse.Cloud.define('adduser', addUser);
124127
Parse.Cloud.define('filterdocs', filterDocs);
125128
Parse.Cloud.define('senddeleterequest', sendDeleteUserMail);
126129
Parse.Cloud.define('resetpassword', resetPassword);
130+
Parse.Cloud.define('savesignature', saveSignature);
131+
Parse.Cloud.define('managesign', manageSign);
132+
Parse.Cloud.define('getdefaultsignature', getSignature);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
export default async function getSignature(request) {
2+
const { userId } = request.params;
3+
if (!userId) {
4+
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Missing userId parameter.');
5+
}
6+
if (userId !== request.user?.id) {
7+
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Cannot save signature for the current user.');
8+
}
9+
try {
10+
const query = new Parse.Query('contracts_Signature');
11+
query.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: userId });
12+
const result = await query.first({ useMasterKey: true });
13+
return result;
14+
} catch (err) {
15+
console.error('Error fetching signature:', err);
16+
throw err;
17+
}
18+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export default async function manageSign(request) {
2+
const { signature, userId, initials, id, title } = request.params;
3+
4+
if (!userId) {
5+
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Missing userId parameter.');
6+
}
7+
if (userId !== request.user?.id) {
8+
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Cannot save signature for the current user.');
9+
}
10+
const userPtr = { __type: 'Pointer', className: '_User', objectId: userId };
11+
try {
12+
const signatureCls = new Parse.Object('contracts_Signature');
13+
if (id) {
14+
signatureCls.id = id;
15+
}
16+
signatureCls.set('Initials', initials ? initials : '');
17+
signatureCls.set('ImageURL', signature ? signature : '');
18+
signatureCls.set('SignatureName', title ? title : '');
19+
if (userPtr) {
20+
signatureCls.set('UserId', userPtr);
21+
}
22+
const signRes = await signatureCls.save(null, { useMasterKey: true });
23+
return signRes;
24+
} catch (err) {
25+
console.error('Error saving signature:', err);
26+
throw err;
27+
}
28+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
export default async function saveSignature(request) {
2+
const { signature, userId, initials, id, title } = request.params;
3+
4+
if (!userId) {
5+
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Missing userId parameter.');
6+
}
7+
if (userId !== request.user?.id) {
8+
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Cannot save signature for the current user.');
9+
}
10+
const userPtr = { __type: 'Pointer', className: '_User', objectId: userId };
11+
try {
12+
const signatureCls = new Parse.Object('contracts_Signature');
13+
if (id) {
14+
signatureCls.id = id;
15+
}
16+
if (initials) {
17+
signatureCls.set('Initials', initials);
18+
}
19+
if (signature) {
20+
signatureCls.set('ImageURL', signature);
21+
}
22+
if (title) {
23+
signatureCls.set('SignatureName', title);
24+
}
25+
if (userPtr) {
26+
signatureCls.set('UserId', userPtr);
27+
}
28+
const signRes = await signatureCls.save(null, { useMasterKey: true });
29+
return signRes;
30+
} catch (err) {
31+
throw err;
32+
}
33+
}

apps/OpenSignServer/cloud/parsefunction/sendMailv3.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,23 @@ async function sendMailProvider(req, plan, monthchange) {
1212
let mailgunClient;
1313
let mailgunDomain;
1414
if (smtpenable) {
15-
transporterSMTP = createTransport({
15+
let transporterConfig = {
1616
host: process.env.SMTP_HOST,
1717
port: process.env.SMTP_PORT || 465,
1818
secure: smtpsecure,
19-
auth: {
19+
};
20+
21+
// ✅ Add auth only if BOTH username & password exist
22+
const smtpUser = process.env.SMTP_USERNAME;
23+
const smtpPass = process.env.SMTP_PASS;
24+
25+
if (smtpUser && smtpPass) {
26+
transporterConfig.auth = {
2027
user: process.env.SMTP_USERNAME ? process.env.SMTP_USERNAME : process.env.SMTP_USER_EMAIL,
21-
pass: process.env.SMTP_PASS,
22-
},
23-
});
28+
pass: smtpPass,
29+
};
30+
}
31+
transporterSMTP = createTransport(transporterConfig);
2432
} else {
2533
if (mailgunApiKey) {
2634
const mailgun = new Mailgun(formData);
@@ -185,7 +193,7 @@ async function sendMailProvider(req, plan, monthchange) {
185193
}
186194
}
187195
} catch (err) {
188-
console.log('err in sendmailv3', err);
196+
console.log(`Error in sendmailv3: ${err}`);
189197
if (fs.existsSync(testPdf)) {
190198
try {
191199
fs.unlinkSync(testPdf);
@@ -236,7 +244,7 @@ async function sendMailProvider(req, plan, monthchange) {
236244
}
237245
}
238246
} catch (err) {
239-
console.log('err in sendmailv3', err);
247+
console.log(`Error in sendmailv3: ${err}`);
240248
if (err) {
241249
return { status: 'error' };
242250
}

apps/OpenSignServer/index.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,28 @@ let mailgunDomain;
6161
let isMailAdapter = false;
6262
if (smtpenable) {
6363
try {
64-
transporterMail = createTransport({
64+
let transporterConfig = {
6565
host: process.env.SMTP_HOST,
6666
port: process.env.SMTP_PORT || 465,
6767
secure: smtpsecure,
68-
auth: {
68+
};
69+
70+
// ✅ Add auth only if BOTH username & password exist
71+
const smtpUser = process.env.SMTP_USERNAME;
72+
const smtpPass = process.env.SMTP_PASS;
73+
74+
if (smtpUser && smtpPass) {
75+
transporterConfig.auth = {
6976
user: process.env.SMTP_USERNAME ? process.env.SMTP_USERNAME : process.env.SMTP_USER_EMAIL,
70-
pass: process.env.SMTP_PASS,
71-
},
72-
});
77+
pass: smtpPass,
78+
};
79+
}
80+
transporterMail = createTransport(transporterConfig);
7381
await transporterMail.verify();
7482
isMailAdapter = true;
7583
} catch (err) {
7684
isMailAdapter = false;
77-
console.log('Please provide valid SMTP credentials');
85+
console.log(`Please provide valid SMTP credentials: ${err}`);
7886
}
7987
} else if (process.env.MAILGUN_API_KEY) {
8088
try {

0 commit comments

Comments
 (0)