From 8630465d340378dd0cfc43f080058ae429648e86 Mon Sep 17 00:00:00 2001 From: Alireza Hassani Date: Fri, 18 Sep 2026 14:26:05 +0330 Subject: [PATCH] Allow Email DNS updates with RSA-only DKIM paste. Co-authored-by: Cursor --- .../src/components/EmailDnsModal.tsx | 46 ++++++++++++------- .../super-admin/src/services/domainService.ts | 2 +- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/apps/super-admin/src/components/EmailDnsModal.tsx b/apps/super-admin/src/components/EmailDnsModal.tsx index 0c9c925..e884d12 100644 --- a/apps/super-admin/src/components/EmailDnsModal.tsx +++ b/apps/super-admin/src/components/EmailDnsModal.tsx @@ -24,6 +24,12 @@ function keyReady(paste: string, selector: string) { return pasteIncludesDomainkey(trimmed) || Boolean(selector.trim()) } +/** Empty = skip Ed25519; otherwise same rules as RSA. */ +function optionalKeyReady(paste: string, selector: string) { + if (!paste.trim()) return true + return keyReady(paste, selector) +} + export function EmailDnsModal({ domain, onClose }: EmailDnsModalProps) { const { showToast } = useToast() const [dnsProvider, setDnsProvider] = useState('arvan') @@ -48,17 +54,19 @@ export function EmailDnsModal({ domain, onClose }: EmailDnsModalProps) { if (!domain) return null const target = domain const canSubmit = - keyReady(ed25519Key, ed25519Selector) && keyReady(rsaKey, rsaSelector) + keyReady(rsaKey, rsaSelector) && + optionalKeyReady(ed25519Key, ed25519Selector) async function submit() { setSubmitting(true) setError('') try { + const ed25519Paste = ed25519Key.trim() const result = await applyMailDns(target.id, { dnsProvider, - ed25519Key, rsaKey, - ...(ed25519Selector.trim() + ...(ed25519Paste ? { ed25519Key: ed25519Paste } : {}), + ...(ed25519Paste && ed25519Selector.trim() ? { ed25519Selector: ed25519Selector.trim() } : {}), ...(rsaSelector.trim() ? { rsaSelector: rsaSelector.trim() } : {}), @@ -85,14 +93,16 @@ export function EmailDnsModal({ domain, onClose }: EmailDnsModalProps) { }} >

- Paste each DKIM TXT value (v=DKIM1; …) from - Stalwart, or the full zone line. For value-only pastes, fill the selector - (for example v1-ed25519-20260901). We upsert common mail - records on {dnsProvider === 'cloudflare' ? 'Cloudflare' : 'Arvan'}{' '} - (DNS-only / not proxied): mail A → 185.214.101.41, MX → - mail.meshkee.com (priority 10), SPF v=spf1 mx -all, both - DKIM keys, autoconfig / autodiscover → mail.meshkee.com. Extra MX,{' '} - dkim._domainkey, and _dmarc are removed. + Paste the RSA DKIM TXT value (v=DKIM1; …) from + Stalwart, or the full zone line. Ed25519 is optional — leave it empty to + skip. For value-only pastes, fill the selector (for example{' '} + v1-rsa-20260901). We upsert common mail records on{' '} + {dnsProvider === 'cloudflare' ? 'Cloudflare' : 'Arvan'} (DNS-only / not + proxied): mail A → 185.214.101.41, MX → mail.meshkee.com + (priority 10), SPF v=spf1 mx -all, DKIM (RSA required, + Ed25519 if provided), autoconfig / autodiscover → mail.meshkee.com. Extra + MX, dkim._domainkey, and _dmarc are + removed.

{error ? (

@@ -115,7 +125,9 @@ export function EmailDnsModal({ domain, onClose }: EmailDnsModalProps) {

- +

- Needed when pasting only the TXT value. Optional if the paste includes{' '} - …._domainkey. + Only needed with an Ed25519 paste that has no …._domainkey.

- +