@serve.zone/dcrouter 20.2.0 → 32.0.1

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.
Files changed (30) hide show
  1. package/deno.json +1 -1
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/classes.dcrouter.js +2 -3
  4. package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +0 -1
  5. package/dist_ts/db/documents/classes.webpush-spool.doc.js +2 -8
  6. package/dist_ts/email/classes.coremail-gateway.manager.js +2 -3
  7. package/dist_ts/email/coremail-gateway-authority.d.ts +1 -1
  8. package/dist_ts/email/coremail-gateway-authority.js +1 -1
  9. package/dist_ts/opsserver/handlers/gatewayclient.handler.d.ts +0 -1
  10. package/dist_ts/opsserver/handlers/gatewayclient.handler.js +13 -34
  11. package/dist_ts/opsserver/helpers/gateway-client-route-key.d.ts +26 -0
  12. package/dist_ts/opsserver/helpers/gateway-client-route-key.js +51 -0
  13. package/dist_ts/webpush/classes.webpush-crypto.d.ts +9 -1
  14. package/dist_ts/webpush/classes.webpush-crypto.js +69 -56
  15. package/dist_ts/webpush/classes.webpush-manager.js +3 -4
  16. package/dist_ts_migrations/index.d.ts +18 -9
  17. package/dist_ts_migrations/index.js +602 -1776
  18. package/dist_ts_web/00_commitinfo_data.js +1 -1
  19. package/package.json +5 -5
  20. package/readme.md +22 -7
  21. package/ts/00_commitinfo_data.ts +1 -1
  22. package/ts/classes.dcrouter.ts +2 -4
  23. package/ts/db/documents/classes.webpush-spool.doc.ts +0 -3
  24. package/ts/email/classes.coremail-gateway.manager.ts +1 -2
  25. package/ts/email/coremail-gateway-authority.ts +1 -1
  26. package/ts/opsserver/handlers/gatewayclient.handler.ts +19 -36
  27. package/ts/opsserver/helpers/gateway-client-route-key.ts +64 -0
  28. package/ts/webpush/classes.webpush-crypto.ts +80 -57
  29. package/ts/webpush/classes.webpush-manager.ts +2 -3
  30. package/ts_web/00_commitinfo_data.ts +1 -1
@@ -1,19 +1,55 @@
1
1
  import * as nodeCrypto from 'node:crypto';
2
- import * as nodeFs from 'node:fs/promises';
3
- import * as nodePath from 'node:path';
4
2
  import { domainToASCII } from 'node:url';
5
- import { TextDecoder } from 'node:util';
6
- import { getSmartMtaTextNamespace, hashSmartMtaStorageKey, normalizeSmartMtaStorageKey, validateSmartMtaTextValue, } from '../dist_ts/email/smartmta-storage-policy.js';
3
+ import { hashSmartMtaStorageKey } from '../dist_ts/email/smartmta-storage-policy.js';
7
4
  import { createGatewayMailDomainId, groupGatewayMailIdentities, normalizeGatewayMailDomain, normalizeGatewayMailDomainOwner, } from '../dist_ts/email/gateway-mail-domain-authority.js';
8
5
  import { deriveSmtpScramVerifier } from '../dist_ts/email/smtp-scram.js';
9
6
  import { evaluateInboundAcceptance } from '../dist_ts/email/helpers.inbound-security.js';
10
7
  import { getWebPushIndexSpecifications } from '../dist_ts/webpush/webpush-indexes.js';
8
+ import { canonicalJson as canonicalWebPushJson, openWebPushEnvelope, parseWebPushKeyRing, sealWebPushEnvelope, } from '../dist_ts/webpush/classes.webpush-crypto.js';
9
+ import { buildGatewayClientRouteName, gatewayClientHostRouteKeyPrefix, parseGatewayClientHostRouteKey, } from '../dist_ts/opsserver/helpers/gateway-client-route-key.js';
10
+ import { data as servezoneInterfacesData } from '@serve.zone/interfaces';
11
+ /** The verifier contract token CoreMail peers are stored under from interfaces 32.0.0 on. */
12
+ const coreMailVerifierFormat = servezoneInterfacesData.coreMailCredentialVerifierPolicy.format;
13
+ /**
14
+ * dcrouter migration runner.
15
+ *
16
+ * Uses @push.rocks/smartmigration via dynamic import so smartmigration's type
17
+ * chain (which pulls in mongodb 7.x and related types) doesn't leak into
18
+ * compile-time type checking for this folder.
19
+ */
20
+ /**
21
+ * A refusal dcrouter's own migration code authored. smartmigration redacts every
22
+ * unknown failure that crosses one of its boundaries, so this class is how a
23
+ * message that names the condition and the way out — and carries no secret —
24
+ * is told apart from an unknown throw and allowed through the sanitizer.
25
+ */
26
+ export class DcRouterMigrationError extends Error {
27
+ constructor(messageArg, optionsArg) {
28
+ super(messageArg, optionsArg);
29
+ this.name = 'DcRouterMigrationError';
30
+ }
31
+ }
11
32
  // Advance only with a registered schema migration, not each package release.
12
33
  // Released bridge-only ledgers must remain readable without rewriting history.
13
- export const dcRouterSchemaVersion = '19.1.0';
34
+ export const dcRouterSchemaVersion = '32.0.1';
14
35
  export async function createApplicationMigrationRunner(db, options = {}) {
15
- // The locked run re-reads the ledger and rejects a concurrent newer schema.
16
- return createMigrationRunner(db, dcRouterSchemaVersion, options);
36
+ const runner = await createMigrationRunner(db, dcRouterSchemaVersion, options);
37
+ return {
38
+ getCurrentVersion: () => runner.getCurrentVersion(),
39
+ run: async () => {
40
+ // smartmigration plans a reverse run whenever the ledger is ahead of the
41
+ // target, and in bridge mode the generated bridge is reversible, so a
42
+ // database a newer dcrouter wrote would be walked back instead of
43
+ // refused. Starting an application against data it cannot read is never
44
+ // what an operator meant, so this release refuses it by name.
45
+ const ledgerVersion = await runner.getCurrentVersion();
46
+ if (ledgerVersion && compareSemver(ledgerVersion, dcRouterSchemaVersion) > 0) {
47
+ throw new DcRouterMigrationError(`The migration ledger is at "${ledgerVersion}", which a newer dcrouter wrote. `
48
+ + `This release migrates data up to "${dcRouterSchemaVersion}" and refuses to run against it.`);
49
+ }
50
+ return await runner.run();
51
+ },
52
+ };
17
53
  }
18
54
  const DEFAULT_SOURCE_PROFILES = [
19
55
  {
@@ -59,7 +95,6 @@ const DEFAULT_SOURCE_PROFILES = [
59
95
  },
60
96
  },
61
97
  ];
62
- const remoteIngressHubSettingsMigrationBaseVersion = '13.43.5';
63
98
  function compareSemver(a, b) {
64
99
  const aParts = a.split('.').map((part) => Number.parseInt(part, 10) || 0);
65
100
  const bParts = b.split('.').map((part) => Number.parseInt(part, 10) || 0);
@@ -121,85 +156,6 @@ function resolveMigrationSourceProfileSecurity(profileId, profiles, visited = ne
121
156
  }
122
157
  return mergeMigrationSecurityFields(baseSecurity, profile.security || {});
123
158
  }
124
- async function rematerializeSourceProfileRouteSecurity(ctx) {
125
- const profileCollection = ctx.mongo.collection('SourceProfileDoc');
126
- const routeCollection = ctx.mongo.collection('RouteDoc');
127
- const profiles = new Map();
128
- for await (const profile of profileCollection.find({})) {
129
- if (typeof profile.id === 'string') {
130
- profiles.set(profile.id, profile);
131
- }
132
- }
133
- let inspected = 0;
134
- let migrated = 0;
135
- let skippedMissingProfile = 0;
136
- const now = Date.now();
137
- for await (const routeDoc of routeCollection.find({})) {
138
- const sourceProfileRef = routeDoc.metadata?.sourceProfileRef;
139
- if (typeof sourceProfileRef !== 'string' || sourceProfileRef.trim() === '')
140
- continue;
141
- inspected++;
142
- const resolvedSecurity = resolveMigrationSourceProfileSecurity(sourceProfileRef, profiles);
143
- const profile = profiles.get(sourceProfileRef);
144
- if (!resolvedSecurity || !profile) {
145
- skippedMissingProfile++;
146
- continue;
147
- }
148
- const currentSecurity = routeDoc.route?.security || {};
149
- const securityChanged = JSON.stringify(currentSecurity) !== JSON.stringify(resolvedSecurity);
150
- const profileNameChanged = routeDoc.metadata?.sourceProfileName !== profile.name;
151
- if (!securityChanged && !profileNameChanged)
152
- continue;
153
- const query = routeDoc._id
154
- ? { _id: routeDoc._id }
155
- : { id: routeDoc.id };
156
- await routeCollection.updateOne(query, {
157
- $set: {
158
- 'route.security': structuredClone(resolvedSecurity),
159
- 'metadata.sourceProfileName': profile.name,
160
- 'metadata.lastResolvedAt': now,
161
- updatedAt: now,
162
- },
163
- });
164
- migrated++;
165
- }
166
- ctx.log.log('info', `rematerialize-source-profile-route-security: migrated ${migrated}/${inspected} route(s), skipped ${skippedMissingProfile} missing profile ref(s)`);
167
- }
168
- async function migrateTargetProfileTargetHosts(ctx) {
169
- const collection = ctx.mongo.collection('TargetProfileDoc');
170
- const cursor = collection.find({ 'targets.host': { $exists: true } });
171
- let migrated = 0;
172
- for await (const doc of cursor) {
173
- const targets = (doc.targets || []).map((target) => {
174
- if (target && typeof target === 'object' && 'host' in target && !('ip' in target)) {
175
- const { host, ...rest } = target;
176
- return { ...rest, ip: host };
177
- }
178
- return target;
179
- });
180
- await collection.updateOne({ _id: doc._id }, { $set: { targets } });
181
- migrated++;
182
- }
183
- ctx.log.log('info', `rename-target-profile-host-to-ip: migrated ${migrated} profile(s)`);
184
- }
185
- async function backfillSystemRouteKeys(ctx) {
186
- const collection = ctx.mongo.collection('RouteDoc');
187
- const cursor = collection.find({
188
- origin: { $in: ['config', 'email', 'dns'] },
189
- systemKey: { $exists: false },
190
- 'route.name': { $type: 'string' },
191
- });
192
- let migrated = 0;
193
- for await (const doc of cursor) {
194
- const origin = typeof doc.origin === 'string' ? doc.origin : undefined;
195
- const routeName = typeof doc.route?.name === 'string' ? doc.route.name.trim() : '';
196
- if (!origin || !routeName)
197
- continue;
198
- await collection.updateOne({ _id: doc._id }, { $set: { systemKey: `${origin}:${routeName}` } });
199
- migrated++;
200
- }
201
- ctx.log.log('info', `backfill-system-route-keys: migrated ${migrated} route(s)`);
202
- }
203
159
  async function seedMissingDefaultSourceProfiles(ctx) {
204
160
  const collection = ctx.mongo.collection('SourceProfileDoc');
205
161
  const now = Date.now();
@@ -382,101 +338,6 @@ async function backfillGatewayDnsProxyIntent(ctx) {
382
338
  }
383
339
  ctx.log.log('info', `backfill-gateway-dns-proxy-intent: migrated ${migrated}/${inspected} route(s)`);
384
340
  }
385
- function normalizeMigrationSourceBinding(binding, profiles) {
386
- if (!binding || typeof binding !== 'object')
387
- return undefined;
388
- const sourceProfileRef = typeof binding.sourceProfileRef === 'string'
389
- ? binding.sourceProfileRef.trim()
390
- : '';
391
- if (!sourceProfileRef)
392
- return undefined;
393
- const profile = profiles.get(sourceProfileRef);
394
- const normalizedBinding = structuredClone(binding);
395
- normalizedBinding.sourceProfileRef = sourceProfileRef;
396
- const sourceProfileName = typeof normalizedBinding.sourceProfileName === 'string'
397
- ? normalizedBinding.sourceProfileName.trim()
398
- : '';
399
- if (sourceProfileName) {
400
- normalizedBinding.sourceProfileName = sourceProfileName;
401
- }
402
- else if (typeof profile?.name === 'string' && profile.name.trim()) {
403
- normalizedBinding.sourceProfileName = profile.name.trim();
404
- }
405
- else {
406
- delete normalizedBinding.sourceProfileName;
407
- }
408
- return normalizedBinding;
409
- }
410
- async function convertRouteAccessMetadataToSourceBindings(ctx) {
411
- const profileCollection = ctx.mongo.collection('SourceProfileDoc');
412
- const routeCollection = ctx.mongo.collection('RouteDoc');
413
- const profiles = new Map();
414
- const now = Date.now();
415
- for await (const profile of profileCollection.find({})) {
416
- if (typeof profile.id === 'string') {
417
- profiles.set(profile.id, profile);
418
- }
419
- }
420
- let inspected = 0;
421
- let migrated = 0;
422
- for await (const routeDoc of routeCollection.find({})) {
423
- const metadata = routeDoc.metadata || {};
424
- const existingSourceBindings = Array.isArray(metadata.sourceBindings)
425
- ? metadata.sourceBindings
426
- : [];
427
- const legacyPolicyBindings = Array.isArray(metadata.sourcePolicy?.bindings)
428
- ? metadata.sourcePolicy.bindings
429
- : [];
430
- const legacySourceProfileRef = typeof metadata.sourceProfileRef === 'string'
431
- ? metadata.sourceProfileRef.trim()
432
- : '';
433
- const hasLegacyAccessFields = legacyPolicyBindings.length > 0
434
- || legacySourceProfileRef.length > 0
435
- || metadata.sourcePolicy !== undefined
436
- || metadata.sourceProfileRef !== undefined
437
- || metadata.sourceProfileName !== undefined;
438
- if (!hasLegacyAccessFields && existingSourceBindings.length === 0) {
439
- continue;
440
- }
441
- inspected++;
442
- const sourceBindings = existingSourceBindings.length > 0
443
- ? existingSourceBindings
444
- .map((binding) => normalizeMigrationSourceBinding(binding, profiles))
445
- .filter(Boolean)
446
- : legacyPolicyBindings.length > 0
447
- ? legacyPolicyBindings
448
- .map((binding) => normalizeMigrationSourceBinding(binding, profiles))
449
- .filter(Boolean)
450
- : legacySourceProfileRef
451
- ? [normalizeMigrationSourceBinding({
452
- sourceProfileRef: legacySourceProfileRef,
453
- sourceProfileName: metadata.sourceProfileName,
454
- }, profiles)].filter(Boolean)
455
- : [];
456
- const $set = { updatedAt: now };
457
- const $unset = {
458
- 'metadata.sourcePolicy': '',
459
- 'metadata.sourceProfileRef': '',
460
- 'metadata.sourceProfileName': '',
461
- };
462
- if (sourceBindings.length > 0) {
463
- $set['metadata.sourceBindings'] = sourceBindings;
464
- $set['metadata.lastResolvedAt'] = now;
465
- }
466
- else if (existingSourceBindings.length === 0) {
467
- $unset['metadata.sourceBindings'] = '';
468
- }
469
- if (existingSourceBindings.length === 0 && legacyPolicyBindings.length === 0 && legacySourceProfileRef) {
470
- $unset['route.security'] = '';
471
- }
472
- const query = routeDoc._id
473
- ? { _id: routeDoc._id }
474
- : { id: routeDoc.id };
475
- await routeCollection.updateOne(query, { $set, $unset });
476
- migrated++;
477
- }
478
- ctx.log.log('info', `convert-route-access-metadata-to-source-bindings: migrated ${migrated}/${inspected} route(s)`);
479
- }
480
341
  async function backfillRemoteIngressHubSettings(ctx, options) {
481
342
  const collection = ctx.mongo.collection('RemoteIngressHubSettingsDoc');
482
343
  const seed = options.remoteIngressHubSettings || {};
@@ -553,73 +414,6 @@ async function backfillEmailServerSettings(ctx, options) {
553
414
  await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, { $set });
554
415
  ctx.log.log('info', `backfill-email-server-settings: set ${Object.keys($set).length - 2} missing field(s)`);
555
416
  }
