@serve.zone/dcrouter 34.0.0 → 34.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,6 +16,175 @@ const isUsableZoneName = (zoneArg) => {
16
16
  && labelArg.length <= 63
17
17
  && /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(labelArg));
18
18
  };
19
+ /** Timeout of each DNS-over-HTTPS lookup of a probe (D). */
20
+ const PROBE_DOH_TIMEOUT_MS = 5_000;
21
+ /**
22
+ * Timeout of each attempt of a parent server query (T). A truncated UDP answer
23
+ * is asked again over TCP with its own timeout, so one server costs at most 2·T.
24
+ */
25
+ const PARENT_QUERY_TIMEOUT_MS = 2_000;
26
+ /**
27
+ * No probe phase starts after this deadline. The phase in flight may still run
28
+ * to its own bound, so a probe ends within the deadline + max(D, 2·T) = 35 s,
29
+ * which is also the longest a claim holds the DNS mutation lock for its probe.
30
+ */
31
+ const PROBE_DEADLINE_MS = 30_000;
32
+ /** Proper suffixes of the zone tried as its parent zone, nearest first. */
33
+ const PARENT_WALK_LIMIT = 8;
34
+ /** Parent nameserver names whose addresses are looked up. */
35
+ const PARENT_NAME_LIMIT = 8;
36
+ /** Parent servers asked for the referral. */
37
+ const PARENT_SERVER_LIMIT = 4;
38
+ /** Conclusive parent answers needed, from as many different parent nameserver names. */
39
+ const PARENT_AGREEMENT_MINIMUM = 2;
40
+ const describeError = (errorArg) => errorArg instanceof Error ? errorArg.message : String(errorArg);
41
+ const describeDohError = (resultArg) => resultArg.status === 'error'
42
+ ? `${resultArg.error.kind}/${resultArg.error.code}: ${resultArg.error.message}`
43
+ : resultArg.status;
44
+ /** The address the probe asks, as `ip:port`, the way smartdns reports servers. */
45
+ const formatParentServer = (addressArg) => plugins.net.isIPv6(addressArg) ? `[${addressArg}]:53` : `${addressArg}:53`;
46
+ const rcodeNames = {
47
+ 0: 'NOERROR',
48
+ 1: 'FORMERR',
49
+ 2: 'SERVFAIL',
50
+ 3: 'NXDOMAIN',
51
+ 4: 'NOTIMP',
52
+ 5: 'REFUSED',
53
+ };
54
+ const describeRcode = (rcodeArg) => rcodeNames[rcodeArg] ?? `RCODE ${rcodeArg}`;
55
+ /**
56
+ * Classify one parent server's answer to the non-recursive NS query for
57
+ * `zoneArg`. Only two shapes are conclusive, and everything else is not:
58
+ *
59
+ * - a referral: RCODE 0, AA=0, an empty answer section, at least one authority
60
+ * NS and every authority NS owned by the zone, and an OPT record echoing DO=1.
61
+ * Without that echo the server may simply not have sent the DS, so a referral
62
+ * without one would not prove that there is none.
63
+ * - a negative: AA=1, NXDOMAIN or NODATA, an empty answer section, and SOA
64
+ * records in the authority section that are all owned by the parent zone.
65
+ *
66
+ * Any other AA=1 answer is inconclusive, an AA=1 referral included: a server
67
+ * that hosts both the parent and the child answers for the child, and such an
68
+ * answer says nothing about the delegation.
69
+ */
70
+ const classifyParentAnswer = (zoneArg, parentZoneArg, resultArg) => {
71
+ const inconclusive = (detailArg) => ({ outcome: 'inconclusive', detail: detailArg });
72
+ if (resultArg.status === 'error') {
73
+ return inconclusive(`no usable answer (${resultArg.error.kind}/${resultArg.error.code}): ${resultArg.error.message}`);
74
+ }
75
+ if (resultArg.flags.tc)
76
+ return inconclusive('the answer is truncated');
77
+ if (resultArg.flags.aa) {
78
+ const soaOwners = resultArg.authorities
79
+ .filter((recordArg) => recordArg.type === 'SOA')
80
+ .map((recordArg) => normalizeZone(recordArg.name));
81
+ const isNegative = (resultArg.rcode === 0 || resultArg.rcode === 3)
82
+ && resultArg.answers.length === 0
83
+ && soaOwners.length > 0
84
+ && soaOwners.every((ownerArg) => ownerArg === parentZoneArg);
85
+ if (isNegative) {
86
+ return {
87
+ outcome: 'negative',
88
+ detail: `${describeRcode(resultArg.rcode)} from ${parentZoneArg}: no delegation for ${zoneArg}`,
89
+ };
90
+ }
91
+ if (resultArg.answers.some((recordArg) => recordArg.type === 'NS' && normalizeZone(recordArg.name) === zoneArg)) {
92
+ return inconclusive(`authoritative for ${zoneArg} itself (AA=1 NS answer), not a referral from ${parentZoneArg}`);
93
+ }
94
+ return inconclusive(`authoritative ${describeRcode(resultArg.rcode)} that is neither a referral nor a negative from ${parentZoneArg}`);
95
+ }
96
+ if (resultArg.rcode !== 0)
97
+ return inconclusive(`${describeRcode(resultArg.rcode)} without AA`);
98
+ if (resultArg.answers.length > 0)
99
+ return inconclusive('a non-authoritative answer section, not a referral');
100
+ const referralRecords = resultArg.authorities.filter((recordArg) => recordArg.type === 'NS');
101
+ if (referralRecords.length === 0)
102
+ return inconclusive('no NS records in the authority section');
103
+ const foreignOwner = referralRecords.find((recordArg) => normalizeZone(recordArg.name) !== zoneArg);
104
+ if (foreignOwner) {
105
+ return inconclusive(`a referral for ${normalizeZone(foreignOwner.name) || '.'}, not for ${zoneArg}`);
106
+ }
107
+ if (resultArg.edns?.dnssecOk !== true) {
108
+ return inconclusive('the answer does not echo DO=1, so the absence of a DS is not proven');
109
+ }
110
+ const nameservers = [...new Set(referralRecords.map((recordArg) => normalizeNameserver(recordArg.value)).filter(Boolean))].sort();
111
+ if (nameservers.length === 0)
112
+ return inconclusive('referral NS records without a nameserver name');
113
+ const dsPresent = resultArg.authorities.some((recordArg) => recordArg.type === 'DS' && normalizeZone(recordArg.name) === zoneArg);
114
+ return {
115
+ outcome: 'referral',
116
+ nameservers,
117
+ dsPresent,
118
+ detail: `referral to ${nameservers.join(', ')}${dsPresent ? ' with a DS' : ' without a DS'}`,
119
+ };
120
+ };
121
+ /** What "identical" compares: the normalised NS set and DS presence, nothing else. */
122
+ const parentAnswerKey = (answerArg) => answerArg.outcome === 'referral'
123
+ ? `referral:${(answerArg.nameservers ?? []).join(',')}|ds:${answerArg.dsPresent === true}`
124
+ : answerArg.outcome;
125
+ /**
126
+ * Turn the parent servers' classified answers into a verdict: at least two
127
+ * conclusive answers, through at least two different parent nameserver names,
128
+ * all identical — any disagreement is undeterminable.
129
+ */
130
+ const aggregateParentAnswers = (zoneArg, parentZoneArg, expectedNameserversArg, answersArg) => {
131
+ const base = {
132
+ zone: zoneArg,
133
+ expectedNameservers: expectedNameserversArg,
134
+ parentZone: parentZoneArg,
135
+ parentAnswers: answersArg,
136
+ };
137
+ const undeterminable = (detailArg) => ({
138
+ ...base,
139
+ verdict: 'undeterminable',
140
+ observedNameservers: [],
141
+ detail: detailArg,
142
+ });
143
+ const conclusive = answersArg.filter((answerArg) => answerArg.outcome !== 'inconclusive');
144
+ if (conclusive.length < PARENT_AGREEMENT_MINIMUM) {
145
+ return undeterminable(`${conclusive.length} of ${answersArg.length} parent server(s) of ${parentZoneArg} gave a conclusive answer `
146
+ + `for ${zoneArg}; at least ${PARENT_AGREEMENT_MINIMUM} identical ones are needed`);
147
+ }
148
+ if (new Set(conclusive.map(parentAnswerKey)).size > 1) {
149
+ return undeterminable(`the parent servers of ${parentZoneArg} disagree about ${zoneArg}: `
150
+ + conclusive.map((answerArg) => `${answerArg.server} (${answerArg.nameserver}) ${answerArg.detail}`).join('; '));
151
+ }
152
+ const agreeingNames = [...new Set(conclusive.map((answerArg) => answerArg.nameserver))];
153
+ if (agreeingNames.length < PARENT_AGREEMENT_MINIMUM) {
154
+ return undeterminable(`the conclusive answers for ${zoneArg} all came through one parent nameserver name (${agreeingNames.join(', ')}); `
155
+ + `at least ${PARENT_AGREEMENT_MINIMUM} different names are needed`);
156
+ }
157
+ const agreed = conclusive[0];
158
+ if (agreed.outcome === 'negative') {
159
+ return {
160
+ ...base,
161
+ verdict: 'not-delegated',
162
+ observedNameservers: [],
163
+ detail: `${parentZoneArg} has no delegation for ${zoneArg}`,
164
+ };
165
+ }
166
+ const delegatedTo = agreed.nameservers ?? [];
167
+ const dsPresent = agreed.dsPresent === true;
168
+ const ours = delegatedTo.filter((nameserverArg) => expectedNameserversArg.includes(nameserverArg));
169
+ if (ours.length === 0) {
170
+ return {
171
+ ...base,
172
+ verdict: 'not-delegated',
173
+ observedNameservers: delegatedTo,
174
+ dsPresent,
175
+ detail: `${parentZoneArg} delegates ${zoneArg} to ${delegatedTo.join(', ')}, which does not include any of our `
176
+ + `nameservers (${expectedNameserversArg.join(', ')})`,
177
+ };
178
+ }
179
+ return {
180
+ ...base,
181
+ verdict: 'delegated',
182
+ observedNameservers: delegatedTo,
183
+ dsPresent,
184
+ detail: `${parentZoneArg} delegates ${zoneArg} to ${delegatedTo.join(', ')}`
185
+ + (dsPresent ? `; ${parentZoneArg} publishes a DS for ${zoneArg}` : ''),
186
+ };
187
+ };
19
188
  /**
20
189
  * DnsAuthorityManager — owns which zones dcrouter may answer for
21
190
  * authoritatively, and proves that claim rather than accepting it.
@@ -30,9 +199,9 @@ const isUsableZoneName = (zoneArg) => {
30
199
  * any domain and manufacture that proof — the identical self-assertion vector
31
200
  * that `createDcrouterDomain` used to have.
32
201
  *
33
- * So a zone earns authority by delegation instead: its public NS records must
34
- * name our `dnsNsDomains`. An ops-API caller cannot fake that without actually
35
- * controlling the domain, so the proof stays unforgeable while becoming
202
+ * So a zone earns authority by delegation instead: its delegation in the parent
203
+ * zone must name our `dnsNsDomains`. An ops-API caller cannot fake that without
204
+ * actually controlling the domain, so the proof stays unforgeable while becoming
36
205
  * mutable at runtime. It is also the comparison that was missing — claimed
37
206
  * authority versus real delegation, checked by the mechanism itself rather than
38
207
  * by an audit bolted on afterwards.
@@ -180,18 +349,43 @@ export class DnsAuthorityManager {
180
349
  // Delegation probe
181
350
  // ==========================================================================
182
351
  /**
183
- * Ask the public DNS whether `zone` is delegated to our nameservers.
352
+ * Ask the parent zone's own servers whether `zone` is delegated to our
353
+ * nameservers.
184
354
  *
185
- * Deliberately uses `strategy: 'doh'` — a single DNS-over-HTTPS attempt
186
- * against a public resolver, with no system-resolver fallback. smartdns'
187
- * `getNameServers()` uses `dns.resolveNs`, i.e. the *system* resolver, which on
188
- * a dcrouter host may be dcrouter itself: it would happily answer with the very
189
- * NS records we generated, making the probe self-confirming. An independent
190
- * vantage point is the whole point of the proof.
355
+ * A recursive lookup of the zone cannot prove this. For a zone delegated to
356
+ * us but not claimed yet, a public resolver follows the delegation to our
357
+ * servers, which REFUSE the zone because it is not claimed, so the resolver
358
+ * answers SERVFAIL and the zone could never be claimed. The delegation itself
359
+ * lives in the parent zone, so the probe reads it there:
360
+ *
361
+ * 1. Find the parent zone over DNS-over-HTTPS: the nearest proper suffix of
362
+ * the zone with an NS RRset (at most 8 levels). The zone itself, and every
363
+ * name below it, is never looked up over DoH: that is the circular query.
364
+ * A failed lookup at any level is undeterminable; a level is never
365
+ * skipped, which could pick a grandparent.
366
+ * 2. Look up A and AAAA of up to 8 parent nameserver names (sorted, names at
367
+ * or below the zone dropped) over DoH, and pick up to 4 distinct addresses:
368
+ * one per name first, IPv4 before IPv6, then further addresses round by
369
+ * round. Fewer than 2 names with an address is undeterminable.
370
+ * 3. Ask each picked server, in parallel, for the zone's NS with RD=0 and
371
+ * DO=1, over UDP (TCP when truncated). A signed parent then sends the DS
372
+ * with the referral, so DS presence needs no further query.
373
+ * 4. Classify every answer (`classifyParentAnswer`) and require at least 2
374
+ * identical conclusive answers through at least 2 different parent
375
+ * nameserver names (`aggregateParentAnswers`). Glue, TTLs, case and order
376
+ * are not compared.
377
+ *
378
+ * DoH never decides a verdict; only the parent's servers do. The DoH
379
+ * lookups never use the system resolver: on a dcrouter host that may be
380
+ * dcrouter itself, which would make the probe self-confirming.
191
381
  *
192
382
  * The three verdicts are kept distinct on purpose. A timeout is not evidence
193
383
  * that a zone is not ours; collapsing 'undeterminable' into 'not-delegated'
194
384
  * would let a transient resolver fault revoke authority.
385
+ *
386
+ * Known limitation: the parent servers of a zone below a zone we already
387
+ * serve are our own, which answer for the parent authoritatively, so such a
388
+ * zone is undeterminable.
195
389
  */
