@social-mail/social-mail-web-server 1.4.981 → 1.4.982
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/dist/server/model/events/DomainKeyEvents.d.ts.map +1 -1
- package/dist/server/model/events/DomainKeyEvents.js +5 -7
- package/dist/server/model/events/DomainKeyEvents.js.map +1 -1
- package/dist/server/model/events/HostedDomainEvents.d.ts.map +1 -1
- package/dist/server/model/events/HostedDomainEvents.js.map +1 -1
- package/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/server/workflows/dns/SyncDnsZoneRecordsWorkflow.d.ts.map +1 -1
- package/dist/server/workflows/dns/SyncDnsZoneRecordsWorkflow.js +72 -0
- package/dist/server/workflows/dns/SyncDnsZoneRecordsWorkflow.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/wwwroot/routes/social-mail/public/dns/zones/index.d.ts +7 -0
- package/dist/wwwroot/routes/social-mail/public/dns/zones/index.d.ts.map +1 -0
- package/dist/wwwroot/routes/social-mail/public/dns/zones/index.js +35 -0
- package/dist/wwwroot/routes/social-mail/public/dns/zones/index.js.map +1 -0
- package/dist/wwwroot/routes/social-mail/public/dns/zones/put.d.ts +7 -0
- package/dist/wwwroot/routes/social-mail/public/dns/zones/put.d.ts.map +1 -0
- package/dist/wwwroot/routes/social-mail/public/dns/zones/put.js +38 -0
- package/dist/wwwroot/routes/social-mail/public/dns/zones/put.js.map +1 -0
- package/package.json +1 -1
- package/src/server/model/events/DomainKeyEvents.ts +5 -6
- package/src/server/model/events/HostedDomainEvents.ts +2 -0
- package/src/server/seed/ui/seed-ui.ts +1 -1
- package/src/server/workflows/dns/SyncDnsZoneRecordsWorkflow.ts +81 -0
- package/src/wwwroot/routes/social-mail/public/dns/zones/index.ts +31 -0
- package/src/wwwroot/routes/social-mail/public/dns/zones/put.ts +29 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import Page from "@entity-access/server-pages/dist/Page.js";
|
|
2
|
+
import SocialMailContext from "../../../../../../server/model/SocialMailContext.js";
|
|
3
|
+
export default class extends Page {
|
|
4
|
+
db: SocialMailContext;
|
|
5
|
+
run(): Promise<import("@entity-access/server-pages/dist/Content.js").default>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/wwwroot/routes/social-mail/public/dns/zones/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAG5D,OAAO,iBAAiB,MAAM,qDAAqD,CAAC;AAEpF,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,EAAE,EAAE,iBAAiB,CAAC;IAEhB,GAAG;CAoBZ"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import Page from "@entity-access/server-pages/dist/Page.js";
|
|
11
|
+
import { globalEnv } from "../../../../../../common/globalEnv.js";
|
|
12
|
+
import Inject from "@entity-access/entity-access/dist/di/di.js";
|
|
13
|
+
import SocialMailContext from "../../../../../../server/model/SocialMailContext.js";
|
|
14
|
+
export default class default_1 extends Page {
|
|
15
|
+
async run() {
|
|
16
|
+
if (this.query.token !== globalEnv.parentApiToken) {
|
|
17
|
+
return this.content({
|
|
18
|
+
body: "Unauthorized",
|
|
19
|
+
status: 401
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const zones = await this.db.hostedZones.asQuery().toArray();
|
|
23
|
+
await this.db.hostedZoneRecords.where(void 0, (p) => (x) => x.disabled === false)
|
|
24
|
+
.toArray();
|
|
25
|
+
return this.json(zones.map((z) => ({
|
|
26
|
+
...z,
|
|
27
|
+
records: z.records.map((r) => ({ ...r, zone: void 0 }))
|
|
28
|
+
})));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
__decorate([
|
|
32
|
+
Inject,
|
|
33
|
+
__metadata("design:type", SocialMailContext)
|
|
34
|
+
], default_1.prototype, "db", void 0);
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/wwwroot/routes/social-mail/public/dns/zones/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,MAAM,MAAM,4CAA4C,CAAC;AAChE,OAAO,iBAAiB,MAAM,qDAAqD,CAAC;AAEpF,MAAM,CAAC,OAAO,gBAAO,SAAQ,IAAI;IAK7B,KAAK,CAAC,GAAG;QAEL,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,cAAc,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,OAAO,CAAC;gBAChB,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,GAAG;aACd,CAAC,CAAC;QACP,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;QAE5D,MAAM,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC;aAC5E,OAAO,EAAE,CAAC;QAEf,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,GAAI,CAAC;YACL,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,EAAE,GAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,EAAC,CAAC,CAAC;SAC3D,CAAC,CAAC,CAAC,CAAC;IAET,CAAC;CACJ;AAtBG;IADC,MAAM;8BACH,iBAAiB;qCAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import Page from "@entity-access/server-pages/dist/Page.js";
|
|
2
|
+
import SocialMailContext from "../../../../../../server/model/SocialMailContext.js";
|
|
3
|
+
export default class extends Page {
|
|
4
|
+
db: SocialMailContext;
|
|
5
|
+
run(): Promise<import("@entity-access/server-pages/dist/Content.js").default>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=put.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"put.d.ts","sourceRoot":"","sources":["../../../../../../../src/wwwroot/routes/social-mail/public/dns/zones/put.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAG5D,OAAO,iBAAiB,MAAM,qDAAqD,CAAC;AAIpF,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,EAAE,EAAE,iBAAiB,CAAC;IAEhB,GAAG;CAgBZ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import Page from "@entity-access/server-pages/dist/Page.js";
|
|
11
|
+
import { globalEnv } from "../../../../../../common/globalEnv.js";
|
|
12
|
+
import Inject from "@entity-access/entity-access/dist/di/di.js";
|
|
13
|
+
import SocialMailContext from "../../../../../../server/model/SocialMailContext.js";
|
|
14
|
+
import { Prepare } from "@entity-access/server-pages/dist/decorators/Prepare.js";
|
|
15
|
+
let default_1 = class extends Page {
|
|
16
|
+
async run() {
|
|
17
|
+
if (this.query.token !== globalEnv.parentApiToken) {
|
|
18
|
+
return this.content({
|
|
19
|
+
body: "Unauthorized",
|
|
20
|
+
status: 401
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const { zoneID, unsigned, digest } = this.body;
|
|
24
|
+
await this.db.hostedZones.statements.update({
|
|
25
|
+
unsigned,
|
|
26
|
+
digest
|
|
27
|
+
}, { zoneID });
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
__decorate([
|
|
31
|
+
Inject,
|
|
32
|
+
__metadata("design:type", SocialMailContext)
|
|
33
|
+
], default_1.prototype, "db", void 0);
|
|
34
|
+
default_1 = __decorate([
|
|
35
|
+
Prepare.parseJsonBody
|
|
36
|
+
], default_1);
|
|
37
|
+
export default default_1;
|
|
38
|
+
//# sourceMappingURL=put.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"put.js","sourceRoot":"","sources":["../../../../../../../src/wwwroot/routes/social-mail/public/dns/zones/put.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,MAAM,MAAM,4CAA4C,CAAC;AAChE,OAAO,iBAAiB,MAAM,qDAAqD,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AAGlE,gBAAA,KAAM,SAAQ,IAAI;IAK7B,KAAK,CAAC,GAAG;QAEL,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,cAAc,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,OAAO,CAAC;gBAChB,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,GAAG;aACd,CAAC,CAAC;QACP,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAW,CAAC;QAEtD,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;YACxC,QAAQ;YACR,MAAM;SACT,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACnB,CAAC;CACJ,CAAA;AAlBG;IADC,MAAM;8BACH,iBAAiB;qCAAC;AAHX;IADd,OAAO,CAAC,aAAa;aAsBrB"}
|
package/package.json
CHANGED
|
@@ -2,12 +2,14 @@ import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWit
|
|
|
2
2
|
import DomainKey from "../entities/DomainKey.js";
|
|
3
3
|
import AuthenticatedEvents from "./AuthenticatedEvents.js";
|
|
4
4
|
import ChangeEntry from "@entity-access/entity-access/dist/model/changes/ChangeEntry.js";
|
|
5
|
-
import Inject from "@entity-access/entity-access/dist/di/di.js";
|
|
5
|
+
import Inject, { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
|
|
6
6
|
import CryptoService from "../../services/CryptoService.js";
|
|
7
7
|
import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
|
|
8
8
|
import SocialMailContext from "../SocialMailContext.js";
|
|
9
9
|
import GlobalEvents from "../../../common/GlobalEvents.js";
|
|
10
10
|
import { globalEnv } from "../../../common/globalEnv.js";
|
|
11
|
+
import WorkflowContext from "@entity-access/entity-access/dist/workflows/WorkflowContext.js";
|
|
12
|
+
import SyncDnsZoneRecordsWorkflow from "../../workflows/dns/SyncDnsZoneRecordsWorkflow.js";
|
|
11
13
|
|
|
12
14
|
export default class DomainKeyEvents extends AuthenticatedEvents<DomainKey> {
|
|
13
15
|
|
|
@@ -61,10 +63,7 @@ export default class DomainKeyEvents extends AuthenticatedEvents<DomainKey> {
|
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
private async notify(entity: DomainKey) {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
const host = d.name;
|
|
67
|
-
const serverID = globalEnv.serverID;
|
|
68
|
-
this.globalEvents.notify("dkim-added", { publicKey, host, name, keyType, serverID });
|
|
66
|
+
const wc = ServiceProvider.resolve(this, WorkflowContext);
|
|
67
|
+
await SyncDnsZoneRecordsWorkflow.enqueue(wc, entity.domainID);
|
|
69
68
|
}
|
|
70
69
|
}
|
|
@@ -7,6 +7,8 @@ import Inject, { ServiceProvider } from "@entity-access/entity-access/dist/di/di
|
|
|
7
7
|
import EmailAddressService from "../../services/EmailAddressService.js";
|
|
8
8
|
import SocialMailContext from "../SocialMailContext.js";
|
|
9
9
|
import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
|
|
10
|
+
import SyncDnsZoneRecordsWorkflow from "../../workflows/dns/SyncDnsZoneRecordsWorkflow.js";
|
|
11
|
+
import WorkflowContext from "@entity-access/entity-access/dist/workflows/WorkflowContext.js";
|
|
10
12
|
|
|
11
13
|
export default class HostedDomainEvents extends AuthenticatedEvents<HostedDomain> {
|
|
12
14
|
|
|
@@ -5,6 +5,7 @@ import WorkflowContext from "@entity-access/entity-access/dist/workflows/Workflo
|
|
|
5
5
|
import SocialMailContext from "../../model/SocialMailContext.js";
|
|
6
6
|
import EmailAddressService from "../../services/EmailAddressService.js";
|
|
7
7
|
import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
|
|
8
|
+
import { globalEnv } from "../../../common/globalEnv.js";
|
|
8
9
|
|
|
9
10
|
export default class SyncDnsZoneRecordsWorkflow extends Workflow {
|
|
10
11
|
|
|
@@ -35,6 +36,86 @@ export default class SyncDnsZoneRecordsWorkflow extends Workflow {
|
|
|
35
36
|
}, {
|
|
36
37
|
zoneID
|
|
37
38
|
});
|
|
39
|
+
|
|
40
|
+
const exists = await db.hostedZoneRecords.statements.select({}, { zoneID });
|
|
41
|
+
if (exists) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const { name: domain } = await db.domains.statements.select({}, { domainID: zoneID });
|
|
46
|
+
|
|
47
|
+
const ttl = 8600;
|
|
48
|
+
const dateCreated = DateTime.now;
|
|
49
|
+
const dateUpdated = dateCreated;
|
|
50
|
+
|
|
51
|
+
await db.hostedZoneRecords.statements.insert({
|
|
52
|
+
zoneID,
|
|
53
|
+
dateCreated,
|
|
54
|
+
dateUpdated,
|
|
55
|
+
ttl,
|
|
56
|
+
name: "@",
|
|
57
|
+
type: "SOA",
|
|
58
|
+
value: globalEnv.dns.soa,
|
|
59
|
+
readonly: true,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
await db.hostedZoneRecords.statements.insert({
|
|
63
|
+
zoneID,
|
|
64
|
+
dateCreated,
|
|
65
|
+
dateUpdated,
|
|
66
|
+
ttl,
|
|
67
|
+
name: "_acme-challenge",
|
|
68
|
+
type: "CNAME",
|
|
69
|
+
value: `${domain}.${globalEnv.dns.letsEncryptPrefix}`,
|
|
70
|
+
readonly: true,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await db.hostedZoneRecords.statements.insert({
|
|
74
|
+
zoneID,
|
|
75
|
+
dateCreated,
|
|
76
|
+
dateUpdated,
|
|
77
|
+
ttl,
|
|
78
|
+
name: "_dmarc",
|
|
79
|
+
type: "TXT",
|
|
80
|
+
value: `v=DMARC1; p=reject; rua=mailto:no-reply@${domain};`,
|
|
81
|
+
readonly: true,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
await db.hostedZoneRecords.statements.insert({
|
|
85
|
+
zoneID,
|
|
86
|
+
dateCreated,
|
|
87
|
+
dateUpdated,
|
|
88
|
+
ttl,
|
|
89
|
+
type: "A",
|
|
90
|
+
name: "@",
|
|
91
|
+
value: "$IP$",
|
|
92
|
+
fqdn: `${domain}`,
|
|
93
|
+
readonly: true
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
await db.hostedZoneRecords.statements.insert({
|
|
97
|
+
zoneID,
|
|
98
|
+
dateCreated,
|
|
99
|
+
dateUpdated,
|
|
100
|
+
ttl,
|
|
101
|
+
type: "CNAME",
|
|
102
|
+
name: "www",
|
|
103
|
+
value: "$HOST$",
|
|
104
|
+
fqdn: `www.${domain}`,
|
|
105
|
+
readonly: true
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
await db.hostedZoneRecords.statements.insert({
|
|
109
|
+
zoneID,
|
|
110
|
+
dateCreated,
|
|
111
|
+
dateUpdated,
|
|
112
|
+
ttl,
|
|
113
|
+
type: "CNAME",
|
|
114
|
+
name: "*",
|
|
115
|
+
value: "$HOST$",
|
|
116
|
+
fqdn: `*.${domain}`,
|
|
117
|
+
readonly: true
|
|
118
|
+
});
|
|
38
119
|
}
|
|
39
120
|
|
|
40
121
|
@UniqueActivity
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Page from "@entity-access/server-pages/dist/Page.js";
|
|
2
|
+
import { globalEnv } from "../../../../../../common/globalEnv.js";
|
|
3
|
+
import Inject from "@entity-access/entity-access/dist/di/di.js";
|
|
4
|
+
import SocialMailContext from "../../../../../../server/model/SocialMailContext.js";
|
|
5
|
+
|
|
6
|
+
export default class extends Page {
|
|
7
|
+
|
|
8
|
+
@Inject
|
|
9
|
+
db: SocialMailContext;
|
|
10
|
+
|
|
11
|
+
async run() {
|
|
12
|
+
|
|
13
|
+
if (this.query.token !== globalEnv.parentApiToken) {
|
|
14
|
+
return this.content({
|
|
15
|
+
body: "Unauthorized",
|
|
16
|
+
status: 401
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const zones = await this.db.hostedZones.asQuery().toArray();
|
|
21
|
+
|
|
22
|
+
await this.db.hostedZoneRecords.where(void 0, (p) => (x) => x.disabled === false)
|
|
23
|
+
.toArray();
|
|
24
|
+
|
|
25
|
+
return this.json(zones.map((z) => ({
|
|
26
|
+
... z,
|
|
27
|
+
records: z.records.map((r) => ( { ... r, zone: void 0}))
|
|
28
|
+
})));
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Page from "@entity-access/server-pages/dist/Page.js";
|
|
2
|
+
import { globalEnv } from "../../../../../../common/globalEnv.js";
|
|
3
|
+
import Inject from "@entity-access/entity-access/dist/di/di.js";
|
|
4
|
+
import SocialMailContext from "../../../../../../server/model/SocialMailContext.js";
|
|
5
|
+
import { Prepare } from "@entity-access/server-pages/dist/decorators/Prepare.js";
|
|
6
|
+
|
|
7
|
+
@Prepare.parseJsonBody
|
|
8
|
+
export default class extends Page {
|
|
9
|
+
|
|
10
|
+
@Inject
|
|
11
|
+
db: SocialMailContext;
|
|
12
|
+
|
|
13
|
+
async run() {
|
|
14
|
+
|
|
15
|
+
if (this.query.token !== globalEnv.parentApiToken) {
|
|
16
|
+
return this.content({
|
|
17
|
+
body: "Unauthorized",
|
|
18
|
+
status: 401
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const { zoneID, unsigned, digest } = this.body as any;
|
|
23
|
+
|
|
24
|
+
await this.db.hostedZones.statements.update({
|
|
25
|
+
unsigned,
|
|
26
|
+
digest
|
|
27
|
+
}, { zoneID });
|
|
28
|
+
}
|
|
29
|
+
}
|