From 1b7f07a2c4bdaac518585dba130c22688f21bbaa Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Mon, 3 Mar 2025 17:57:33 +0000 Subject: [PATCH] Merge pull request #349 from OpenSignLabs/mismatch_attach feat: restrict emails --- .../public/locales/de/translation.json | 3 ++- .../public/locales/en/translation.json | 3 ++- .../public/locales/es/translation.json | 3 ++- .../public/locales/fr/translation.json | 3 ++- .../public/locales/it/translation.json | 3 ++- .../src/components/pdf/EmailComponent.js | 9 +++++++ apps/OpenSign/src/pages/PlaceHolderSign.js | 5 ++++ .../src/primitives/GetReportDisplay.js | 6 +++++ .../parsefunction/sendMailGmailProvider.js | 17 ++++++++++--- .../cloud/parsefunction/sendMailv3.js | 25 ++++++++++++++++++- 10 files changed, 68 insertions(+), 9 deletions(-) diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index c9c7f6397f..d7bb44fe27 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -847,5 +847,6 @@ "agreement-note": "Hinweis: Durch Ihre Zustimmung unterzeichnen Sie das Dokument nicht sofort. Sie können das Dokument nur elektronisch einsehen. Sie haben die Möglichkeit, es vollständig zu lesen und anschließend zu entscheiden, ob Sie es unterzeichnen möchten.", "draft-template-info-p1": "Um Ihre Vorlage öffentlich zu machen, muss sie entweder eine einzelne Rolle enthalten oder, wenn sie mehrere Rollen umfasst, müssen alle zusätzlichen Rollen bereits den Unterzeichnern zugewiesen sein. Die nicht zugewiesene öffentliche Rolle muss leer bleiben und an erster Stelle stehen.", "visit-below-link": "Besuchen Sie den untenstehenden Link, um mehr zu erfahren -", - "storage-help": "Durch die Aktivierung von BYOC können Sie Ihren eigenen S3-Speicher verbinden, sodass Ihre Dateien vollständig unter Ihrer Kontrolle bleiben und keine externen Kopien gespeichert werden. Wenn Ihnen Datenautonomie wichtig ist, erwägen Sie ein Upgrade auf Teams, um diese Funktion freizuschalten." + "storage-help": "Durch die Aktivierung von BYOC können Sie Ihren eigenen S3-Speicher verbinden, sodass Ihre Dateien vollständig unter Ihrer Kontrolle bleiben und keine externen Kopien gespeichert werden. Wenn Ihnen Datenautonomie wichtig ist, erwägen Sie ein Upgrade auf Teams, um diese Funktion freizuschalten.", + "daily-quota-reached": "You’ve reached your daily quota. For assistance, please contact quotas@opensignlabs.com." } diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 3c31ea9d23..3044449a9d 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -848,5 +848,6 @@ "agreement-note": "Note: Agreeing to this does not mean you are signing the document immediately. This only allows you to review the document electronically. You will have the opportunity to read it in full and decide whether to sign it afterward.", "draft-template-info-p1": "To make your template public, it must either contain a single role, or, if it includes multiple roles, all additional roles must already be assigned to signers. The unassigned public role should remain empty and must be placed in the first position.", "visit-below-link": "Visit below link to know more -", - "storage-help": "Enabling BYOC lets you connect your own S3 storage so your files remain entirely under your control—no external copies retained. If data autonomy matters to you, consider upgrading to Teams to unlock this feature." + "storage-help": "Enabling BYOC lets you connect your own S3 storage so your files remain entirely under your control—no external copies retained. If data autonomy matters to you, consider upgrading to Teams to unlock this feature.", + "daily-quota-reached": "You’ve reached your daily quota. For assistance, please contact quotas@opensignlabs.com." } diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index 2037853aa7..8a891f28ee 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -849,5 +849,6 @@ "draft-template-info-p1": "Para hacer que tu plantilla sea pública, debe contener un único rol o, si incluye múltiples roles, todos los roles adicionales deben estar ya asignados a firmantes. El rol público no asignado debe permanecer vacío y debe estar en la primera posición.", "visit-below-link": "Visita el siguiente enlace para saber más -", "upgrade-to-team-plan": "Actualizar a team plan", - "storage-help": "Habilitar BYOC te permite conectar tu propio almacenamiento S3 para que tus archivos permanezcan completamente bajo tu control, sin copias externas retenidas. Si la autonomía de los datos es importante para ti, considera actualizar a Teams para desbloquear esta función." + "storage-help": "Habilitar BYOC te permite conectar tu propio almacenamiento S3 para que tus archivos permanezcan completamente bajo tu control, sin copias externas retenidas. Si la autonomía de los datos es importante para ti, considera actualizar a Teams para desbloquear esta función.", + "daily-quota-reached": "You’ve reached your daily quota. For assistance, please contact quotas@opensignlabs.com." } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index 22ce1eda08..13d302b684 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -846,5 +846,6 @@ "agreement-note": "Remarque : Accepter cela ne signifie pas que vous signez immédiatement le document. Cela vous permet uniquement de consulter le document électroniquement. Vous aurez l'opportunité de le lire entièrement et de décider ensuite si vous souhaitez le signer.", "draft-template-info-p1": "Pour rendre votre modèle public, il doit contenir un seul rôle ou, s'il inclut plusieurs rôles, tous les rôles supplémentaires doivent déjà être attribués aux signataires. Le rôle public non attribué doit rester vide et être placé en première position.", "visit-below-link": "Visitez le lien ci-dessous pour en savoir plus -", - "storage-help": "Activer BYOC vous permet de connecter votre propre stockage S3 afin que vos fichiers restent entièrement sous votre contrôle, sans copie externe conservée. Si l'autonomie des données est importante pour vous, envisagez de passer à l'offre Teams pour débloquer cette fonctionnalité." + "storage-help": "Activer BYOC vous permet de connecter votre propre stockage S3 afin que vos fichiers restent entièrement sous votre contrôle, sans copie externe conservée. Si l'autonomie des données est importante pour vous, envisagez de passer à l'offre Teams pour débloquer cette fonctionnalité.", + "daily-quota-reached": "You’ve reached your daily quota. For assistance, please contact quotas@opensignlabs.com." } diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index d30629ff96..e7276d5c2e 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -847,5 +847,6 @@ "agreement-note": "Nota: Accettare questo non significa che stai firmando immediatamente il documento. Questo ti consente solo di esaminare il documento elettronicamente. Avrai l'opportunità di leggerlo per intero e decidere successivamente se firmarlo.", "draft-template-info-p1": "Per rendere il tuo modello pubblico, deve contenere un solo ruolo oppure, se include più ruoli, tutti i ruoli aggiuntivi devono essere già assegnati ai firmatari. Il ruolo pubblico non assegnato deve rimanere vuoto e deve essere posizionato per primo.", "visit-below-link": "Visita il link qui sotto per saperne di più -", - "storage-help": "Abilitare BYOC ti consente di collegare il tuo archivio S3 in modo che i tuoi file rimangano completamente sotto il tuo controllo, senza copie esterne conservate. Se l'autonomia dei dati è importante per te, considera l'upgrade a Teams per sbloccare questa funzionalità." + "storage-help": "Abilitare BYOC ti consente di collegare il tuo archivio S3 in modo che i tuoi file rimangano completamente sotto il tuo controllo, senza copie esterne conservate. Se l'autonomia dei dati è importante per te, considera l'upgrade a Teams per sbloccare questa funzionalità.", + "daily-quota-reached": "You’ve reached your daily quota. For assistance, please contact quotas@opensignlabs.com." } diff --git a/apps/OpenSign/src/components/pdf/EmailComponent.js b/apps/OpenSign/src/components/pdf/EmailComponent.js index b0c5ee9cac..2d94c5e3b5 100644 --- a/apps/OpenSign/src/components/pdf/EmailComponent.js +++ b/apps/OpenSign/src/components/pdf/EmailComponent.js @@ -103,6 +103,15 @@ function EmailComponent({ setEmailList([]); }, 1500); setIsLoading(false); + } else if (sendMail?.data?.result?.status === "daily-quota-reached") { + setIsLoading(false); + setIsEmail(false); + setIsAlert({ + isShow: true, + alertMessage: t("daily-quota-reached") + }); + setEmailValue(""); + setEmailList([]); } else { setIsLoading(false); setIsEmail(false); diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index be66e98cd0..855c5bb37b 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -1311,6 +1311,11 @@ function PlaceHolderSign() { setIsMailSend(true); setIsLoading({ isLoad: false }); setIsUiLoading(false); + } else if (sendMail?.data?.result?.status === "daily-quota-reached") { + setMailStatus("daily-quota-reached"); + setIsSend(true); + setIsMailSend(true); + setIsUiLoading(false); } else if (sendMail?.data?.result?.status === "quota-reached") { setMailStatus("quotareached"); setIsSend(true); diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 1bf7e10a6d..97ca23f924 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -806,6 +806,12 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "success", message: t("mail-sent-alert") }); setIsResendMail({}); + } else if (res?.data?.result?.status === "daily-quota-reached") { + setIsAlert(true); + setAlertMsg({ + type: "danger", + message: t("daily-quota-reached") + }); } else { setIsAlert(true); setAlertMsg({ diff --git a/apps/OpenSignServer/cloud/parsefunction/sendMailGmailProvider.js b/apps/OpenSignServer/cloud/parsefunction/sendMailGmailProvider.js index c639454406..b02905d9c2 100644 --- a/apps/OpenSignServer/cloud/parsefunction/sendMailGmailProvider.js +++ b/apps/OpenSignServer/cloud/parsefunction/sendMailGmailProvider.js @@ -35,7 +35,8 @@ const makeEmail = async ( bcc, filename, certificatePath, - replyto + replyto, + testPdf ) => { const publicUrl = new URL(process.env.SERVER_URL); const htmlContent = html; @@ -46,7 +47,7 @@ const makeEmail = async ( let str; if (url) { let attachments; - let Pdf = fs.createWriteStream('test.pdf'); + let Pdf = fs.createWriteStream(testPdf); const writeToLocalDisk = () => { return new Promise((resolve, reject) => { const isSecure = @@ -161,6 +162,8 @@ export default async function sendMailGmailProvider(_extRes, template) { // Construct email message const from = sender || _extRes.Email || 'me'; const to = receiver; + const randomNumber = Math.floor(Math.random() * 5000); + const testPdf = `test_${randomNumber}.pdf`; const email = await makeEmail( to, from, @@ -171,7 +174,8 @@ export default async function sendMailGmailProvider(_extRes, template) { bcc, filename, certificatePath, - replyto + replyto, + testPdf ); // Update Gmail client with new access token const newGmail = createGmailClient(access_token); @@ -189,6 +193,13 @@ export default async function sendMailGmailProvider(_extRes, template) { console.log('Err in unlink certificate sendmailgmail provider'); } } + if (fs.existsSync(testPdf)) { + try { + fs.unlinkSync(testPdf); + } catch (err) { + console.log('Err in unlink pdf sendmailv3'); + } + } return { code: 200, message: 'Email sent successfully' }; } catch (error) { console.error('Error sending email:', error); diff --git a/apps/OpenSignServer/cloud/parsefunction/sendMailv3.js b/apps/OpenSignServer/cloud/parsefunction/sendMailv3.js index bcca7d8269..5762fbb130 100644 --- a/apps/OpenSignServer/cloud/parsefunction/sendMailv3.js +++ b/apps/OpenSignServer/cloud/parsefunction/sendMailv3.js @@ -29,7 +29,9 @@ async function sendMailProvider(req, plan, monthchange) { } } if (req.params.url) { - let Pdf = fs.createWriteStream('test.pdf'); + const randomNumber = Math.floor(Math.random() * 5000); + const testPdf = `test_${randomNumber}.pdf`; + let Pdf = fs.createWriteStream(testPdf); const writeToLocalDisk = () => { return new Promise((resolve, reject) => { const isSecure = @@ -129,6 +131,13 @@ async function sendMailProvider(req, plan, monthchange) { console.log('Err in unlink certificate sendmailv3'); } } + if (fs.existsSync(testPdf)) { + try { + fs.unlinkSync(testPdf); + } catch (err) { + console.log('Err in unlink pdf sendmailv3'); + } + } return { status: 'success' }; } } else { @@ -146,6 +155,13 @@ async function sendMailProvider(req, plan, monthchange) { console.log('Err in unlink certificate sendmailv3'); } } + if (fs.existsSync(testPdf)) { + try { + fs.unlinkSync(testPdf); + } catch (err) { + console.log('Err in unlink pdf sendmailv3'); + } + } return { status: 'success' }; } } else { @@ -156,6 +172,13 @@ async function sendMailProvider(req, plan, monthchange) { console.log('Err in unlink certificate sendmailv3'); } } + if (fs.existsSync(testPdf)) { + try { + fs.unlinkSync(testPdf); + } catch (err) { + console.log('Err in unlink pdf sendmailv3'); + } + } return { status: 'error' }; } }