196
390
  probeDelegation(zoneArg) {
197
391
  if (this.stopped)
@@ -213,7 +407,7 @@ export class DnsAuthorityManager {
213
407
  return new plugins.smartdns.dnsClientMod.Smartdns({
214
408
  strategy: 'doh',
215
409
  allowDohFallback: false,
216
- timeoutMs: 10_000,
410
+ timeoutMs: PROBE_DOH_TIMEOUT_MS,
217
411
  });
218
412
  }
219
413
  async probeDelegationUnlocked(zoneArg) {
@@ -242,65 +436,146 @@ export class DnsAuthorityManager {
242
436
  const smartdnsClient = this.createProbeClient();
243
437
  this.ownedProbeClients.add(smartdnsClient);
244
438
  try {
245
- let result;
246
- try {
247
- result = await smartdnsClient.queryRecords(zone, 'NS');
439
+ const deadline = Date.now() + PROBE_DEADLINE_MS;
440
+ const undeterminable = (detailArg, parentZoneArg) => ({
441
+ zone,
442
+ verdict: 'undeterminable',
443
+ observedNameservers: [],
444
+ expectedNameservers,
445
+ detail: detailArg,
446
+ ...(parentZoneArg ? { parentZone: parentZoneArg } : {}),
447
+ });
448
+ const parent = await this.findParentZone(smartdnsClient, zone, deadline);
449
+ if (parent.status === 'failed')
450
+ return undeterminable(parent.detail);
451
+ if (Date.now() >= deadline) {
452
+ return undeterminable('the probe deadline passed before the parent servers were resolved', parent.parentZone);
248
453
  }
249
- catch (error) {
250
- return {
251
- zone,
252
- verdict: 'undeterminable',
253
- observedNameservers: [],
254
- expectedNameservers,
255
- detail: `delegation lookup threw: ${error.message}`,
256
- };
454
+ const selection = await this.selectParentServers(smartdnsClient, zone, parent.parentZone, parent.nameservers);
455
+ if (selection.status === 'failed')
456
+ return undeterminable(selection.detail, parent.parentZone);
457
+ if (Date.now() >= deadline) {
458
+ return undeterminable('the probe deadline passed before the parent servers were asked', parent.parentZone);
257
459
  }
258
- if (result.status === 'error') {
259
- return {
260
- zone,
261
- verdict: 'undeterminable',
262
- observedNameservers: [],
263
- expectedNameservers,
264
- detail: `delegation lookup failed (${result.error.kind}/${result.error.code}): ${result.error.message}`,
265
- };
460
+ const answers = await Promise.all(selection.servers.map((serverArg) => this.askParentServer(smartdnsClient, zone, parent.parentZone, serverArg)));
461
+ return aggregateParentAnswers(zone, parent.parentZone, expectedNameservers, answers);
462
+ }
463
+ finally {
464
+ // Keep ownership if confirmed termination fails; stop() can retry it.
465
+ await smartdnsClient.terminate();
466
+ this.ownedProbeClients.delete(smartdnsClient);
467
+ }
468
+ }
469
+ /** One DoH lookup; a thrown lookup is a failed one. */
470
+ async lookUpOverDoh(clientArg, nameArg, typeArg) {
471
+ try {
472
+ return await clientArg.queryRecords(nameArg, typeArg);
473
+ }
474
+ catch (error) {
475
+ return { status: 'thrown', message: describeError(error) };
476
+ }
477
+ }
478
+ /** Step 1: the nearest proper suffix of the zone with an NS RRset, over DoH. */
479
+ async findParentZone(clientArg, zoneArg, deadlineArg) {
480
+ const labels = zoneArg.split('.');
481
+ const candidates = labels.slice(1).map((_labelArg, indexArg) => labels.slice(indexArg + 1).join('.'));
482
+ for (const [index, candidate] of candidates.entries()) {
483
+ if (index >= PARENT_WALK_LIMIT) {
484
+ return { status: 'failed', detail: `no parent zone of ${zoneArg} found within ${PARENT_WALK_LIMIT} levels` };
266
485
  }
267
- if (result.status === 'missing') {
268
- return {
269
- zone,
270
- verdict: 'not-delegated',
271
- observedNameservers: [],
272
- expectedNameservers,
273
- detail: result.missingReason === 'nxdomain'
274
- ? `${zone} does not exist in public DNS`
275
- : `${zone} has no NS records in public DNS`,
276
- };
486
+ if (Date.now() >= deadlineArg) {
487
+ return { status: 'failed', detail: `the probe deadline passed while looking for the parent zone of ${zoneArg}` };
277
488
  }
278
- const observedNameservers = [...new Set(result.records
279
- .map((record) => normalizeNameserver(String(record.value ?? '')))
280
- .filter((nameserver) => Boolean(nameserver)))];
281
- const matches = observedNameservers.filter((observed) => expectedNameservers.includes(observed));
282
- if (matches.length === 0) {
283
- return {
284
- zone,
285
- verdict: 'not-delegated',
286
- observedNameservers,
287
- expectedNameservers,
288
- detail: `${zone} is delegated to ${observedNameservers.join(', ') || 'nothing'}, which does not include any of our nameservers (${expectedNameservers.join(', ')})`,
289
- };
489
+ const result = await this.lookUpOverDoh(clientArg, candidate, 'NS');
490
+ if (result.status === 'thrown') {
491
+ return { status: 'failed', detail: `parent zone lookup for ${candidate} threw: ${result.message}` };
492
+ }
493
+ if (result.status === 'error') {
494
+ return { status: 'failed', detail: `parent zone lookup for ${candidate} failed (${describeDohError(result)})` };
290
495
  }
496
+ if (result.status === 'missing')
497
+ continue;
498
+ const nameservers = [...new Set(result.records
499
+ .filter((recordArg) => recordArg.type === 'NS' && normalizeZone(recordArg.name) === candidate)
500
+ .map((recordArg) => normalizeNameserver(String(recordArg.value ?? '')))
501
+ .filter(Boolean))];
502
+ if (nameservers.length === 0)
503
+ continue;
504
+ return { status: 'found', parentZone: candidate, nameservers };
505
+ }
506
+ return { status: 'failed', detail: `no parent zone of ${zoneArg} found` };
507
+ }
508
+ /**
509
+ * Step 2: up to 4 distinct parent server addresses over DoH, one per parent
510
+ * nameserver name first. An address belongs to the first name (in sorted
511
+ * order) that resolves to it, so one server never counts for two names.
512
+ */
513
+ async selectParentServers(clientArg, zoneArg, parentZoneArg, nameserversArg) {
514
+ const names = [...new Set(nameserversArg)]
515
+ .filter((nameArg) => nameArg !== zoneArg && !nameArg.endsWith(`.${zoneArg}`))
516
+ .sort()
517
+ .slice(0, PARENT_NAME_LIMIT);
518
+ const addressesOf = (resultArg, familyArg) => resultArg.status === 'success'
519
+ ? [...new Set(resultArg.records
520
+ .map((recordArg) => String(recordArg.value ?? '').trim().toLowerCase())
521
+ .filter((addressArg) => plugins.net.isIP(addressArg) === familyArg))].sort()
522
+ : [];
523
+ const resolved = await Promise.all(names.map(async (nameserverArg) => {
524
+ const [ipv4, ipv6] = await Promise.all([
525
+ this.lookUpOverDoh(clientArg, nameserverArg, 'A'),
526
+ this.lookUpOverDoh(clientArg, nameserverArg, 'AAAA'),
527
+ ]);
528
+ return { nameserver: nameserverArg, addresses: [...addressesOf(ipv4, 4), ...addressesOf(ipv6, 6)] };
529
+ }));
530
+ const claimed = new Set();
531
+ const perName = resolved
532
+ .map((entryArg) => ({
533
+ nameserver: entryArg.nameserver,
534
+ addresses: entryArg.addresses.filter((addressArg) => {
535
+ if (claimed.has(addressArg))
536
+ return false;
537
+ claimed.add(addressArg);
538
+ return true;
539
+ }),
540
+ }))
541
+ .filter((entryArg) => entryArg.addresses.length > 0);
542
+ if (perName.length < PARENT_AGREEMENT_MINIMUM) {
291
543
  return {
292
- zone,
293
- verdict: 'delegated',
294
- observedNameservers,
295
- expectedNameservers,
296
- detail: `${zone} is delegated to ${matches.join(', ')}`,
544
+ status: 'failed',
545
+ detail: `only ${perName.length} of the ${names.length} usable nameserver name(s) of ${parentZoneArg} `
546
+ + `(${names.join(', ') || 'none'}) have a resolvable address; at least ${PARENT_AGREEMENT_MINIMUM} are needed`,
297
547
  };
298
548
  }
299
- finally {
300
- // Keep ownership if confirmed termination fails; stop() can retry it.
301
- await smartdnsClient.terminate();
302
- this.ownedProbeClients.delete(smartdnsClient);
549
+ const servers = [];
550
+ for (let round = 0; servers.length < PARENT_SERVER_LIMIT; round++) {
551
+ const picks = perName
552
+ .filter((entryArg) => round < entryArg.addresses.length)
553
+ .map((entryArg) => ({ address: entryArg.addresses[round], nameserver: entryArg.nameserver }));
554
+ if (picks.length === 0)
555
+ break;
556
+ servers.push(...picks.slice(0, PARENT_SERVER_LIMIT - servers.length));
303
557
  }
558
+ return { status: 'selected', servers };
559
+ }
560
+ /** Step 3: the non-recursive NS query for the zone to one parent server. */
561
+ async askParentServer(clientArg, zoneArg, parentZoneArg, serverArg) {
562
+ const identity = { server: formatParentServer(serverArg.address), nameserver: serverArg.nameserver };
563
+ let result;
564
+ try {
565
+ result = await clientArg.queryServer({
566
+ server: serverArg.address,
567
+ name: zoneArg,
568
+ type: 'NS',
569
+ recursionDesired: false,
570
+ dnssecOk: true,
571
+ transport: 'udp',
572
+ timeoutMs: PARENT_QUERY_TIMEOUT_MS,
573
+ });
574
+ }
575
+ catch (error) {
576
+ return { ...identity, outcome: 'inconclusive', detail: `the query threw: ${describeError(error)}` };
577
+ }
578
+ return { ...identity, ...classifyParentAnswer(zoneArg, parentZoneArg, result) };
304
579
  }
305
580
  // ==========================================================================
306
581
  // Mutations
@@ -308,6 +583,8 @@ export class DnsAuthorityManager {
308
583
  /**
309
584
  * Claim authority over a zone, but only against a positive delegation proof.
310
585
  * An undeterminable probe refuses the mutation — never assume either way.
586
+ * A delegation whose parent zone publishes a DS for the zone is refused as
587
+ * well (`dsPresent`); the DS has to be removed at the registrar first.
311
588
  */
312
589
  async verifyZone(zoneArg, verifiedBy) {
313
590
  const zone = normalizeZone(zoneArg);
@@ -326,6 +603,14 @@ export class DnsAuthorityManager {
326
603
  : `Cannot verify ${zone}: ${probe.detail}`,
327
604
  };
328
605
  }
606
+ if (probe.dsPresent) {
607
+ return {
608
+ success: false,
609
+ probe,
610
+ message: `Cannot verify ${zone}: ${probe.parentZone ?? 'the parent zone'} publishes a DS for ${zone}, `
611
+ + 'and dcrouter refuses zones with a DS. Remove the DS at the registrar, then verify again.',
612
+ };
613
+ }
329
614
  const entry = {
330
615
  zone,
331
616
  origin: 'verified',
@@ -460,7 +745,10 @@ export class DnsAuthorityManager {
460
745
  observedNameservers: probe.observedNameservers,
461
746
  expectedNameservers: probe.expectedNameservers,
462
747
  detail: `${zone} is delegated to ${probe.observedNameservers.join(', ')} but is not in the authority set, `
463
- + 'so dcrouter refuses to serve it authoritatively and will not request certificates for it',
748
+ + 'so dcrouter refuses to serve it authoritatively and will not request certificates for it'
749
+ + (probe.dsPresent
750
+ ? `; ${probe.parentZone ?? 'the parent zone'} publishes a DS for ${zone}, which blocks the claim until it is removed`
751
+ : ''),
464
752
  });
465
753
  }
466
754
  // Direction 2: a verified zone whose delegation moved away from us.
@@ -522,4 +810,4 @@ export class DnsAuthorityManager {
522
810
  }
523
811
  }
524
812
  }
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlci5kbnMtYXV0aG9yaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZG5zL21hbmFnZXIuZG5zLWF1dGhvcml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUF1QnRFLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FDaEQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbEQsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxhQUFxQixFQUFVLEVBQUUsQ0FDNUQsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFeEQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQWUsRUFBVyxFQUFFO0lBQ3BELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbkQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEMsT0FBTyxN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
813
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlci5kbnMtYXV0aG9yaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZG5zL21hbmFnZXIuZG5zLWF1dGhvcml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUF3QnRFLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FDaEQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbEQsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxhQUFxQixFQUFVLEVBQUUsQ0FDNUQsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFeEQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQWUsRUFBVyxFQUFFO0lBQ3BELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbkQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEMsT0FBTyxN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