@serve.zone/dcrouter 18.5.0 → 18.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deno.json +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +2 -1
- package/dist_ts/classes.dcrouter.js +4 -2
- package/dist_ts/db/documents/classes.gateway-mail-domain.doc.d.ts +16 -0
- package/dist_ts/db/documents/classes.gateway-mail-domain.doc.js +107 -0
- package/dist_ts/db/documents/index.d.ts +1 -0
- package/dist_ts/db/documents/index.js +2 -1
- package/dist_ts/email/classes.gateway-mail-domain.store.d.ts +11 -0
- package/dist_ts/email/classes.gateway-mail-domain.store.js +70 -0
- package/dist_ts/email/classes.workapp-mail-manager.d.ts +3 -23
- package/dist_ts/email/classes.workapp-mail-manager.js +18 -35
- package/dist_ts/email/gateway-mail-domain-authority.d.ts +44 -0
- package/dist_ts/email/gateway-mail-domain-authority.js +160 -0
- package/dist_ts/email/index.d.ts +2 -0
- package/dist_ts/email/index.js +3 -1
- package/dist_ts/opsserver/handlers/gatewayclient.handler.js +33 -1
- package/dist_ts/opsserver/helpers/gateway-client-auth.d.ts +2 -0
- package/dist_ts/opsserver/helpers/gateway-client-auth.js +5 -3
- package/dist_ts_migrations/index.js +196 -11
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +3 -3
- package/readme.md +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +3 -1
- package/ts/db/documents/classes.gateway-mail-domain.doc.ts +42 -0
- package/ts/db/documents/index.ts +1 -0
- package/ts/email/classes.gateway-mail-domain.store.ts +89 -0
- package/ts/email/classes.workapp-mail-manager.ts +33 -70
- package/ts/email/gateway-mail-domain-authority.ts +222 -0
- package/ts/email/index.ts +2 -0
- package/ts/opsserver/handlers/gatewayclient.handler.ts +43 -1
- package/ts/opsserver/helpers/gateway-client-auth.ts +6 -2
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
import * as plugins from '../../plugins.js';
|
|
36
|
+
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
|
+
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
38
|
+
/**
|
|
39
|
+
* Authoritative WorkApp mail identity storage, grouped so one document equals
|
|
40
|
+
* one distinct gateway-client-owned mail domain.
|
|
41
|
+
*/
|
|
42
|
+
let GatewayMailDomainDoc = (() => {
|
|
43
|
+
let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
|
|
44
|
+
let _classDescriptor;
|
|
45
|
+
let _classExtraInitializers = [];
|
|
46
|
+
let _classThis;
|
|
47
|
+
let _classSuper = plugins.smartdata.SmartDataDbDoc;
|
|
48
|
+
let _id_decorators;
|
|
49
|
+
let _id_initializers = [];
|
|
50
|
+
let _id_extraInitializers = [];
|
|
51
|
+
let _ownerGatewayClientType_decorators;
|
|
52
|
+
let _ownerGatewayClientType_initializers = [];
|
|
53
|
+
let _ownerGatewayClientType_extraInitializers = [];
|
|
54
|
+
let _ownerGatewayClientId_decorators;
|
|
55
|
+
let _ownerGatewayClientId_initializers = [];
|
|
56
|
+
let _ownerGatewayClientId_extraInitializers = [];
|
|
57
|
+
let _domain_decorators;
|
|
58
|
+
let _domain_initializers = [];
|
|
59
|
+
let _domain_extraInitializers = [];
|
|
60
|
+
let _identities_decorators;
|
|
61
|
+
let _identities_initializers = [];
|
|
62
|
+
let _identities_extraInitializers = [];
|
|
63
|
+
let _createdAt_decorators;
|
|
64
|
+
let _createdAt_initializers = [];
|
|
65
|
+
let _createdAt_extraInitializers = [];
|
|
66
|
+
let _updatedAt_decorators;
|
|
67
|
+
let _updatedAt_initializers = [];
|
|
68
|
+
let _updatedAt_extraInitializers = [];
|
|
69
|
+
var GatewayMailDomainDoc = class extends _classSuper {
|
|
70
|
+
static { _classThis = this; }
|
|
71
|
+
static {
|
|
72
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
73
|
+
_id_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
|
|
74
|
+
_ownerGatewayClientType_decorators = [plugins.smartdata.index(), plugins.smartdata.svDb()];
|
|
75
|
+
_ownerGatewayClientId_decorators = [plugins.smartdata.index(), plugins.smartdata.svDb()];
|
|
76
|
+
_domain_decorators = [plugins.smartdata.index(), plugins.smartdata.svDb()];
|
|
77
|
+
_identities_decorators = [plugins.smartdata.svDb()];
|
|
78
|
+
_createdAt_decorators = [plugins.smartdata.svDb()];
|
|
79
|
+
_updatedAt_decorators = [plugins.smartdata.svDb()];
|
|
80
|
+
__esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
|
|
81
|
+
__esDecorate(null, null, _ownerGatewayClientType_decorators, { kind: "field", name: "ownerGatewayClientType", static: false, private: false, access: { has: obj => "ownerGatewayClientType" in obj, get: obj => obj.ownerGatewayClientType, set: (obj, value) => { obj.ownerGatewayClientType = value; } }, metadata: _metadata }, _ownerGatewayClientType_initializers, _ownerGatewayClientType_extraInitializers);
|
|
82
|
+
__esDecorate(null, null, _ownerGatewayClientId_decorators, { kind: "field", name: "ownerGatewayClientId", static: false, private: false, access: { has: obj => "ownerGatewayClientId" in obj, get: obj => obj.ownerGatewayClientId, set: (obj, value) => { obj.ownerGatewayClientId = value; } }, metadata: _metadata }, _ownerGatewayClientId_initializers, _ownerGatewayClientId_extraInitializers);
|
|
83
|
+
__esDecorate(null, null, _domain_decorators, { kind: "field", name: "domain", static: false, private: false, access: { has: obj => "domain" in obj, get: obj => obj.domain, set: (obj, value) => { obj.domain = value; } }, metadata: _metadata }, _domain_initializers, _domain_extraInitializers);
|
|
84
|
+
__esDecorate(null, null, _identities_decorators, { kind: "field", name: "identities", static: false, private: false, access: { has: obj => "identities" in obj, get: obj => obj.identities, set: (obj, value) => { obj.identities = value; } }, metadata: _metadata }, _identities_initializers, _identities_extraInitializers);
|
|
85
|
+
__esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
|
|
86
|
+
__esDecorate(null, null, _updatedAt_decorators, { kind: "field", name: "updatedAt", static: false, private: false, access: { has: obj => "updatedAt" in obj, get: obj => obj.updatedAt, set: (obj, value) => { obj.updatedAt = value; } }, metadata: _metadata }, _updatedAt_initializers, _updatedAt_extraInitializers);
|
|
87
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
88
|
+
GatewayMailDomainDoc = _classThis = _classDescriptor.value;
|
|
89
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
90
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
91
|
+
}
|
|
92
|
+
id = __runInitializers(this, _id_initializers, void 0);
|
|
93
|
+
ownerGatewayClientType = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _ownerGatewayClientType_initializers, void 0));
|
|
94
|
+
ownerGatewayClientId = (__runInitializers(this, _ownerGatewayClientType_extraInitializers), __runInitializers(this, _ownerGatewayClientId_initializers, void 0));
|
|
95
|
+
domain = (__runInitializers(this, _ownerGatewayClientId_extraInitializers), __runInitializers(this, _domain_initializers, void 0));
|
|
96
|
+
identities = (__runInitializers(this, _domain_extraInitializers), __runInitializers(this, _identities_initializers, []));
|
|
97
|
+
createdAt = (__runInitializers(this, _identities_extraInitializers), __runInitializers(this, _createdAt_initializers, void 0));
|
|
98
|
+
updatedAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _updatedAt_initializers, void 0));
|
|
99
|
+
constructor() {
|
|
100
|
+
super(...arguments);
|
|
101
|
+
__runInitializers(this, _updatedAt_extraInitializers);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
return GatewayMailDomainDoc = _classThis;
|
|
105
|
+
})();
|
|
106
|
+
export { GatewayMailDomainDoc };
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nYXRld2F5LW1haWwtZG9tYWluLmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLmdhdGV3YXktbWFpbC1kb21haW4uZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUl2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFckQ7OztHQUdHO0lBRVUsb0JBQW9COzRCQURoQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7OztzQkFDRixPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0NBQXhDLFNBQVEsV0FHekM7Ozs7OEJBQ0UsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7a0RBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2dEQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUN6QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtrQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFDekIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7c0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFwQnpCLHdKQUFPLEVBQUUsNkJBQUYsRUFBRSwrRUFBVTtZQUluQixvTkFBTyxzQkFBc0IsNkJBQXRCLHNCQUFzQix1SEFBc0I7WUFJbkQsOE1BQU8sb0JBQW9CLDZCQUFwQixvQkFBb0IsbUhBQVU7WUFJckMsb0tBQU8sTUFBTSw2QkFBTixNQUFNLHVGQUFVO1lBR3ZCLGdMQUFPLFVBQVUsNkJBQVYsVUFBVSwrRkFBb0M7WUFHckQsNktBQU8sU0FBUyw2QkFBVCxTQUFTLDZGQUFVO1lBRzFCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtZQTNCNUIsNktBNEJDOzs7WUE1QlksdURBQW9COztRQU14QixFQUFFLHFEQUFVO1FBSVosc0JBQXNCLDJIQUFzQjtRQUk1QyxvQkFBb0IsNklBQVU7UUFJOUIsTUFBTSw2SEFBVTtRQUdoQixVQUFVLDBHQUFpQyxFQUFFLEdBQUM7UUFHOUMsU0FBUyxzSEFBVTtRQUduQixTQUFTLHFIQUFVOzs7Ozs7OztTQTNCZixvQkFBb0IifQ==
|
|
@@ -26,6 +26,7 @@ export * from './classes.dns-record.doc.js';
|
|
|
26
26
|
export * from './classes.dns-authority.doc.js';
|
|
27
27
|
export * from './classes.acme-config.doc.js';
|
|
28
28
|
export * from './classes.email-domain.doc.js';
|
|
29
|
+
export * from './classes.gateway-mail-domain.doc.js';
|
|
29
30
|
export * from './classes.email-server-settings.doc.js';
|
|
30
31
|
export * from './classes.smtp-account.doc.js';
|
|
31
32
|
export * from './classes.webpush-binding.doc.js';
|
|
@@ -35,6 +35,7 @@ export * from './classes.dns-authority.doc.js';
|
|
|
35
35
|
export * from './classes.acme-config.doc.js';
|
|
36
36
|
// Email domain management
|
|
37
37
|
export * from './classes.email-domain.doc.js';
|
|
38
|
+
export * from './classes.gateway-mail-domain.doc.js';
|
|
38
39
|
export * from './classes.email-server-settings.doc.js';
|
|
39
40
|
export * from './classes.smtp-account.doc.js';
|
|
40
41
|
// Web Push provider documents
|
|
@@ -43,4 +44,4 @@ export * from './classes.webpush-admission.doc.js';
|
|
|
43
44
|
export * from './classes.webpush-spool.doc.js';
|
|
44
45
|
export * from './classes.smartmta-storage.doc.js';
|
|
45
46
|
export * from './classes.ops-config-event.doc.js';
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQThCO0FBQzlCLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsdUNBQXVDLENBQUM7QUFFdEQsMEJBQTBCO0FBQzFCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGlDQUFpQyxDQUFDO0FBRWhELHVCQUF1QjtBQUN2QixjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsNkJBQTZCLENBQUM7QUFFNUMsK0JBQStCO0FBQy9CLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGtDQUFrQztBQUNsQyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsOENBQThDLENBQUM7QUFFN0QsMEJBQTBCO0FBQzFCLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxxQ0FBcUMsQ0FBQztBQUVwRCwyQ0FBMkM7QUFDM0MsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUUvQyxpQ0FBaUM7QUFDakMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QywwQkFBMEI7QUFDMUIsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYywrQkFBK0IsQ0FBQztBQUU5Qyw4QkFBOEI7QUFDOUIsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLG1DQUFtQyxDQUFDIn0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type IGatewayMailDomainOwner, type IStoredWorkAppMailIdentity } from './gateway-mail-domain-authority.js';
|
|
2
|
+
export interface IGatewayMailDomainStore {
|
|
3
|
+
readAllIdentities(): Promise<IStoredWorkAppMailIdentity[]>;
|
|
4
|
+
writeAllIdentities(identitiesArg: IStoredWorkAppMailIdentity[]): Promise<IStoredWorkAppMailIdentity[]>;
|
|
5
|
+
countDomains(ownerArg: IGatewayMailDomainOwner): Promise<number>;
|
|
6
|
+
}
|
|
7
|
+
export declare class GatewayMailDomainStore implements IGatewayMailDomainStore {
|
|
8
|
+
readAllIdentities(): Promise<IStoredWorkAppMailIdentity[]>;
|
|
9
|
+
writeAllIdentities(identitiesArg: IStoredWorkAppMailIdentity[]): Promise<IStoredWorkAppMailIdentity[]>;
|
|
10
|
+
countDomains(ownerArg: IGatewayMailDomainOwner): Promise<number>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { DcRouterDb } from '../db/classes.dcrouter-db.js';
|
|
2
|
+
import { GatewayMailDomainDoc } from '../db/documents/classes.gateway-mail-domain.doc.js';
|
|
3
|
+
import { createGatewayMailDomainId, groupGatewayMailIdentities, normalizeGatewayMailDomain, normalizeGatewayMailDomainOwner, } from './gateway-mail-domain-authority.js';
|
|
4
|
+
const validateDocument = (documentArg) => {
|
|
5
|
+
const owner = normalizeGatewayMailDomainOwner({
|
|
6
|
+
gatewayClientType: documentArg.ownerGatewayClientType,
|
|
7
|
+
gatewayClientId: documentArg.ownerGatewayClientId,
|
|
8
|
+
});
|
|
9
|
+
const domain = normalizeGatewayMailDomain(documentArg.domain);
|
|
10
|
+
const expectedId = createGatewayMailDomainId(owner, domain);
|
|
11
|
+
if (documentArg.id !== expectedId) {
|
|
12
|
+
throw new Error(`GatewayMailDomainDoc has a non-canonical id: ${documentArg.id}`);
|
|
13
|
+
}
|
|
14
|
+
const groups = groupGatewayMailIdentities(documentArg.identities || []);
|
|
15
|
+
if (groups.length !== 1 || groups[0].id !== expectedId) {
|
|
16
|
+
throw new Error(`GatewayMailDomainDoc identities do not match owner/domain: ${documentArg.id}`);
|
|
17
|
+
}
|
|
18
|
+
return groups[0].identities;
|
|
19
|
+
};
|
|
20
|
+
export class GatewayMailDomainStore {
|
|
21
|
+
async readAllIdentities() {
|
|
22
|
+
const documents = await GatewayMailDomainDoc.getInstances({});
|
|
23
|
+
const identities = documents.flatMap((documentArg) => validateDocument(documentArg));
|
|
24
|
+
return groupGatewayMailIdentities(identities).flatMap((groupArg) => groupArg.identities);
|
|
25
|
+
}
|
|
26
|
+
async writeAllIdentities(identitiesArg) {
|
|
27
|
+
const desiredGroups = groupGatewayMailIdentities(identitiesArg);
|
|
28
|
+
const desiredById = new Map(desiredGroups.map((groupArg) => [groupArg.id, groupArg]));
|
|
29
|
+
const db = DcRouterDb.getInstance().getDb();
|
|
30
|
+
const session = db.startSession();
|
|
31
|
+
try {
|
|
32
|
+
await session.withTransaction(async () => {
|
|
33
|
+
const existingDocuments = await GatewayMailDomainDoc.getInstances({}, { session });
|
|
34
|
+
const existingById = new Map(existingDocuments.map((documentArg) => {
|
|
35
|
+
validateDocument(documentArg);
|
|
36
|
+
return [documentArg.id, documentArg];
|
|
37
|
+
}));
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
for (const group of desiredGroups) {
|
|
40
|
+
const document = existingById.get(group.id) || new GatewayMailDomainDoc();
|
|
41
|
+
document.id = group.id;
|
|
42
|
+
document.ownerGatewayClientType = group.gatewayClientType;
|
|
43
|
+
document.ownerGatewayClientId = group.gatewayClientId;
|
|
44
|
+
document.domain = group.domain;
|
|
45
|
+
document.identities = group.identities;
|
|
46
|
+
document.createdAt = document.createdAt || now;
|
|
47
|
+
document.updatedAt = now;
|
|
48
|
+
await document.save({ session });
|
|
49
|
+
}
|
|
50
|
+
for (const existingDocument of existingDocuments) {
|
|
51
|
+
if (!desiredById.has(existingDocument.id)) {
|
|
52
|
+
await existingDocument.delete({ session });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
await session.endSession();
|
|
59
|
+
}
|
|
60
|
+
return await this.readAllIdentities();
|
|
61
|
+
}
|
|
62
|
+
async countDomains(ownerArg) {
|
|
63
|
+
const owner = normalizeGatewayMailDomainOwner(ownerArg);
|
|
64
|
+
return await GatewayMailDomainDoc.getCount({
|
|
65
|
+
ownerGatewayClientType: owner.gatewayClientType,
|
|
66
|
+
ownerGatewayClientId: owner.gatewayClientId,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nYXRld2F5LW1haWwtZG9tYWluLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZW1haWwvY2xhc3Nlcy5nYXRld2F5LW1haWwtZG9tYWluLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMxRixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsK0JBQStCLEdBR2hDLE1BQU0sb0NBQW9DLENBQUM7QUFRNUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFdBQWlDLEVBQWdDLEVBQUU7SUFDM0YsTUFBTSxLQUFLLEdBQUcsK0JBQStCLENBQUM7UUFDNUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLHNCQUFzQjtRQUNyRCxlQUFlLEVBQUUsV0FBVyxDQUFDLG9CQUFvQjtLQUNsRCxDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUQsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDdkQs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
|
|
@@ -4,6 +4,7 @@ import * as plugins from '../plugins.js';
|
|
|
4
4
|
import { CachedEmail } from '../db/index.js';
|
|
5
5
|
import type { DcRouter } from '../classes.dcrouter.js';
|
|
6
6
|
import type * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
7
|
+
import { type IStoredWorkAppMailIdentity } from './gateway-mail-domain-authority.js';
|
|
7
8
|
type TSyncRequest = {
|
|
8
9
|
ownership: interfaces.data.IWorkAppMailOwnership;
|
|
9
10
|
localPart: string;
|
|
@@ -26,27 +27,6 @@ type TMailEnqueueResponse = plugins.servezoneInterfaces.requests.mail.IReq_Enque
|
|
|
26
27
|
type TMailDeliveryStatusResponse = plugins.servezoneInterfaces.requests.mail.IReq_GetMailDeliveryStatus['response'];
|
|
27
28
|
type TMailEndpointRegistrationResponse = plugins.servezoneInterfaces.requests.mail.IReq_RegisterServiceMailEndpoint['response'];
|
|
28
29
|
type TWorkAppMailBinding = plugins.servezoneInterfaces.data.IWorkAppMailBinding;
|
|
29
|
-
interface IStoredWorkAppMailIdentity {
|
|
30
|
-
id: string;
|
|
31
|
-
externalKey: string;
|
|
32
|
-
ownership: interfaces.data.IWorkAppMailOwnership;
|
|
33
|
-
address: string;
|
|
34
|
-
localPart: string;
|
|
35
|
-
domain: string;
|
|
36
|
-
enabled: boolean;
|
|
37
|
-
displayName?: string;
|
|
38
|
-
inbound?: interfaces.data.IWorkAppMailInboundRoute;
|
|
39
|
-
inboundTarget?: plugins.servezoneInterfaces.data.IMailInboundTarget;
|
|
40
|
-
smtp: {
|
|
41
|
-
enabled: boolean;
|
|
42
|
-
username: string;
|
|
43
|
-
};
|
|
44
|
-
createdAt: number;
|
|
45
|
-
updatedAt: number;
|
|
46
|
-
createdBy: string;
|
|
47
|
-
smtpPassword: string;
|
|
48
|
-
smtpLastRotatedAt?: number;
|
|
49
|
-
}
|
|
50
30
|
/**
|
|
51
31
|
* WorkApp-generated routes and SMTP users contributed to the composed email
|
|
52
32
|
* runtime config. Consumed by SmtpAccountManager, the single owner of the
|
|
@@ -65,8 +45,8 @@ export declare function isWorkAppManagedMailRouteName(routeName: string): boolea
|
|
|
65
45
|
export declare function isWorkAppManagedSmtpUsername(username: string): boolean;
|
|
66
46
|
export declare class WorkAppMailManager {
|
|
67
47
|
private dcRouterRef;
|
|
68
|
-
private readonly storageKey;
|
|
69
48
|
private readonly emailValidator;
|
|
49
|
+
private readonly gatewayMailDomainStore;
|
|
70
50
|
private identityMutationPromise;
|
|
71
51
|
constructor(dcRouterRef: DcRouter);
|
|
72
52
|
listMailIdentities(ownership?: Partial<interfaces.data.IWorkAppMailOwnership>): Promise<interfaces.data.IWorkAppMailIdentity[]>;
|
|
@@ -79,6 +59,7 @@ export declare class WorkAppMailManager {
|
|
|
79
59
|
address?: string;
|
|
80
60
|
}): Promise<TMailAddressBinding[]>;
|
|
81
61
|
listWorkAppMailBindings(owner?: Partial<TMailResourceOwner>): Promise<TWorkAppMailBinding[]>;
|
|
62
|
+
countMailDomains(ownerArg: Pick<TMailResourceOwner, 'gatewayClientType' | 'gatewayClientId'>): Promise<number>;
|
|
82
63
|
syncMailAddressBinding(binding: TMailAddressBindingSync, createdBy: string): Promise<TMailAddressBindingSyncResponse>;
|
|
83
64
|
rotateMailCredential(credentialId: string, createdBy: string, owner?: Partial<TMailResourceOwner>): Promise<TMailCredentialRotateResponse>;
|
|
84
65
|
private rotateMailCredentialInner;
|
|
@@ -105,7 +86,6 @@ export declare class WorkAppMailManager {
|
|
|
105
86
|
applyStoredIdentitiesToRuntime(identities?: IStoredWorkAppMailIdentity[] | undefined): Promise<void>;
|
|
106
87
|
private readStoredIdentities;
|
|
107
88
|
private writeStoredIdentities;
|
|
108
|
-
private getRequiredStorageManager;
|
|
109
89
|
private buildInboundRoute;
|
|
110
90
|
private buildOutboundRoute;
|
|
111
91
|
private ensureEmailDomainConfigured;
|