556
- async function backfillEmailOutboundMode(ctx, options) {
557
- const collection = ctx.mongo.collection('EmailServerSettingsDoc');
558
- const seed = options.emailServerSettings || {};
559
- const now = Date.now();
560
- const doc = await collection.findOne({ settingsId: 'email-server-settings' });
561
- const outboundMode = seed.outboundMode || 'direct';
562
- if (!doc) {
563
- await collection.insertOne({
564
- settingsId: 'email-server-settings',
565
- enabled: seed.enabled ?? Boolean(seed.emailConfig),
566
- outboundMode,
567
- emailConfig: seed.emailConfig || undefined,
568
- emailPortConfig: seed.emailPortConfig || undefined,
569
- updatedAt: now,
570
- updatedBy: 'migration',
571
- });
572
- ctx.log.log('info', 'backfill-email-outbound-mode: inserted singleton settings document');
573
- return;
574
- }
575
- if (doc.outboundMode !== undefined) {
576
- ctx.log.log('info', 'backfill-email-outbound-mode: no changes needed');
577
- return;
578
- }
579
- await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, {
580
- $set: {
581
- outboundMode,
582
- updatedAt: now,
583
- updatedBy: doc.updatedBy || 'migration',
584
- },
585
- });
586
- ctx.log.log('info', 'backfill-email-outbound-mode: set missing outboundMode');
587
- }
588
- async function backfillRemoteIngressEdgeEgressDefaults(ctx) {
589
- const collection = ctx.mongo.collection('RemoteIngressEdgeDoc');
590
- const result = await collection.updateMany({ egress: { $exists: false } }, { $set: { egress: { enabled: false } } });
591
- ctx.log.log('info', `backfill-remote-ingress-edge-egress-defaults: set ${result.modifiedCount || 0} edge(s) to disabled egress`);
592
- }
593
- async function backfillEmailOutboundAndRemoteIngressEgressSettings(ctx, options) {
594
- await backfillEmailOutboundMode(ctx, options);
595
- await backfillRemoteIngressEdgeEgressDefaults(ctx);
596
- }
597
- async function flipEmailOutboundModeToRemoteIngress(ctx) {
598
- const collection = ctx.mongo.collection('EmailServerSettingsDoc');
599
- const doc = await collection.findOne({ settingsId: 'email-server-settings' });
600
- if (!doc) {
601
- ctx.log.log('info', 'flip-email-outbound-mode: no settings document, nothing to flip');
602
- return;
603
- }
604
- const mode = doc.outboundMode;
605
- const updatedBy = String(doc.updatedBy || '');
606
- // Operator-explicit 'direct' (set by a real identity) is preserved as opt-out;
607
- // missing or default/migration-authored 'direct' flips to the new default.
608
- const shouldFlip = mode === undefined
609
- || (mode === 'direct' && ['default', 'migration', ''].includes(updatedBy));
610
- if (!shouldFlip) {
611
- ctx.log.log('info', `flip-email-outbound-mode: keeping ${mode} (updatedBy: ${updatedBy || 'unknown'})`);
612
- return;
613
- }
614
- await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, {
615
- $set: {
616
- outboundMode: 'remoteIngress',
617
- updatedAt: Date.now(),
618
- updatedBy: 'migration',
619
- },
620
- });
621
- ctx.log.log('info', 'flip-email-outbound-mode: outboundMode set to remoteIngress');
622
- }
623
417
  /**
624
418
  * The legacy bootstrap config carried a `central.eu-incoming` route with a
625
419
  * `deliver` action. SmartMTA's `deliver` action is an unimplemented stub that
@@ -743,152 +537,6 @@ async function convertLegacySmtpAuthUsers(ctx) {
743
537
  });
744
538
  ctx.log.log('info', `convert-legacy-smtp-auth-users: converted ${converted}, skipped ${skipped}; plaintext auth users stripped from persisted settings`);
745
539
  }
746
- async function backfillCachedEmailDirections(ctx) {
747
- const collection = ctx.mongo.collection('CachedEmail');
748
- const cursor = collection.find({ direction: { $exists: false } });
749
- let updated = 0;
750
- for await (const doc of cursor) {
751
- let routeData = {};
752
- try {
753
- routeData = JSON.parse(doc.routeData || '{}');
754
- }
755
- catch {
756
- routeData = {};
757
- }
758
- const authenticated = routeData?.session?.authenticated === true;
759
- const recipientDomains = [...new Set((doc.to || [])
760
- .map((address) => {
761
- const match = String(address).match(/@([^>]+)>?$/);
762
- return match ? match[1].toLowerCase() : undefined;
763
- })
764
- .filter(Boolean))];
765
- const acceptedAtParsed = Date.parse(routeData?.acceptedAt || '');
766
- await collection.updateOne({ _id: doc._id }, {
767
- $set: {
768
- direction: authenticated ? 'outbound' : 'inbound',
769
- recipientDomains,
770
- acceptedAt: Number.isFinite(acceptedAtParsed) ? acceptedAtParsed : Date.now(),
771
- },
772
- });
773
- updated++;
774
- }
775
- ctx.log.log('info', `backfill-cached-email-directions: annotated ${updated} cached email(s)`);
776
- }
777
- async function migrateGatewayCredentialPolicyBindings(ctx) {
778
- const gatewayClients = ctx.mongo.collection('GatewayClientDoc');
779
- const apiTokens = ctx.mongo.collection('ApiTokenDoc');
780
- const batchSize = 100;
781
- let migratedClients = 0;
782
- let migratedTokens = 0;
783
- let disabledOrphanTokens = 0;
784
- const digestClientPolicy = (clientArg, generationArg) => {
785
- const canonicalize = (valueArg) => {
786
- if (Array.isArray(valueArg))
787
- return valueArg.map((entryArg) => canonicalize(entryArg));
788
- if (valueArg && typeof valueArg === 'object') {
789
- return Object.fromEntries(Object.keys(valueArg)
790
- .sort((left, right) => left.localeCompare(right))
791
- .map((keyArg) => [keyArg, canonicalize(valueArg[keyArg])]));
792
- }
793
- return valueArg;
794
- };
795
- return nodeCrypto.createHash('sha256').update(JSON.stringify(canonicalize({
796
- id: clientArg.id,
797
- generation: generationArg,
798
- policy: {
799
- type: clientArg.type,
800
- hostnamePatterns: clientArg.hostnamePatterns || [],
801
- allowedRouteTargets: clientArg.allowedRouteTargets || [],
802
- capabilities: clientArg.capabilities || {},
803
- enabled: clientArg.enabled !== false,
804
- },
805
- }))).digest('hex');
806
- };
807
- while (true) {
808
- const batch = await gatewayClients.find({
809
- $or: [
810
- { policyGeneration: { $exists: false } },
811
- { policyGeneration: { $in: [null, 0] } },
812
- { credentialSequence: { $exists: false } },
813
- { credentialSequence: null },
814
- { activeCredentialSequence: { $exists: false } },
815
- { activeCredentialSequence: null },
816
- { pendingProvisioning: { $exists: false } },
817
- ],
818
- }).limit(batchSize).toArray();
819
- if (batch.length === 0)
820
- break;
821
- for (const client of batch) {
822
- const policyGeneration = Number.isSafeInteger(client.policyGeneration)
823
- && Number(client.policyGeneration) >= 1
824
- ? Number(client.policyGeneration)
825
- : 1;
826
- const credentialSequence = Number.isSafeInteger(client.credentialSequence)
827
- && Number(client.credentialSequence) >= 0
828
- ? Number(client.credentialSequence)
829
- : 0;
830
- let activeCredentialSequence = Number.isSafeInteger(client.activeCredentialSequence)
831
- && Number(client.activeCredentialSequence) >= 0
832
- ? Number(client.activeCredentialSequence)
833
- : 0;
834
- if (activeCredentialSequence === 0) {
835
- const activeDigest = digestClientPolicy(client, policyGeneration);
836
- const activeTokens = await apiTokens.find({
837
- enabled: true,
838
- 'policy.role': 'gatewayClient',
839
- 'policy.gatewayClient.id': client.id,
840
- 'gatewayCredentialLifecycle.source': 'provisioned',
841
- 'gatewayCredentialLifecycle.state': 'active',
842
- 'gatewayCredentialLifecycle.policyGeneration': policyGeneration,
843
- 'gatewayCredentialLifecycle.policyDigest': activeDigest,
844
- }).sort({ 'gatewayCredentialLifecycle.sequence': -1 }).limit(1).toArray();
845
- const activeSequence = activeTokens[0]?.gatewayCredentialLifecycle?.sequence;
846
- if (Number.isSafeInteger(activeSequence) && Number(activeSequence) >= 1) {
847
- activeCredentialSequence = Number(activeSequence);
848
- }
849
- }
850
- await gatewayClients.updateOne(client._id === undefined ? { id: client.id } : { _id: client._id, id: client.id }, {
851
- $set: {
852
- policyGeneration,
853
- credentialSequence,
854
- activeCredentialSequence,
855
- pendingProvisioning: client.pendingProvisioning ?? null,
856
- },
857
- });
858
- migratedClients++;
859
- }
860
- }
861
- while (true) {
862
- const batch = await apiTokens.find({
863
- 'policy.role': 'gatewayClient',
864
- $or: [
865
- { 'policy.gatewayClient.policyGeneration': { $exists: false } },
866
- { 'policy.gatewayClient.policyGeneration': { $in: [null, 0] } },
867
- ],
868
- }).limit(batchSize).toArray();
869
- if (batch.length === 0)
870
- break;
871
- for (const token of batch) {
872
- const gatewayClientId = typeof token.policy?.gatewayClient?.id === 'string'
873
- ? token.policy.gatewayClient.id.trim().toLowerCase()
874
- : '';
875
- const client = gatewayClientId
876
- ? await gatewayClients.findOne({ id: gatewayClientId })
877
- : null;
878
- const selector = token._id === undefined ? { id: token.id } : { _id: token._id, id: token.id };
879
- await apiTokens.updateOne(selector, {
880
- $set: {
881
- 'policy.gatewayClient.policyGeneration': client?.policyGeneration || 1,
882
- ...(!client ? { enabled: false } : {}),
883
- },
884
- });
885
- migratedTokens++;
886
- if (!client)
887
- disabledOrphanTokens++;
888
- }
889
- }
890
- ctx.log.log(disabledOrphanTokens > 0 ? 'warn' : 'info', `gateway-credential-policy-bindings: migrated ${migratedClients} client(s), ${migratedTokens} token(s), disabled ${disabledOrphanTokens} orphan token(s)`);
891
- }
892
540
  async function migrateWebPushProviderSchema(ctx) {
893
541
  const migrationBatchSize = 100;
894
542
  const bindingCollection = ctx.mongo.collection('WebPushBindingDoc');
@@ -896,7 +544,7 @@ async function migrateWebPushProviderSchema(ctx) {
896
544
  const spoolCollection = ctx.mongo.collection('WebPushSpoolDoc');
897
545
  const requireMongoDocumentId = (documentArg, documentTypeArg) => {
898
546
  if (documentArg?._id === undefined || documentArg?._id === null) {
899
- throw new Error(`web-push-provider-schema: ${documentTypeArg} document has no MongoDB id`);
547
+ throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} document has no MongoDB id`);
900
548
  }
901
549
  return documentArg._id;
902
550
  };
@@ -917,7 +565,7 @@ async function migrateWebPushProviderSchema(ctx) {
917
565
  },
918
566
  })), { ordered: false });
919
567
  if (result.modifiedCount === 0) {
920
- throw new Error(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
568
+ throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
921
569
  }
922
570
  }
923
571
  };
@@ -945,7 +593,7 @@ async function migrateWebPushProviderSchema(ctx) {
945
593
  || binding.id !== binding.id.trim()
946
594
  || !Number.isSafeInteger(binding.lifecycleGeneration)
947
595
  || binding.lifecycleGeneration < 1) {
948
- throw new Error('web-push-provider-schema: malformed binding lifecycle authority');
596
+ throw new DcRouterMigrationError('web-push-provider-schema: malformed binding lifecycle authority');
949
597
  }
950
598
  }
951
599
  const backfillDependentLifecycles = async (collectionArg, documentTypeArg) => {
@@ -960,13 +608,13 @@ async function migrateWebPushProviderSchema(ctx) {
960
608
  if (typeof document.bindingId !== 'string'
961
609
  || document.bindingId.trim().length === 0
962
610
  || document.bindingId !== document.bindingId.trim()) {
963
- throw new Error(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
611
+ throw new DcRouterMigrationError(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
964
612
  }
965
613
  const binding = await bindingCollection.findOne({ id: document.bindingId }, { projection: { lifecycleGeneration: 1 } });
966
614
  if (!binding
967
615
  || !Number.isSafeInteger(binding.lifecycleGeneration)
968
616
  || binding.lifecycleGeneration < 1) {
969
- throw new Error(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
617
+ throw new DcRouterMigrationError(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
970
618
  }
971
619
  operations.push({
972
620
  updateOne: {
@@ -981,7 +629,7 @@ async function migrateWebPushProviderSchema(ctx) {
981
629
  }
982
630
  const result = await collectionArg.bulkWrite(operations, { ordered: false });
983
631
  if (result.modifiedCount === 0) {
984
- throw new Error(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
632
+ throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
985
633
  }
986
634
  }
987
635
  };
@@ -997,13 +645,13 @@ async function migrateWebPushProviderSchema(ctx) {
997
645
  && (typeof documentArg.id !== 'string'
998
646
  || documentArg.id.trim().length === 0
999
647
  || documentArg.id !== documentArg.id.trim()))) {
1000
- throw new Error(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
648
+ throw new DcRouterMigrationError(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
1001
649
  }
1002
650
  const binding = await bindingCollection.findOne({ id: documentArg.bindingId }, { projection: { lifecycleGeneration: 1 } });
1003
651
  if (!binding
1004
652
  || !Number.isSafeInteger(binding.lifecycleGeneration)
1005
653
  || documentArg.lifecycleGeneration > binding.lifecycleGeneration) {
1006
- throw new Error(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
654
+ throw new DcRouterMigrationError(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
1007
655
  }
1008
656
  };
1009
657
  const streamLifecycleCollection = async (collectionArg, documentTypeArg) => {
@@ -1075,7 +723,7 @@ async function migrateServiceMailIdempotencyIndex(ctx) {
1075
723
  continue;
1076
724
  }
1077
725
  if (document._id === undefined || document._id === null) {
1078
- throw new Error('index-service-mail-idempotency: CachedEmail document has no _id');
726
+ throw new DcRouterMigrationError('index-service-mail-idempotency: CachedEmail document has no _id');
1079
727
  }
1080
728
  pendingUnsets.push({
1081
729
  updateOne: {
@@ -1118,829 +766,260 @@ async function migrateServiceMailIdempotencyIndex(ctx) {
1118
766
  */
1119
767
  export async function createMigrationRunner(db, targetVersion, options = {}) {
1120
768
  const sm = await import('@push.rocks/smartmigration');
1121
- const freshInstallVersion = compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) >= 0
1122
- ? serviceMailIdempotencyPreviousVersion
1123
- : targetVersion;
1124
769
  const migration = new sm.SmartMigration({
1125
770
  targetVersion,
1126
771
  db: db,
1127
- // Fresh installs run the mail idempotency and Web Push schema migrations.
1128
- freshInstallVersion,
1129
- // Retain historical bridge steps for already released package-version ledgers.
772
+ // A fresh install enters the chain at its start, so it still runs the mail
773
+ // idempotency and Web Push index steps that create its indexes.
774
+ freshInstallVersion: serviceMailIdempotencyPreviousVersion,
775
+ // 32.0.0 deleted every released step below the chain start. Without this
776
+ // floor a ledger from before it would be skip-forward resumed and stamped
777
+ // as if the deleted work had happened; with it, such a ledger is refused
778
+ // by name on the first read, before the lock and before any write.
779
+ oldestSupportedVersion: serviceMailIdempotencyPreviousVersion,
780
+ // A target that is not a step boundary is bridged rather than overshot.
1130
781
  targetVersionStrategy: 'bridge',
782
+ // dcrouter's own refusals name the condition and the way out and carry no
783
+ // secret, so they reach the operator unchanged; anything else is reported
784
+ // as the step or phase it failed in and nothing more.
785
+ errorSanitizer: (errorArg, contextArg) => (errorArg instanceof DcRouterMigrationError
786
+ ? { message: errorArg.message }
787
+ : {
788
+ message: contextArg.stepId
789
+ ? `Migration step "${contextArg.stepId}" failed.`
790
+ : `Migration ${contextArg.phase} failed.`,
791
+ }),
1131
792
  // A replacement process must be able to wait out the complete stale-lock TTL.
1132
793
  lockWaitMs: 11 * 60_000,
1133
794
  lockTtlMs: 10 * 60_000,
1134
795
  });
