From d3caf61d638874264f3bf09cf2d5d36d8de1b10b Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Tue, 19 May 2026 16:18:05 -0700 Subject: [PATCH 1/2] Add managed email domain deletion and Cloudflare DNS setup helpers. Let projects remove unused managed domains with upstream cleanup, and streamline Cloudflare NS record import during onboarding. Co-authored-by: Cursor --- .../managed-onboarding/delete/route.tsx | 40 +++ .../backend/src/lib/managed-email-domains.tsx | 25 ++ .../src/lib/managed-email-onboarding.tsx | 84 ++++++- .../public/assets/cloudflare-import-dns.png | Bin 0 -> 88963 bytes .../email-settings/domain-settings.tsx | 231 ++++++++++++++++-- .../internal/managed-email-onboarding.test.ts | 171 +++++++++++++ .../src/interface/admin-interface.ts | 13 + .../apps/implementations/admin-app-impl.ts | 6 + .../stack-app/apps/interfaces/admin-app.ts | 1 + 9 files changed, 544 insertions(+), 27 deletions(-) create mode 100644 apps/backend/src/app/api/latest/internal/emails/managed-onboarding/delete/route.tsx create mode 100644 apps/dashboard/public/assets/cloudflare-import-dns.png diff --git a/apps/backend/src/app/api/latest/internal/emails/managed-onboarding/delete/route.tsx b/apps/backend/src/app/api/latest/internal/emails/managed-onboarding/delete/route.tsx new file mode 100644 index 0000000000..e8d5170aa3 --- /dev/null +++ b/apps/backend/src/app/api/latest/internal/emails/managed-onboarding/delete/route.tsx @@ -0,0 +1,40 @@ +import { deleteManagedEmailProvider } from "@/lib/managed-email-onboarding"; +import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler"; +import { adaptSchema, adminAuthTypeSchema, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields"; + +export const POST = createSmartRouteHandler({ + metadata: { + hidden: true, + }, + request: yupObject({ + auth: yupObject({ + type: adminAuthTypeSchema.defined(), + tenancy: adaptSchema.defined(), + }).defined(), + body: yupObject({ + resend_domain_id: yupString().defined(), + }).defined(), + method: yupString().oneOf(["POST"]).defined(), + }), + response: yupObject({ + statusCode: yupNumber().oneOf([200]).defined(), + bodyType: yupString().oneOf(["json"]).defined(), + body: yupObject({ + status: yupString().oneOf(["deleted"]).defined(), + }).defined(), + }), + handler: async ({ auth, body }) => { + const result = await deleteManagedEmailProvider({ + tenancy: auth.tenancy, + resendDomainId: body.resend_domain_id, + }); + + return { + statusCode: 200, + bodyType: "json", + body: { + status: result.status, + }, + }; + }, +}); diff --git a/apps/backend/src/lib/managed-email-domains.tsx b/apps/backend/src/lib/managed-email-domains.tsx index c31c3960c6..ee0cd191dc 100644 --- a/apps/backend/src/lib/managed-email-domains.tsx +++ b/apps/backend/src/lib/managed-email-domains.tsx @@ -224,3 +224,28 @@ export async function listManagedEmailDomainsForTenancy(tenancyId: string): Prom `); return rows.map(mapRow); } + +export async function deleteManagedEmailDomainById(id: string): Promise { + const rows = await globalPrismaClient.$queryRaw(Prisma.sql` + DELETE FROM "ManagedEmailDomain" + WHERE "id" = ${id} + RETURNING * + `); + if (rows.length === 0) { + return null; + } + return mapRow(rows[0]!); +} + +export async function countManagedEmailDomainsBySubdomainExcludingId(options: { + subdomain: string, + excludeId: string, +}): Promise { + const rows = await globalPrismaClient.$queryRaw<{ count: bigint }[]>(Prisma.sql` + SELECT COUNT(*)::bigint AS count + FROM "ManagedEmailDomain" + WHERE "subdomain" = ${options.subdomain} + AND "id" <> ${options.excludeId} + `); + return Number(rows[0]?.count ?? 0n); +} diff --git a/apps/backend/src/lib/managed-email-onboarding.tsx b/apps/backend/src/lib/managed-email-onboarding.tsx index 11eb3f051a..405d8b0030 100644 --- a/apps/backend/src/lib/managed-email-onboarding.tsx +++ b/apps/backend/src/lib/managed-email-onboarding.tsx @@ -8,6 +8,8 @@ import { getManagedEmailDomainByTenancyAndSubdomain, listManagedEmailDomainsForTenancy, markManagedEmailDomainApplied, + countManagedEmailDomainsBySubdomainExcludingId, + deleteManagedEmailDomainById, updateManagedEmailDomainWebhookStatus, } from "@/lib/managed-email-domains"; import { Tenancy } from "@/lib/tenancies"; @@ -225,6 +227,26 @@ async function createDnsimpleZone(subdomain: string): Promise { }; } +async function deleteDnsimpleZoneByName(zoneName: string): Promise<{ status: "deleted" | "not_found" }> { + const dnsimpleBaseUrl = getDnsimpleBaseUrl(); + const dnsimpleAccountId = getDnsimpleAccountId(); + const response = await fetch(`${dnsimpleBaseUrl}/${encodeURIComponent(dnsimpleAccountId)}/zones/${encodeURIComponent(zoneName)}`, { + method: "DELETE", + headers: getDnsimpleHeaders(), + }); + if (response.status === 404) { + return { status: "not_found" }; + } + if (!response.ok) { + const responseBody = await response.text(); + throw new StatusError( + 502, + `DNSimple returned ${response.status} when deleting managed email zone ${zoneName}: ${responseBody.slice(0, 500)}`, + ); + } + return { status: "deleted" }; +} + async function createOrReuseDnsimpleZone(subdomain: string): Promise { const existingZones = await listDnsimpleZones(subdomain); if (existingZones.length > 1) { @@ -650,6 +672,67 @@ export async function applyManagedEmailProvider(options: { return { status: "applied" }; } +function isManagedEmailDomainInUseForTenancy(options: { + tenancy: Tenancy, + subdomain: string, + senderLocalPart: string, +}): boolean { + const emailServer = options.tenancy.config.emails.server; + return emailServer.provider === "managed" + && emailServer.managedSubdomain === options.subdomain + && emailServer.managedSenderLocalPart === options.senderLocalPart; +} + +export async function deleteManagedEmailProvider(options: { + tenancy: Tenancy, + resendDomainId: string, +}): Promise<{ status: "deleted" }> { + const domain = await getManagedEmailDomainByResendDomainId(options.resendDomainId); + if (!domain || domain.tenancyId !== options.tenancy.id) { + throw new StatusError(404, "Managed domain not found for this project/branch"); + } + if (isManagedEmailDomainInUseForTenancy({ + tenancy: options.tenancy, + subdomain: domain.subdomain, + senderLocalPart: domain.senderLocalPart, + })) { + throw new StatusError(409, "Cannot delete a managed domain that is currently in use for sending email"); + } + + // External cleanup must succeed before we drop the DB row; otherwise a failure here + // would leak provider-side resources with no record left to retry against. + if (!shouldUseMockManagedEmailOnboarding()) { + const resendApiKey = getEnvVariable("STACK_RESEND_API_KEY"); + const resendResponse = await fetch(`https://api.resend.com/domains/${encodeURIComponent(domain.resendDomainId)}`, { + method: "DELETE", + headers: { + "Authorization": `Bearer ${resendApiKey}`, + }, + }); + if (!resendResponse.ok && resendResponse.status !== 404) { + const responseBody = await resendResponse.text(); + throw new StatusError( + 502, + `Upstream email provider returned ${resendResponse.status} when deleting managed domain ${domain.resendDomainId}: ${responseBody.slice(0, 500)}`, + ); + } + + // createOrReuseDnsimpleZone lets multiple ManagedEmailDomain rows share a zone (when + // two tenancies pick the same subdomain). Only delete the zone if this row is the + // last one referencing it. + const remaining = await countManagedEmailDomainsBySubdomainExcludingId({ + subdomain: domain.subdomain, + excludeId: domain.id, + }); + if (remaining === 0) { + await deleteDnsimpleZoneByName(domain.subdomain); + } + } + + await deleteManagedEmailDomainById(domain.id); + return { status: "deleted" }; +} + export async function processResendDomainWebhookEvent(options: { domainId: string, providerStatusRaw: string, @@ -691,4 +774,3 @@ async function saveManagedEmailProviderConfig(options: { }, }); } - diff --git a/apps/dashboard/public/assets/cloudflare-import-dns.png b/apps/dashboard/public/assets/cloudflare-import-dns.png new file mode 100644 index 0000000000000000000000000000000000000000..daa76f62db7338b5b751bd2e6874f9f60d20bd1e GIT binary patch literal 88963 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/email-settings/domain-settings.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/email-settings/domain-settings.tsx index cafd59cf82..e6af5aea89 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/email-settings/domain-settings.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/email-settings/domain-settings.tsx @@ -19,19 +19,22 @@ import { CheckCircle, Cloud, CopySimple, + DownloadSimple, Envelope, GlobeSimple, HardDrives, type Icon as PhosphorIcon, + Info, PaperPlaneTilt, Plus, ShieldCheck, Spinner, + Trash, WarningDiamond, } from "@phosphor-icons/react"; import { throwErr } from "@stackframe/stack-shared/dist/utils/errors"; -import { runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/promises"; -import { Dialog, DialogContent, DialogTitle, Label, Typography, useToast } from "@/components/ui"; +import { runAsynchronously, runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/promises"; +import { ActionDialog, Dialog, DialogContent, DialogTitle, Label, Popover, PopoverContent, PopoverTrigger, Typography, useToast } from "@/components/ui"; import { useCallback, useEffect, useMemo, useState } from "react"; import * as yup from "yup"; import Image from "next/image"; @@ -105,6 +108,18 @@ function getFormValuesFromConfig(config: CompleteConfig["emails"]["server"], pro }; } +function CloudflareIcon({ className }: { className?: string }) { + return ( + // eslint-disable-next-line @next/next/no-img-element + + ); +} + function ResendIcon({ className }: { className?: string }) { return ( <> @@ -216,6 +231,58 @@ const senderLocalPartSchema = yup .defined("Sender local part is required") .test("non-empty", "Sender local part is required", (value) => value.trim().length > 0); +async function lookupAuthoritativeNameServers(name: string): Promise { + // Best-effort DoH lookup powering an optional UX hint. Swallow network/parse errors + // silently — ad-blockers, corp firewalls, and offline use are all expected here and + // shouldn't alert the user or pollute error reporting. + try { + const res = await fetch(`https://cloudflare-dns.com/dns-query?name=${encodeURIComponent(name)}&type=NS`, { + headers: { Accept: "application/dns-json" }, + }); + if (!res.ok) return null; + const json = (await res.json()) as { Answer?: { data?: string }[] }; + const ns = (json.Answer ?? []) + .map((a) => a.data) + .filter((d): d is string => typeof d === "string" && d.trim().length > 0) + .map((d) => d.trim().replace(/\.$/, "")); + return ns.length > 0 ? ns : null; + } catch { + return null; + } +} + +// Walk up labels (e.g. mail.shop.example.co.uk → shop.example.co.uk → example.co.uk → co.uk) +// and return the first ancestor whose authoritative NS records actually resolve. That ancestor +// is the DNS zone apex — robust to multi-label public suffixes (`.co.uk`, `.com.au`, …). +async function findZoneApex(subdomain: string): Promise<{ apex: string, nameServers: string[] } | null> { + const labels = subdomain.split(".").filter(Boolean); + for (let i = 1; i < labels.length; i++) { + const candidate = labels.slice(i).join("."); + const ns = await lookupAuthoritativeNameServers(candidate); + if (ns) return { apex: candidate, nameServers: ns }; + } + return null; +} + +function downloadCloudflareZoneFile(subdomain: string, apex: string, nameServerRecords: string[]) { + const fqdnSubdomain = `${subdomain}.`; + const lines = [ + `$ORIGIN ${apex}.`, + `$TTL 3600`, + ...nameServerRecords.map((r) => `${fqdnSubdomain}\t3600\tIN\tNS\t${r.replace(/\.$/, "")}.`), + "", + ]; + const blob = new Blob([lines.join("\n")], { type: "text/plain;charset=utf-8" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `${subdomain}-cloudflare.txt`; + document.body.appendChild(a); + a.click(); + a.remove(); + setTimeout(() => URL.revokeObjectURL(url), 1000); +} + function CopyButton({ text }: { text: string }) { const [copied, setCopied] = useState(false); return ( @@ -254,6 +321,24 @@ function ManagedDomainSetupDialog(props: { const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); const [checking, setChecking] = useState(false); + const [cloudflareApex, setCloudflareApex] = useState(null); + + useEffect(() => { + if (!props.open || stage !== 2 || !setupState) { + setCloudflareApex(null); + return; + } + let cancelled = false; + runAsynchronously(async () => { + const zone = await findZoneApex(setupState.subdomain); + if (cancelled || !zone) return; + const usesCloudflare = zone.nameServers.some((n) => /(^|\.)cloudflare\.com$/i.test(n)); + if (usesCloudflare) setCloudflareApex(zone.apex); + }); + return () => { + cancelled = true; + }; + }, [props.open, stage, setupState]); useEffect(() => { if (props.open) { @@ -354,7 +439,7 @@ function ManagedDomainSetupDialog(props: { return ( - + Add managed domain
@@ -426,19 +511,21 @@ function ManagedDomainSetupDialog(props: { Use a dedicated subdomain (e.g. emails.example.com), not your apex domain.
-
+
-
- { - setSenderLocalPart(e.target.value); - setStage1Error(null); - }} - type="text" - size="md" - /> - +
+
+ { + setSenderLocalPart(e.target.value); + setStage1Error(null); + }} + type="text" + size="md" + /> +
+ @{subdomain || "your-subdomain"}
@@ -449,8 +536,8 @@ function ManagedDomainSetupDialog(props: { {stage === 2 && setupState && ( <> -
-
+
+
Add these records to {setupState.subdomain}
@@ -458,8 +545,65 @@ function ManagedDomainSetupDialog(props: {
+ {cloudflareApex && ( +
+
+ +
+
+ Cloudflare detected on {cloudflareApex} +
+
+
+
+ { window.open(`https://dash.cloudflare.com/?to=/:account/${encodeURIComponent(cloudflareApex)}/dns/records`, "_blank", "noopener,noreferrer"); }} + > + Open + + downloadCloudflareZoneFile(setupState.subdomain, cloudflareApex, setupState.nameServerRecords)} + > + Download zone file + + + + + + +
Import on Cloudflare
+
    +
  1. Open your zone's DNS page on Cloudflare.
  2. +
  3. Click Import and Export in the top-right.
  4. +
  5. Under Import DNS records, click Select a file and pick the file you just downloaded.
  6. +
+ Cloudflare Import and Export dialog screenshot +
+
+
+
+ )} +
-
+
Type
Name
Content
@@ -468,14 +612,17 @@ function ManagedDomainSetupDialog(props: {
NS - {setupState.subdomain}
- {r} + {setupState.subdomain} + +
+
+ {r}
@@ -582,6 +729,7 @@ export function DomainSettings() { const [domains, setDomains] = useState([]); const [loadingDomains, setLoadingDomains] = useState(false); const [dialog, setDialog] = useState<{ initialState: SetupState | null } | null>(null); + const [confirmDelete, setConfirmDelete] = useState(null); const refreshDomains = useCallback(async () => { setLoadingDomains(true); @@ -887,11 +1035,11 @@ export function DomainSettings() { const displayStatus: ManagedDomainStatus = isInUse ? "applied" : isReadyButUnused ? "verified" : d.status; const displayLabel = isInUse ? "Active" : MANAGED_DOMAIN_STATUS_LABELS[displayStatus]; return ( -
-
+
+
-
-
+
+
{d.senderLocalPart}@{d.subdomain}
@@ -901,7 +1049,7 @@ export function DomainSettings() {
{displayLabel} @@ -934,6 +1082,16 @@ export function DomainSettings() { View DNS )} + {!isInUse && ( + + )}
); @@ -1015,6 +1173,27 @@ export function DomainSettings() { initialState={dialog?.initialState ?? null} onCompleted={() => { runAsynchronouslyWithAlert(refreshDomains); }} /> + + { if (!o) setConfirmDelete(null); }} + title="Remove managed domain" + danger + okButton={{ + label: "Remove", + onClick: async () => { + if (!confirmDelete) return; + await stackAdminApp.deleteManagedEmailDomain({ resendDomainId: confirmDelete.domainId }); + toast({ title: "Domain removed", description: `${confirmDelete.senderLocalPart}@${confirmDelete.subdomain} was removed.`, variant: "success" }); + await refreshDomains(); + }, + }} + cancelButton + > + + Remove {confirmDelete?.senderLocalPart}@{confirmDelete?.subdomain}? This permanently removes the domain from our records and the underlying email provider. You can re-add it later, but you'll need to re-verify DNS. + + ); } diff --git a/apps/e2e/tests/backend/endpoints/api/v1/internal/managed-email-onboarding.test.ts b/apps/e2e/tests/backend/endpoints/api/v1/internal/managed-email-onboarding.test.ts index c248c1b0b7..54e20fc698 100644 --- a/apps/e2e/tests/backend/endpoints/api/v1/internal/managed-email-onboarding.test.ts +++ b/apps/e2e/tests/backend/endpoints/api/v1/internal/managed-email-onboarding.test.ts @@ -125,4 +125,175 @@ describe("managed email onboarding internal endpoints", () => { }); expect(config.emails.server.password).toEqual(expect.stringMatching(/^managed_mock_key_/)); }); + + it("rejects client access for delete endpoint", async ({ expect }) => { + await Project.createAndSwitch(); + + const response = await niceBackendFetch("/api/v1/internal/emails/managed-onboarding/delete", { + method: "POST", + accessType: "client", + body: { + resend_domain_id: "managed_mock_domain", + }, + }); + + expect(response).toMatchInlineSnapshot(` + NiceResponse { + "status": 401, + "body": { + "code": "INSUFFICIENT_ACCESS_TYPE", + "details": { + "actual_access_type": "client", + "allowed_access_types": ["admin"], + }, + "error": "The x-stack-access-type header must be 'admin', but was 'client'.", + }, + "headers": Headers { + "x-stack-known-error": "INSUFFICIENT_ACCESS_TYPE", +