From df0986b4e1c16f28a91ec63efe68aa27cebf1481 Mon Sep 17 00:00:00 2001 From: Yash Kumar Date: Tue, 8 Sep 2026 17:13:58 +0530 Subject: [PATCH] fix(dns): apply content normalization in upsert match logic to prevent duplicates --- packages/server/src/utils/dns/cloudflare.ts | 10 +++++++++- packages/server/src/utils/dns/infomaniak.ts | 5 ++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/server/src/utils/dns/cloudflare.ts b/packages/server/src/utils/dns/cloudflare.ts index 85c53715f..f08823ffa 100644 --- a/packages/server/src/utils/dns/cloudflare.ts +++ b/packages/server/src/utils/dns/cloudflare.ts @@ -175,8 +175,16 @@ export const cloudflareClient: DnsClient = { `/zones/${record.zoneId}/dns_records?type=${record.type}&name=${encodeURIComponent(record.name)}`, ); + const built = buildValue(record); + const normalizedRecord = { + type: record.type, + content: built.content ?? record.content.trim(), + priority: built.priority, + }; + const expectedContent = inlinePriority(normalizedRecord); + const existingRecord = existing.find( - (r) => inlinePriority(r) === record.content, + (r) => inlinePriority(r) === expectedContent, ); if (existingRecord) { const updated = await cfFetch<{ id: string }>( diff --git a/packages/server/src/utils/dns/infomaniak.ts b/packages/server/src/utils/dns/infomaniak.ts index 0ddcee26e..e161c9f0d 100644 --- a/packages/server/src/utils/dns/infomaniak.ts +++ b/packages/server/src/utils/dns/infomaniak.ts @@ -172,11 +172,14 @@ export const infomaniakClient: DnsClient = { async upsertRecord(config, record) { const source = toSource(record.name, record.zoneId); const existing = await listZoneRecords(config, record.zoneId); + const expectedContent = unquoteTarget( + quoteTarget(record.type, record.content), + ); const match = existing.find( (candidate) => candidate.type === record.type && normalizeSource(candidate.source) === source && - unquoteTarget(candidate.target) === record.content, + unquoteTarget(candidate.target) === expectedContent, ); const body = JSON.stringify(recordPayload(record, record.zoneId));