1135
- const gatewayClientRouteMetadataMigrationVersion = '15.0.0';
1136
- const gatewayClientRoutePublicSourceMigrationVersion = '15.0.2';
1137
- async function normalizeGatewayClientRouteMetadata(ctx) {
1138
- const collection = ctx.mongo.collection('RouteDoc');
1139
- const docs = await collection.find({
1140
- $or: [
1141
- { 'metadata.workHosterType': { $exists: true } },
1142
- { 'metadata.workHosterId': { $exists: true } },
1143
- { 'metadata.workAppId': { $exists: true } },
1144
- { 'metadata.ownerType': 'workhoster' },
1145
- ],
1146
- }).toArray();
1147
- for (const doc of docs) {
1148
- const metadata = doc.metadata || {};
1149
- const set = {};
1150
- if (!metadata.gatewayClientType && metadata.workHosterType) {
1151
- set['metadata.gatewayClientType'] = metadata.workHosterType;
1152
- }
1153
- if (!metadata.gatewayClientId && metadata.workHosterId) {
1154
- set['metadata.gatewayClientId'] = metadata.workHosterId;
1155
- }
1156
- if (!metadata.gatewayClientAppId && metadata.workAppId) {
1157
- set['metadata.gatewayClientAppId'] = metadata.workAppId;
1158
- }
1159
- if (metadata.ownerType === 'workhoster') {
1160
- set['metadata.ownerType'] = 'gatewayClient';
796
+ // Register steps in execution order; each `.from()` is the previous `.to()`,
797
+ // and `oldestSupportedVersion` pins the first one as the floor of this
798
+ // release. Registration stops at `targetVersion` so a target that is not a
799
+ // step boundary is bridged by smartmigration instead of overshooting.
800
+ const reaches = (versionArg) => compareSemver(targetVersion, versionArg) >= 0;
801
+ /**
802
+ * Close the chain. A `targetVersion` that is not a step boundary is bridged,
803
+ * and that bridge repeats the settings safeguards the chain reached rather
804
+ * than being a no-op: the persisted settings document can be seeded from
805
+ * bootstrap config in the very run that bridges it.
806
+ */
807
+ const finish = (chainEndArg) => {
808
+ if (compareSemver(targetVersion, chainEndArg) <= 0)
809
+ return migration;
810
+ migration
811
+ .step('backfill-settings-to-target')
812
+ .from(chainEndArg).to(targetVersion)
813
+ .description('Bridge to a target between two chain boundaries, repeating the settings safeguards')
814
+ .up(async (ctx) => {
815
+ await backfillRemoteIngressHubSettings(ctx, options);
816
+ await backfillEmailServerSettings(ctx, options);
817
+ if (compareSemver(chainEndArg, legacyCentralEuDeliverRouteMigrationVersion) >= 0) {
818
+ await removeLegacyCentralEuDeliverRoute(ctx);
1161
819
  }
1162
- const update = {
1163
- $unset: {
1164
- 'metadata.workHosterType': '',
1165
- 'metadata.workHosterId': '',
1166
- 'metadata.workAppId': '',
1167
- },
1168
- };
1169
- if (Object.keys(set).length > 0) {
1170
- update.$set = set;
820
+ if (compareSemver(chainEndArg, smtpAuthAccountsMigrationVersion) >= 0) {
821
+ await convertLegacySmtpAuthUsers(ctx);
1171
822
  }
1172
- await collection.updateOne({ _id: doc._id }, update);
1173
- }
1174
- ctx.log.log('info', `normalize-gateway-client-route-metadata: migrated ${docs.length} route(s)`);
1175
- }
1176
- function isStandardSourceBinding(binding) {
1177
- if (!binding || typeof binding !== 'object')
1178
- return false;
1179
- const sourceProfileRef = typeof binding.sourceProfileRef === 'string'
1180
- ? binding.sourceProfileRef.trim().toLowerCase()
1181
- : '';
1182
- const sourceProfileName = typeof binding.sourceProfileName === 'string'
1183
- ? binding.sourceProfileName.trim().toLowerCase()
1184
- : '';
1185
- return sourceProfileRef === 'standard' || sourceProfileName === 'standard';
1186
- }
1187
- async function preferPublicSourceBindingsForGatewayClientRoutes(ctx) {
1188
- const profileCollection = ctx.mongo.collection('SourceProfileDoc');
1189
- const routeCollection = ctx.mongo.collection('RouteDoc');
1190
- const profiles = await profileCollection.find({}).toArray();
1191
- const publicProfile = profiles.find((profile) => {
1192
- return typeof profile.id === 'string' && profile.id.trim().toLowerCase() === 'public';
1193
- }) || profiles.find((profile) => {
1194
- return typeof profile.name === 'string' && profile.name.trim().toLowerCase() === 'public';
1195
- });
1196
- if (!publicProfile?.id) {
1197
- ctx.log.log('warn', 'gateway-client-routes-use-public-source-profile: PUBLIC source profile not found, skipping');
1198
- return;
1199
- }
1200
- const publicBinding = {
1201
- sourceProfileRef: String(publicProfile.id),
1202
- sourceProfileName: typeof publicProfile.name === 'string' ? publicProfile.name : 'PUBLIC',
1203
- };
1204
- const cursor = routeCollection.find({
1205
- 'metadata.ownerType': 'gatewayClient',
1206
823
  });
1207
- const now = Date.now();
1208
- let inspected = 0;
1209
- let migrated = 0;
1210
- for await (const doc of cursor) {
1211
- inspected++;
1212
- const metadata = doc.metadata || {};
1213
- const sourceBindings = Array.isArray(metadata.sourceBindings)
1214
- ? metadata.sourceBindings
1215
- : [];
1216
- const shouldMigrate = sourceBindings.length === 0
1217
- || sourceBindings.every((binding) => isStandardSourceBinding(binding));
1218
- if (!shouldMigrate) {
1219
- continue;
1220
- }
1221
- await routeCollection.updateOne(doc._id ? { _id: doc._id } : { id: doc.id }, {
1222
- $set: {
1223
- 'metadata.sourceBindings': [publicBinding],
1224
- 'metadata.lastResolvedAt': now,
1225
- updatedAt: now,
1226
- },
1227
- $unset: {
1228
- 'route.security': '',
1229
- },
1230
- });
1231
- migrated++;
1232
- }
1233
- ctx.log.log('info', `gateway-client-routes-use-public-source-profile: migrated ${migrated}/${inspected} route(s)`);
1234
- }
1235
- // Register steps in execution order. Each step's .from() must match the
1236
- // previous step's .to() to form a contiguous chain.
824
+ return migration;
825
+ };
826
+ if (!reaches(serviceMailIdempotencyMigrationVersion))
827
+ return finish(serviceMailIdempotencyPreviousVersion);
1237
828
  migration
1238
- .step('rename-target-profile-host-to-ip')
1239
- .from('13.0.11').to('13.1.0')
1240
- .description('Rename ITargetProfileTarget.host → ip on all target profiles')
1241
- .up(async (ctx) => migrateTargetProfileTargetHosts(ctx))
1242
- .step('rename-domain-source-manual-to-dcrouter')
1243
- .from('13.1.0').to('13.8.1')
1244
- .description('Rename DomainDoc.source value from "manual" to "dcrouter"')
829
+ .step('index-service-mail-idempotency')
830
+ .from(serviceMailIdempotencyPreviousVersion).to(serviceMailIdempotencyMigrationVersion)
831
+ .description('Repair replay metadata and create the credential-scoped sparse unique service-mail index')
1245
832
  .up(async (ctx) => {
1246
- const collection = ctx.mongo.collection('DomainDoc');
1247
- const result = await collection.updateMany({ source: 'manual' }, { $set: { source: 'dcrouter' } });
1248
- ctx.log.log('info', `rename-domain-source-manual-to-dcrouter: migrated ${result.modifiedCount} domain(s)`);
1249
- })
1250
- .step('rename-record-source-manual-to-local')
1251
- .from('13.8.1').to('13.8.2')
1252
- .description('Rename DnsRecordDoc.source value from "manual" to "local"')
833
+ await migrateServiceMailIdempotencyIndex(ctx);
834
+ });
835
+ if (!reaches(webPushSchemaMigrationVersion))
836
+ return finish(serviceMailIdempotencyMigrationVersion);
837
+ migration
838
+ .step('web-push-provider-schema')
839
+ .from(webPushSchemaPreviousVersion).to(webPushSchemaMigrationVersion)
840
+ .description('Create durable Web Push binding, delivery, idempotency, and retention indexes')
1253
841
  .up(async (ctx) => {
1254
- const collection = ctx.mongo.collection('DnsRecordDoc');
1255
- const result = await collection.updateMany({ source: 'manual' }, { $set: { source: 'local' } });
1256
- ctx.log.log('info', `rename-record-source-manual-to-local: migrated ${result.modifiedCount} record(s)`);
1257
- })
1258
- .step('unify-routes-rename-collection')
1259
- .from('13.8.2').to('13.16.0')
1260
- .description('Rename StoredRouteDoc → RouteDoc, add origin field, drop RouteOverrideDoc')
842
+ await migrateWebPushProviderSchema(ctx);
843
+ await backfillRemoteIngressHubSettings(ctx, options);
844
+ await backfillEmailServerSettings(ctx, options);
845
+ });
846
+ if (!reaches(routeIngressPolicyMigrationVersion))
847
+ return finish(webPushSchemaMigrationVersion);
848
+ migration
849
+ .step('backfill-route-ingress-policies')
850
+ .from(routeIngressPolicyPreviousVersion).to(routeIngressPolicyMigrationVersion)
851
+ .description('Preserve existing route reachability with explicit direct hub and SmartVPN ingress policy')
1261
852
  .up(async (ctx) => {
1262
- const db = ctx.mongo;
1263
- // 1. Rename StoredRouteDoc → RouteDoc (smartdata uses exact class names)
1264
- const collections = await db.listCollections({ name: 'StoredRouteDoc' }).toArray();
1265
- if (collections.length > 0) {
1266
- await db.renameCollection('StoredRouteDoc', 'RouteDoc');
1267
- ctx.log.log('info', 'Renamed StoredRouteDoc → RouteDoc');
1268
- }
1269
- // 2. Set origin='api' on all migrated docs (they were API-created)
1270
- const routeCol = db.collection('RouteDoc');
1271
- const result = await routeCol.updateMany({ origin: { $exists: false } }, { $set: { origin: 'api' } });
1272
- ctx.log.log('info', `Set origin='api' on ${result.modifiedCount} migrated route(s)`);
1273
- // 3. Drop RouteOverrideDoc collection
1274
- const overrideCollections = await db.listCollections({ name: 'RouteOverrideDoc' }).toArray();
1275
- if (overrideCollections.length > 0) {
1276
- await db.collection('RouteOverrideDoc').drop();
1277
- ctx.log.log('info', 'Dropped RouteOverrideDoc collection');
1278
- }
1279
- })
1280
- .step('repair-target-profile-ip-migration')
1281
- .from('13.16.0').to('13.17.4')
1282
- .description('Repair TargetProfileDoc.targets host→ip migration for already-upgraded installs')
853
+ await backfillRouteIngressPolicies(ctx);
854
+ await backfillRemoteIngressHubSettings(ctx, options);
855
+ await backfillEmailServerSettings(ctx, options);
856
+ });
857
+ if (!reaches(sourceProfileNetworkNormalizationMigrationVersion))
858
+ return finish(routeIngressPolicyMigrationVersion);
859
+ migration
860
+ .step('normalize-private-source-profile-networks')
861
+ .from(routeIngressPolicyMigrationVersion).to(sourceProfileNetworkNormalizationMigrationVersion)
862
+ .description('Normalize legacy private source-profile wildcards to valid CIDR notation')
1283
863
  .up(async (ctx) => {
1284
- await migrateTargetProfileTargetHosts(ctx);
1285
- })
1286
- .step('backfill-system-route-keys')
1287
- .from('13.17.4').to('13.18.0')
1288
- .description('Backfill RouteDoc.systemKey for persisted config/email/dns routes')
864
+ await normalizeLegacyPrivateSourceProfileNetworks(ctx);
865
+ await backfillRemoteIngressHubSettings(ctx, options);
866
+ await backfillEmailServerSettings(ctx, options);
867
+ });
868
+ if (!reaches(gatewayDnsProxyIntentMigrationVersion))
869
+ return finish(sourceProfileNetworkNormalizationMigrationVersion);
870
+ migration
871
+ .step('backfill-gateway-dns-proxy-intent')
872
+ .from(sourceProfileNetworkNormalizationMigrationVersion).to(gatewayDnsProxyIntentMigrationVersion)
873
+ .description('Recover gateway route DNS proxy intent from owned provider record state')
1289
874
  .up(async (ctx) => {
1290
- await backfillSystemRouteKeys(ctx);
1291
- })
1292
- .step('rematerialize-source-profile-route-security')
1293
- .from('13.18.0').to('13.40.2')
1294
- .description('Replace stale route security with resolved source profile security')
875
+ await backfillGatewayDnsProxyIntent(ctx);
876
+ await backfillRemoteIngressHubSettings(ctx, options);
877
+ await backfillEmailServerSettings(ctx, options);
878
+ });
879
+ if (!reaches(legacyCentralEuDeliverRouteMigrationVersion))
880
+ return finish(gatewayDnsProxyIntentMigrationVersion);
881
+ migration
882
+ .step('remove-legacy-central-eu-deliver-route')
883
+ .from(gatewayDnsProxyIntentMigrationVersion).to(legacyCentralEuDeliverRouteMigrationVersion)
884
+ .description('Remove the legacy central.eu-incoming deliver route so accepted mail falls through to the domain inbound store policy')
1295
885
  .up(async (ctx) => {
1296
- await rematerializeSourceProfileRouteSecurity(ctx);
1297
- })
1298
- .step('seed-missing-default-source-profiles')
1299
- .from('13.40.2').to('13.42.0')
1300
- .description('Seed missing default source profiles for source-policy presets')
886
+ // Backfills run first so a leapfrog upgrade that seeds the settings doc
887
+ // (including the legacy route) in this very step is normalized before
888
+ // the step completes.
889
+ await backfillRemoteIngressHubSettings(ctx, options);
890
+ await backfillEmailServerSettings(ctx, options);
891
+ await removeLegacyCentralEuDeliverRoute(ctx);
892
+ });
893
+ if (!reaches(smtpAuthAccountsMigrationVersion))
894
+ return finish(legacyCentralEuDeliverRouteMigrationVersion);
895
+ migration
896
+ .step('convert-legacy-smtp-auth-users')
897
+ .from(legacyCentralEuDeliverRouteMigrationVersion).to(smtpAuthAccountsMigrationVersion)
898
+ .description('Convert legacy plaintext emailConfig.auth.users into hashed SMTP account documents and strip the plaintext from persisted settings')
1301
899
  .up(async (ctx) => {
1302
- await seedMissingDefaultSourceProfiles(ctx);
1303
- })
1304
- .step('convert-route-access-metadata-to-source-bindings')
1305
- .from('13.42.0').to('13.43.2')
1306
- .description('Convert route sourceProfileRef/sourcePolicy metadata to canonical sourceBindings')
900
+ await backfillRemoteIngressHubSettings(ctx, options);
901
+ await backfillEmailServerSettings(ctx, options);
902
+ await removeLegacyCentralEuDeliverRoute(ctx);
903
+ await convertLegacySmtpAuthUsers(ctx);
904
+ });
905
+ if (!reaches(monitoringEventsMigrationVersion))
906
+ return finish(smtpAuthAccountsMigrationVersion);
907
+ migration
908
+ .step('create-monitoring-event-indexes')
909
+ .from(smtpAuthAccountsMigrationVersion).to(monitoringEventsMigrationVersion)
910
+ .description('Create durable authentication event and email traffic bucket indexes')
1307
911
  .up(async (ctx) => {
1308
- await convertRouteAccessMetadataToSourceBindings(ctx);
912
+ await backfillRemoteIngressHubSettings(ctx, options);
913
+ await backfillEmailServerSettings(ctx, options);
914
+ await removeLegacyCentralEuDeliverRoute(ctx);
915
+ await convertLegacySmtpAuthUsers(ctx);
916
+ await createMonitoringEventIndexes(ctx);
917
+ });
918
+ if (!reaches(cachedEmailAcceptedAtIndexMigrationVersion))
919
+ return finish(monitoringEventsMigrationVersion);
920
+ migration
921
+ .step('index-cached-email-accepted-at')
922
+ .from(monitoringEventsMigrationVersion).to(cachedEmailAcceptedAtIndexMigrationVersion)
923
+ .description('Index CachedEmail.acceptedAt for retained email traffic and security views')
924
+ .up(async (ctx) => {
925
+ await backfillRemoteIngressHubSettings(ctx, options);
926
+ await backfillEmailServerSettings(ctx, options);
927
+ await removeLegacyCentralEuDeliverRoute(ctx);
928
+ await convertLegacySmtpAuthUsers(ctx);
929
+ await createCachedEmailAcceptedAtIndex(ctx);
930
+ });
931
+ if (!reaches(cachedEmailSecurityDispositionMigrationVersion))
932
+ return finish(cachedEmailAcceptedAtIndexMigrationVersion);
933
+ migration
934
+ .step('backfill-cached-email-security-disposition')
935
+ .from(cachedEmailAcceptedAtIndexMigrationVersion).to(cachedEmailSecurityDispositionMigrationVersion)
936
+ .description('Classify retained inbound authentication results without overwriting delivery state')
937
+ .up(async (ctx) => {
938
+ await backfillRemoteIngressHubSettings(ctx, options);
939
+ await backfillEmailServerSettings(ctx, options);
940
+ await removeLegacyCentralEuDeliverRoute(ctx);
941
+ await convertLegacySmtpAuthUsers(ctx);
942
+ await backfillCachedEmailSecurityDisposition(ctx);
943
+ });
944
+ if (!reaches(gatewayMailDomainAuthorityMigrationVersion))
945
+ return finish(cachedEmailSecurityDispositionMigrationVersion);
946
+ migration
947
+ .step('bridge-cached-email-security-disposition-to-gateway-mail-domain-authority')
948
+ .from(cachedEmailSecurityDispositionMigrationVersion).to(gatewayMailDomainAuthorityPreviousVersion)
949
+ .description('Bridge the 18.5.0 release before migrating WorkApp mail identity authority')
950
+ .up(async (ctx) => {
951
+ await backfillRemoteIngressHubSettings(ctx, options);
952
+ await backfillEmailServerSettings(ctx, options);
953
+ await removeLegacyCentralEuDeliverRoute(ctx);
954
+ await convertLegacySmtpAuthUsers(ctx);
1309
955
  })
1310
- .step('backfill-remote-ingress-hub-settings-current')
1311
- .from('13.43.2').to(remoteIngressHubSettingsMigrationBaseVersion)
1312
- .description('Backfill RemoteIngress hub singleton settings for current dcrouter 13.43.5 installs')
956
+ .step('migrate-gateway-mail-domain-authority')
957
+ .from(gatewayMailDomainAuthorityPreviousVersion).to(gatewayMailDomainAuthorityMigrationVersion)
958
+ .description('Move WorkApp mail identities into authoritative owner/domain SmartData documents')
1313
959
  .up(async (ctx) => {
1314
960
  await backfillRemoteIngressHubSettings(ctx, options);
1315
961
  await backfillEmailServerSettings(ctx, options);
962
+ await removeLegacyCentralEuDeliverRoute(ctx);
963
+ await convertLegacySmtpAuthUsers(ctx);
964
+ await migrateGatewayMailDomainAuthority(ctx);
1316
965
  });
