@serve.zone/dcrouter 20.2.0 → 32.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.smartconfig.json +1 -0
- package/deno.json +1 -1
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/classes.dcrouter.js +2 -3
- package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +0 -1
- package/dist_ts/db/documents/classes.webpush-spool.doc.js +2 -8
- package/dist_ts/email/classes.coremail-gateway.manager.js +2 -3
- package/dist_ts/email/coremail-gateway-authority.d.ts +1 -1
- package/dist_ts/email/coremail-gateway-authority.js +1 -1
- package/dist_ts/webpush/classes.webpush-crypto.d.ts +9 -1
- package/dist_ts/webpush/classes.webpush-crypto.js +69 -56
- package/dist_ts/webpush/classes.webpush-manager.js +3 -4
- package/dist_ts_migrations/index.d.ts +18 -9
- package/dist_ts_migrations/index.js +530 -1776
- package/dist_ts_web/00_commitinfo_data.js +3 -3
- package/package.json +5 -5
- package/readme.md +13 -7
- package/ts/00_commitinfo_data.ts +3 -3
- package/ts/classes.dcrouter.ts +2 -4
- package/ts/db/documents/classes.webpush-spool.doc.ts +0 -3
- package/ts/email/classes.coremail-gateway.manager.ts +1 -2
- package/ts/email/coremail-gateway-authority.ts +1 -1
- package/ts/webpush/classes.webpush-crypto.ts +80 -57
- package/ts/webpush/classes.webpush-manager.ts +2 -3
- package/ts_web/00_commitinfo_data.ts +3 -3
|
@@ -1,19 +1,54 @@
|
|
|
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 {
|
|
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 { data as servezoneInterfacesData } from '@serve.zone/interfaces';
|
|
10
|
+
/** The verifier contract token CoreMail peers are stored under from interfaces 32.0.0 on. */
|
|
11
|
+
const coreMailVerifierFormat = servezoneInterfacesData.coreMailCredentialVerifierPolicy.format;
|
|
12
|
+
/**
|
|
13
|
+
* dcrouter migration runner.
|
|
14
|
+
*
|
|
15
|
+
* Uses @push.rocks/smartmigration via dynamic import so smartmigration's type
|
|
16
|
+
* chain (which pulls in mongodb 7.x and related types) doesn't leak into
|
|
17
|
+
* compile-time type checking for this folder.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* A refusal dcrouter's own migration code authored. smartmigration redacts every
|
|
21
|
+
* unknown failure that crosses one of its boundaries, so this class is how a
|
|
22
|
+
* message that names the condition and the way out — and carries no secret —
|
|
23
|
+
* is told apart from an unknown throw and allowed through the sanitizer.
|
|
24
|
+
*/
|
|
25
|
+
export class DcRouterMigrationError extends Error {
|
|
26
|
+
constructor(messageArg, optionsArg) {
|
|
27
|
+
super(messageArg, optionsArg);
|
|
28
|
+
this.name = 'DcRouterMigrationError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
11
31
|
// Advance only with a registered schema migration, not each package release.
|
|
12
32
|
// Released bridge-only ledgers must remain readable without rewriting history.
|
|
13
|
-
export const dcRouterSchemaVersion = '
|
|
33
|
+
export const dcRouterSchemaVersion = '32.0.0';
|
|
14
34
|
export async function createApplicationMigrationRunner(db, options = {}) {
|
|
15
|
-
|
|
16
|
-
return
|
|
35
|
+
const runner = await createMigrationRunner(db, dcRouterSchemaVersion, options);
|
|
36
|
+
return {
|
|
37
|
+
getCurrentVersion: () => runner.getCurrentVersion(),
|
|
38
|
+
run: async () => {
|
|
39
|
+
// smartmigration plans a reverse run whenever the ledger is ahead of the
|
|
40
|
+
// target, and in bridge mode the generated bridge is reversible, so a
|
|
41
|
+
// database a newer dcrouter wrote would be walked back instead of
|
|
42
|
+
// refused. Starting an application against data it cannot read is never
|
|
43
|
+
// what an operator meant, so this release refuses it by name.
|
|
44
|
+
const ledgerVersion = await runner.getCurrentVersion();
|
|
45
|
+
if (ledgerVersion && compareSemver(ledgerVersion, dcRouterSchemaVersion) > 0) {
|
|
46
|
+
throw new DcRouterMigrationError(`The migration ledger is at "${ledgerVersion}", which a newer dcrouter wrote. `
|
|
47
|
+
+ `This release migrates data up to "${dcRouterSchemaVersion}" and refuses to run against it.`);
|
|
48
|
+
}
|
|
49
|
+
return await runner.run();
|
|
50
|
+
},
|
|
51
|
+
};
|
|
17
52
|
}
|
|
18
53
|
const DEFAULT_SOURCE_PROFILES = [
|
|
19
54
|
{
|
|
@@ -59,7 +94,6 @@ const DEFAULT_SOURCE_PROFILES = [
|
|
|
59
94
|
},
|
|
60
95
|
},
|
|
61
96
|
];
|
|
62
|
-
const remoteIngressHubSettingsMigrationBaseVersion = '13.43.5';
|
|
63
97
|
function compareSemver(a, b) {
|
|
64
98
|
const aParts = a.split('.').map((part) => Number.parseInt(part, 10) || 0);
|
|
65
99
|
const bParts = b.split('.').map((part) => Number.parseInt(part, 10) || 0);
|
|
@@ -121,85 +155,6 @@ function resolveMigrationSourceProfileSecurity(profileId, profiles, visited = ne
|
|
|
121
155
|
}
|
|
122
156
|
return mergeMigrationSecurityFields(baseSecurity, profile.security || {});
|
|
123
157
|
}
|
|
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
158
|
async function seedMissingDefaultSourceProfiles(ctx) {
|
|
204
159
|
const collection = ctx.mongo.collection('SourceProfileDoc');
|
|
205
160
|
const now = Date.now();
|
|
@@ -382,101 +337,6 @@ async function backfillGatewayDnsProxyIntent(ctx) {
|
|
|
382
337
|
}
|
|
383
338
|
ctx.log.log('info', `backfill-gateway-dns-proxy-intent: migrated ${migrated}/${inspected} route(s)`);
|
|
384
339
|
}
|
|
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
340
|
async function backfillRemoteIngressHubSettings(ctx, options) {
|
|
481
341
|
const collection = ctx.mongo.collection('RemoteIngressHubSettingsDoc');
|
|
482
342
|
const seed = options.remoteIngressHubSettings || {};
|
|
@@ -553,73 +413,6 @@ async function backfillEmailServerSettings(ctx, options) {
|
|
|
553
413
|
await collection.updateOne(doc._id ? { _id: doc._id } : { settingsId: 'email-server-settings' }, { $set });
|
|
554
414
|
ctx.log.log('info', `backfill-email-server-settings: set ${Object.keys($set).length - 2} missing field(s)`);
|
|
555
415
|
}
|
|
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
416
|
/**
|
|
624
417
|
* The legacy bootstrap config carried a `central.eu-incoming` route with a
|
|
625
418
|
* `deliver` action. SmartMTA's `deliver` action is an unimplemented stub that
|
|
@@ -743,152 +536,6 @@ async function convertLegacySmtpAuthUsers(ctx) {
|
|
|
743
536
|
});
|
|
744
537
|
ctx.log.log('info', `convert-legacy-smtp-auth-users: converted ${converted}, skipped ${skipped}; plaintext auth users stripped from persisted settings`);
|
|
745
538
|
}
|
|
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
539
|
async function migrateWebPushProviderSchema(ctx) {
|
|
893
540
|
const migrationBatchSize = 100;
|
|
894
541
|
const bindingCollection = ctx.mongo.collection('WebPushBindingDoc');
|
|
@@ -896,7 +543,7 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
896
543
|
const spoolCollection = ctx.mongo.collection('WebPushSpoolDoc');
|
|
897
544
|
const requireMongoDocumentId = (documentArg, documentTypeArg) => {
|
|
898
545
|
if (documentArg?._id === undefined || documentArg?._id === null) {
|
|
899
|
-
throw new
|
|
546
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} document has no MongoDB id`);
|
|
900
547
|
}
|
|
901
548
|
return documentArg._id;
|
|
902
549
|
};
|
|
@@ -917,7 +564,7 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
917
564
|
},
|
|
918
565
|
})), { ordered: false });
|
|
919
566
|
if (result.modifiedCount === 0) {
|
|
920
|
-
throw new
|
|
567
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
|
|
921
568
|
}
|
|
922
569
|
}
|
|
923
570
|
};
|
|
@@ -945,7 +592,7 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
945
592
|
|| binding.id !== binding.id.trim()
|
|
946
593
|
|| !Number.isSafeInteger(binding.lifecycleGeneration)
|
|
947
594
|
|| binding.lifecycleGeneration < 1) {
|
|
948
|
-
throw new
|
|
595
|
+
throw new DcRouterMigrationError('web-push-provider-schema: malformed binding lifecycle authority');
|
|
949
596
|
}
|
|
950
597
|
}
|
|
951
598
|
const backfillDependentLifecycles = async (collectionArg, documentTypeArg) => {
|
|
@@ -960,13 +607,13 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
960
607
|
if (typeof document.bindingId !== 'string'
|
|
961
608
|
|| document.bindingId.trim().length === 0
|
|
962
609
|
|| document.bindingId !== document.bindingId.trim()) {
|
|
963
|
-
throw new
|
|
610
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
|
|
964
611
|
}
|
|
965
612
|
const binding = await bindingCollection.findOne({ id: document.bindingId }, { projection: { lifecycleGeneration: 1 } });
|
|
966
613
|
if (!binding
|
|
967
614
|
|| !Number.isSafeInteger(binding.lifecycleGeneration)
|
|
968
615
|
|| binding.lifecycleGeneration < 1) {
|
|
969
|
-
throw new
|
|
616
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
|
|
970
617
|
}
|
|
971
618
|
operations.push({
|
|
972
619
|
updateOne: {
|
|
@@ -981,7 +628,7 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
981
628
|
}
|
|
982
629
|
const result = await collectionArg.bulkWrite(operations, { ordered: false });
|
|
983
630
|
if (result.modifiedCount === 0) {
|
|
984
|
-
throw new
|
|
631
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: ${documentTypeArg} backfill made no progress`);
|
|
985
632
|
}
|
|
986
633
|
}
|
|
987
634
|
};
|
|
@@ -997,13 +644,13 @@ async function migrateWebPushProviderSchema(ctx) {
|
|
|
997
644
|
&& (typeof documentArg.id !== 'string'
|
|
998
645
|
|| documentArg.id.trim().length === 0
|
|
999
646
|
|| documentArg.id !== documentArg.id.trim()))) {
|
|
1000
|
-
throw new
|
|
647
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: malformed ${documentTypeArg} lifecycle authority`);
|
|
1001
648
|
}
|
|
1002
649
|
const binding = await bindingCollection.findOne({ id: documentArg.bindingId }, { projection: { lifecycleGeneration: 1 } });
|
|
1003
650
|
if (!binding
|
|
1004
651
|
|| !Number.isSafeInteger(binding.lifecycleGeneration)
|
|
1005
652
|
|| documentArg.lifecycleGeneration > binding.lifecycleGeneration) {
|
|
1006
|
-
throw new
|
|
653
|
+
throw new DcRouterMigrationError(`web-push-provider-schema: orphan ${documentTypeArg} lifecycle authority`);
|
|
1007
654
|
}
|
|
1008
655
|
};
|
|
1009
656
|
const streamLifecycleCollection = async (collectionArg, documentTypeArg) => {
|
|
@@ -1075,7 +722,7 @@ async function migrateServiceMailIdempotencyIndex(ctx) {
|
|
|
1075
722
|
continue;
|
|
1076
723
|
}
|
|
1077
724
|
if (document._id === undefined || document._id === null) {
|
|
1078
|
-
throw new
|
|
725
|
+
throw new DcRouterMigrationError('index-service-mail-idempotency: CachedEmail document has no _id');
|
|
1079
726
|
}
|
|
1080
727
|
pendingUnsets.push({
|
|
1081
728
|
updateOne: {
|
|
@@ -1118,829 +765,250 @@ async function migrateServiceMailIdempotencyIndex(ctx) {
|
|
|
1118
765
|
*/
|
|
1119
766
|
export async function createMigrationRunner(db, targetVersion, options = {}) {
|
|
1120
767
|
const sm = await import('@push.rocks/smartmigration');
|
|
1121
|
-
const freshInstallVersion = compareSemver(targetVersion, serviceMailIdempotencyMigrationVersion) >= 0
|
|
1122
|
-
? serviceMailIdempotencyPreviousVersion
|
|
1123
|
-
: targetVersion;
|
|
1124
768
|
const migration = new sm.SmartMigration({
|
|
1125
769
|
targetVersion,
|
|
1126
770
|
db: db,
|
|
1127
|
-
//
|
|
1128
|
-
|
|
1129
|
-
|
|
771
|
+
// A fresh install enters the chain at its start, so it still runs the mail
|
|
772
|
+
// idempotency and Web Push index steps that create its indexes.
|
|
773
|
+
freshInstallVersion: serviceMailIdempotencyPreviousVersion,
|
|
774
|
+
// 32.0.0 deleted every released step below the chain start. Without this
|
|
775
|
+
// floor a ledger from before it would be skip-forward resumed and stamped
|
|
776
|
+
// as if the deleted work had happened; with it, such a ledger is refused
|
|
777
|
+
// by name on the first read, before the lock and before any write.
|
|
778
|
+
oldestSupportedVersion: serviceMailIdempotencyPreviousVersion,
|
|
779
|
+
// A target that is not a step boundary is bridged rather than overshot.
|
|
1130
780
|
targetVersionStrategy: 'bridge',
|
|
781
|
+
// dcrouter's own refusals name the condition and the way out and carry no
|
|
782
|
+
// secret, so they reach the operator unchanged; anything else is reported
|
|
783
|
+
// as the step or phase it failed in and nothing more.
|
|
784
|
+
errorSanitizer: (errorArg, contextArg) => (errorArg instanceof DcRouterMigrationError
|
|
785
|
+
? { message: errorArg.message }
|
|
786
|
+
: {
|
|
787
|
+
message: contextArg.stepId
|
|
788
|
+
? `Migration step "${contextArg.stepId}" failed.`
|
|
789
|
+
: `Migration ${contextArg.phase} failed.`,
|
|
790
|
+
}),
|
|
1131
791
|
// A replacement process must be able to wait out the complete stale-lock TTL.
|
|
1132
792
|
lockWaitMs: 11 * 60_000,
|
|
1133
793
|
lockTtlMs: 10 * 60_000,
|
|
1134
794
|
});
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
if (
|
|
1157
|
-
|
|
1158
|
-
}
|
|
1159
|
-
if (metadata.ownerType === 'workhoster') {
|
|
1160
|
-
set['metadata.ownerType'] = 'gatewayClient';
|
|
795
|
+
// Register steps in execution order; each `.from()` is the previous `.to()`,
|
|
796
|
+
// and `oldestSupportedVersion` pins the first one as the floor of this
|
|
797
|
+
// release. Registration stops at `targetVersion` so a target that is not a
|
|
798
|
+
// step boundary is bridged by smartmigration instead of overshooting.
|
|
799
|
+
const reaches = (versionArg) => compareSemver(targetVersion, versionArg) >= 0;
|
|
800
|
+
/**
|
|
801
|
+
* Close the chain. A `targetVersion` that is not a step boundary is bridged,
|
|
802
|
+
* and that bridge repeats the settings safeguards the chain reached rather
|
|
803
|
+
* than being a no-op: the persisted settings document can be seeded from
|
|
804
|
+
* bootstrap config in the very run that bridges it.
|
|
805
|
+
*/
|
|
806
|
+
const finish = (chainEndArg) => {
|
|
807
|
+
if (compareSemver(targetVersion, chainEndArg) <= 0)
|
|
808
|
+
return migration;
|
|
809
|
+
migration
|
|
810
|
+
.step('backfill-settings-to-target')
|
|
811
|
+
.from(chainEndArg).to(targetVersion)
|
|
812
|
+
.description('Bridge to a target between two chain boundaries, repeating the settings safeguards')
|
|
813
|
+
.up(async (ctx) => {
|
|
814
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
815
|
+
await backfillEmailServerSettings(ctx, options);
|
|
816
|
+
if (compareSemver(chainEndArg, legacyCentralEuDeliverRouteMigrationVersion) >= 0) {
|
|
817
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
1161
818
|
}
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
'metadata.workHosterType': '',
|
|
1165
|
-
'metadata.workHosterId': '',
|
|
1166
|
-
'metadata.workAppId': '',
|
|
1167
|
-
},
|
|
1168
|
-
};
|
|
1169
|
-
if (Object.keys(set).length > 0) {
|
|
1170
|
-
update.$set = set;
|
|
819
|
+
if (compareSemver(chainEndArg, smtpAuthAccountsMigrationVersion) >= 0) {
|
|
820
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
1171
821
|
}
|
|
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
822
|
});
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
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
|
-
});
|
|
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.
|
|
823
|
+
return migration;
|
|
824
|
+
};
|
|
825
|
+
if (!reaches(serviceMailIdempotencyMigrationVersion))
|
|
826
|
+
return finish(serviceMailIdempotencyPreviousVersion);
|
|
1237
827
|
migration
|
|
1238
|
-
.step('
|
|
1239
|
-
.from(
|
|
1240
|
-
.description('
|
|
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"')
|
|
828
|
+
.step('index-service-mail-idempotency')
|
|
829
|
+
.from(serviceMailIdempotencyPreviousVersion).to(serviceMailIdempotencyMigrationVersion)
|
|
830
|
+
.description('Repair replay metadata and create the credential-scoped sparse unique service-mail index')
|
|
1245
831
|
.up(async (ctx) => {
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
.
|
|
1252
|
-
.
|
|
832
|
+
await migrateServiceMailIdempotencyIndex(ctx);
|
|
833
|
+
});
|
|
834
|
+
if (!reaches(webPushSchemaMigrationVersion))
|
|
835
|
+
return finish(serviceMailIdempotencyMigrationVersion);
|
|
836
|
+
migration
|
|
837
|
+
.step('web-push-provider-schema')
|
|
838
|
+
.from(webPushSchemaPreviousVersion).to(webPushSchemaMigrationVersion)
|
|
839
|
+
.description('Create durable Web Push binding, delivery, idempotency, and retention indexes')
|
|
1253
840
|
.up(async (ctx) => {
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
ctx
|
|
1257
|
-
})
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
841
|
+
await migrateWebPushProviderSchema(ctx);
|
|
842
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
843
|
+
await backfillEmailServerSettings(ctx, options);
|
|
844
|
+
});
|
|
845
|
+
if (!reaches(routeIngressPolicyMigrationVersion))
|
|
846
|
+
return finish(webPushSchemaMigrationVersion);
|
|
847
|
+
migration
|
|
848
|
+
.step('backfill-route-ingress-policies')
|
|
849
|
+
.from(routeIngressPolicyPreviousVersion).to(routeIngressPolicyMigrationVersion)
|
|
850
|
+
.description('Preserve existing route reachability with explicit direct hub and SmartVPN ingress policy')
|
|
1261
851
|
.up(async (ctx) => {
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
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')
|
|
852
|
+
await backfillRouteIngressPolicies(ctx);
|
|
853
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
854
|
+
await backfillEmailServerSettings(ctx, options);
|
|
855
|
+
});
|
|
856
|
+
if (!reaches(sourceProfileNetworkNormalizationMigrationVersion))
|
|
857
|
+
return finish(routeIngressPolicyMigrationVersion);
|
|
858
|
+
migration
|
|
859
|
+
.step('normalize-private-source-profile-networks')
|
|
860
|
+
.from(routeIngressPolicyMigrationVersion).to(sourceProfileNetworkNormalizationMigrationVersion)
|
|
861
|
+
.description('Normalize legacy private source-profile wildcards to valid CIDR notation')
|
|
1283
862
|
.up(async (ctx) => {
|
|
1284
|
-
await
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
863
|
+
await normalizeLegacyPrivateSourceProfileNetworks(ctx);
|
|
864
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
865
|
+
await backfillEmailServerSettings(ctx, options);
|
|
866
|
+
});
|
|
867
|
+
if (!reaches(gatewayDnsProxyIntentMigrationVersion))
|
|
868
|
+
return finish(sourceProfileNetworkNormalizationMigrationVersion);
|
|
869
|
+
migration
|
|
870
|
+
.step('backfill-gateway-dns-proxy-intent')
|
|
871
|
+
.from(sourceProfileNetworkNormalizationMigrationVersion).to(gatewayDnsProxyIntentMigrationVersion)
|
|
872
|
+
.description('Recover gateway route DNS proxy intent from owned provider record state')
|
|
1289
873
|
.up(async (ctx) => {
|
|
1290
|
-
await
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
874
|
+
await backfillGatewayDnsProxyIntent(ctx);
|
|
875
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
876
|
+
await backfillEmailServerSettings(ctx, options);
|
|
877
|
+
});
|
|
878
|
+
if (!reaches(legacyCentralEuDeliverRouteMigrationVersion))
|
|
879
|
+
return finish(gatewayDnsProxyIntentMigrationVersion);
|
|
880
|
+
migration
|
|
881
|
+
.step('remove-legacy-central-eu-deliver-route')
|
|
882
|
+
.from(gatewayDnsProxyIntentMigrationVersion).to(legacyCentralEuDeliverRouteMigrationVersion)
|
|
883
|
+
.description('Remove the legacy central.eu-incoming deliver route so accepted mail falls through to the domain inbound store policy')
|
|
1295
884
|
.up(async (ctx) => {
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
.
|
|
1299
|
-
|
|
1300
|
-
|
|
885
|
+
// Backfills run first so a leapfrog upgrade that seeds the settings doc
|
|
886
|
+
// (including the legacy route) in this very step is normalized before
|
|
887
|
+
// the step completes.
|
|
888
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
889
|
+
await backfillEmailServerSettings(ctx, options);
|
|
890
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
891
|
+
});
|
|
892
|
+
if (!reaches(smtpAuthAccountsMigrationVersion))
|
|
893
|
+
return finish(legacyCentralEuDeliverRouteMigrationVersion);
|
|
894
|
+
migration
|
|
895
|
+
.step('convert-legacy-smtp-auth-users')
|
|
896
|
+
.from(legacyCentralEuDeliverRouteMigrationVersion).to(smtpAuthAccountsMigrationVersion)
|
|
897
|
+
.description('Convert legacy plaintext emailConfig.auth.users into hashed SMTP account documents and strip the plaintext from persisted settings')
|
|
1301
898
|
.up(async (ctx) => {
|
|
1302
|
-
await
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
899
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
900
|
+
await backfillEmailServerSettings(ctx, options);
|
|
901
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
902
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
903
|
+
});
|
|
904
|
+
if (!reaches(monitoringEventsMigrationVersion))
|
|
905
|
+
return finish(smtpAuthAccountsMigrationVersion);
|
|
906
|
+
migration
|
|
907
|
+
.step('create-monitoring-event-indexes')
|
|
908
|
+
.from(smtpAuthAccountsMigrationVersion).to(monitoringEventsMigrationVersion)
|
|
909
|
+
.description('Create durable authentication event and email traffic bucket indexes')
|
|
910
|
+
.up(async (ctx) => {
|
|
911
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
912
|
+
await backfillEmailServerSettings(ctx, options);
|
|
913
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
914
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
915
|
+
await createMonitoringEventIndexes(ctx);
|
|
916
|
+
});
|
|
917
|
+
if (!reaches(cachedEmailAcceptedAtIndexMigrationVersion))
|
|
918
|
+
return finish(monitoringEventsMigrationVersion);
|
|
919
|
+
migration
|
|
920
|
+
.step('index-cached-email-accepted-at')
|
|
921
|
+
.from(monitoringEventsMigrationVersion).to(cachedEmailAcceptedAtIndexMigrationVersion)
|
|
922
|
+
.description('Index CachedEmail.acceptedAt for retained email traffic and security views')
|
|
923
|
+
.up(async (ctx) => {
|
|
924
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
925
|
+
await backfillEmailServerSettings(ctx, options);
|
|
926
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
927
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
928
|
+
await createCachedEmailAcceptedAtIndex(ctx);
|
|
929
|
+
});
|
|
930
|
+
if (!reaches(cachedEmailSecurityDispositionMigrationVersion))
|
|
931
|
+
return finish(cachedEmailAcceptedAtIndexMigrationVersion);
|
|
932
|
+
migration
|
|
933
|
+
.step('backfill-cached-email-security-disposition')
|
|
934
|
+
.from(cachedEmailAcceptedAtIndexMigrationVersion).to(cachedEmailSecurityDispositionMigrationVersion)
|
|
935
|
+
.description('Classify retained inbound authentication results without overwriting delivery state')
|
|
1307
936
|
.up(async (ctx) => {
|
|
1308
|
-
await
|
|
937
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
938
|
+
await backfillEmailServerSettings(ctx, options);
|
|
939
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
940
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
941
|
+
await backfillCachedEmailSecurityDisposition(ctx);
|
|
942
|
+
});
|
|
943
|
+
if (!reaches(gatewayMailDomainAuthorityMigrationVersion))
|
|
944
|
+
return finish(cachedEmailSecurityDispositionMigrationVersion);
|
|
945
|
+
migration
|
|
946
|
+
.step('bridge-cached-email-security-disposition-to-gateway-mail-domain-authority')
|
|
947
|
+
.from(cachedEmailSecurityDispositionMigrationVersion).to(gatewayMailDomainAuthorityPreviousVersion)
|
|
948
|
+
.description('Bridge the 18.5.0 release before migrating WorkApp mail identity authority')
|
|
949
|
+
.up(async (ctx) => {
|
|
950
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
951
|
+
await backfillEmailServerSettings(ctx, options);
|
|
952
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
953
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
1309
954
|
})
|
|
1310
|
-
.step('
|
|
1311
|
-
.from(
|
|
1312
|
-
.description('
|
|
955
|
+
.step('migrate-gateway-mail-domain-authority')
|
|
956
|
+
.from(gatewayMailDomainAuthorityPreviousVersion).to(gatewayMailDomainAuthorityMigrationVersion)
|
|
957
|
+
.description('Move WorkApp mail identities into authoritative owner/domain SmartData documents')
|
|
1313
958
|
.up(async (ctx) => {
|
|
1314
959
|
await backfillRemoteIngressHubSettings(ctx, options);
|
|
1315
960
|
await backfillEmailServerSettings(ctx, options);
|
|
961
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
962
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
963
|
+
await migrateGatewayMailDomainAuthority(ctx);
|
|
1316
964
|
});
|
|
1317
|
-
if (
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
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;
|
|
965
|
+
if (!reaches(smartDb5ManagedRecordKeyRepairMigrationVersion))
|
|
966
|
+
return finish(gatewayMailDomainAuthorityMigrationVersion);
|
|
967
|
+
migration
|
|
968
|
+
.step('repair-smartdb5-managed-record-key-index')
|
|
969
|
+
.from(gatewayMailDomainAuthorityMigrationVersion).to(smartDb5ManagedRecordKeyRepairMigrationVersion)
|
|
970
|
+
.description('Replace the legacy partial managedRecordKey index with a SmartDB 5-compatible sparse unique index')
|
|
971
|
+
.up(async (ctx) => {
|
|
972
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
973
|
+
await backfillEmailServerSettings(ctx, options);
|
|
974
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
975
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
976
|
+
await repairManagedRecordKeyIndex(ctx, 'smartdb5-managed-record-key-index');
|
|
977
|
+
});
|
|
978
|
+
if (!reaches(testingAccessMigrationVersion))
|
|
979
|
+
return finish(smartDb5ManagedRecordKeyRepairMigrationVersion);
|
|
980
|
+
migration
|
|
981
|
+
.step('testing-access-and-exact-certificate-identities')
|
|
982
|
+
.from(smartDb5ManagedRecordKeyRepairMigrationVersion).to(testingAccessMigrationVersion)
|
|
983
|
+
.description('Isolate exact certificates and initialize durable testing access and recovery indexes')
|
|
984
|
+
.up(async (ctx) => {
|
|
985
|
+
await backfillRemoteIngressHubSettings(ctx, options);
|
|
986
|
+
await backfillEmailServerSettings(ctx, options);
|
|
987
|
+
await removeLegacyCentralEuDeliverRoute(ctx);
|
|
988
|
+
await convertLegacySmtpAuthUsers(ctx);
|
|
989
|
+
await migrateTestingAccess(ctx);
|
|
990
|
+
});
|
|
991
|
+
if (!reaches(webPushEncryptionContextMigrationVersion))
|
|
992
|
+
return finish(testingAccessMigrationVersion);
|
|
993
|
+
migration
|
|
994
|
+
.step('webpush-encryption-context')
|
|
995
|
+
.from(testingAccessMigrationVersion).to(webPushEncryptionContextMigrationVersion)
|
|
996
|
+
.description('Reseal every Web Push envelope under the associated data of interfaces 32')
|
|
997
|
+
.resumable()
|
|
998
|
+
.up(async (ctx) => {
|
|
999
|
+
await migrateWebPushEncryptionContext(ctx, options);
|
|
1000
|
+
});
|
|
1001
|
+
if (!reaches(coreMailPeerVerifierFormatMigrationVersion))
|
|
1002
|
+
return finish(webPushEncryptionContextMigrationVersion);
|
|
1003
|
+
migration
|
|
1004
|
+
.step('coremail-peer-verifier-format')
|
|
1005
|
+
.from(webPushEncryptionContextMigrationVersion).to(coreMailPeerVerifierFormatMigrationVersion)
|
|
1006
|
+
.description('Rewrite stored CoreMail gateway peer verifier formats to the unsuffixed argon2id contract token')
|
|
1007
|
+
.up(async (ctx) => {
|
|
1008
|
+
await migrateCoreMailPeerVerifierFormat(ctx);
|
|
1009
|
+
});
|
|
1010
|
+
return finish(coreMailPeerVerifierFormatMigrationVersion);
|
|
1930
1011
|
}
|
|
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
1012
|
const serviceMailIdempotencyPreviousVersion = '17.7.2';
|
|
1945
1013
|
const serviceMailIdempotencyMigrationVersion = '17.7.3';
|
|
1946
1014
|
const webPushSchemaPreviousVersion = serviceMailIdempotencyMigrationVersion;
|
|
@@ -1958,12 +1026,13 @@ const gatewayMailDomainAuthorityPreviousVersion = '18.5.0';
|
|
|
1958
1026
|
const gatewayMailDomainAuthorityMigrationVersion = '18.6.0';
|
|
1959
1027
|
const smartDb5ManagedRecordKeyRepairMigrationVersion = '18.8.0';
|
|
1960
1028
|
const testingAccessMigrationVersion = '19.1.0';
|
|
1961
|
-
const
|
|
1029
|
+
const webPushEncryptionContextMigrationVersion = '19.2.0';
|
|
1030
|
+
const coreMailPeerVerifierFormatMigrationVersion = '32.0.0';
|
|
1962
1031
|
const legacyWorkAppMailIdentityStorageKey = '/workhosters/mail-identities.json';
|
|
1963
1032
|
const gatewayMailDomainOwnerIndexName = 'gateway_mail_domain_owner_domain_unique';
|
|
1964
1033
|
function normalizeGatewayMailDomainMigrationDocument(documentArg) {
|
|
1965
1034
|
if (!documentArg || typeof documentArg !== 'object' || Array.isArray(documentArg)) {
|
|
1966
|
-
throw new
|
|
1035
|
+
throw new DcRouterMigrationError('GatewayMailDomainDoc must be an object');
|
|
1967
1036
|
}
|
|
1968
1037
|
const owner = normalizeGatewayMailDomainOwner({
|
|
1969
1038
|
gatewayClientType: documentArg.ownerGatewayClientType,
|
|
@@ -1972,14 +1041,14 @@ function normalizeGatewayMailDomainMigrationDocument(documentArg) {
|
|
|
1972
1041
|
const domain = normalizeGatewayMailDomain(documentArg.domain);
|
|
1973
1042
|
const expectedId = createGatewayMailDomainId(owner, domain);
|
|
1974
1043
|
if (documentArg.id !== expectedId) {
|
|
1975
|
-
throw new
|
|
1044
|
+
throw new DcRouterMigrationError(`GatewayMailDomainDoc has a non-canonical id: ${documentArg.id}`);
|
|
1976
1045
|
}
|
|
1977
1046
|
const groups = groupGatewayMailIdentities(documentArg.identities || []);
|
|
1978
1047
|
if (groups.length !== 1 || groups[0].id !== expectedId) {
|
|
1979
|
-
throw new
|
|
1048
|
+
throw new DcRouterMigrationError(`GatewayMailDomainDoc identities do not match owner/domain: ${expectedId}`);
|
|
1980
1049
|
}
|
|
1981
1050
|
if (!Number.isSafeInteger(documentArg.createdAt) || !Number.isSafeInteger(documentArg.updatedAt)) {
|
|
1982
|
-
throw new
|
|
1051
|
+
throw new DcRouterMigrationError(`GatewayMailDomainDoc timestamps are invalid: ${expectedId}`);
|
|
1983
1052
|
}
|
|
1984
1053
|
return {
|
|
1985
1054
|
id: expectedId,
|
|
@@ -1997,14 +1066,14 @@ function parseLegacyWorkAppMailIdentities(documentArg) {
|
|
|
1997
1066
|
|| documentArg.id !== expectedId
|
|
1998
1067
|
|| documentArg.key !== legacyWorkAppMailIdentityStorageKey
|
|
1999
1068
|
|| typeof documentArg.value !== 'string') {
|
|
2000
|
-
throw new
|
|
1069
|
+
throw new DcRouterMigrationError('Legacy WorkApp mail identity storage document is corrupt');
|
|
2001
1070
|
}
|
|
2002
1071
|
let parsed;
|
|
2003
1072
|
try {
|
|
2004
1073
|
parsed = JSON.parse(documentArg.value);
|
|
2005
1074
|
}
|
|
2006
1075
|
catch (error) {
|
|
2007
|
-
throw new
|
|
1076
|
+
throw new DcRouterMigrationError(`Legacy WorkApp mail identity JSON is malformed: ${error.message}`);
|
|
2008
1077
|
}
|
|
2009
1078
|
if (Array.isArray(parsed))
|
|
2010
1079
|
return parsed;
|
|
@@ -2012,7 +1081,7 @@ function parseLegacyWorkAppMailIdentities(documentArg) {
|
|
|
2012
1081
|
|| typeof parsed !== 'object'
|
|
2013
1082
|
|| parsed.version !== 1
|
|
2014
1083
|
|| !Array.isArray(parsed.identities)) {
|
|
2015
|
-
throw new
|
|
1084
|
+
throw new DcRouterMigrationError('Legacy WorkApp mail identity state must use version 1 with an identities array');
|
|
2016
1085
|
}
|
|
2017
1086
|
return parsed.identities;
|
|
2018
1087
|
}
|
|
@@ -2045,7 +1114,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2045
1114
|
normalized.domain,
|
|
2046
1115
|
]);
|
|
2047
1116
|
if (canonicalKeys.has(canonicalKey) || existingById.has(normalized.id)) {
|
|
2048
|
-
throw new
|
|
1117
|
+
throw new DcRouterMigrationError(`Conflicting GatewayMailDomainDoc authority: ${normalized.id}`);
|
|
2049
1118
|
}
|
|
2050
1119
|
canonicalKeys.add(canonicalKey);
|
|
2051
1120
|
existingById.set(normalized.id, normalized);
|
|
@@ -2054,7 +1123,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2054
1123
|
for (const existingDocument of existingById.values()) {
|
|
2055
1124
|
const desiredDocument = desiredById.get(existingDocument.id);
|
|
2056
1125
|
if (!desiredDocument || JSON.stringify(existingDocument) !== JSON.stringify(desiredDocument)) {
|
|
2057
|
-
throw new
|
|
1126
|
+
throw new DcRouterMigrationError(`GatewayMailDomainDoc conflicts with legacy authority: ${existingDocument.id}`);
|
|
2058
1127
|
}
|
|
2059
1128
|
}
|
|
2060
1129
|
for (const desiredDocument of desiredDocuments) {
|
|
@@ -2071,7 +1140,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2071
1140
|
? [...desiredDocuments].sort((leftArg, rightArg) => leftArg.id.localeCompare(rightArg.id))
|
|
2072
1141
|
: normalizedPersisted;
|
|
2073
1142
|
if (JSON.stringify(normalizedPersisted) !== JSON.stringify(expectedDocuments)) {
|
|
2074
|
-
throw new
|
|
1143
|
+
throw new DcRouterMigrationError('GatewayMailDomainDoc migration verification failed');
|
|
2075
1144
|
}
|
|
2076
1145
|
await domainCollection.createIndex({
|
|
2077
1146
|
ownerGatewayClientType: 1,
|
|
@@ -2090,7 +1159,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2090
1159
|
ownerGatewayClientId: 1,
|
|
2091
1160
|
domain: 1,
|
|
2092
1161
|
})) {
|
|
2093
|
-
throw new
|
|
1162
|
+
throw new DcRouterMigrationError('GatewayMailDomainDoc unique owner/domain index verification failed');
|
|
2094
1163
|
}
|
|
2095
1164
|
if (sourceDocument) {
|
|
2096
1165
|
const deleted = await storageCollection.deleteOne({
|
|
@@ -2100,7 +1169,7 @@ async function migrateGatewayMailDomainAuthority(ctx) {
|
|
|
2100
1169
|
value: sourceDocument.value,
|
|
2101
1170
|
});
|
|
2102
1171
|
if (deleted.deletedCount !== 1) {
|
|
2103
|
-
throw new
|
|
1172
|
+
throw new DcRouterMigrationError('Legacy WorkApp mail identity authority changed during migration');
|
|
2104
1173
|
}
|
|
2105
1174
|
}
|
|
2106
1175
|
ctx.log.log('info', `migrate-gateway-mail-domain-authority: verified ${normalizedPersisted.length} owner/domain document(s)`);
|
|
@@ -2213,148 +1282,6 @@ async function createMonitoringEventIndexes(ctx) {
|
|
|
2213
1282
|
]);
|
|
2214
1283
|
ctx.log.log('info', 'create-monitoring-event-indexes: ensured authentication and email traffic indexes');
|
|
2215
1284
|
}
|
|
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
1285
|
async function repairManagedRecordKeyIndex(ctx, logPrefix) {
|
|
2359
1286
|
const collection = ctx.mongo.collection('DnsRecordDoc');
|
|
2360
1287
|
if (typeof collection.dropIndex === 'function') {
|
|
@@ -2384,408 +1311,6 @@ async function repairManagedRecordKeyIndex(ctx, logPrefix) {
|
|
|
2384
1311
|
});
|
|
2385
1312
|
ctx.log.log('info', `${logPrefix}: repaired managedRecordKey index and removed ${cleaned} non-string key(s)`);
|
|
2386
1313
|
}
|
|
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
1314
|
async function migrateTestingAccess(ctx) {
|
|
2790
1315
|
const certificates = ctx.mongo.collection('AcmeCertDoc');
|
|
2791
1316
|
// One bounded, replayable batch at a time. PEM data is never rewritten.
|
|
@@ -2796,14 +1321,14 @@ async function migrateTestingAccess(ctx) {
|
|
|
2796
1321
|
for (const certificate of legacy) {
|
|
2797
1322
|
if (typeof certificate.domainName !== 'string' || !certificate.domainName
|
|
2798
1323
|
|| certificate.domainName !== certificate.domainName.trim())
|
|
2799
|
-
throw new
|
|
1324
|
+
throw new DcRouterMigrationError('Invalid legacy certificate domain');
|
|
2800
1325
|
const identityKey = `legacy:${certificate.domainName}`;
|
|
2801
1326
|
if (certificate.identityKey !== undefined && certificate.identityKey !== identityKey) {
|
|
2802
|
-
throw new
|
|
1327
|
+
throw new DcRouterMigrationError('Conflicting legacy certificate identity');
|
|
2803
1328
|
}
|
|
2804
1329
|
const changed = await certificates.updateOne({ _id: certificate._id, kind: { $exists: false } }, { $set: { identityKey, kind: 'legacy' } });
|
|
2805
1330
|
if (changed.modifiedCount !== 1)
|
|
2806
|
-
throw new
|
|
1331
|
+
throw new DcRouterMigrationError('Certificate changed during identity migration');
|
|
2807
1332
|
}
|
|
2808
1333
|
}
|
|
2809
1334
|
await certificates.createIndex({ identityKey: 1 }, { name: 'identityKey_1', unique: true });
|
|
@@ -2848,21 +1373,250 @@ async function migrateTestingAccess(ctx) {
|
|
|
2848
1373
|
]);
|
|
2849
1374
|
ctx.log.log('info', 'testing-access: isolated legacy certificate keys and initialized durable testing indexes');
|
|
2850
1375
|
}
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
1376
|
+
// -------------------------------------------- Web Push encryption context (32)
|
|
1377
|
+
/**
|
|
1378
|
+
* Associated data every Web Push envelope was sealed under before interfaces
|
|
1379
|
+
* 32.0.0 removed the shape version from the push payload contract. It is
|
|
1380
|
+
* private to this module on purpose: a superseded computation belongs to the
|
|
1381
|
+
* migration that retires it and must not be reachable from `ts/`.
|
|
1382
|
+
*/
|
|
1383
|
+
const legacyWebPushAadShapeVersion = 1;
|
|
1384
|
+
const legacyWebPushEnvelopeVersion = 1;
|
|
1385
|
+
const webPushEncryptionContextChunkSize = 100;
|
|
1386
|
+
function buildLegacyWebPushAad(contextArg) {
|
|
1387
|
+
return Buffer.from(canonicalWebPushJson({
|
|
1388
|
+
schemaVersion: legacyWebPushAadShapeVersion,
|
|
1389
|
+
gatewayClientId: contextArg.gatewayClientId,
|
|
1390
|
+
appInstanceId: contextArg.appInstanceId,
|
|
1391
|
+
bindingId: contextArg.bindingId,
|
|
1392
|
+
documentType: contextArg.documentType,
|
|
1393
|
+
documentId: contextArg.documentId,
|
|
1394
|
+
}), 'utf8');
|
|
1395
|
+
}
|
|
1396
|
+
/**
|
|
1397
|
+
* A sealed envelope is pre-32 exactly when it still declares the shape version
|
|
1398
|
+
* the contract dropped. The discriminator is the stored shape, never a trial
|
|
1399
|
+
* decryption: a failed decryption cannot tell "already resealed" from "wrong
|
|
1400
|
+
* key" and would silently skip readable secrets.
|
|
1401
|
+
*/
|
|
1402
|
+
function isLegacyWebPushEnvelope(valueArg) {
|
|
1403
|
+
return valueArg !== null
|
|
1404
|
+
&& typeof valueArg === 'object'
|
|
1405
|
+
&& !Array.isArray(valueArg)
|
|
1406
|
+
&& valueArg.version !== undefined;
|
|
1407
|
+
}
|
|
1408
|
+
function openLegacyWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg) {
|
|
1409
|
+
if (envelopeArg.version !== legacyWebPushEnvelopeVersion
|
|
1410
|
+
|| envelopeArg.algorithm !== 'aes-256-gcm') {
|
|
1411
|
+
throw new DcRouterMigrationError('Web Push envelope predates 32.0.0 but states an unknown format');
|
|
1412
|
+
}
|
|
1413
|
+
const key = keyRingArg.keys.get(envelopeArg.keyId);
|
|
1414
|
+
if (!key) {
|
|
1415
|
+
throw new DcRouterMigrationError(`Web Push envelope references key "${envelopeArg.keyId}", which the configured key ring does not hold`);
|
|
1416
|
+
}
|
|
1417
|
+
const decipher = nodeCrypto.createDecipheriv('aes-256-gcm', key, Buffer.from(envelopeArg.nonce, 'base64url'));
|
|
1418
|
+
decipher.setAAD(buildLegacyWebPushAad(aadContextArg));
|
|
1419
|
+
decipher.setAuthTag(Buffer.from(envelopeArg.tag, 'base64url'));
|
|
1420
|
+
return JSON.parse(Buffer.concat([
|
|
1421
|
+
decipher.update(Buffer.from(envelopeArg.ciphertext, 'base64url')),
|
|
1422
|
+
decipher.final(),
|
|
1423
|
+
]).toString('utf8'));
|
|
1424
|
+
}
|
|
1425
|
+
/**
|
|
1426
|
+
* Reseal one envelope under the 32 associated data with a fresh nonce, then
|
|
1427
|
+
* read it back before the caller is allowed to store it: an envelope that
|
|
1428
|
+
* cannot be opened again is a lost secret, not a migration.
|
|
1429
|
+
*/
|
|
1430
|
+
function resealWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg, transformPlaintextArg) {
|
|
1431
|
+
const plaintext = transformPlaintextArg(openLegacyWebPushEnvelope(envelopeArg, aadContextArg, keyRingArg));
|
|
1432
|
+
const resealed = sealWebPushEnvelope(keyRingArg, plaintext, aadContextArg);
|
|
1433
|
+
const verified = openWebPushEnvelope(keyRingArg, resealed, aadContextArg);
|
|
1434
|
+
if (canonicalWebPushJson(verified) !== canonicalWebPushJson(plaintext)) {
|
|
1435
|
+
throw new DcRouterMigrationError('Resealed Web Push envelope did not decrypt to its original plaintext');
|
|
1436
|
+
}
|
|
1437
|
+
return resealed;
|
|
1438
|
+
}
|
|
1439
|
+
/** interfaces 32.0.0 removed `schemaVersion` from the push payload, so the resealed plaintext drops it. */
|
|
1440
|
+
function withoutWebPushPayloadShapeVersion(plaintextArg) {
|
|
1441
|
+
if (plaintextArg === null || typeof plaintextArg !== 'object' || Array.isArray(plaintextArg)) {
|
|
1442
|
+
return plaintextArg;
|
|
1443
|
+
}
|
|
1444
|
+
const payload = { ...plaintextArg };
|
|
1445
|
+
delete payload.schemaVersion;
|
|
1446
|
+
return payload;
|
|
1447
|
+
}
|
|
1448
|
+
function keepWebPushPlaintext(plaintextArg) {
|
|
1449
|
+
return plaintextArg;
|
|
1450
|
+
}
|
|
1451
|
+
async function resealWebPushBindings(collectionArg, keyRingArg, checkpointArg, logArg) {
|
|
1452
|
+
let cursor = (await checkpointArg?.read('bindingCursor')) ?? '';
|
|
1453
|
+
let resealed = 0;
|
|
1454
|
+
for (;;) {
|
|
1455
|
+
const chunk = await collectionArg
|
|
1456
|
+
.find({ id: { $gt: cursor } })
|
|
1457
|
+
.sort({ id: 1 })
|
|
1458
|
+
.limit(webPushEncryptionContextChunkSize)
|
|
1459
|
+
.toArray();
|
|
1460
|
+
if (chunk.length === 0)
|
|
1461
|
+
break;
|
|
1462
|
+
for (const document of chunk) {
|
|
1463
|
+
const owner = {
|
|
1464
|
+
gatewayClientId: String(document.ownerGatewayClientId),
|
|
1465
|
+
appInstanceId: String(document.ownerAppInstanceId),
|
|
1466
|
+
};
|
|
1467
|
+
const vapidKeys = Array.isArray(document.vapidKeys) ? document.vapidKeys : [];
|
|
1468
|
+
const recovery = document.credentialRotationRecovery;
|
|
1469
|
+
const update = {};
|
|
1470
|
+
const nextVapidKeys = vapidKeys.map((vapidKey) => {
|
|
1471
|
+
if (!isLegacyWebPushEnvelope(vapidKey?.privateKeyEnvelope))
|
|
1472
|
+
return vapidKey;
|
|
1473
|
+
return {
|
|
1474
|
+
...vapidKey,
|
|
1475
|
+
privateKeyEnvelope: resealWebPushEnvelope(vapidKey.privateKeyEnvelope, {
|
|
1476
|
+
...owner,
|
|
1477
|
+
bindingId: String(document.id),
|
|
1478
|
+
documentType: 'vapid-private-key',
|
|
1479
|
+
documentId: String(vapidKey.id),
|
|
1480
|
+
}, keyRingArg, keepWebPushPlaintext),
|
|
1481
|
+
};
|
|
1482
|
+
});
|
|
1483
|
+
if (nextVapidKeys.some((vapidKey, index) => vapidKey !== vapidKeys[index])) {
|
|
1484
|
+
update.vapidKeys = nextVapidKeys;
|
|
1485
|
+
}
|
|
1486
|
+
if (isLegacyWebPushEnvelope(recovery?.secretEnvelope)) {
|
|
1487
|
+
update.credentialRotationRecovery = {
|
|
1488
|
+
...recovery,
|
|
1489
|
+
secretEnvelope: resealWebPushEnvelope(recovery.secretEnvelope, {
|
|
1490
|
+
...owner,
|
|
1491
|
+
bindingId: String(document.id),
|
|
1492
|
+
documentType: 'credential-rotation-recovery',
|
|
1493
|
+
documentId: canonicalWebPushJson({
|
|
1494
|
+
lifecycleGeneration: recovery.lifecycleGeneration,
|
|
1495
|
+
requestedCredentialId: recovery.requestedCredentialId,
|
|
1496
|
+
resultingCredentialId: recovery.resultingCredentialId,
|
|
1497
|
+
}),
|
|
1498
|
+
}, keyRingArg, keepWebPushPlaintext),
|
|
1499
|
+
};
|
|
1500
|
+
}
|
|
1501
|
+
if (Object.keys(update).length > 0) {
|
|
1502
|
+
await collectionArg.updateOne({ _id: document._id }, { $set: update });
|
|
1503
|
+
resealed++;
|
|
1504
|
+
}
|
|
1505
|
+
cursor = String(document.id);
|
|
1506
|
+
}
|
|
1507
|
+
await checkpointArg?.write('bindingCursor', cursor);
|
|
2859
1508
|
}
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
1509
|
+
logArg(`resealed ${resealed} binding document(s)`);
|
|
1510
|
+
}
|
|
1511
|
+
/**
|
|
1512
|
+
* Resolve a spool row's owner from its binding. It is read on demand rather
|
|
1513
|
+
* than collected during the binding walk, because that walk resumes from a
|
|
1514
|
+
* cursor and would otherwise hand the spool an owner map missing every binding
|
|
1515
|
+
* an earlier run already passed.
|
|
1516
|
+
*/
|
|
1517
|
+
function createWebPushOwnerResolver(bindingCollectionArg) {
|
|
1518
|
+
const owners = new Map();
|
|
1519
|
+
return async (bindingIdArg) => {
|
|
1520
|
+
if (owners.has(bindingIdArg))
|
|
1521
|
+
return owners.get(bindingIdArg);
|
|
1522
|
+
const document = await bindingCollectionArg.findOne({ id: bindingIdArg });
|
|
1523
|
+
const owner = document
|
|
1524
|
+
? {
|
|
1525
|
+
gatewayClientId: String(document.ownerGatewayClientId),
|
|
1526
|
+
appInstanceId: String(document.ownerAppInstanceId),
|
|
1527
|
+
}
|
|
1528
|
+
: undefined;
|
|
1529
|
+
owners.set(bindingIdArg, owner);
|
|
1530
|
+
return owner;
|
|
1531
|
+
};
|
|
1532
|
+
}
|
|
1533
|
+
async function resealWebPushSpool(collectionArg, resolveOwnerArg, keyRingArg, checkpointArg, logArg) {
|
|
1534
|
+
let cursor = (await checkpointArg?.read('spoolCursor')) ?? '';
|
|
1535
|
+
let resealed = 0;
|
|
1536
|
+
let orphaned = 0;
|
|
1537
|
+
for (;;) {
|
|
1538
|
+
const chunk = await collectionArg
|
|
1539
|
+
.find({ id: { $gt: cursor } })
|
|
1540
|
+
.sort({ id: 1 })
|
|
1541
|
+
.limit(webPushEncryptionContextChunkSize)
|
|
1542
|
+
.toArray();
|
|
1543
|
+
if (chunk.length === 0)
|
|
1544
|
+
break;
|
|
1545
|
+
for (const document of chunk) {
|
|
1546
|
+
cursor = String(document.id);
|
|
1547
|
+
const legacySubscription = isLegacyWebPushEnvelope(document.subscriptionEnvelope);
|
|
1548
|
+
const legacyPayload = isLegacyWebPushEnvelope(document.payloadEnvelope);
|
|
1549
|
+
if (!legacySubscription && !legacyPayload && document.schemaVersion === undefined)
|
|
1550
|
+
continue;
|
|
1551
|
+
const owner = await resolveOwnerArg(String(document.bindingId));
|
|
1552
|
+
if (!owner) {
|
|
1553
|
+
// The owning binding is gone, so no version of dcrouter can rebuild
|
|
1554
|
+
// this row's associated data or deliver it. It is left exactly as it
|
|
1555
|
+
// is rather than rewritten from a guess or deleted.
|
|
1556
|
+
orphaned++;
|
|
1557
|
+
continue;
|
|
1558
|
+
}
|
|
1559
|
+
const aadBase = {
|
|
1560
|
+
...owner,
|
|
1561
|
+
bindingId: String(document.bindingId),
|
|
1562
|
+
documentId: String(document.id),
|
|
1563
|
+
};
|
|
1564
|
+
const update = {};
|
|
1565
|
+
if (legacySubscription) {
|
|
1566
|
+
update.subscriptionEnvelope = resealWebPushEnvelope(document.subscriptionEnvelope, { ...aadBase, documentType: 'spool-subscription' }, keyRingArg, keepWebPushPlaintext);
|
|
1567
|
+
}
|
|
1568
|
+
if (legacyPayload) {
|
|
1569
|
+
update.payloadEnvelope = resealWebPushEnvelope(document.payloadEnvelope, { ...aadBase, documentType: 'spool-payload' }, keyRingArg, withoutWebPushPayloadShapeVersion);
|
|
1570
|
+
}
|
|
1571
|
+
await collectionArg.updateOne({ _id: document._id }, {
|
|
1572
|
+
...(Object.keys(update).length > 0 ? { $set: update } : {}),
|
|
1573
|
+
$unset: { schemaVersion: '' },
|
|
1574
|
+
});
|
|
1575
|
+
resealed++;
|
|
1576
|
+
}
|
|
1577
|
+
await checkpointArg?.write('spoolCursor', cursor);
|
|
1578
|
+
}
|
|
1579
|
+
logArg(`resealed ${resealed} spool document(s)`
|
|
1580
|
+
+ (orphaned > 0 ? `; left ${orphaned} undeliverable row(s) whose binding no longer exists` : ''));
|
|
1581
|
+
}
|
|
1582
|
+
async function migrateWebPushEncryptionContext(ctx, options) {
|
|
1583
|
+
const bindings = ctx.mongo.collection('WebPushBindingDoc');
|
|
1584
|
+
const spool = ctx.mongo.collection('WebPushSpoolDoc');
|
|
1585
|
+
const hasSealedMaterial = Boolean(await bindings.findOne({}, { projection: { _id: 1 } })
|
|
1586
|
+
|| await spool.findOne({}, { projection: { _id: 1 } }));
|
|
1587
|
+
if (!hasSealedMaterial) {
|
|
1588
|
+
ctx.log.log('info', 'webpush-encryption-context: no Web Push documents to reseal');
|
|
1589
|
+
return;
|
|
1590
|
+
}
|
|
1591
|
+
if (!options.webPushMasterKeyRing) {
|
|
1592
|
+
throw new DcRouterMigrationError('webpush-encryption-context: stored Web Push documents have to be resealed under the '
|
|
1593
|
+
+ 'interfaces 32 associated data, but DCROUTER_WEB_PUSH_MASTER_KEY_RING is not configured');
|
|
1594
|
+
}
|
|
1595
|
+
const keyRing = parseWebPushKeyRing(options.webPushMasterKeyRing, 'DCROUTER_WEB_PUSH_MASTER_KEY_RING');
|
|
1596
|
+
await resealWebPushBindings(bindings, keyRing, ctx.checkpoint, (message) => ctx.log.log('info', `webpush-encryption-context: ${message}`));
|
|
1597
|
+
await resealWebPushSpool(spool, createWebPushOwnerResolver(bindings), keyRing, ctx.checkpoint, (message) => ctx.log.log('info', `webpush-encryption-context: ${message}`));
|
|
1598
|
+
}
|
|
1599
|
+
// ----------------------------------------- CoreMail peer verifier format (32)
|
|
1600
|
+
/** The verifier contract token CoreMail peers were stored under before interfaces 32.0.0. */
|
|
1601
|
+
const legacyCoreMailVerifierFormat = 'argon2id-v1';
|
|
1602
|
+
async function migrateCoreMailPeerVerifierFormat(ctx) {
|
|
1603
|
+
const collection = ctx.mongo.collection('CoreMailGatewayPeerDoc');
|
|
1604
|
+
const documents = await collection.find({}).sort({ id: 1 }).toArray();
|
|
1605
|
+
let migrated = 0;
|
|
1606
|
+
for (const document of documents) {
|
|
1607
|
+
const credentials = Array.isArray(document.credentials) ? document.credentials : [];
|
|
1608
|
+
if (!credentials.some((credential) => credential?.format === legacyCoreMailVerifierFormat)) {
|
|
1609
|
+
continue;
|
|
1610
|
+
}
|
|
1611
|
+
await collection.updateOne({ _id: document._id }, {
|
|
1612
|
+
$set: {
|
|
1613
|
+
credentials: credentials.map((credential) => (credential?.format === legacyCoreMailVerifierFormat
|
|
1614
|
+
? { ...credential, format: coreMailVerifierFormat }
|
|
1615
|
+
: credential)),
|
|
1616
|
+
},
|
|
1617
|
+
});
|
|
1618
|
+
migrated++;
|
|
2863
1619
|
}
|
|
2864
|
-
|
|
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');
|
|
1620
|
+
ctx.log.log('info', `coremail-peer-verifier-format: rewrote ${migrated} peer record(s)`);
|
|
2867
1621
|
}
|
|
2868
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQix5QkFBeUIsR0FDMUIsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsK0JBQStCLEdBQ2hDLE1BQU0sOENBQThDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDcEYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUF3QmpGLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0NBQWdDLENBQ3BELEVBQVcsRUFDWCxVQUFxQyxFQUFFO0lBRXZDLDRFQUE0RTtJQUM1RSxPQUFPLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBNEJELE1BQU0sdUJBQXVCLEdBSXhCO0lBQ0g7UUFDRSxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFdBQVcsRUFBRSw0RkFBNEY7UUFD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QUssU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBSyxHQUFXLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQUssR0FBVyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSyxHQUFXLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSx5REFBeUQsQ0FBQyxDQUFDO1FBQy9FLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBSSxHQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQztJQUV2RCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQ3ZCLEdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFHLEdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsNkJBQTZCLEVBQUUsRUFDNUYsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFF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
|
|
1622
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLCtCQUErQixHQUNoQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFDTCxhQUFhLElBQUksb0JBQW9CLEVBQ3JDLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsbUJBQW1CLEdBQ3BCLE1BQU0seUNBQXlDLENBQUM7QUFNakQsT0FBTyxFQUFFLElBQUksSUFBSSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpFLDZGQUE2RjtBQUM3RixNQUFNLHNCQUFzQixHQUFHLHVCQUF1QixDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQztBQUUvRjs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0lBQy9DLFlBQVksVUFBa0IsRUFBRSxVQUFnQztRQUM5RCxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBZ0JELDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFD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
|