From 7e0c2517f273a72630dcc014b410d5ab8d3143fc Mon Sep 17 00:00:00 2001 From: raktima-opensignlabs Date: Fri, 21 Aug 2026 12:11:59 +0000 Subject: [PATCH] Merge pull request #2737 from nxglabs/sync-to-public_repo-32459158600 Merge pull request #2736 from nxglabs/raktima-main-patch-security --- apps/OpenSign/public/locales/de/translation.json | 1 + apps/OpenSign/public/locales/en/translation.json | 1 + apps/OpenSign/public/locales/es/translation.json | 1 + apps/OpenSign/public/locales/fr/translation.json | 1 + apps/OpenSign/public/locales/hi/translation.json | 1 + apps/OpenSign/public/locales/it/translation.json | 1 + apps/OpenSign/public/locales/kr/translation.json | 1 + .../cloud/parsefunction/createBatchDocs.js | 4 ++-- .../cloud/parsefunction/createDocumentFromApp.js | 2 +- .../cloud/parsefunction/sendMailGmailProvider.js | 16 ++++++++++++++-- 10 files changed, 24 insertions(+), 5 deletions(-) diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index 27bca68a6..b7279b371 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -800,6 +800,7 @@ "quota-mail-info": "Um die Servicequalität aufrechtzuerhalten und Spam zu verhindern, erlaubt OpenSign bis zu 15 E-Mails pro Monat im kostenlosen Plan. Upgraden Sie jetzt für unbegrenzten E-Mail-Versand.", "quota-mail-reset": "Ihre Credits für Signaturanfragen per E-Mail werden zurückgesetzt am", "quota-mail": "Sie haben Ihr monatliches Limit von 15 Signaturanfragen per E-Mail erreicht. Jetzt upgraden, um weiter E-Mails direkt zu senden.", + "quota-mail-limit-reached": "Sie haben Ihr monatliches Limit von 15 E-Mail-Credits erreicht. Bitte upgraden Sie Ihren Tarif, um weiterhin E-Mails direkt zu senden.\nIhre E-Mail-Credits werden am {{resetDate}} zurückgesetzt.", "quota-mail-tip": "Tipp: Sie können weiterhin <1>unbegrenzt Dokumente signieren, indem Sie den Signaturanfragelink manuell teilen.", "quota-mail-head": "Kontingent erreicht", "unauthorized-modal": "Sie haben keine Berechtigung, diese Aktion auszuführen. Bitte kontaktieren Sie {{adminEmail}}.", diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 49b308af1..e912a1953 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -800,6 +800,7 @@ "quota-mail-info": "To maintain service quality and prevent spam, OpenSign allows up to 15 emails per month on the free plan. Upgrade now for unlimited email sending.", "quota-mail-reset": "Your signature request email credits will be reset on", "quota-mail": "You've reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.", + "quota-mail-limit-reached": "You've reached your monthly limit of 15 email credits. Please upgrade your plan to continue sending emails directly.\nYour email credits will reset on {{resetDate}}", "quota-mail-tip": "Tip: You can still sign <1>unlimited documents by manually sharing the signing request link.", "quota-mail-head": "Quota reached", "unauthorized-modal": "You don't have permission to perform this action, please contact {{adminEmail}}.", diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index 33582688a..3cf602c22 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -800,6 +800,7 @@ "quota-mail-info": "Para mantener la calidad del servicio y prevenir el spam, OpenSign permite hasta 15 correos electrónicos por mes en el plan gratuito. Mejora tu plan ahora para envíos ilimitados de correos electrónicos.", "quota-mail-reset": "Los créditos de tu correo electrónico de solicitud de firma se restablecerán el", "quota-mail": "Has alcanzado tu límite de 15 solicitudes de firma por correo para este mes. Mejora ahora para continuar enviando correos.", + "quota-mail-limit-reached": "Has alcanzado tu límite mensual de 15 créditos de correo electrónico. Mejora tu plan para continuar enviando correos directamente.\nTus créditos de correo electrónico se restablecerán el {{resetDate}}.", "quota-mail-tip": "Consejo: Aún puedes firmar <1>documentos ilimitados compartiendo manualmente el enlace de solicitud de firma.", "quota-mail-head": "Cuota alcanzada", "unauthorized-modal": "No tienes permisos para realizar esta acción, por favor, contacta a {{adminEmail}}.", diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index bd8e27fd8..f1cecf586 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -798,6 +798,7 @@ "quota-mail-info": "Pour maintenir la qualité du service et prévenir le spam, OpenSign permet jusqu'à 15 e-mails par mois avec le plan gratuit. Passez à l'offre supérieure pour un envoi illimité d'e-mails.", "quota-mail-reset": "Les crédits de votre email de demande de signature seront réinitialisés le", "quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.", + "quota-mail-limit-reached": "Vous avez atteint votre limite mensuelle de 15 crédits e-mail. Veuillez mettre à niveau votre forfait pour continuer à envoyer des e-mails directement.\nVos crédits e-mail seront réinitialisés le {{resetDate}}.", "quota-mail-tip": "Astuce: Vous pouvez toujours signer un nombre <1>illimité de documents en partageant manuellement le lien de demande de signature.", "quota-mail-head": "Quota atteint", "unauthorized-modal": "Vous n'êtes pas autorisé à effectuer cette action, veuillez contacter {{adminEmail}}.", diff --git a/apps/OpenSign/public/locales/hi/translation.json b/apps/OpenSign/public/locales/hi/translation.json index 5935a81fd..ac95a9e06 100644 --- a/apps/OpenSign/public/locales/hi/translation.json +++ b/apps/OpenSign/public/locales/hi/translation.json @@ -801,6 +801,7 @@ "quota-mail-reset": "आपके हस्ताक्षर अनुरोध ईमेल क्रेडिट इस पर रीसेट हो जाएंगे", "quota-mail": "आपने इस महीने के लिए 15 हस्ताक्षर अनुरोध ईमेल की अपनी सीमा पूरी कर ली है। सीधे ईमेल भेजना जारी रखने के लिए अभी अपग्रेड करें।", "quota-mail-tip": "सुझाव: आप अभी भी हस्ताक्षर अनुरोध लिंक को मैन्युअल रूप से साझा करके <1>असीमित दस्तावेज़ों पर हस्ताक्षर कर सकते हैं।", + "quota-mail-limit-reached": "आपने 15 ईमेल क्रेडिट की अपनी मासिक सीमा पूरी कर ली है। सीधे ईमेल भेजना जारी रखने के लिए कृपया अपना प्लान अपग्रेड करें।\nआपके ईमेल क्रेडिट {{resetDate}} को रीसेट हो जाएंगे।", "quota-mail-head": "कोटा पहुँच गया", "unauthorized-modal": "आपको यह कार्रवाई करने की अनुमति नहीं है, कृपया {{adminEmail}} से संपर्क करें।", "sent-this-month": "इस महीने भेजा गया", diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index 9bda7b610..8d0749fcc 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -800,6 +800,7 @@ "quota-mail-info": "Per mantenere la qualità del servizio e prevenire lo spam, OpenSign consente fino a 15 email al mese con il piano gratuito. Esegui l'upgrade ora per l'invio illimitato di email.", "quota-mail-reset": "I tuoi crediti email per richieste di firma saranno ripristinati il", "quota-mail": "Hai raggiunto il limite di 15 email di richiesta di firma per questo mese. Passa al piano superiore per continuare a inviare email direttamente.", + "quota-mail-limit-reached": "Hai raggiunto il limite mensile di 15 crediti email. Effettua l'upgrade del tuo piano per continuare a inviare email direttamente.\nI tuoi crediti email verranno ripristinati il {{resetDate}}.", "quota-mail-tip": "Suggerimento: Puoi ancora firmare un numero <1>illimitato de documenti condividendo manualmente il link della richiesta di firma.", "quota-mail-head": "Quota Raggiunta", "unauthorized-modal": "Non hai l'autorizzazione per eseguire questa azione, contatta {{adminEmail}}.", diff --git a/apps/OpenSign/public/locales/kr/translation.json b/apps/OpenSign/public/locales/kr/translation.json index 377fe9d88..ca07d670d 100644 --- a/apps/OpenSign/public/locales/kr/translation.json +++ b/apps/OpenSign/public/locales/kr/translation.json @@ -800,6 +800,7 @@ "quota-mail-info": "서비스 품질을 유지하고 스팸을 방지하기 위해 OpenSign은 무료 플랜에서 월 최대 15개의 이메일을 허용합니다. 지금 업그레이드하여 무제한 이메일 전송을 이용하세요.", "quota-mail-reset": "서명 요청 이메일 크레딧은 다음에 재설정됩니다.", "quota-mail": "이번 달 서명 요청 이메일 15개 한도에 도달했습니다. 지금 업그레이드하여 이메일을 계속 직접 보내세요.", + "quota-mail-limit-reached": "월간 이메일 크레딧 15개 한도에 도달했습니다. 이메일을 계속 직접 보내려면 요금제를 업그레이드하세요.\n이메일 크레딧은 {{resetDate}}에 재설정됩니다.", "quota-mail-tip": "팁: 서명 요청 링크를 수동으로 공유하여 <1>무제한 문서에 계속 서명할 수 있습니다.", "quota-mail-head": "할당량 도달", "unauthorized-modal": "이 작업을 수행할 권한이 없습니다. {{adminEmail}}에게 문의하세요.", diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index b67bd6017..571cd3c1b 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -327,8 +327,8 @@ export default async function createBatchDocs(request) { const Documents = JSON.parse(strDocuments); const Ip = request?.headers?.['x-real-ip'] || ''; - // Access the host from the headers - const publicUrl = request.headers.public_url; + // Use the browser origin so signing links keep the custom domain. + let publicUrl = request.headers.origin || request.headers.public_url; const parseConfig = { baseURL: serverUrl, headers: { diff --git a/apps/OpenSignServer/cloud/parsefunction/createDocumentFromApp.js b/apps/OpenSignServer/cloud/parsefunction/createDocumentFromApp.js index 2a41f335c..f16c6bcdb 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createDocumentFromApp.js +++ b/apps/OpenSignServer/cloud/parsefunction/createDocumentFromApp.js @@ -29,7 +29,7 @@ export default async function createDocumentFromApp(request) { docCls.set('URL', doc?.URL); docCls.set('ExtUserPtr', doc.ExtUserPtr); docCls.set('CreatedBy', doc.CreatedBy); - + docCls.set('OriginIp', request?.headers?.['x-real-ip'] || ''); if (doc.Description) { docCls.set('Description', doc.Description); } diff --git a/apps/OpenSignServer/cloud/parsefunction/sendMailGmailProvider.js b/apps/OpenSignServer/cloud/parsefunction/sendMailGmailProvider.js index 4ea553f1f..a9a3d9fa5 100644 --- a/apps/OpenSignServer/cloud/parsefunction/sendMailGmailProvider.js +++ b/apps/OpenSignServer/cloud/parsefunction/sendMailGmailProvider.js @@ -37,6 +37,18 @@ const getGmail = async (access_token, displayName) => { return displayName; } }; + +export const encodeMimeAddress = address => { + const value = String(address || ''); + const match = value.match(/^(.*?)\s*<([^<>]+)>$/); + const displayName = match ? match[1].trim() : value; + + if (/^[\x00-\x7F]*$/.test(displayName)) return value; + + const encodedName = Buffer.from(displayName, 'utf8').toString('base64'); + return match ? `=?UTF-8?B?${encodedName}?= <${match[2]}>` : `=?UTF-8?B?${encodedName}?=`; +}; + // Function to create a raw email message const makeEmail = async ( to, @@ -137,7 +149,7 @@ const makeEmail = async ( 'Content-Type: multipart/mixed; boundary="' + boundary + '"\n', 'MIME-Version: 1.0\n', `To: ${to}\n`, - `From: ${from}\n`, + `From: ${encodeMimeAddress(from)}\n`, bccHeader, ccHeader, replyToHeader, @@ -155,7 +167,7 @@ const makeEmail = async ( 'Content-Type: multipart/mixed; boundary="' + boundary + '"\n', 'MIME-Version: 1.0\n', `To: ${to}\n`, - `From: ${from}\n`, + `From: ${encodeMimeAddress(from)}\n`, bccHeader, ccHeader, replyToHeader,