1317
- if (compareSemver(targetVersion, gatewayClientRouteMetadataMigrationVersion) >= 0) {
1318
- migration
1319
- .step('normalize-gateway-client-route-metadata')
1320
- .from(remoteIngressHubSettingsMigrationBaseVersion).to(gatewayClientRouteMetadataMigrationVersion)
1321
- .description('Promote legacy workHoster route metadata to gatewayClient fields and drop the legacy fields')
1322
- .up(async (ctx) => {
1323
- await normalizeGatewayClientRouteMetadata(ctx);
1324
- await backfillRemoteIngressHubSettings(ctx, options);
1325
- await backfillEmailServerSettings(ctx, options);
1326
- });
1327
- if (compareSemver(targetVersion, gatewayClientRouteMetadataMigrationVersion) > 0) {
1328
- if (compareSemver(targetVersion, gatewayClientRoutePublicSourceMigrationVersion) >= 0) {
1329
- migration
1330
- .step('gateway-client-routes-use-public-source-profile')
1331
- .from(gatewayClientRouteMetadataMigrationVersion).to(gatewayClientRoutePublicSourceMigrationVersion)
1332
- .description('Move managed gateway-client routes from STANDARD to PUBLIC source profile')
1333
- .up(async (ctx) => {
1334
- await preferPublicSourceBindingsForGatewayClientRoutes(ctx);
1335
- await backfillRemoteIngressHubSettings(ctx, options);
1336
- await backfillEmailServerSettings(ctx, options);
1337
- });
1338
- if (compareSemver(targetVersion, gatewayClientRoutePublicSourceMigrationVersion) > 0) {
1339
- if (compareSemver(targetVersion, domainNameUniqueMigrationBaseVersion) >= 0) {
1340
- migration
1341
- .step('dedupe-domain-docs-by-name')
1342
- .from(gatewayClientRoutePublicSourceMigrationVersion).to(domainNameUniqueMigrationBaseVersion)
1343
- .description('Remove duplicate DomainDoc rows per name (oldest wins) before the unique name index')
1344
- .up(async (ctx) => {
1345
- await dedupeDomainDocsByName(ctx);
1346
- await backfillRemoteIngressHubSettings(ctx, options);
1347
- await backfillEmailServerSettings(ctx, options);
1348
- });
1349
- if (compareSemver(targetVersion, domainNameUniqueMigrationBaseVersion) > 0) {
1350
- if (compareSemver(targetVersion, emailOutboundEgressSettingsMigrationVersion) >= 0) {
1351
- migration
1352
- .step('backfill-remote-ingress-hub-settings-before-email-egress')
1353
- .from(domainNameUniqueMigrationBaseVersion).to(emailOutboundEgressSettingsMigrationPreviousVersion)
1354
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1355
- .up(async (ctx) => {
1356
- await backfillRemoteIngressHubSettings(ctx, options);
1357
- await backfillEmailServerSettings(ctx, options);
1358
- })
1359
- .step('backfill-email-outbound-and-remote-ingress-egress-settings')
1360
- .from(emailOutboundEgressSettingsMigrationPreviousVersion).to(emailOutboundEgressSettingsMigrationVersion)
1361
- .description('Backfill email outbound mode and default-disabled RemoteIngress edge egress policy')
1362
- .up(async (ctx) => {
1363
- await backfillEmailOutboundAndRemoteIngressEgressSettings(ctx, options);
1364
- });
1365
- if (compareSemver(targetVersion, emailOutboundEgressSettingsMigrationVersion) > 0) {
1366
- if (compareSemver(targetVersion, mailOverEdgesMigrationVersion) >= 0) {
1367
- migration
1368
- .step('mail-over-edges-defaults')
1369
- .from(emailOutboundEgressSettingsMigrationVersion).to(mailOverEdgesMigrationVersion)
1370
- .description('Default email outbound mode to remoteIngress and backfill CachedEmail direction metadata')
1371
- .up(async (ctx) => {
1372
- await flipEmailOutboundModeToRemoteIngress(ctx);
1373
- await backfillCachedEmailDirections(ctx);
1374
- await backfillRemoteIngressHubSettings(ctx, options);
1375
- await backfillEmailServerSettings(ctx, options);
1376
- });
1377
- if (compareSemver(targetVersion, mailOverEdgesMigrationVersion) > 0) {
1378
- if (compareSemver(targetVersion, cachedEmailStatusIndexMigrationVersion) >= 0) {
1379
- migration
1380
- .step('backfill-remote-ingress-hub-settings-before-cached-email-status-index')
1381
- .from(mailOverEdgesMigrationVersion).to(cachedEmailStatusIndexPreviousVersion)
1382
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1383
- .up(async (ctx) => {
1384
- await backfillRemoteIngressHubSettings(ctx, options);
1385
- await backfillEmailServerSettings(ctx, options);
1386
- });
1387
- migration
1388
- .step('index-cached-email-status')
1389
- .from(cachedEmailStatusIndexPreviousVersion).to(cachedEmailStatusIndexMigrationVersion)
1390
- .description('Index CachedEmail.status for bounded spool delivery scans')
1391
- .up(async (ctx) => {
1392
- const collection = ctx.mongo.collection('CachedEmail');
1393
- await collection.createIndex({ status: 1 }, { name: 'status_1' });
1394
- ctx.log.log('info', 'index-cached-email-status: ensured CachedEmail.status index');
1395
- });
1396
- if (compareSemver(targetVersion, cachedEmailStatusIndexMigrationVersion) > 0) {
1397
- if (compareSemver(targetVersion, emailDnsLifecycleMigrationVersion) >= 0) {
1398
- migration
1399
- .step('email-dns-lifecycle')
1400
- .from(cachedEmailStatusIndexMigrationVersion).to(emailDnsLifecycleMigrationVersion)
1401
- .description('Add durable email DNS lifecycle state, unique domains, and explicit managed record ownership')
1402
- .up(async (ctx) => {
1403
- await migrateEmailDnsLifecycle(ctx);
1404
- await backfillRemoteIngressHubSettings(ctx, options);
1405
- await backfillEmailServerSettings(ctx, options);
1406
- });
1407
- if (compareSemver(targetVersion, smartMtaManagedStorageMigrationVersion) >= 0) {
1408
- migration
1409
- .step('migrate-smartmta-managed-storage')
1410
- .from(emailDnsLifecycleMigrationVersion).to(smartMtaManagedStorageMigrationVersion)
1411
- .description('Import legacy SmartMTA text state into SmartData and repair sparse DNS ownership indexing')
1412
- .up(async (ctx) => {
1413
- await migrateSmartMtaManagedStorage(ctx, options);
1414
- await backfillRemoteIngressHubSettings(ctx, options);
1415
- await backfillEmailServerSettings(ctx, options);
1416
- });
1417
- if (compareSemver(targetVersion, smartMtaManagedStorageMigrationVersion) > 0) {
1418
- if (compareSemver(targetVersion, emailDnsProviderProvenanceMigrationVersion) >= 0) {
1419
- migration
1420
- .step('bridge-smartmta-storage-to-dcrouter-17')
1421
- .from(smartMtaManagedStorageMigrationVersion).to(emailDnsProviderProvenancePreviousVersion)
1422
- .description('Bridge SmartMTA storage schema to dcrouter 17.0.0')
1423
- .up(async (ctx) => {
1424
- await backfillRemoteIngressHubSettings(ctx, options);
1425
- await backfillEmailServerSettings(ctx, options);
1426
- })
1427
- .step('email-dns-provider-provenance')
1428
- .from(emailDnsProviderProvenancePreviousVersion).to(emailDnsProviderProvenanceMigrationVersion)
1429
- .description('Backfill durable provider-zone provenance for safe email DNS cleanup')
1430
- .up(async (ctx) => {
1431
- await migrateCachedEmailRawContentToBlobStorage(ctx, options);
1432
- await migrateEmailDnsProviderProvenance(ctx);
1433
- await backfillRemoteIngressHubSettings(ctx, options);
1434
- await backfillEmailServerSettings(ctx, options);
1435
- });
1436
- if (compareSemver(targetVersion, emailDnsProviderProvenanceMigrationVersion) > 0) {
1437
- if (compareSemver(targetVersion, ipIntelligenceRetentionMigrationVersion) >= 0) {
1438
- migration
1439
- .step('bridge-email-dns-provenance-to-ip-intelligence-retention')
1440
- .from(emailDnsProviderProvenanceMigrationVersion).to(ipIntelligenceRetentionPreviousVersion)
1441
- .description('Bridge email DNS provenance to the IP intelligence retention migration')
1442
- .up(async (ctx) => {
1443
- await backfillRemoteIngressHubSettings(ctx, options);
1444
- await backfillEmailServerSettings(ctx, options);
1445
- })
1446
- .step('bound-ip-intelligence-retention')
1447
- .from(ipIntelligenceRetentionPreviousVersion).to(ipIntelligenceRetentionMigrationVersion)
1448
- .description('Reset and index the rebuildable bounded IP intelligence cache')
1449
- .resumable()
1450
- .up(async (ctx) => {
1451
- await migrateIpIntelligenceRetention(ctx);
1452
- await backfillRemoteIngressHubSettings(ctx, options);
1453
- await backfillEmailServerSettings(ctx, options);
1454
- });
1455
- if (compareSemver(targetVersion, ipIntelligenceRetentionMigrationVersion) > 0) {
1456
- if (compareSemver(targetVersion, gatewayCredentialPolicyMigrationVersion) >= 0) {
1457
- migration
1458
- .step('gateway-credential-policy-bindings')
1459
- .from(ipIntelligenceRetentionMigrationVersion).to(gatewayCredentialPolicyMigrationVersion)
1460
- .description('Bind legacy gateway credentials to a durable live policy generation')
1461
- .up(async (ctx) => {
1462
- await migrateGatewayCredentialPolicyBindings(ctx);
1463
- await backfillRemoteIngressHubSettings(ctx, options);
1464
- await backfillEmailServerSettings(ctx, options);
1465
- });
1466
- if (compareSemver(targetVersion, gatewayCredentialPolicyMigrationVersion) > 0) {
1467
- if (compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) >= 0) {
1468
- migration
1469
- .step('bridge-gateway-credential-policy-to-service-mail-idempotency')
1470
- .from(gatewayCredentialPolicyMigrationVersion).to(serviceMailIdempotencyPreviousVersion)
1471
- .description('Bridge dcrouter releases before the service-mail idempotency index')
1472
- .up(async (ctx) => {
1473
- await backfillRemoteIngressHubSettings(ctx, options);
1474
- await backfillEmailServerSettings(ctx, options);
1475
- })
1476
- .step('index-service-mail-idempotency')
1477
- .from(serviceMailIdempotencyPreviousVersion).to(serviceMailIdempotencyMigrationVersion)
1478
- .description('Repair replay metadata and create the credential-scoped sparse unique service-mail index')
1479
- .up(async (ctx) => {
1480
- await migrateServiceMailIdempotencyIndex(ctx);
1481
- });
1482
- if (compareSemver(targetVersion, webPushSchemaMigrationVersion) >= 0) {
1483
- migration
1484
- .step('web-push-provider-schema')
1485
- .from(webPushSchemaPreviousVersion).to(webPushSchemaMigrationVersion)
1486
- .description('Create durable Web Push binding, delivery, idempotency, and retention indexes')
1487
- .up(async (ctx) => {
1488
- await migrateWebPushProviderSchema(ctx);
1489
- await backfillRemoteIngressHubSettings(ctx, options);
1490
- await backfillEmailServerSettings(ctx, options);
1491
- });
1492
- if (compareSemver(targetVersion, routeIngressPolicyMigrationVersion) >= 0) {
1493
- migration
1494
- .step('backfill-route-ingress-policies')
1495
- .from(routeIngressPolicyPreviousVersion).to(routeIngressPolicyMigrationVersion)
1496
- .description('Preserve existing route reachability with explicit direct hub and SmartVPN ingress policy')
1497
- .up(async (ctx) => {
1498
- await backfillRouteIngressPolicies(ctx);
1499
- await backfillRemoteIngressHubSettings(ctx, options);
1500
- await backfillEmailServerSettings(ctx, options);
1501
- });
1502
- if (compareSemver(targetVersion, routeIngressPolicyMigrationVersion) > 0) {
1503
- if (compareSemver(targetVersion, sourceProfileNetworkNormalizationMigrationVersion) >= 0) {
1504
- migration
1505
- .step('normalize-private-source-profile-networks')
1506
- .from(routeIngressPolicyMigrationVersion).to(sourceProfileNetworkNormalizationMigrationVersion)
1507
- .description('Normalize legacy private source-profile wildcards to valid CIDR notation')
1508
- .up(async (ctx) => {
1509
- await normalizeLegacyPrivateSourceProfileNetworks(ctx);
1510
- await backfillRemoteIngressHubSettings(ctx, options);
1511
- await backfillEmailServerSettings(ctx, options);
1512
- });
1513
- if (compareSemver(targetVersion, sourceProfileNetworkNormalizationMigrationVersion) > 0) {
1514
- if (compareSemver(targetVersion, gatewayDnsProxyIntentMigrationVersion) >= 0) {
1515
- migration
1516
- .step('backfill-gateway-dns-proxy-intent')
1517
- .from(sourceProfileNetworkNormalizationMigrationVersion).to(gatewayDnsProxyIntentMigrationVersion)
1518
- .description('Recover gateway route DNS proxy intent from owned provider record state')
1519
- .up(async (ctx) => {
1520
- await backfillGatewayDnsProxyIntent(ctx);
1521
- await backfillRemoteIngressHubSettings(ctx, options);
1522
- await backfillEmailServerSettings(ctx, options);
1523
- });
1524
- if (compareSemver(targetVersion, gatewayDnsProxyIntentMigrationVersion) > 0) {
1525
- if (compareSemver(targetVersion, legacyCentralEuDeliverRouteMigrationVersion) >= 0) {
1526
- migration
1527
- .step('remove-legacy-central-eu-deliver-route')
1528
- .from(gatewayDnsProxyIntentMigrationVersion).to(legacyCentralEuDeliverRouteMigrationVersion)
1529
- .description('Remove the legacy central.eu-incoming deliver route so accepted mail falls through to the domain inbound store policy')
1530
- .up(async (ctx) => {
1531
- // Backfills run first so a leapfrog upgrade that seeds the
1532
- // settings doc (including the legacy route) in this very
1533
- // step is normalized before the step completes.
1534
- await backfillRemoteIngressHubSettings(ctx, options);
1535
- await backfillEmailServerSettings(ctx, options);
1536
- await removeLegacyCentralEuDeliverRoute(ctx);
1537
- });
1538
- if (compareSemver(targetVersion, legacyCentralEuDeliverRouteMigrationVersion) > 0) {
1539
- if (compareSemver(targetVersion, smtpAuthAccountsMigrationVersion) >= 0) {
1540
- migration
1541
- .step('convert-legacy-smtp-auth-users')
1542
- .from(legacyCentralEuDeliverRouteMigrationVersion).to(smtpAuthAccountsMigrationVersion)
1543
- .description('Convert legacy plaintext emailConfig.auth.users into hashed SMTP account documents and strip the plaintext from persisted settings')
1544
- .up(async (ctx) => {
1545
- // Backfills run first so a leapfrog upgrade that seeds
1546
- // the settings doc (including plaintext users) in this
1547
- // very step is normalized before the step completes.
1548
- await backfillRemoteIngressHubSettings(ctx, options);
1549
- await backfillEmailServerSettings(ctx, options);
1550
- await removeLegacyCentralEuDeliverRoute(ctx);
1551
- await convertLegacySmtpAuthUsers(ctx);
1552
- });
1553
- if (compareSemver(targetVersion, smtpAuthAccountsMigrationVersion) > 0) {
1554
- if (compareSemver(targetVersion, monitoringEventsMigrationVersion) >= 0) {
1555
- migration
1556
- .step('create-monitoring-event-indexes')
1557
- .from(smtpAuthAccountsMigrationVersion).to(monitoringEventsMigrationVersion)
1558
- .description('Create durable authentication event and email traffic bucket indexes')
1559
- .up(async (ctx) => {
1560
- await backfillRemoteIngressHubSettings(ctx, options);
1561
- await backfillEmailServerSettings(ctx, options);
1562
- await removeLegacyCentralEuDeliverRoute(ctx);
1563
- await convertLegacySmtpAuthUsers(ctx);
1564
- await createMonitoringEventIndexes(ctx);
1565
- });
1566
- if (compareSemver(targetVersion, monitoringEventsMigrationVersion) > 0) {
1567
- if (compareSemver(targetVersion, cachedEmailAcceptedAtIndexMigrationVersion) >= 0) {
1568
- migration
1569
- .step('index-cached-email-accepted-at')
1570
- .from(monitoringEventsMigrationVersion).to(cachedEmailAcceptedAtIndexMigrationVersion)
1571
- .description('Index CachedEmail.acceptedAt for retained email traffic and security views')
1572
- .up(async (ctx) => {
1573
- await backfillRemoteIngressHubSettings(ctx, options);
1574
- await backfillEmailServerSettings(ctx, options);
1575
- await removeLegacyCentralEuDeliverRoute(ctx);
1576
- await convertLegacySmtpAuthUsers(ctx);
1577
- await createCachedEmailAcceptedAtIndex(ctx);
1578
- });
1579
- if (compareSemver(targetVersion, cachedEmailAcceptedAtIndexMigrationVersion) > 0) {
1580
- if (compareSemver(targetVersion, cachedEmailSecurityDispositionMigrationVersion) >= 0) {
1581
- migration
1582
- .step('backfill-cached-email-security-disposition')
1583
- .from(cachedEmailAcceptedAtIndexMigrationVersion).to(cachedEmailSecurityDispositionMigrationVersion)
1584
- .description('Classify retained inbound authentication results without overwriting delivery state')
1585
- .up(async (ctx) => {
1586
- await backfillRemoteIngressHubSettings(ctx, options);
1587
- await backfillEmailServerSettings(ctx, options);
1588
- await removeLegacyCentralEuDeliverRoute(ctx);
1589
- await convertLegacySmtpAuthUsers(ctx);
1590
- await backfillCachedEmailSecurityDisposition(ctx);
1591
- });
1592
- if (compareSemver(targetVersion, cachedEmailSecurityDispositionMigrationVersion) > 0) {
1593
- if (compareSemver(targetVersion, gatewayMailDomainAuthorityMigrationVersion) >= 0) {
1594
- migration
1595
- .step('bridge-cached-email-security-disposition-to-gateway-mail-domain-authority')
1596
- .from(cachedEmailSecurityDispositionMigrationVersion).to(gatewayMailDomainAuthorityPreviousVersion)
1597
- .description('Bridge the 18.5.0 release before migrating WorkApp mail identity authority')
1598
- .up(async (ctx) => {
1599
- await backfillRemoteIngressHubSettings(ctx, options);
1600
- await backfillEmailServerSettings(ctx, options);
1601
- await removeLegacyCentralEuDeliverRoute(ctx);
1602
- await convertLegacySmtpAuthUsers(ctx);
1603
- })
1604
- .step('migrate-gateway-mail-domain-authority')
1605
- .from(gatewayMailDomainAuthorityPreviousVersion).to(gatewayMailDomainAuthorityMigrationVersion)
1606
- .description('Move WorkApp mail identities into authoritative owner/domain SmartData documents')
1607
- .up(async (ctx) => {
1608
- await backfillRemoteIngressHubSettings(ctx, options);
1609
- await backfillEmailServerSettings(ctx, options);
1610
- await removeLegacyCentralEuDeliverRoute(ctx);
1611
- await convertLegacySmtpAuthUsers(ctx);
1612
- await migrateGatewayMailDomainAuthority(ctx);
1613
- });
1614
- if (compareSemver(targetVersion, smartDb5ManagedRecordKeyRepairMigrationVersion) >= 0) {
1615
- migration
1616
- .step('repair-smartdb5-managed-record-key-index')
1617
- .from(gatewayMailDomainAuthorityMigrationVersion).to(smartDb5ManagedRecordKeyRepairMigrationVersion)
1618
- .description('Replace the legacy partial managedRecordKey index with a SmartDB 5-compatible sparse unique index')
1619
- .up(async (ctx) => {
1620
- await backfillRemoteIngressHubSettings(ctx, options);
1621
- await backfillEmailServerSettings(ctx, options);
1622
- await removeLegacyCentralEuDeliverRoute(ctx);
1623
- await convertLegacySmtpAuthUsers(ctx);
1624
- await repairManagedRecordKeyIndex(ctx, 'smartdb5-managed-record-key-index');
1625
- });
1626
- if (compareSemver(targetVersion, testingAccessMigrationVersion) >= 0) {
1627
- migration
1628
- .step('testing-access-and-exact-certificate-identities')
1629
- .from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(testingAccessMigrationVersion)
1630
- .description('Isolate exact certificates and initialize durable testing access and recovery indexes')
1631
- .up(async (ctx) => {
1632
- await backfillRemoteIngressHubSettings(ctx, options);
1633
- await backfillEmailServerSettings(ctx, options);
1634
- await removeLegacyCentralEuDeliverRoute(ctx);
1635
- await convertLegacySmtpAuthUsers(ctx);
1636
- await migrateTestingAccess(ctx);
1637
- });
1638
- }
1639
- else if (compareSemver(targetVersion, smartDb5ManagedRecordKeyRepairMigrationVersion) > 0) {
1640
- migration
1641
- .step('backfill-settings-after-smartdb5-managed-record-key-repair')
1642
- .from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(targetVersion)
1643
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1644
- .up(async (ctx) => {
1645
- await backfillRemoteIngressHubSettings(ctx, options);
1646
- await backfillEmailServerSettings(ctx, options);
1647
- await removeLegacyCentralEuDeliverRoute(ctx);
1648
- await convertLegacySmtpAuthUsers(ctx);
1649
- });
1650
- }
1651
- }
1652
- else if (compareSemver(targetVersion, gatewayMailDomainAuthorityMigrationVersion) > 0) {
1653
- migration
1654
- .step('backfill-settings-after-gateway-mail-domain-authority')
1655
- .from(gatewayMailDomainAuthorityMigrationVersion).to(targetVersion)
1656
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1657
- .up(async (ctx) => {
1658
- await backfillRemoteIngressHubSettings(ctx, options);
1659
- await backfillEmailServerSettings(ctx, options);
1660
- await removeLegacyCentralEuDeliverRoute(ctx);
1661
- await convertLegacySmtpAuthUsers(ctx);
1662
- });
1663
- }
1664
- }
1665
- else {
1666
- migration
1667
- .step('backfill-settings-after-cached-email-security-disposition')
1668
- .from(cachedEmailSecurityDispositionMigrationVersion).to(targetVersion)
1669
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1670
- .up(async (ctx) => {
1671
- await backfillRemoteIngressHubSettings(ctx, options);
1672
- await backfillEmailServerSettings(ctx, options);
1673
- await removeLegacyCentralEuDeliverRoute(ctx);
1674
- await convertLegacySmtpAuthUsers(ctx);
1675
- });
1676
- }
1677
- }
1678
- }
1679
- else {
1680
- migration
1681
- .step('backfill-settings-after-cached-email-accepted-at-index')
1682
- .from(cachedEmailAcceptedAtIndexMigrationVersion).to(targetVersion)
1683
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1684
- .up(async (ctx) => {
1685
- await backfillRemoteIngressHubSettings(ctx, options);
1686
- await backfillEmailServerSettings(ctx, options);
1687
- await removeLegacyCentralEuDeliverRoute(ctx);
1688
- await convertLegacySmtpAuthUsers(ctx);
1689
- });
1690
- }
1691
- }
1692
- }
1693
- else {
1694
- migration
1695
- .step('backfill-settings-after-monitoring-event-indexes')
1696
- .from(monitoringEventsMigrationVersion).to(targetVersion)
1697
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1698
- .up(async (ctx) => {
1699
- await backfillRemoteIngressHubSettings(ctx, options);
1700
- await backfillEmailServerSettings(ctx, options);
1701
- // Later bridges must keep every settings safeguard:
1702
- // legacy bootstrap config can reintroduce retired
1703
- // routes and plaintext SMTP auth users.
1704
- await removeLegacyCentralEuDeliverRoute(ctx);
1705
- await convertLegacySmtpAuthUsers(ctx);
1706
- });
1707
- }
1708
- }
1709
- }
1710
- else {
1711
- migration
1712
- .step('backfill-settings-after-smtp-auth-account-conversion')
1713
- .from(smtpAuthAccountsMigrationVersion).to(targetVersion)
1714
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1715
- .up(async (ctx) => {
1716
- await backfillRemoteIngressHubSettings(ctx, options);
1717
- await backfillEmailServerSettings(ctx, options);
1718
- await removeLegacyCentralEuDeliverRoute(ctx);
1719
- await convertLegacySmtpAuthUsers(ctx);
1720
- });
1721
- }
1722
- }
1723
- }
1724
- else {
1725
- migration
1726
- .step('backfill-settings-after-legacy-deliver-route-removal')
1727
- .from(legacyCentralEuDeliverRouteMigrationVersion).to(targetVersion)
1728
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1729
- .up(async (ctx) => {
1730
- await backfillRemoteIngressHubSettings(ctx, options);
1731
- await backfillEmailServerSettings(ctx, options);
1732
- // The backfill re-seeds emailConfig from a legacy
1733
- // config.json whenever the persisted doc lost it, so
1734
- // every later upgrade must strip the legacy route again.
1735
- await removeLegacyCentralEuDeliverRoute(ctx);
1736
- });
1737
- }
1738
- }
1739
- }
1740
- else {
1741
- migration
1742
- .step('backfill-settings-after-gateway-dns-proxy-intent')
1743
- .from(gatewayDnsProxyIntentMigrationVersion).to(targetVersion)
1744
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1745
- .up(async (ctx) => {
1746
- await backfillRemoteIngressHubSettings(ctx, options);
1747
- await backfillEmailServerSettings(ctx, options);
1748
- });
1749
- }
1750
- }
1751
- }
1752
- else {
1753
- migration
1754
- .step('backfill-settings-after-source-profile-network-normalization')
1755
- .from(sourceProfileNetworkNormalizationMigrationVersion).to(targetVersion)
1756
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1757
- .up(async (ctx) => {
1758
- await backfillRemoteIngressHubSettings(ctx, options);
1759
- await backfillEmailServerSettings(ctx, options);
1760
- });
1761
- }
1762
- }
1763
- }
1764
- else {
1765
- migration
1766
- .step('backfill-settings-after-route-ingress-policies')
1767
- .from(routeIngressPolicyMigrationVersion).to(targetVersion)
1768
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1769
- .up(async (ctx) => {
1770
- await backfillRemoteIngressHubSettings(ctx, options);
1771
- await backfillEmailServerSettings(ctx, options);
1772
- });
1773
- }
1774
- }
1775
- }
1776
- else if (compareSemver(targetVersion, webPushSchemaMigrationVersion) > 0) {
1777
- migration
1778
- .step('backfill-settings-after-web-push-provider-schema')
1779
- .from(webPushSchemaMigrationVersion).to(targetVersion)
1780
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1781
- .up(async (ctx) => {
1782
- await backfillRemoteIngressHubSettings(ctx, options);
1783
- await backfillEmailServerSettings(ctx, options);
1784
- });
1785
- }
1786
- }
1787
- else if (compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) > 0) {
1788
- migration
1789
- .step('backfill-settings-after-service-mail-idempotency')
1790
- .from(serviceMailIdempotencyMigrationVersion).to(targetVersion)
1791
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1792
- .up(async (ctx) => {
1793
- await backfillRemoteIngressHubSettings(ctx, options);
1794
- await backfillEmailServerSettings(ctx, options);
1795
- });
1796
- }
1797
- }
1798
- else {
1799
- migration
1800
- .step('backfill-settings-after-gateway-credential-policy-bindings')
1801
- .from(gatewayCredentialPolicyMigrationVersion).to(targetVersion)
1802
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1803
- .up(async (ctx) => {
1804
- await backfillRemoteIngressHubSettings(ctx, options);
1805
- await backfillEmailServerSettings(ctx, options);
1806
- });
1807
- }
1808
- }
1809
- }
1810
- else {
1811
- migration
1812
- .step('backfill-remote-ingress-hub-settings-after-ip-intelligence-retention')
1813
- .from(ipIntelligenceRetentionMigrationVersion).to(targetVersion)
1814
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1815
- .up(async (ctx) => {
1816
- await backfillRemoteIngressHubSettings(ctx, options);
1817
- await backfillEmailServerSettings(ctx, options);
1818
- });
1819
- }
1820
- }
1821
- }
1822
- else {
1823
- migration
1824
- .step('backfill-remote-ingress-hub-settings-after-email-dns-provenance')
1825
- .from(emailDnsProviderProvenanceMigrationVersion).to(targetVersion)
1826
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1827
- .up(async (ctx) => {
1828
- await backfillRemoteIngressHubSettings(ctx, options);
1829
- await backfillEmailServerSettings(ctx, options);
1830
- });
1831
- }
1832
- }
1833
- }
1834
- else {
1835
- migration
1836
- .step('backfill-remote-ingress-hub-settings-after-smartmta-storage')
1837
- .from(smartMtaManagedStorageMigrationVersion).to(targetVersion)
1838
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1839
- .up(async (ctx) => {
1840
- await backfillRemoteIngressHubSettings(ctx, options);
1841
- await backfillEmailServerSettings(ctx, options);
1842
- });
1843
- }
1844
- }
1845
- }
1846
- }
1847
- else {
1848
- migration
1849
- .step('backfill-remote-ingress-hub-settings-after-cached-email-status-index')
1850
- .from(cachedEmailStatusIndexMigrationVersion).to(targetVersion)
1851
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1852
- .up(async (ctx) => {
1853
- await backfillRemoteIngressHubSettings(ctx, options);
1854
- await backfillEmailServerSettings(ctx, options);
1855
- });
1856
- }
1857
- }
1858
- }
1859
- else {
1860
- migration
1861
- .step('backfill-remote-ingress-hub-settings-after-mail-over-edges')
1862
- .from(mailOverEdgesMigrationVersion).to(targetVersion)
1863
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1864
- .up(async (ctx) => {
1865
- await backfillRemoteIngressHubSettings(ctx, options);
1866
- await backfillEmailServerSettings(ctx, options);
1867
- });
1868
- }
1869
- }
1870
- }
1871
- else {
1872
- migration
1873
- .step('backfill-remote-ingress-hub-settings-after-email-egress')
1874
- .from(emailOutboundEgressSettingsMigrationVersion).to(targetVersion)
1875
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1876
- .up(async (ctx) => {
1877
- await backfillRemoteIngressHubSettings(ctx, options);
1878
- await backfillEmailServerSettings(ctx, options);
1879
- });
1880
- }
1881
- }
1882
- }
1883
- else {
1884
- migration
1885
- .step('backfill-remote-ingress-hub-settings')
1886
- .from(domainNameUniqueMigrationBaseVersion).to(targetVersion)
1887
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1888
- .up(async (ctx) => {
1889
- await backfillRemoteIngressHubSettings(ctx, options);
1890
- await backfillEmailServerSettings(ctx, options);
1891
- });
1892
- }
1893
- }
1894
- }
1895
- else {
1896
- migration
1897
- .step('backfill-remote-ingress-hub-settings')
1898
- .from(gatewayClientRoutePublicSourceMigrationVersion).to(targetVersion)
1899
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1900
- .up(async (ctx) => {
1901
- await backfillRemoteIngressHubSettings(ctx, options);
1902
- await backfillEmailServerSettings(ctx, options);
1903
- });
1904
- }
1905
- }
1906
- }
1907
- else {
1908
- migration
1909
- .step('backfill-remote-ingress-hub-settings')
1910
- .from(gatewayClientRouteMetadataMigrationVersion).to(targetVersion)
1911
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1912
- .up(async (ctx) => {
1913
- await backfillRemoteIngressHubSettings(ctx, options);
1914
- await backfillEmailServerSettings(ctx, options);
1915
- });
1916
- }
1917
- }
1918
- }
1919
- else if (compareSemver(targetVersion, remoteIngressHubSettingsMigrationBaseVersion) > 0) {
1920
- migration
1921
- .step('backfill-remote-ingress-hub-settings')
1922
- .from(remoteIngressHubSettingsMigrationBaseVersion).to(targetVersion)
1923
- .description('Backfill DB-backed singleton runtime settings from legacy bootstrap config')
1924
- .up(async (ctx) => {
1925
- await backfillRemoteIngressHubSettings(ctx, options);
1926
- await backfillEmailServerSettings(ctx, options);
1927
- });
1928
- }
1929
- return migration;
966
+ if (!reaches(smartDb5ManagedRecordKeyRepairMigrationVersion))
967
+ return finish(gatewayMailDomainAuthorityMigrationVersion);
968
+ migration
969
+ .step('repair-smartdb5-managed-record-key-index')
970
+ .from(gatewayMailDomainAuthorityMigrationVersion).to(smartDb5ManagedRecordKeyRepairMigrationVersion)
971
+ .description('Replace the legacy partial managedRecordKey index with a SmartDB 5-compatible sparse unique index')
972
+ .up(async (ctx) => {
973
+ await backfillRemoteIngressHubSettings(ctx, options);
974
+ await backfillEmailServerSettings(ctx, options);
975
+ await removeLegacyCentralEuDeliverRoute(ctx);
976
+ await convertLegacySmtpAuthUsers(ctx);
977
+ await repairManagedRecordKeyIndex(ctx, 'smartdb5-managed-record-key-index');
978
+ });
979
+ if (!reaches(testingAccessMigrationVersion))
980
+ return finish(smartDb5ManagedRecordKeyRepairMigrationVersion);
981
+ migration
982
+ .step('testing-access-and-exact-certificate-identities')
983
+ .from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(testingAccessMigrationVersion)
984
+ .description('Isolate exact certificates and initialize durable testing access and recovery indexes')
985
+ .up(async (ctx) => {
986
+ await backfillRemoteIngressHubSettings(ctx, options);
987
+ await backfillEmailServerSettings(ctx, options);
988
+ await removeLegacyCentralEuDeliverRoute(ctx);
989
+ await convertLegacySmtpAuthUsers(ctx);
990
+ await migrateTestingAccess(ctx);
991
+ });
992
+ if (!reaches(webPushEncryptionContextMigrationVersion))
993
+ return finish(testingAccessMigrationVersion);
994
+ migration
995
+ .step('webpush-encryption-context')
996
+ .from(testingAccessMigrationVersion).to(webPushEncryptionContextMigrationVersion)
997
+ .description('Reseal every Web Push envelope under the associated data of interfaces 32')
998
+ .resumable()
999
+ .up(async (ctx) => {
1000
+ await migrateWebPushEncryptionContext(ctx, options);
1001
+ });
1002
+ if (!reaches(coreMailPeerVerifierFormatMigrationVersion))
1003
+ return finish(webPushEncryptionContextMigrationVersion);
1004
+ migration
1005
+ .step('coremail-peer-verifier-format')
1006
+ .from(webPushEncryptionContextMigrationVersion).to(coreMailPeerVerifierFormatMigrationVersion)
1007
+ .description('Rewrite stored CoreMail gateway peer verifier formats to the unsuffixed argon2id contract token')
1008
+ .up(async (ctx) => {
1009
+ await migrateCoreMailPeerVerifierFormat(ctx);
1010
+ });
1011
+ if (!reaches(gatewayClientHostRouteKeyMigrationVersion))
1012
+ return finish(coreMailPeerVerifierFormatMigrationVersion);
1013
+ migration
1014
+ .step('host-route-key')
1015
+ .from(coreMailPeerVerifierFormatMigrationVersion).to(gatewayClientHostRouteKeyMigrationVersion)
1016
+ .description('Rewrite stored gateway-client route keys to the unsuffixed combined host-route prefix')
1017
+ .resumable()
1018
+ .up(async (ctx) => {
1019
+ await migrateGatewayClientHostRouteKey(ctx);
1020
+ });
1021
+ return finish(gatewayClientHostRouteKeyMigrationVersion);
1930
1022
  }
