From 1c6d9e8e989ceeef4fab07b23c3c2543154c92d3 Mon Sep 17 00:00:00 2001 From: OE6DXD Date: Mon, 16 Mar 2026 14:13:07 +0100 Subject: [PATCH] make OTP plugin inherit SMTP relay configuration Use rms.auth.smtp_relay settings as the primary source for OTP mail transport (host/port/auth/tls/from/replyTo), with existing OTP/env values only as fallback. This lets OTP delivery work immediately when relay settings are already configured. --- plugins/rms.auth.otp_email/index.js | 43 +++++++++++++++++++++++------ server/index.js | 1 + 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/plugins/rms.auth.otp_email/index.js b/plugins/rms.auth.otp_email/index.js index 574ff27..320190e 100644 --- a/plugins/rms.auth.otp_email/index.js +++ b/plugins/rms.auth.otp_email/index.js @@ -10,19 +10,43 @@ async function createPlugin(ctx) { let transportKey = ""; function readTransportConfig() { - const host = String(ctx.getSetting("host", ctx.env.SMTP_HOST || "")).trim(); - const portRaw = Number(ctx.getSetting("port", ctx.env.SMTP_PORT || 587)); - const secure = String(ctx.getSetting("secure", ctx.env.SMTP_SECURE || "false")) === "true"; - const authUser = String(ctx.getSetting("authUser", ctx.env.SMTP_USER || "")).trim(); - const authPass = String(ctx.getSetting("authPass", ctx.env.SMTP_PASS || "")).trim(); - const allowInvalidCert = String(ctx.getSetting("allowInvalidCert", ctx.env.SMTP_ALLOW_INVALID_CERT || "false")) === "true"; + const relaySetting = typeof ctx.getPluginSetting === "function" + ? (key, fallback = null) => ctx.getPluginSetting("rms.auth.smtp_relay", key, fallback) + : (_key, fallback = null) => fallback; + + const host = String( + relaySetting("host", ctx.getSetting("host", ctx.env.SMTP_HOST || "")) + ).trim(); + const portRaw = Number( + relaySetting("port", ctx.getSetting("port", ctx.env.SMTP_PORT || 587)) + ); + const secure = String( + relaySetting("secure", ctx.getSetting("secure", ctx.env.SMTP_SECURE || "false")) + ) === "true"; + const authUser = String( + relaySetting("authUser", ctx.getSetting("authUser", ctx.env.SMTP_USER || "")) + ).trim(); + const authPass = String( + relaySetting("authPass", ctx.getSetting("authPass", ctx.env.SMTP_PASS || "")) + ).trim(); + const allowInvalidCert = String( + relaySetting("allowInvalidCert", ctx.getSetting("allowInvalidCert", ctx.env.SMTP_ALLOW_INVALID_CERT || "false")) + ) === "true"; + const from = String( + relaySetting("from", ctx.getSetting("from", ctx.env.SMTP_FROM || "noreply@arcg.at")) + ).trim() || "noreply@arcg.at"; + const replyTo = String( + relaySetting("replyTo", ctx.getSetting("replyTo", ctx.env.SMTP_REPLY_TO || "")) + ).trim(); return { host, port: Number.isFinite(portRaw) && portRaw > 0 ? portRaw : 587, secure, authUser, authPass, - allowInvalidCert + allowInvalidCert, + from, + replyTo }; } @@ -64,12 +88,13 @@ async function createPlugin(ctx) { if (!recipient) { throw new Error("recipient missing"); } + const transportConfig = readTransportConfig(); const entry = { at: new Date().toISOString(), via: "rms.auth.otp_email", to: recipient, - from: String(ctx.getSetting("from", ctx.env.SMTP_FROM || "noreply@arcg.at")), - replyTo: String(ctx.getSetting("replyTo", ctx.env.SMTP_REPLY_TO || "")), + from: transportConfig.from, + replyTo: transportConfig.replyTo, subject: String(payload.subject || "ARCG OTP"), text: String(payload.text || ""), html: String(payload.html || "") diff --git a/server/index.js b/server/index.js index 10450b9..6f664b3 100644 --- a/server/index.js +++ b/server/index.js @@ -6703,6 +6703,7 @@ async function loadPlugins() { execMode: config.execMode, simulateHardware: config.simulateHardware, getSetting: (key, fallback = null) => getPluginSetting(manifest.id, key, fallback), + getPluginSetting: (pluginId, key, fallback = null) => getPluginSetting(pluginId, key, fallback), commandRunner: runCommand, executeCapability: async (capability, action, input = {}, meta = {}) => executeCapability(capability, action, input, meta), emit: (type, data) => broadcastEvent(type, { pluginId: manifest.id, ...data }),