From 5511776a9480f4e30b342afca863c096743b8708 Mon Sep 17 00:00:00 2001 From: 18041 <180419202@qq.com> Date: Fri, 8 May 2026 21:02:21 +0800 Subject: [PATCH] Preserve explicit SenderName in request email headers Request-signature emails could display the owner profile name in the from field even when a document already carried an explicit SenderName. The ternary condition in sendEmailToSigners was relying on operator precedence, so any truthy SenderName still routed to ExtUserPtr.Name. This extracts the sender selection into a tiny helper, uses it in the request-email flow, and adds regression coverage for the intended precedence. Constraint: Keep the change narrowly scoped to request-email sender selection so the existing mail flow stays stable Rejected: Parenthesize the existing inline expression only | harder to test in isolation and easier to regress later Confidence: high Scope-risk: narrow Reversibility: clean Directive: When sender identity precedence changes, keep the pure helper and its tests aligned with the document fields that drive email customization Tested: Direct Node assertions for explicit SenderName, UseNameAsSender fallback, and senderEmail fallback Not-tested: Vitest runner in this environment (blocked by local Windows EPERM when Vite/esbuild spawns) --- apps/OpenSign/src/constant/Utils.js | 11 +++--- apps/OpenSign/src/constant/mailUtils.js | 16 +++++++++ apps/OpenSign/src/constant/mailUtils.test.js | 37 ++++++++++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 apps/OpenSign/src/constant/mailUtils.js create mode 100644 apps/OpenSign/src/constant/mailUtils.test.js diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index a0c33986a..c9725d460 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -14,6 +14,7 @@ import { buildDownloadFilename, addPreferenceOpt } from "../utils"; +import { resolveMailFromSender } from "./mailUtils"; export const fontsizeArr = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]; export const fontColorArr = ["red", "black", "blue", "yellow"]; @@ -3971,10 +3972,12 @@ export const sendEmailToSigners = async ( const senderName = pdfDetails?.[0]?.SenderName || pdfDetails?.[0]?.ExtUserPtr?.Name; - const from = - pdfDetails?.[0]?.SenderName || useNameAsSender - ? pdfDetails?.[0]?.ExtUserPtr?.Name || "" - : senderEmail; + const from = resolveMailFromSender({ + senderName: pdfDetails?.[0]?.SenderName, + useNameAsSender, + extUserName: pdfDetails?.[0]?.ExtUserPtr?.Name, + senderEmail + }); const documentName = `${pdfDetails?.[0].Name}`; let replaceVar; diff --git a/apps/OpenSign/src/constant/mailUtils.js b/apps/OpenSign/src/constant/mailUtils.js new file mode 100644 index 000000000..0c1159e05 --- /dev/null +++ b/apps/OpenSign/src/constant/mailUtils.js @@ -0,0 +1,16 @@ +export function resolveMailFromSender({ + senderName, + useNameAsSender, + extUserName, + senderEmail +}) { + if (senderName) { + return senderName; + } + + if (useNameAsSender) { + return extUserName || ""; + } + + return senderEmail; +} diff --git a/apps/OpenSign/src/constant/mailUtils.test.js b/apps/OpenSign/src/constant/mailUtils.test.js new file mode 100644 index 000000000..611f8a7f9 --- /dev/null +++ b/apps/OpenSign/src/constant/mailUtils.test.js @@ -0,0 +1,37 @@ +import { describe, expect, it } from "vitest"; +import { resolveMailFromSender } from "./mailUtils"; + +describe("resolveMailFromSender", () => { + it("prefers the explicit sender name when present", () => { + expect( + resolveMailFromSender({ + senderName: "Contract Team", + useNameAsSender: true, + extUserName: "Owner Name", + senderEmail: "owner@example.com" + }) + ).toBe("Contract Team"); + }); + + it("falls back to the owner name only when UseNameAsSender is enabled", () => { + expect( + resolveMailFromSender({ + senderName: "", + useNameAsSender: true, + extUserName: "Owner Name", + senderEmail: "owner@example.com" + }) + ).toBe("Owner Name"); + }); + + it("falls back to the sender email when no sender name should be used", () => { + expect( + resolveMailFromSender({ + senderName: "", + useNameAsSender: false, + extUserName: "Owner Name", + senderEmail: "owner@example.com" + }) + ).toBe("owner@example.com"); + }); +});