1931
- const domainNameUniqueMigrationBaseVersion = '15.0.5';
1932
- const emailOutboundEgressSettingsMigrationPreviousVersion = '15.6.1';
1933
- const emailOutboundEgressSettingsMigrationVersion = '15.6.2';
1934
- const mailOverEdgesMigrationVersion = '16.0.0';
1935
- const cachedEmailStatusIndexPreviousVersion = '16.4.0';
1936
- const cachedEmailStatusIndexMigrationVersion = '16.4.1';
1937
- const emailDnsLifecycleMigrationVersion = '16.5.0';
1938
- const smartMtaManagedStorageMigrationVersion = '16.5.1';
1939
- const emailDnsProviderProvenancePreviousVersion = '17.0.0';
1940
- const emailDnsProviderProvenanceMigrationVersion = '17.1.0';
1941
- const ipIntelligenceRetentionPreviousVersion = '17.1.4';
1942
- const ipIntelligenceRetentionMigrationVersion = '17.1.5';
1943
- const gatewayCredentialPolicyMigrationVersion = '17.3.0';
1944
1023
  const serviceMailIdempotencyPreviousVersion = '17.7.2';
1945
1024
  const serviceMailIdempotencyMigrationVersion = '17.7.3';
1946
1025
  const webPushSchemaPreviousVersion = serviceMailIdempotencyMigrationVersion;
@@ -1958,12 +1037,14 @@ const gatewayMailDomainAuthorityPreviousVersion = '18.5.0';
1958
1037
  const gatewayMailDomainAuthorityMigrationVersion = '18.6.0';
1959
1038
  const smartDb5ManagedRecordKeyRepairMigrationVersion = '18.8.0';
1960
1039
  const testingAccessMigrationVersion = '19.1.0';
1961
- const cachedEmailRawContentMigrationBatchSize = 25;
1040
+ const webPushEncryptionContextMigrationVersion = '19.2.0';
1041
+ const coreMailPeerVerifierFormatMigrationVersion = '32.0.0';
1042
+ const gatewayClientHostRouteKeyMigrationVersion = '32.0.1';
1962
1043
  const legacyWorkAppMailIdentityStorageKey = '/workhosters/mail-identities.json';
1963
1044
  const gatewayMailDomainOwnerIndexName = 'gateway_mail_domain_owner_domain_unique';
1964
1045
  function normalizeGatewayMailDomainMigrationDocument(documentArg) {
1965
1046
  if (!documentArg || typeof documentArg !== 'object' || Array.isArray(documentArg)) {
1966
- throw new Error('GatewayMailDomainDoc must be an object');
1047
+ throw new DcRouterMigrationError('GatewayMailDomainDoc must be an object');
1967
1048
  }
1968
1049
  const owner = normalizeGatewayMailDomainOwner({
1969
1050
  gatewayClientType: documentArg.ownerGatewayClientType,
@@ -1972,14 +1053,14 @@ function normalizeGatewayMailDomainMigrationDocument(documentArg) {
1972
1053
  const domain = normalizeGatewayMailDomain(documentArg.domain);
1973
1054
  const expectedId = createGatewayMailDomainId(owner, domain);
1974
1055
  if (documentArg.id !== expectedId) {
1975
- throw new Error(`GatewayMailDomainDoc has a non-canonical id: ${documentArg.id}`);
1056
+ throw new DcRouterMigrationError(`GatewayMailDomainDoc has a non-canonical id: ${documentArg.id}`);
1976
1057
  }
1977
1058
  const groups = groupGatewayMailIdentities(documentArg.identities || []);
1978
1059
  if (groups.length !== 1 || groups[0].id !== expectedId) {
1979
- throw new Error(`GatewayMailDomainDoc identities do not match owner/domain: ${expectedId}`);
1060
+ throw new DcRouterMigrationError(`GatewayMailDomainDoc identities do not match owner/domain: ${expectedId}`);
1980
1061
  }
1981
1062
  if (!Number.isSafeInteger(documentArg.createdAt) || !Number.isSafeInteger(documentArg.updatedAt)) {
1982
- throw new Error(`GatewayMailDomainDoc timestamps are invalid: ${expectedId}`);
1063
+ throw new DcRouterMigrationError(`GatewayMailDomainDoc timestamps are invalid: ${expectedId}`);
1983
1064
  }
1984
1065
  return {
1985
1066
  id: expectedId,
@@ -1997,14 +1078,14 @@ function parseLegacyWorkAppMailIdentities(documentArg) {
1997
1078
  || documentArg.id !== expectedId
1998
1079
  || documentArg.key !== legacyWorkAppMailIdentityStorageKey
1999
1080
  || typeof documentArg.value !== 'string') {
2000
- throw new Error('Legacy WorkApp mail identity storage document is corrupt');
1081
+ throw new DcRouterMigrationError('Legacy WorkApp mail identity storage document is corrupt');
2001
1082
  }
2002
1083
  let parsed;
2003
1084
  try {
2004
1085
  parsed = JSON.parse(documentArg.value);
2005
1086
  }
2006
1087
  catch (error) {
2007
- throw new Error(`Legacy WorkApp mail identity JSON is malformed: ${error.message}`);
1088
+ throw new DcRouterMigrationError(`Legacy WorkApp mail identity JSON is malformed: ${error.message}`);
2008
1089
  }
2009
1090
  if (Array.isArray(parsed))
2010
1091
  return parsed;
@@ -2012,7 +1093,7 @@ function parseLegacyWorkAppMailIdentities(documentArg) {
2012
1093
  || typeof parsed !== 'object'
2013
1094
  || parsed.version !== 1
2014
1095
  || !Array.isArray(parsed.identities)) {
2015
- throw new Error('Legacy WorkApp mail identity state must use version 1 with an identities array');
1096
+ throw new DcRouterMigrationError('Legacy WorkApp mail identity state must use version 1 with an identities array');
2016
1097
  }
2017
1098
  return parsed.identities;
2018
1099
  }
@@ -2045,7 +1126,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2045
1126
  normalized.domain,
2046
1127
  ]);
2047
1128
  if (canonicalKeys.has(canonicalKey) || existingById.has(normalized.id)) {
2048
- throw new Error(`Conflicting GatewayMailDomainDoc authority: ${normalized.id}`);
1129
+ throw new DcRouterMigrationError(`Conflicting GatewayMailDomainDoc authority: ${normalized.id}`);
2049
1130
  }
2050
1131
  canonicalKeys.add(canonicalKey);
2051
1132
  existingById.set(normalized.id, normalized);
@@ -2054,7 +1135,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2054
1135
  for (const existingDocument of existingById.values()) {
2055
1136
  const desiredDocument = desiredById.get(existingDocument.id);
2056
1137
  if (!desiredDocument || JSON.stringify(existingDocument) !== JSON.stringify(desiredDocument)) {
2057
- throw new Error(`GatewayMailDomainDoc conflicts with legacy authority: ${existingDocument.id}`);
1138
+ throw new DcRouterMigrationError(`GatewayMailDomainDoc conflicts with legacy authority: ${existingDocument.id}`);
2058
1139
  }
2059
1140
  }
2060
1141
  for (const desiredDocument of desiredDocuments) {
@@ -2071,7 +1152,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2071
1152
  ? [...desiredDocuments].sort((leftArg, rightArg) => leftArg.id.localeCompare(rightArg.id))
2072
1153
  : normalizedPersisted;
2073
1154
  if (JSON.stringify(normalizedPersisted) !== JSON.stringify(expectedDocuments)) {
2074
- throw new Error('GatewayMailDomainDoc migration verification failed');
1155
+ throw new DcRouterMigrationError('GatewayMailDomainDoc migration verification failed');
2075
1156
  }
2076
1157
  await domainCollection.createIndex({
2077
1158
  ownerGatewayClientType: 1,
@@ -2090,7 +1171,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2090
1171
  ownerGatewayClientId: 1,
2091
1172
  domain: 1,
2092
1173
  })) {
2093
- throw new Error('GatewayMailDomainDoc unique owner/domain index verification failed');
1174
+ throw new DcRouterMigrationError('GatewayMailDomainDoc unique owner/domain index verification failed');
2094
1175
  }
2095
1176
  if (sourceDocument) {
2096
1177
  const deleted = await storageCollection.deleteOne({
@@ -2100,7 +1181,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
2100
1181
  value: sourceDocument.value,
2101
1182
  });
2102
1183
  if (deleted.deletedCount !== 1) {
2103
- throw new Error('Legacy WorkApp mail identity authority changed during migration');
1184
+ throw new DcRouterMigrationError('Legacy WorkApp mail identity authority changed during migration');
2104
1185
  }
2105
1186
  }
2106
1187
  ctx.log.log('info', `migrate-gateway-mail-domain-authority: verified ${normalizedPersisted.length} owner/domain document(s)`);
@@ -2213,148 +1294,6 @@ async function createMonitoringEventIndexes(ctx) {
2213
1294
  ]);
2214
1295
  ctx.log.log('info', 'create-monitoring-event-indexes: ensured authentication and email traffic indexes');
2215
1296
  }
2216
- async function lstatOrNull(targetPath) {
2217
- try {
2218
- return await nodeFs.lstat(targetPath);
2219
- }
2220
- catch (error) {
2221
- if (error.code === 'ENOENT')
2222
- return null;
2223
- throw error;
2224
- }
2225
- }
2226
- function assertLegacyPathContained(rootPath, targetPath) {
2227
- const resolvedRoot = nodePath.resolve(rootPath);
2228
- const resolvedTarget = nodePath.resolve(targetPath);
2229
- if (resolvedTarget !== resolvedRoot
2230
- && !resolvedTarget.startsWith(`${resolvedRoot}${nodePath.sep}`)) {
2231
- throw new Error(`Legacy SmartMTA path escapes configured root: ${targetPath}`);
2232
- }
2233
- }
2234
- async function collectLegacySmartMtaEntry(rootPath, relativePath, recursive, entries) {
2235
- const targetPath = nodePath.resolve(rootPath, relativePath);
2236
- assertLegacyPathContained(rootPath, targetPath);
2237
- const stat = await lstatOrNull(targetPath);
2238
- if (!stat)
2239
- return;
2240
- if (stat.isSymbolicLink()) {
2241
- throw new Error(`Legacy SmartMTA migration refuses symbolic link: ${targetPath}`);
2242
- }
2243
- if (stat.isDirectory()) {
2244
- if (!recursive) {
2245
- throw new Error(`Expected regular legacy SmartMTA file: ${targetPath}`);
2246
- }
2247
- const children = await nodeFs.readdir(targetPath);
2248
- for (const child of children.sort()) {
2249
- await collectLegacySmartMtaEntry(rootPath, nodePath.join(relativePath, child), true, entries);
2250
- }
2251
- return;
2252
- }
2253
- if (!stat.isFile()) {
2254
- throw new Error(`Legacy SmartMTA migration refuses non-regular file: ${targetPath}`);
2255
- }
2256
- const storageKey = normalizeSmartMtaStorageKey(`/${relativePath.split(nodePath.sep).join('/')}`);
2257
- const namespace = getSmartMtaTextNamespace(storageKey);
2258
- if (stat.size > namespace.maxBytes) {
2259
- throw new Error(`Legacy SmartMTA file ${targetPath} exceeds ${namespace.maxBytes} bytes`);
2260
- }
2261
- const contents = await nodeFs.readFile(targetPath);
2262
- let value;
2263
- try {
2264
- value = new TextDecoder('utf-8', { fatal: true }).decode(contents);
2265
- }
2266
- catch {
2267
- throw new Error(`Legacy SmartMTA file is not valid UTF-8: ${targetPath}`);
2268
- }
2269
- validateSmartMtaTextValue(storageKey, value);
2270
- entries.push({
2271
- key: storageKey,
2272
- value,
2273
- createdAt: stat.birthtime?.toISOString?.() || stat.mtime.toISOString(),
2274
- });
2275
- }
2276
- function validateSmartMtaStorageDocument(document) {
2277
- const normalizedKey = normalizeSmartMtaStorageKey(document.key);
2278
- const expectedId = hashSmartMtaStorageKey(normalizedKey);
2279
- if (document._id !== expectedId
2280
- || document.id !== expectedId
2281
- || document.key !== normalizedKey
2282
- || typeof document.value !== 'string') {
2283
- throw new Error(`Corrupt SmartMtaStorageDoc encountered during migration: ${document._id}`);
2284
- }
2285
- validateSmartMtaTextValue(document.key, document.value);
2286
- }
2287
- function validateDkimPair(domain, selector, privateKeyPem, publicKeyPem) {
2288
- let privateKey;
2289
- let publicKey;
2290
- try {
2291
- privateKey = nodeCrypto.createPrivateKey(privateKeyPem);
2292
- publicKey = nodeCrypto.createPublicKey(publicKeyPem);
2293
- }
2294
- catch (error) {
2295
- throw new Error(`Invalid DKIM PEM for ${selector}._domainkey.${domain}: ${error.message}`);
2296
- }
2297
- const derivedPublicKey = nodeCrypto.createPublicKey(privateKeyPem).export({
2298
- type: 'spki',
2299
- format: 'der',
2300
- });
2301
- const storedPublicKey = publicKey.export({
2302
- type: 'spki',
2303
- format: 'der',
2304
- });
2305
- if (derivedPublicKey.length !== storedPublicKey.length
2306
- || !nodeCrypto.timingSafeEqual(derivedPublicKey, storedPublicKey)) {
2307
- throw new Error(`DKIM private/public key mismatch for ${selector}._domainkey.${domain}`);
2308
- }
2309
- const rsaKeySize = privateKey.asymmetricKeyDetails?.modulusLength;
2310
- return {
2311
- domain,
2312
- selector,
2313
- publicKey: storedPublicKey.toString('base64'),
2314
- keySize: rsaKeySize || (privateKey.asymmetricKeyType === 'ed25519' ? 256 : 2048),
2315
- };
2316
- }
2317
- function extractDkimPairs(storageDocuments) {
2318
- const grouped = new Map();
2319
- for (const document of storageDocuments) {
2320
- validateSmartMtaStorageDocument(document);
2321
- const segments = document.key.split('/').filter(Boolean);
2322
- if (segments[0] !== 'email' || segments[1] !== 'dkim')
2323
- continue;
2324
- let domain;
2325
- let selector;
2326
- let filename;
2327
- if (segments.length === 4) {
2328
- [, , domain, filename] = segments;
2329
- selector = 'default';
2330
- }
2331
- else if (segments.length === 5) {
2332
- [, , domain, selector, filename] = segments;
2333
- }
2334
- else {
2335
- continue;
2336
- }
2337
- if (filename !== 'private.key' && filename !== 'public.key')
2338
- continue;
2339
- domain = domain.trim().toLowerCase();
2340
- selector = selector.trim().toLowerCase();
2341
- const groupKey = `${domain}\0${selector}`;
2342
- const group = grouped.get(groupKey) || { domain, selector };
2343
- if (filename === 'private.key')
2344
- group.privateKey = document.value;
2345
- if (filename === 'public.key')
2346
- group.publicKey = document.value;
2347
- grouped.set(groupKey, group);
2348
- }
2349
- const pairs = [];
2350
- for (const group of grouped.values()) {
2351
- if (!group.privateKey || !group.publicKey) {
2352
- throw new Error(`Incomplete DKIM keypair for ${group.selector}._domainkey.${group.domain}`);
2353
- }
2354
- pairs.push(validateDkimPair(group.domain, group.selector, group.privateKey, group.publicKey));
2355
- }
2356
- return pairs;
2357
- }
2358
1297
  async function repairManagedRecordKeyIndex(ctx, logPrefix) {
2359
1298
  const collection = ctx.mongo.collection('DnsRecordDoc');
2360
1299
  if (typeof collection.dropIndex === 'function') {
@@ -2384,408 +1323,6 @@ async function repairManagedRecordKeyIndex(ctx, logPrefix) {
2384
1323
  });
2385
1324
  ctx.log.log('info', `${logPrefix}: repaired managedRecordKey index and removed ${cleaned} non-string key(s)`);
2386
1325
  }
2387
- async function migrateSmartMtaManagedStorage(ctx, options) {
2388
- const storageCollection = ctx.mongo.collection('SmartMtaStorageDoc');
2389
- const legacyRoot = options.legacySmartMtaStoragePath;
2390
- let imported = 0;
2391
- let existing = 0;
2392
- if (legacyRoot) {
2393
- const rootStat = await lstatOrNull(legacyRoot);
2394
- if (rootStat?.isSymbolicLink()) {
2395
- throw new Error(`Legacy SmartMTA storage root must not be a symbolic link: ${legacyRoot}`);
2396
- }
2397
- if (rootStat && !rootStat.isDirectory()) {
2398
- throw new Error(`Legacy SmartMTA storage root must be a directory: ${legacyRoot}`);
2399
- }
2400
- const legacyEntries = [];
2401
- for (const relativePath of [
2402
- 'email/dkim',
2403
- 'email/dns',
2404
- 'email/bounces',
2405
- 'email/templates',
2406
- 'security',
2407
- ]) {
2408
- await collectLegacySmartMtaEntry(legacyRoot, relativePath, true, legacyEntries);
2409
- }
2410
- for (const relativePath of [
2411
- 'email/routes/config.json',
2412
- 'workhosters/mail-identities.json',
2413
- ]) {
2414
- await collectLegacySmartMtaEntry(legacyRoot, relativePath, false, legacyEntries);
2415
- }
2416
- for (const entry of legacyEntries) {
2417
- const id = hashSmartMtaStorageKey(entry.key);
2418
- const stored = await storageCollection.findOne({ _id: id });
2419
- if (stored) {
2420
- validateSmartMtaStorageDocument(stored);
2421
- if (stored.key !== entry.key || stored.value !== entry.value) {
2422
- throw new Error(`Legacy SmartMTA storage conflict for ${entry.key}`);
2423
- }
2424
- existing++;
2425
- continue;
2426
- }
2427
- const now = new Date().toISOString();
2428
- await storageCollection.insertOne({
2429
- _id: id,
2430
- id,
2431
- key: entry.key,
2432
- value: entry.value,
2433
- createdAt: entry.createdAt,
2434
- updatedAt: now,
2435
- });
2436
- imported++;
2437
- }
2438
- }
2439
- const dkimDocuments = await storageCollection.find({
2440
- key: {
2441
- $gte: '/email/dkim/',
2442
- $lt: '/email/dkim/\uffff',
2443
- },
2444
- }).toArray();
2445
- const dkimPairs = extractDkimPairs(dkimDocuments);
2446
- const pairsByDomain = new Map(dkimPairs.map((pair) => [`${pair.domain}\0${pair.selector}`, pair]));
2447
- const emailCollection = ctx.mongo.collection('EmailDomainDoc');
2448
- const emailDomains = await emailCollection.find({}).toArray();
2449
- let hydratedDomains = 0;
2450
- for (const emailDomain of emailDomains) {
2451
- const domain = String(emailDomain.domain || '').trim().toLowerCase();
2452
- const selector = String(emailDomain.dkim?.selector || 'default').trim().toLowerCase();
2453
- const pair = pairsByDomain.get(`${domain}\0${selector}`);
2454
- if (!pair)
2455
- continue;
2456
- const setPatch = {};
2457
- if (typeof emailDomain.dkim?.publicKey !== 'string' || !emailDomain.dkim.publicKey.trim()) {
2458
- setPatch['dkim.publicKey'] = pair.publicKey;
2459
- }
2460
- if (!emailDomain.activeDkim) {
2461
- setPatch.activeDkim = {
2462
- selector: pair.selector,
2463
- keySize: Number(emailDomain.dkim?.keySize) || pair.keySize,
2464
- publicKey: pair.publicKey,
2465
- createdAt: String(emailDomain.createdAt || new Date().toISOString()),
2466
- };
2467
- }
2468
- const reconciliationErrors = Array.isArray(emailDomain.reconciliation?.errors)
2469
- ? emailDomain.reconciliation.errors
2470
- : [];
2471
- if (reconciliationErrors.some((error) => error?.code === 'DKIM_KEY_UNAVAILABLE')) {
2472
- setPatch.reconciliation = {
2473
- ...emailDomain.reconciliation,
2474
- lifecycleStatus: 'pending',
2475
- desiredGeneration: Number(emailDomain.reconciliation?.desiredGeneration || 0) + 1,
2476
- errors: reconciliationErrors.filter((error) => error?.code !== 'DKIM_KEY_UNAVAILABLE'),
2477
- retryAt: new Date().toISOString(),
2478
- };
2479
- }
2480
- if (Object.keys(setPatch).length > 0) {
2481
- await emailCollection.updateOne({ _id: emailDomain._id }, { $set: setPatch });
2482
- hydratedDomains++;
2483
- }
2484
- }
2485
- await repairManagedRecordKeyIndex(ctx, 'smartmta-managed-storage');
2486
- ctx.log.log('info', `smartmta-managed-storage: imported ${imported}, already present ${existing}, validated ${dkimPairs.length} DKIM pair(s), hydrated ${hydratedDomains} domain(s)`);
2487
- }
2488
- async function migrateEmailDnsLifecycle(ctx) {
2489
- const emailCollection = ctx.mongo.collection('EmailDomainDoc');
2490
- const dnsCollection = ctx.mongo.collection('DnsRecordDoc');
2491
- const emailDocs = await emailCollection.find({}).toArray();
2492
- const byDomain = new Map();
2493
- for (const doc of emailDocs) {
2494
- const normalizedDomain = String(doc.domain || '').trim().toLowerCase();
2495
- if (!normalizedDomain)
2496
- continue;
2497
- if (doc.domain !== normalizedDomain) {
2498
- await emailCollection.updateOne({ _id: doc._id }, { $set: { domain: normalizedDomain } });
2499
- doc.domain = normalizedDomain;
2500
- }
2501
- const group = byDomain.get(normalizedDomain) || [];
2502
- group.push(doc);
2503
- byDomain.set(normalizedDomain, group);
2504
- }
2505
- let duplicateDomainsRemoved = 0;
2506
- for (const [domain, docs] of byDomain) {
2507
- docs.sort((a, b) => String(a.createdAt || '').localeCompare(String(b.createdAt || '')));
2508
- const survivor = docs[0];
2509
- for (const duplicate of docs.slice(1)) {
2510
- const patch = {};
2511
- for (const field of ['rateLimits', 'remoteIngress']) {
2512
- if (survivor[field] === undefined && duplicate[field] !== undefined) {
2513
- patch[field] = duplicate[field];
2514
- survivor[field] = duplicate[field];
2515
- }
2516
- }
2517
- if (Object.keys(patch).length > 0) {
2518
- await emailCollection.updateOne({ _id: survivor._id }, { $set: patch });
2519
- }
2520
- await emailCollection.deleteOne({ _id: duplicate._id });
2521
- duplicateDomainsRemoved++;
2522
- }
2523
- const dkim = survivor.dkim || {};
2524
- const publicKey = typeof dkim.publicKey === 'string' ? dkim.publicKey.trim() : '';
2525
- const now = new Date().toISOString();
2526
- const setPatch = {};
2527
- if (!Number.isInteger(dkim.retirementOverlapDays)) {
2528
- setPatch['dkim.retirementOverlapDays'] = 30;
2529
- }
2530
- if (!survivor.reconciliation) {
2531
- setPatch.reconciliation = {
2532
- lifecycleStatus: 'pending',
2533
- desiredGeneration: 1,
2534
- intents: [],
2535
- errors: [{
2536
- code: 'EGRESS_IDENTITY_PROOF_UNAVAILABLE',
2537
- message: 'RemoteIngress egress identity proof is unavailable until the capability release is consumed',
2538
- retryable: true,
2539
- }],
2540
- capability: {
2541
- egressIdentityProof: 'unsupported',
2542
- selectorCorrectSigning: dkim.selector === 'default' ? 'supported' : 'unsupported',
2543
- },
2544
- retryAt: new Date(Date.now() + 300_000).toISOString(),
2545
- };
2546
- }
2547
- if (publicKey && !survivor.activeDkim) {
2548
- setPatch.activeDkim = {
2549
- selector: String(dkim.selector || 'default'),
2550
- keySize: Number(dkim.keySize) || 2048,
2551
- publicKey,
2552
- createdAt: String(survivor.createdAt || now),
2553
- };
2554
- }
2555
- if (Object.keys(setPatch).length > 0) {
2556
- await emailCollection.updateOne({ _id: survivor._id }, { $set: setPatch });
2557
- }
2558
- byDomain.set(domain, [survivor]);
2559
- }
2560
- await emailCollection.createIndex({ domain: 1 }, { name: 'email_domain_unique', unique: true });
2561
- const survivingEmails = (await emailCollection.find({}).toArray());
2562
- const claimedKeys = new Set();
2563
- let adoptedRecords = 0;
2564
- for await (const record of dnsCollection.find({
2565
- managedRecordKey: { $exists: false },
2566
- createdBy: { $in: ['mail-edge-sync', 'email-domain-manager'] },
2567
- })) {
2568
- const type = String(record.type || '');
2569
- const name = String(record.name || '').toLowerCase();
2570
- const value = String(record.value || '').trim();
2571
- let managedOwnerId = '';
2572
- let managedRecordKey = '';
2573
- if (record.createdBy === 'mail-edge-sync' && ['A', 'AAAA'].includes(type)) {
2574
- managedOwnerId = `topology:legacy:${name}:${value}`;
2575
- managedRecordKey = `mail-topology:legacy:${type}:${name}:${value}`;
2576
- }
2577
- else if (record.createdBy === 'email-domain-manager') {
2578
- const candidates = survivingEmails.filter((email) => {
2579
- if (String(email.linkedDomainId) !== String(record.domainId))
2580
- return false;
2581
- const domain = String(email.domain || '').toLowerCase();
2582
- const selector = String(email.dkim?.selector || 'default').toLowerCase();
2583
- return name === domain
2584
- || name === `_dmarc.${domain}`
2585
- || name === `${selector}._domainkey.${domain}`
2586
- || name === `mx.${domain}`;
2587
- });
2588
- if (candidates.length === 1) {
2589
- managedOwnerId = `domain:${candidates[0].id}`;
2590
- managedRecordKey = `mail-domain:${candidates[0].id}:${type}:${name}:${value}`;
2591
- }
2592
- }
2593
- if (!managedRecordKey || claimedKeys.has(managedRecordKey)) {
2594
- continue;
2595
- }
2596
- claimedKeys.add(managedRecordKey);
2597
- await dnsCollection.updateOne({ _id: record._id }, { $set: { managedBy: 'mail-dns-reconciler', managedOwnerId, managedRecordKey } });
2598
- adoptedRecords++;
2599
- }
2600
- await repairManagedRecordKeyIndex(ctx, 'email-dns-lifecycle');
2601
- ctx.log.log('info', `email-dns-lifecycle: removed ${duplicateDomainsRemoved} duplicate domain(s), adopted ${adoptedRecords} unambiguous legacy record(s)`);
2602
- }
2603
- async function dedupeDomainDocsByName(ctx) {
2604
- const collection = ctx.mongo.collection('DomainDoc');
2605
- const docs = await collection.find({}).toArray();
2606
- const seen = new Map();
2607
- let removed = 0;
2608
- const sorted = [...docs].sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
2609
- for (const doc of sorted) {
2610
- const name = String(doc.name || '').toLowerCase();
2611
- if (!name)
2612
- continue;
2613
- if (seen.has(name)) {
2614
- await collection.deleteOne({ _id: doc._id });
2615
- removed++;
2616
- }
2617
- else {
2618
- seen.set(name, doc);
2619
- }
2620
- }
2621
- ctx.log.log('info', `dedupe-domain-docs-by-name: removed ${removed} duplicate domain doc(s)`);
2622
- }
2623
- async function migrateEmailDnsProviderProvenance(ctx) {
2624
- const emailCollection = ctx.mongo.collection('EmailDomainDoc');
2625
- const domainCollection = ctx.mongo.collection('DomainDoc');
2626
- const dnsCollection = ctx.mongo.collection('DnsRecordDoc');
2627
- const domains = await domainCollection.find({}).toArray();
2628
- const providerZoneIds = new Set(domains
2629
- .filter((domain) => domain?.source === 'provider')
2630
- .map((domain) => String(domain.id || domain._id || ''))
2631
- .filter(Boolean));
2632
- const records = await dnsCollection.find({}).toArray();
2633
- const retainedRecords = [];
2634
- let normalizedProviderIds = 0;
2635
- let deletedStaleProviderMirrors = 0;
2636
- for (const record of records) {
2637
- if (typeof record.providerRecordId === 'string' && !record.providerRecordId.trim()) {
2638
- const identitySelector = record._id !== undefined && record._id !== null
2639
- ? { _id: record._id }
2640
- : typeof record.id === 'string' && record.id.trim()
2641
- ? { id: record.id }
2642
- : undefined;
2643
- if (!identitySelector) {
2644
- throw new Error('DnsRecordDoc with empty providerRecordId has no usable identity');
2645
- }
2646
- if (record.source === 'synced'
2647
- && providerZoneIds.has(String(record.domainId || ''))) {
2648
- const result = await dnsCollection.deleteOne({
2649
- ...identitySelector,
2650
- source: 'synced',
2651
- providerRecordId: record.providerRecordId,
2652
- });
2653
- deletedStaleProviderMirrors += result.deletedCount || 0;
2654
- continue;
2655
- }
2656
- await dnsCollection.updateOne({ ...identitySelector, providerRecordId: record.providerRecordId }, { $unset: { providerRecordId: '' } });
2657
- delete record.providerRecordId;
2658
- normalizedProviderIds++;
2659
- }
2660
- retainedRecords.push(record);
2661
- }
2662
- let backfilledDomains = 0;
2663
- let backfilledActiveRevisionGenerations = 0;
2664
- for (const email of await emailCollection.find({}).toArray()) {
2665
- const reconciliation = email.reconciliation;
2666
- const activeRevision = reconciliation?.activeRevision;
2667
- const desiredGeneration = reconciliation?.desiredGeneration;
2668
- const identitySelector = email._id !== undefined && email._id !== null
2669
- ? { _id: email._id }
2670
- : typeof email.id === 'string' && email.id.trim()
2671
- ? { id: email.id }
2672
- : undefined;
2673
- if (!identitySelector) {
2674
- throw new Error('EmailDomainDoc has no usable identity');
2675
- }
2676
- if (reconciliation?.lifecycleStatus === 'active'
2677
- && activeRevision
2678
- && typeof activeRevision === 'object'
2679
- && Number.isInteger(desiredGeneration)
2680
- && !Object.prototype.hasOwnProperty.call(activeRevision, 'generation')) {
2681
- const result = await emailCollection.updateOne({
2682
- ...identitySelector,
2683
- 'reconciliation.lifecycleStatus': 'active',
2684
- 'reconciliation.desiredGeneration': desiredGeneration,
2685
- 'reconciliation.activeRevision': { $exists: true },
2686
- 'reconciliation.activeRevision.generation': { $exists: false },
2687
- }, { $set: { 'reconciliation.activeRevision.generation': desiredGeneration } });
2688
- if ((result.modifiedCount || 0) > 0) {
2689
- activeRevision.generation = desiredGeneration;
2690
- backfilledActiveRevisionGenerations++;
2691
- }
2692
- }
2693
- if (Array.isArray(email.reconciliation?.providerZoneIds))
2694
- continue;
2695
- const provenance = new Set();
2696
- if (providerZoneIds.has(String(email.linkedDomainId || ''))) {
2697
- provenance.add(String(email.linkedDomainId));
2698
- }
2699
- for (const intent of Array.isArray(email.reconciliation?.intents)
2700
- ? email.reconciliation.intents
2701
- : []) {
2702
- const zoneId = String(intent?.domainId || '');
2703
- if (providerZoneIds.has(zoneId))
2704
- provenance.add(zoneId);
2705
- }
2706
- const ownerId = `domain:${String(email.id || email._id || '')}`;
2707
- for (const record of retainedRecords) {
2708
- const zoneId = String(record.domainId || '');
2709
- if (record.managedBy === 'mail-dns-reconciler'
2710
- && record.managedOwnerId === ownerId
2711
- && providerZoneIds.has(zoneId))
2712
- provenance.add(zoneId);
2713
- }
2714
- await emailCollection.updateOne(identitySelector, { $set: { 'reconciliation.providerZoneIds': [...provenance].sort() } });
2715
- backfilledDomains++;
2716
- }
2717
- ctx.log.log('info', `email-dns-provider-provenance: backfilled ${backfilledDomains} provider provenance set(s) and ${backfilledActiveRevisionGenerations} active revision generation(s), deleted ${deletedStaleProviderMirrors} stale provider mirror(s), normalized ${normalizedProviderIds} other empty provider id(s)`);
2718
- }
2719
- async function migrateCachedEmailRawContentToBlobStorage(ctx, options) {
2720
- const collection = ctx.mongo.collection('CachedEmail');
2721
- let migratedCount = 0;
2722
- while (true) {
2723
- const legacyEmails = await collection
2724
- .find({
2725
- rawContent: { $exists: true },
2726
- rawContentObjectKey: { $exists: false },
2727
- })
2728
- .sort({ acceptedAt: 1, _id: 1 })
2729
- .limit(cachedEmailRawContentMigrationBatchSize)
2730
- .toArray();
2731
- if (legacyEmails.length === 0)
2732
- break;
2733
- const blobStorage = options.legacyRawMessageBlobStorage;
2734
- if (!blobStorage) {
2735
- throw new Error('SmartBucket storage is unavailable for the 17.1.0 CachedEmail rawContent migration');
2736
- }
2737
- for (const legacyEmail of legacyEmails) {
2738
- const id = typeof legacyEmail.id === 'string' ? legacyEmail.id.trim() : '';
2739
- if (!id) {
2740
- throw new Error('Legacy CachedEmail has a missing or malformed id');
2741
- }
2742
- if (typeof legacyEmail.rawContent !== 'string') {
2743
- throw new Error(`Legacy CachedEmail ${id} has invalid inline RFC822 data`);
2744
- }
2745
- const rawMessage = Buffer.from(legacyEmail.rawContent, 'utf8');
2746
- const objectKey = `/email/messages/${id}.eml`;
2747
- await blobStorage.set(objectKey, rawMessage);
2748
- const persistedRawMessage = await blobStorage.get(objectKey);
2749
- if (!persistedRawMessage || !Buffer.from(persistedRawMessage).equals(rawMessage)) {
2750
- throw new Error(`SmartBucket verification failed for legacy CachedEmail ${id}`);
2751
- }
2752
- const identitySelector = legacyEmail._id === undefined
2753
- ? { id }
2754
- : { _id: legacyEmail._id, id };
2755
- const completed = await collection.updateOne({
2756
- ...identitySelector,
2757
- rawContent: legacyEmail.rawContent,
2758
- rawContentObjectKey: { $exists: false },
2759
- }, {
2760
- $set: {
2761
- rawContentObjectKey: objectKey,
2762
- rawContentSize: rawMessage.length,
2763
- _updatedAt: new Date().toISOString(),
2764
- },
2765
- $unset: { rawContent: '' },
2766
- });
2767
- if (completed.modifiedCount !== 1) {
2768
- const current = await collection.findOne(identitySelector);
2769
- const currentPayload = await blobStorage.get(objectKey);
2770
- if (current?.rawContentObjectKey === objectKey
2771
- && current.rawContentSize === rawMessage.length
2772
- && !Object.prototype.hasOwnProperty.call(current, 'rawContent')
2773
- && currentPayload
2774
- && Buffer.from(currentPayload).equals(rawMessage)) {
2775
- continue;
2776
- }
2777
- throw new Error(`Legacy CachedEmail ${id} changed during migration`);
2778
- }
2779
- migratedCount++;
2780
- }
2781
- ctx.log.log('info', `migrate-cached-email-raw-content: completed batch of ${legacyEmails.length} payload(s); ${migratedCount} migrated total`);
2782
- }
2783
- ctx.log.log('info', `migrate-cached-email-raw-content: moved ${migratedCount} payload(s) to SmartBucket`);
2784
- }
2785
- function isMigrationNamespaceMissing(error) {
2786
- const candidate = error;
2787
- return candidate.code === 26 || candidate.codeName === 'NamespaceNotFound';
2788
- }
2789
1326
  async function migrateTestingAccess(ctx) {
2790
1327
  const certificates = ctx.mongo.collection('AcmeCertDoc');
2791
1328
  // One bounded, replayable batch at a time. PEM data is never rewritten.
@@ -2796,14 +1333,14 @@ async function migrateTestingAccess(ctx) {
2796
1333
  for (const certificate of legacy) {
2797
1334
  if (typeof certificate.domainName !== 'string' || !certificate.domainName
2798
1335
  || certificate.domainName !== certificate.domainName.trim())
2799
- throw new Error('Invalid legacy certificate domain');
1336
+ throw new DcRouterMigrationError('Invalid legacy certificate domain');
2800
1337
  const identityKey = `legacy:${certificate.domainName}`;
2801
1338
  if (certificate.identityKey !== undefined && certificate.identityKey !== identityKey) {
2802
- throw new Error('Conflicting legacy certificate identity');
1339
+ throw new DcRouterMigrationError('Conflicting legacy certificate identity');
2803
1340
  }
2804
1341
  const changed = await certificates.updateOne({ _id: certificate._id, kind: { $exists: false } }, { $set: { identityKey, kind: 'legacy' } });
2805
1342
  if (changed.modifiedCount !== 1)
2806
- throw new Error('Certificate changed during identity migration');
1343
+ throw new DcRouterMigrationError('Certificate changed during identity migration');
2807
1344
  }
2808
1345
  }
2809
1346
  await certificates.createIndex({ identityKey: 1 }, { name: 'identityKey_1', unique: true });
@@ -2848,21 +1385,310 @@ async function migrateTestingAccess(ctx) {
2848
1385
  ]);
2849
1386
  ctx.log.log('info', 'testing-access: isolated legacy certificate keys and initialized durable testing indexes');
2850
1387
  }
2851
- async function migrateIpIntelligenceRetention(ctx) {
2852
- // This collection contains rebuildable network-enrichment cache entries,
2853
- // not durable operator state. Resetting it is atomic, bounded, and safe to
2854
- // replay after a crash; preserving legacy rows would make startup depend on
2855
- // materializing or mutating an unbounded collection.
2856
- const collection = ctx.mongo.collection('IpIntelligenceDoc');
2857
- try {
2858
- await collection.drop();
1388
+ // -------------------------------------------- Web Push encryption context (32)
1389
+ /**
1390
+ * Associated data every Web Push envelope was sealed under before interfaces
1391
+ * 32.0.0 removed the shape version from the push payload contract. It is
1392
+ * private to this module on purpose: a superseded computation belongs to the
1393
+ * migration that retires it and must not be reachable from `ts/`.
1394
+ */
1395
+ const legacyWebPushAadShapeVersion = 1;
1396
+ const legacyWebPushEnvelopeVersion = 1;
1397
+ const webPushEncryptionContextChunkSize = 100;
1398
+ function buildLegacyWebPushAad(contextArg) {
1399
+ return Buffer.from(canonicalWebPushJson({
1400
+ schemaVersion: legacyWebPushAadShapeVersion,
1401
+ gatewayClientId: contextArg.gatewayClientId,
1402
+ appInstanceId: contextArg.appInstanceId,
1403
+ bindingId: contextArg.bindingId,
1404
+ documentType: contextArg.documentType,
1405
+ documentId: contextArg.documentId,
1406
+ }), 'utf8');
1407
+ }
1408
+ /**
1409
+ * A sealed envelope is pre-32 exactly when it still declares the shape version
1410
+ * the contract dropped. The discriminator is the stored shape, never a trial
1411
+ * decryption: a failed decryption cannot tell "already resealed" from "wrong
1412
+ * key" and would silently skip readable secrets.
1413
+ */
1414
+ function isLegacyWebPushEnvelope(valueArg) {
1415
+ return valueArg !== null
1416
+ && typeof valueArg === 'object'
1417
+ && !Array.isArray(valueArg)
1418
+ && valueArg.version !== undefined;
1419
+ }
1420
+ function openLegacyWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg) {
1421
+ if (envelopeArg.version !== legacyWebPushEnvelopeVersion
1422
+ || envelopeArg.algorithm !== 'aes-256-gcm') {
1423
+ throw new DcRouterMigrationError('Web Push envelope predates 32.0.0 but states an unknown format');
1424
+ }
1425
+ const key = keyRingArg.keys.get(envelopeArg.keyId);
1426
+ if (!key) {
1427
+ throw new DcRouterMigrationError(`Web Push envelope references key "${envelopeArg.keyId}", which the configured key ring does not hold`);
1428
+ }
1429
+ const decipher = nodeCrypto.createDecipheriv('aes-256-gcm', key, Buffer.from(envelopeArg.nonce, 'base64url'));
1430
+ decipher.setAAD(buildLegacyWebPushAad(aadContextArg));
1431
+ decipher.setAuthTag(Buffer.from(envelopeArg.tag, 'base64url'));
1432
+ return JSON.parse(Buffer.concat([
1433
+ decipher.update(Buffer.from(envelopeArg.ciphertext, 'base64url')),
1434
+ decipher.final(),
1435
+ ]).toString('utf8'));
1436
+ }
1437
+ /**
1438
+ * Reseal one envelope under the 32 associated data with a fresh nonce, then
1439
+ * read it back before the caller is allowed to store it: an envelope that
1440
+ * cannot be opened again is a lost secret, not a migration.
1441
+ */
1442
+ function resealWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg, transformPlaintextArg) {
1443
+ const plaintext = transformPlaintextArg(openLegacyWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg));
1444
+ const resealed = sealWebPushEnvelope(keyRingArg, plaintext, aadContextArg);
1445
+ const verified = openWebPushEnvelope(keyRingArg, resealed, aadContextArg);
1446
+ if (canonicalWebPushJson(verified) !== canonicalWebPushJson(plaintext)) {
1447
+ throw new DcRouterMigrationError('Resealed Web Push envelope did not decrypt to its original plaintext');
1448
+ }
1449
+ return resealed;
1450
+ }
1451
+ /** interfaces 32.0.0 removed `schemaVersion` from the push payload, so the resealed plaintext drops it. */
1452
+ function withoutWebPushPayloadShapeVersion(plaintextArg) {
1453
+ if (plaintextArg === null || typeof plaintextArg !== 'object' || Array.isArray(plaintextArg)) {
1454
+ return plaintextArg;
1455
+ }
1456
+ const payload = { ...plaintextArg };
1457
+ delete payload.schemaVersion;
1458
+ return payload;
1459
+ }
1460
+ function keepWebPushPlaintext(plaintextArg) {
1461
+ return plaintextArg;
1462
+ }
1463
+ async function resealWebPushBindings(collectionArg, keyRingArg, checkpointArg, logArg) {
1464
+ let cursor = (await checkpointArg?.read('bindingCursor')) ?? '';
1465
+ let resealed = 0;
1466
+ for (;;) {
1467
+ const chunk = await collectionArg
1468
+ .find({ id: { $gt: cursor } })
1469
+ .sort({ id: 1 })
1470
+ .limit(webPushEncryptionContextChunkSize)
1471
+ .toArray();
1472
+ if (chunk.length === 0)
1473
+ break;
1474
+ for (const document of chunk) {
1475
+ const owner = {
1476
+ gatewayClientId: String(document.ownerGatewayClientId),
1477
+ appInstanceId: String(document.ownerAppInstanceId),
1478
+ };
1479
+ const vapidKeys = Array.isArray(document.vapidKeys) ? document.vapidKeys : [];
1480
+ const recovery = document.credentialRotationRecovery;
1481
+ const update = {};
1482
+ const nextVapidKeys = vapidKeys.map((vapidKey) => {
1483
+ if (!isLegacyWebPushEnvelope(vapidKey?.privateKeyEnvelope))
1484
+ return vapidKey;
1485
+ return {
1486
+ ...vapidKey,
1487
+ privateKeyEnvelope: resealWebPushEnvelope(vapidKey.privateKeyEnvelope, {
1488
+ ...owner,
1489
+ bindingId: String(document.id),
1490
+ documentType: 'vapid-private-key',
1491
+ documentId: String(vapidKey.id),
1492
+ }, keyRingArg, keepWebPushPlaintext),
1493
+ };
1494
+ });
1495
+ if (nextVapidKeys.some((vapidKey, index) => vapidKey !== vapidKeys[index])) {
1496
+ update.vapidKeys = nextVapidKeys;
1497
+ }
1498
+ if (isLegacyWebPushEnvelope(recovery?.secretEnvelope)) {
1499
+ update.credentialRotationRecovery = {
1500
+ ...recovery,
1501
+ secretEnvelope: resealWebPushEnvelope(recovery.secretEnvelope, {
1502
+ ...owner,
1503
+ bindingId: String(document.id),
1504
+ documentType: 'credential-rotation-recovery',
1505
+ documentId: canonicalWebPushJson({
1506
+ lifecycleGeneration: recovery.lifecycleGeneration,
1507
+ requestedCredentialId: recovery.requestedCredentialId,
1508
+ resultingCredentialId: recovery.resultingCredentialId,
1509
+ }),
1510
+ }, keyRingArg, keepWebPushPlaintext),
1511
+ };
1512
+ }
1513
+ if (Object.keys(update).length > 0) {
1514
+ await collectionArg.updateOne({ _id: document._id }, { $set: update });
1515
+ resealed++;
1516
+ }
1517
+ cursor = String(document.id);
1518
+ }
1519
+ await checkpointArg?.write('bindingCursor', cursor);
2859
1520
  }
2860
- catch (error) {
2861
- if (!isMigrationNamespaceMissing(error))
2862
- throw error;
1521
+ logArg(`resealed ${resealed} binding document(s)`);
1522
+ }
1523
+ /**
1524
+ * Resolve a spool row's owner from its binding. It is read on demand rather
1525
+ * than collected during the binding walk, because that walk resumes from a
1526
+ * cursor and would otherwise hand the spool an owner map missing every binding
1527
+ * an earlier run already passed.
1528
+ */
1529
+ function createWebPushOwnerResolver(bindingCollectionArg) {
1530
+ const owners = new Map();
1531
+ return async (bindingIdArg) => {
1532
+ if (owners.has(bindingIdArg))
1533
+ return owners.get(bindingIdArg);
1534
+ const document = await bindingCollectionArg.findOne({ id: bindingIdArg });
1535
+ const owner = document
1536
+ ? {
1537
+ gatewayClientId: String(document.ownerGatewayClientId),
1538
+ appInstanceId: String(document.ownerAppInstanceId),
1539
+ }
1540
+ : undefined;
1541
+ owners.set(bindingIdArg, owner);
1542
+ return owner;
1543
+ };
1544
+ }
1545
+ async function resealWebPushSpool(collectionArg, resolveOwnerArg, keyRingArg, checkpointArg, logArg) {
1546
+ let cursor = (await checkpointArg?.read('spoolCursor')) ?? '';
1547
+ let resealed = 0;
1548
+ let orphaned = 0;
1549
+ for (;;) {
1550
+ const chunk = await collectionArg
1551
+ .find({ id: { $gt: cursor } })
1552
+ .sort({ id: 1 })
1553
+ .limit(webPushEncryptionContextChunkSize)
1554
+ .toArray();
1555
+ if (chunk.length === 0)
1556
+ break;
1557
+ for (const document of chunk) {
1558
+ cursor = String(document.id);
1559
+ const legacySubscription = isLegacyWebPushEnvelope(document.subscriptionEnvelope);
1560
+ const legacyPayload = isLegacyWebPushEnvelope(document.payloadEnvelope);
1561
+ if (!legacySubscription && !legacyPayload && document.schemaVersion === undefined)
1562
+ continue;
1563
+ const owner = await resolveOwnerArg(String(document.bindingId));
1564
+ if (!owner) {
1565
+ // The owning binding is gone, so no version of dcrouter can rebuild
1566
+ // this row's associated data or deliver it. It is left exactly as it
1567
+ // is rather than rewritten from a guess or deleted.
1568
+ orphaned++;
1569
+ continue;
1570
+ }
1571
+ const aadBase = {
1572
+ ...owner,
1573
+ bindingId: String(document.bindingId),
1574
+ documentId: String(document.id),
1575
+ };
1576
+ const update = {};
1577
+ if (legacySubscription) {
1578
+ update.subscriptionEnvelope = resealWebPushEnvelope(document.subscriptionEnvelope, { ...aadBase, documentType: 'spool-subscription' }, keyRingArg, keepWebPushPlaintext);
1579
+ }
1580
+ if (legacyPayload) {
1581
+ update.payloadEnvelope = resealWebPushEnvelope(document.payloadEnvelope, { ...aadBase, documentType: 'spool-payload' }, keyRingArg, withoutWebPushPayloadShapeVersion);
1582
+ }
1583
+ await collectionArg.updateOne({ _id: document._id }, {
1584
+ ...(Object.keys(update).length > 0 ? { $set: update } : {}),
1585
+ $unset: { schemaVersion: '' },
1586
+ });
1587
+ resealed++;
1588
+ }
1589
+ await checkpointArg?.write('spoolCursor', cursor);
1590
+ }
1591
+ logArg(`resealed ${resealed} spool document(s)`
1592
+ + (orphaned > 0 ? `; left ${orphaned} undeliverable row(s) whose binding no longer exists` : ''));
1593
+ }
1594
+ async function migrateWebPushEncryptionContext(ctx, options) {
1595
+ const bindings = ctx.mongo.collection('WebPushBindingDoc');
1596
+ const spool = ctx.mongo.collection('WebPushSpoolDoc');
1597
+ const hasSealedMaterial = Boolean(await bindings.findOne({}, { projection: { _id: 1 } })
1598
+ || await spool.findOne({}, { projection: { _id: 1 } }));
1599
+ if (!hasSealedMaterial) {
1600
+ ctx.log.log('info', 'webpush-encryption-context: no Web Push documents to reseal');
1601
+ return;
1602
+ }
1603
+ if (!options.webPushMasterKeyRing) {
1604
+ throw new DcRouterMigrationError('webpush-encryption-context: stored Web Push documents have to be resealed under the '
1605
+ + 'interfaces 32 associated data, but DCROUTER_WEB_PUSH_MASTER_KEY_RING is not configured');
1606
+ }
1607
+ const keyRing = parseWebPushKeyRing(options.webPushMasterKeyRing, 'DCROUTER_WEB_PUSH_MASTER_KEY_RING');
1608
+ await resealWebPushBindings(bindings, keyRing, ctx.checkpoint, (message) => ctx.log.log('info', `webpush-encryption-context: ${message}`));
1609
+ await resealWebPushSpool(spool, createWebPushOwnerResolver(bindings), keyRing, ctx.checkpoint, (message) => ctx.log.log('info', `webpush-encryption-context: ${message}`));
1610
+ }
1611
+ // ----------------------------------------- CoreMail peer verifier format (32)
1612
+ /** The verifier contract token CoreMail peers were stored under before interfaces 32.0.0. */
1613
+ const legacyCoreMailVerifierFormat = 'argon2id-v1';
1614
+ async function migrateCoreMailPeerVerifierFormat(ctx) {
1615
+ const collection = ctx.mongo.collection('CoreMailGatewayPeerDoc');
1616
+ const documents = await collection.find({}).sort({ id: 1 }).toArray();
1617
+ let migrated = 0;
1618
+ for (const document of documents) {
1619
+ const credentials = Array.isArray(document.credentials) ? document.credentials : [];
1620
+ if (!credentials.some((credential) => credential?.format === legacyCoreMailVerifierFormat)) {
1621
+ continue;
1622
+ }
1623
+ await collection.updateOne({ _id: document._id }, {
1624
+ $set: {
1625
+ credentials: credentials.map((credential) => (credential?.format === legacyCoreMailVerifierFormat
1626
+ ? { ...credential, format: coreMailVerifierFormat }
1627
+ : credential)),
1628
+ },
1629
+ });
1630
+ migrated++;
1631
+ }
1632
+ ctx.log.log('info', `coremail-peer-verifier-format: rewrote ${migrated} peer record(s)`);
1633
+ }
1634
+ // ----------------------------------------- Gateway-client route key (32.0.1)
1635
+ /** The combined gateway-client route key prefix releases 16.2.0 through 32.0.0 wrote. */
1636
+ const legacyGatewayClientHostRouteKeyPrefix = 'v2:host-route:';
1637
+ const gatewayClientHostRouteKeyChunkSize = 100;
1638
+ /**
1639
+ * Rewrite every stored `RouteDoc.metadata.externalKey` that still spells the combined
1640
+ * gateway-client route key with its released version token.
1641
+ *
1642
+ * The walk is ordered by `id` and resumes from a step-owned checkpoint cursor, and a document is
1643
+ * selected by the stored spelling alone, so a resumed or re-run step re-reads rewritten documents
1644
+ * without touching them. `updatedAt` is deliberately left alone: nothing about the route's
1645
+ * effective configuration changes here, and that field is the operator-visible edit state of
1646
+ * every gateway route.
1647
+ */
1648
+ async function migrateGatewayClientHostRouteKey(ctx) {
1649
+ const routes = ctx.mongo.collection('RouteDoc');
1650
+ let cursor = (await ctx.checkpoint?.read('routeCursor')) ?? '';
1651
+ let inspected = 0;
1652
+ let rewritten = 0;
1653
+ for (;;) {
1654
+ const chunk = await routes
1655
+ .find({ id: { $gt: cursor } })
1656
+ .sort({ id: 1 })
1657
+ .limit(gatewayClientHostRouteKeyChunkSize)
1658
+ .toArray();
1659
+ if (chunk.length === 0)
1660
+ break;
1661
+ for (const document of chunk) {
1662
+ cursor = String(document.id);
1663
+ inspected++;
1664
+ const externalKey = document.metadata?.externalKey;
1665
+ if (typeof externalKey !== 'string')
1666
+ continue;
1667
+ // The legacy token always follows the `<type>:<clientId>:<appId>:` ownership prefix, and the
1668
+ // payload it introduces is base64url, so the first occurrence is the only one.
1669
+ const legacyIndex = externalKey.indexOf(`:${legacyGatewayClientHostRouteKeyPrefix}`);
1670
+ if (legacyIndex < 0)
1671
+ continue;
1672
+ const routeKey = gatewayClientHostRouteKeyPrefix
1673
+ + externalKey.slice(legacyIndex + 1 + legacyGatewayClientHostRouteKeyPrefix.length);
1674
+ if (!parseGatewayClientHostRouteKey(routeKey)) {
1675
+ throw new DcRouterMigrationError(`host-route-key: route "${document.id}" stores the combined ownership key `
1676
+ + `"${externalKey}", whose payload does not decode into a hostname and route reference. `
1677
+ + 'No release can tell what it claimed. Delete that route or repair its '
1678
+ + 'metadata.externalKey, then start dcrouter again.');
1679
+ }
1680
+ const nextExternalKey = externalKey.slice(0, legacyIndex + 1) + routeKey;
1681
+ const update = { 'metadata.externalKey': nextExternalKey };
1682
+ // Only a name generated from the old key is machine-derived; an operator- or
1683
+ // producer-chosen name means what it says and is never rewritten.
1684
+ if (document.route?.name === buildGatewayClientRouteName(externalKey)) {
1685
+ update['route.name'] = buildGatewayClientRouteName(nextExternalKey);
1686
+ }
1687
+ await routes.updateOne({ _id: document._id }, { $set: update });
1688
+ rewritten++;
1689
+ }
1690
+ await ctx.checkpoint?.write('routeCursor', cursor);
2863
1691
  }
2864
- await collection.createIndex({ ipAddress: 1 }, { name: 'ipAddress_1', unique: true });
2865
- await collection.createIndex({ lastSeenAt: -1, _id: -1 }, { name: 'lastSeenAt_-1__id_-1' });
2866
- ctx.log.log('info', 'bound-ip-intelligence-retention: reset rebuildable cache and recreated indexes');
1692
+ ctx.log.log('info', `host-route-key: rewrote ${rewritten} of ${inspected} route(s)`);
2867
1693
  }
2868
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQix5QkFBeUIsR0FDMUIsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsK0JBQStCLEdBQ2hDLE1BQU0sOENBQThDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDcEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUF3QmpGLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0NBQWdDLENBQ3BELEVBQVcsRUFDWCxVQUFxQyxFQUFFO0lBRXZDLDRFQUE0RTtJQUM1RSxPQUFPLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBNEJELE1BQU0sdUJBQXVCLEdBSXhCO0lBQ0g7UUFDRSxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFdBQVcsRUFBRSw0RkFBNEY7UUFD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QUssU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBSyxHQUFXLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUssR0FBVyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSyxHQUFXLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx5REFBeUQsQ0FBQyxDQUFDO1FBQy9FLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBSSxHQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQztJQUV2RCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQ3ZCLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFHLEdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsNkJBQTZCLEVBQUUsRUFDNUYsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFF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
1694
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLCtCQUErQixHQUNoQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFDTCxhQUFhLElBQUksb0JBQW9CLEVBQ3JDLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsbUJBQW1CLEdBQ3BCLE1BQU0seUNBQXlDLENBQUM7QUFNakQsT0FBTyxFQUNMLDJCQUEyQixFQUMzQiwrQkFBK0IsRUFDL0IsOEJBQThCLEdBQy9CLE1BQU0scURBQXFELENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksSUFBSSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpFLDZGQUE2RjtBQUM3RixNQUFNLHNCQUFzQixHQUFHLHVCQUF1QixDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQztBQUUvRjs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0lBQy9DLFlBQVksVUFBa0IsRUFBRSxVQUFnQztRQUM5RCxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdB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