@mavogel/awscdk-rootmail 0.0.225 → 0.0.227
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/.jsii +60 -13
- package/API.md +31 -0
- package/integ-tests/integ.rootmail-custom-santa.ts.snapshot/RootmailIntegTestStack.assets.json +29 -29
- package/integ-tests/integ.rootmail-custom-santa.ts.snapshot/RootmailIntegTestStack.template.json +11 -10
- package/integ-tests/integ.rootmail-custom-santa.ts.snapshot/SetupTestIntegStackDefaultTestDeployAssert6EB6FF77.assets.json +2 -2
- package/integ-tests/integ.rootmail-custom-santa.ts.snapshot/SetupTestIntegStackDefaultTestDeployAssert6EB6FF77.template.json +2 -2
- package/integ-tests/{integ.rootmail.ts.snapshot/asset.9572b451243318765beb576ae7528096b3879783dbaab795c02c01d7f4e83438 → integ.rootmail-custom-santa.ts.snapshot/asset.11768574bbd12c5ed10f463a68797423c366b61535ebc1b14951661b92657fa5}/index.js +1 -1
- package/integ-tests/{integ.rootmail.ts.snapshot/asset.157ba1713f7224463b621261792d18081588ff306a9bc3f75e6c468fabbe1a60 → integ.rootmail-custom-santa.ts.snapshot/asset.409d1db869dd0ed635bff94c855031afc92e9ac918a5d09651dd0b5316db1433}/index.js +1 -1
- package/integ-tests/integ.rootmail-custom-santa.ts.snapshot/asset.5407280701b87b2f099edc3024ed41a8c3a392c678cd6cf144fd099626ebe66d/index.js +35106 -0
- package/integ-tests/{integ.rootmail.ts.snapshot/asset.78b64aaf9aebb4eacbdd42197be10e9d5894360a642f7dcf79aeb84bb3552377 → integ.rootmail-custom-santa.ts.snapshot/asset.7144c5a47b3904b1aa4b27be73803a4b684f4ef765d9df8fa767779d37106254}/index.js +1 -1
- package/integ-tests/{integ.rootmail.ts.snapshot/asset.b8448324ef2c7d5bfa362722df2d397079d5aabaae2749f09180ac5bedfa5c89 → integ.rootmail-custom-santa.ts.snapshot/asset.9709438d0fbb508ea9bfee8683a274b4f9492f5e527eb28e0bd9e2bc96b9a08f}/index.js +4 -1
- package/integ-tests/{integ.rootmail.ts.snapshot/asset.f75274dd7677b6ef41f29d2dfc2c885b4f4e069d3fb8e67636bd89efd3f0fcad → integ.rootmail-custom-santa.ts.snapshot/asset.a0f9d47d625e1e17d1946bc138cc46c9b7ecb7136dc54cf26af266b0e30b4e15}/index.js +1 -1
- package/integ-tests/{integ.rootmail.ts.snapshot/asset.4c079063901e6478dbb5ace19e3123641ebf0da2ab648ecf52079c5bec154196 → integ.rootmail-custom-santa.ts.snapshot/asset.aca912f8a6aebc5dfd423aff79785b8fd7488473a4cf93aaa7ad0e442b548787}/index.js +1 -1
- package/integ-tests/{integ.rootmail.ts.snapshot/asset.d2b520d86fd9d964c83dc0d5ce2e4456dbde5fa7ae0c791a71865cbdfe2fb855 → integ.rootmail-custom-santa.ts.snapshot/asset.ad34b204b794bb6638b7af71a62693ffbfcee3c07bdbd90bbf9f8787036bc7c3}/index.js +1 -1
- package/integ-tests/{integ.rootmail.ts.snapshot/asset.7e8a681794eff5fda1841caa360113df5488ecf944055a69b8f1e5a687e269f5 → integ.rootmail-custom-santa.ts.snapshot/asset.f61472ea141af20f69ebb7a7718158fcb95d72410c0c2a2e72cc59b1822873fc}/index.js +1 -1
- package/integ-tests/integ.rootmail-custom-santa.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.rootmail-custom-santa.ts.snapshot/manifest.json +2 -2
- package/integ-tests/integ.rootmail-custom-santa.ts.snapshot/tree.json +9 -9
- package/integ-tests/integ.rootmail-filter-subject.ts +156 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/RootmailIntegTestStack.assets.json +162 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/RootmailIntegTestStack.template.json +4542 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/SetupTestIntegStackDefaultTestDeployAssert6EB6FF77.assets.json +32 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/SetupTestIntegStackDefaultTestDeployAssert6EB6FF77.template.json +249 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/asset.53e8368959effe94a6e51bef9c7c5bf0eaf5c4d64eece81632ca62aa34517978.bundle/index.js +31981 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/asset.5cc92ed0cea39e2b8de2dbc527dfb5980a3af9564bd1084d840b9787c7d0467e/index.d.ts +14 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/asset.5cc92ed0cea39e2b8de2dbc527dfb5980a3af9564bd1084d840b9787c7d0467e/index.js +1 -0
- package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot/asset.97724f55c990db7c62d85b80d4afb032e60011490da173e3551e6a131013b79d → integ.rootmail-filter-subject.ts.snapshot/asset.9ac6d29f0cc4b20ec46e4c186d9a6f6448c7ea11b689e70a5dda69671a9d6848}/index.js +376 -20245
- package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot/asset.b8448324ef2c7d5bfa362722df2d397079d5aabaae2749f09180ac5bedfa5c89 → integ.rootmail-filter-subject.ts.snapshot/asset.be7d56b509650f7f97c406a745d8335992726086995e4cb4aaf50417ab40e803}/index.js +3 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/asset.f2d30cfc360482320a52a4fcde8a70f3569df79ab30be24650fda58eb60052cf/cfn-response.js +1 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/asset.f2d30cfc360482320a52a4fcde8a70f3569df79ab30be24650fda58eb60052cf/consts.js +1 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/asset.f2d30cfc360482320a52a4fcde8a70f3569df79ab30be24650fda58eb60052cf/framework.js +3 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/asset.f2d30cfc360482320a52a4fcde8a70f3569df79ab30be24650fda58eb60052cf/outbound.js +1 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/asset.f2d30cfc360482320a52a4fcde8a70f3569df79ab30be24650fda58eb60052cf/util.js +1 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/integ.json +27 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/manifest.json +742 -0
- package/integ-tests/integ.rootmail-filter-subject.ts.snapshot/tree.json +5893 -0
- package/integ-tests/integ.rootmail.ts.snapshot/RootmailIntegTestStack.assets.json +32 -32
- package/integ-tests/integ.rootmail.ts.snapshot/RootmailIntegTestStack.template.json +12 -11
- package/integ-tests/integ.rootmail.ts.snapshot/SetupTestIntegStackDefaultTestDeployAssert6EB6FF77.assets.json +2 -2
- package/integ-tests/integ.rootmail.ts.snapshot/SetupTestIntegStackDefaultTestDeployAssert6EB6FF77.template.json +3 -3
- package/integ-tests/integ.rootmail.ts.snapshot/asset.11768574bbd12c5ed10f463a68797423c366b61535ebc1b14951661b92657fa5/index.js +47 -0
- package/integ-tests/integ.rootmail.ts.snapshot/asset.409d1db869dd0ed635bff94c855031afc92e9ac918a5d09651dd0b5316db1433/index.js +106 -0
- package/integ-tests/integ.rootmail.ts.snapshot/asset.7144c5a47b3904b1aa4b27be73803a4b684f4ef765d9df8fa767779d37106254/index.js +61 -0
- package/integ-tests/integ.rootmail.ts.snapshot/asset.9709438d0fbb508ea9bfee8683a274b4f9492f5e527eb28e0bd9e2bc96b9a08f/index.js +108 -0
- package/integ-tests/integ.rootmail.ts.snapshot/asset.a0f9d47d625e1e17d1946bc138cc46c9b7ecb7136dc54cf26af266b0e30b4e15/index.js +74 -0
- package/integ-tests/integ.rootmail.ts.snapshot/asset.aca912f8a6aebc5dfd423aff79785b8fd7488473a4cf93aaa7ad0e442b548787/index.js +215 -0
- package/integ-tests/integ.rootmail.ts.snapshot/asset.ad34b204b794bb6638b7af71a62693ffbfcee3c07bdbd90bbf9f8787036bc7c3/index.js +85 -0
- package/integ-tests/integ.rootmail.ts.snapshot/{asset.3fe096136c1d1292627baeb9b860b3206032deebb5a03ea407d7d04833a222d7 → asset.b0a80de4302e54c024e3dd1233407ed7b1b3ab3bae801ce319e6d8660b2a8db3}/index.js +618 -20478
- package/integ-tests/integ.rootmail.ts.snapshot/{asset.070f758ea9c89b8ceea9bb5141ea511633e1d72ab992b608da4efb3d6eeb2ba5 → asset.d25bfd59a60ba15d60c7d58fe66a9c9930044da8f0592ac451a8760bbbfa6460}/index.js +1 -1
- package/integ-tests/integ.rootmail.ts.snapshot/asset.f61472ea141af20f69ebb7a7718158fcb95d72410c0c2a2e72cc59b1822873fc/index.js +83 -0
- package/integ-tests/integ.rootmail.ts.snapshot/manifest.json +2 -2
- package/integ-tests/integ.rootmail.ts.snapshot/tree.json +10 -10
- package/lib/rootmail.d.ts +6 -0
- package/lib/rootmail.js +4 -2
- package/lib/ses-receipt-ruleset-activation.d.ts +1 -0
- package/lib/ses-receipt-ruleset-activation.js +2 -1
- package/lib/ses-receipt-ruleset-activation.on-event-handler.d.ts +1 -0
- package/lib/ses-receipt-ruleset-activation.on-event-handler.js +3 -2
- package/lib/ses-receive.d.ts +4 -0
- package/lib/ses-receive.js +4 -2
- package/lib/ses-receive.ops-santa-handler.js +15 -3
- package/node_modules/axios/CHANGELOG.md +11 -0
- package/node_modules/axios/dist/axios.js +2 -2
- package/node_modules/axios/dist/axios.js.map +1 -1
- package/node_modules/axios/dist/axios.min.js +1 -1
- package/node_modules/axios/dist/axios.min.js.map +1 -1
- package/node_modules/axios/dist/browser/axios.cjs +2 -2
- package/node_modules/axios/dist/browser/axios.cjs.map +1 -1
- package/node_modules/axios/dist/esm/axios.js +2 -2
- package/node_modules/axios/dist/esm/axios.js.map +1 -1
- package/node_modules/axios/dist/esm/axios.min.js +1 -1
- package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
- package/node_modules/axios/dist/node/axios.cjs +2 -2
- package/node_modules/axios/dist/node/axios.cjs.map +1 -1
- package/node_modules/axios/index.d.cts +28 -33
- package/node_modules/axios/index.d.ts +568 -75
- package/node_modules/axios/lib/env/data.js +1 -1
- package/node_modules/axios/package.json +1 -1
- package/node_modules/cdk-nag/.jsii +2 -2
- package/node_modules/cdk-nag/lib/ignore-suppression-conditions.js +5 -5
- package/node_modules/cdk-nag/lib/nag-logger.js +2 -2
- package/node_modules/cdk-nag/lib/nag-pack.js +1 -1
- package/node_modules/cdk-nag/lib/nag-rules.js +1 -1
- package/node_modules/cdk-nag/lib/nag-suppressions.js +1 -1
- package/node_modules/cdk-nag/lib/packs/aws-solutions.js +1 -1
- package/node_modules/cdk-nag/lib/packs/hipaa-security.js +1 -1
- package/node_modules/cdk-nag/lib/packs/nist-800-53-r4.js +1 -1
- package/node_modules/cdk-nag/lib/packs/nist-800-53-r5.js +1 -1
- package/node_modules/cdk-nag/lib/packs/pci-dss-321.js +1 -1
- package/node_modules/cdk-nag/package.json +1 -1
- package/package.json +4 -4
- /package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot → integ.rootmail-filter-subject.ts.snapshot}/asset.157ba1713f7224463b621261792d18081588ff306a9bc3f75e6c468fabbe1a60/index.js +0 -0
- /package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot → integ.rootmail-filter-subject.ts.snapshot}/asset.4c079063901e6478dbb5ace19e3123641ebf0da2ab648ecf52079c5bec154196/index.js +0 -0
- /package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot → integ.rootmail-filter-subject.ts.snapshot}/asset.78b64aaf9aebb4eacbdd42197be10e9d5894360a642f7dcf79aeb84bb3552377/index.js +0 -0
- /package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot → integ.rootmail-filter-subject.ts.snapshot}/asset.7e8a681794eff5fda1841caa360113df5488ecf944055a69b8f1e5a687e269f5/index.js +0 -0
- /package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot → integ.rootmail-filter-subject.ts.snapshot}/asset.9572b451243318765beb576ae7528096b3879783dbaab795c02c01d7f4e83438/index.js +0 -0
- /package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot → integ.rootmail-filter-subject.ts.snapshot}/asset.d2b520d86fd9d964c83dc0d5ce2e4456dbde5fa7ae0c791a71865cbdfe2fb855/index.js +0 -0
- /package/integ-tests/{integ.rootmail-custom-santa.ts.snapshot → integ.rootmail-filter-subject.ts.snapshot}/asset.f75274dd7677b6ef41f29d2dfc2c885b4f4e069d3fb8e67636bd89efd3f0fcad/index.js +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// asset-input/src/hosted-zone-dkim-verification-records.on-event-handler.ts
|
|
21
|
+
var hosted_zone_dkim_verification_records_on_event_handler_exports = {};
|
|
22
|
+
__export(hosted_zone_dkim_verification_records_on_event_handler_exports, {
|
|
23
|
+
ATTR_DKIM_TOKENS: () => ATTR_DKIM_TOKENS,
|
|
24
|
+
ATTR_VERIFICATION_TOKEN: () => ATTR_VERIFICATION_TOKEN,
|
|
25
|
+
PROP_DOMAIN: () => PROP_DOMAIN,
|
|
26
|
+
handler: () => handler
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(hosted_zone_dkim_verification_records_on_event_handler_exports);
|
|
29
|
+
var import_client_ses = require("@aws-sdk/client-ses");
|
|
30
|
+
var PROP_DOMAIN = "Domain";
|
|
31
|
+
var ATTR_VERIFICATION_TOKEN = "VerificationToken";
|
|
32
|
+
var ATTR_DKIM_TOKENS = "DkimTokens";
|
|
33
|
+
var ses = new import_client_ses.SES();
|
|
34
|
+
async function handler(event) {
|
|
35
|
+
const domain = event.ResourceProperties[PROP_DOMAIN];
|
|
36
|
+
switch (event.RequestType) {
|
|
37
|
+
case "Create":
|
|
38
|
+
case "Update":
|
|
39
|
+
let physicalResourceId = event.PhysicalResourceId;
|
|
40
|
+
if (event.RequestType === "Create") {
|
|
41
|
+
physicalResourceId = event.RequestId;
|
|
42
|
+
}
|
|
43
|
+
console.log(`${event.RequestType}: Do Domain verification and DKIM records for ${event.LogicalResourceId} and domain '${domain}' with PhysicalResourceId '${physicalResourceId}'`);
|
|
44
|
+
const verifyDomainResponse = await ses.verifyDomainIdentity({ Domain: domain });
|
|
45
|
+
const verificationToken = verifyDomainResponse.VerificationToken;
|
|
46
|
+
console.log(`${event.RequestType}: Got verification token '${verificationToken}' for domain '${domain}'`);
|
|
47
|
+
const verifyDomainDkimResponse = await ses.verifyDomainDkim({ Domain: domain });
|
|
48
|
+
const dkimTokens = verifyDomainDkimResponse.DkimTokens;
|
|
49
|
+
console.log(`${event.RequestType}: Got DKIM tokens '${dkimTokens}' for domain '${domain}'`);
|
|
50
|
+
return {
|
|
51
|
+
PhysicalResourceId: physicalResourceId,
|
|
52
|
+
Data: {
|
|
53
|
+
[ATTR_VERIFICATION_TOKEN]: verificationToken,
|
|
54
|
+
[ATTR_DKIM_TOKENS]: dkimTokens
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
// TODO check if delete should do nothing: https://github.com/superwerker/superwerker/blob/main/templates/rootmail.yaml#L170
|
|
58
|
+
// we store in Parameter Store as well
|
|
59
|
+
case "Delete":
|
|
60
|
+
console.log(`Deleting Domain identity for domain '${domain}' with PhysicalResourceId '${event.PhysicalResourceId}'`);
|
|
61
|
+
const deleteResponse = await ses.deleteIdentity({ Identity: domain });
|
|
62
|
+
console.log(`Deleted Domain identity for domain '${domain}'`, deleteResponse);
|
|
63
|
+
return {
|
|
64
|
+
PhysicalResourceId: event.PhysicalResourceId
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
69
|
+
0 && (module.exports = {
|
|
70
|
+
ATTR_DKIM_TOKENS,
|
|
71
|
+
ATTR_VERIFICATION_TOKEN,
|
|
72
|
+
PROP_DOMAIN,
|
|
73
|
+
handler
|
|
74
|
+
});
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// asset-input/src/rootmail-autowire-dns.on-event-handler.ts
|
|
21
|
+
var rootmail_autowire_dns_on_event_handler_exports = {};
|
|
22
|
+
__export(rootmail_autowire_dns_on_event_handler_exports, {
|
|
23
|
+
PROP_DOMAIN: () => PROP_DOMAIN,
|
|
24
|
+
PROP_HOSTED_ZONE_PARAMETER_NAME: () => PROP_HOSTED_ZONE_PARAMETER_NAME,
|
|
25
|
+
PROP_PARENT_HOSTED_ZONE_ID: () => PROP_PARENT_HOSTED_ZONE_ID,
|
|
26
|
+
PROP_R53_CHANGEINFO_ID_PARAMETER_NAME: () => PROP_R53_CHANGEINFO_ID_PARAMETER_NAME,
|
|
27
|
+
PROP_SUB_DOMAIN: () => PROP_SUB_DOMAIN,
|
|
28
|
+
handler: () => handler
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(rootmail_autowire_dns_on_event_handler_exports);
|
|
31
|
+
var import_client_route_53 = require("@aws-sdk/client-route-53");
|
|
32
|
+
var import_client_ssm = require("@aws-sdk/client-ssm");
|
|
33
|
+
var PROP_DOMAIN = "Domain";
|
|
34
|
+
var PROP_SUB_DOMAIN = "Subdomain";
|
|
35
|
+
var PROP_PARENT_HOSTED_ZONE_ID = "ParentHostedZoneId";
|
|
36
|
+
var PROP_HOSTED_ZONE_PARAMETER_NAME = "HostedZoneParameterName";
|
|
37
|
+
var PROP_R53_CHANGEINFO_ID_PARAMETER_NAME = "R53ChangeInfoIdParameterName";
|
|
38
|
+
var route53 = new import_client_route_53.Route53();
|
|
39
|
+
var ssm = new import_client_ssm.SSM();
|
|
40
|
+
async function handler(event) {
|
|
41
|
+
const domain = event.ResourceProperties[PROP_DOMAIN];
|
|
42
|
+
const parentHostedZoneId = event.ResourceProperties[PROP_PARENT_HOSTED_ZONE_ID];
|
|
43
|
+
if (parentHostedZoneId === void 0 || parentHostedZoneId.trim().length === 0) {
|
|
44
|
+
switch (event.RequestType) {
|
|
45
|
+
case "Create":
|
|
46
|
+
log(`${event.RequestType}: Autowire DNS is disabled for '${domain}'. Skipping. PhysicalResourceId: ${event.RequestId}`);
|
|
47
|
+
return {
|
|
48
|
+
PhysicalResourceId: event.RequestId
|
|
49
|
+
};
|
|
50
|
+
case "Update":
|
|
51
|
+
case "Delete":
|
|
52
|
+
log(`${event.RequestType}: Autowire DNS is disabled for '${domain}'. Skipping. PhysicalResourceId: ${event.PhysicalResourceId}`);
|
|
53
|
+
return {
|
|
54
|
+
PhysicalResourceId: event.PhysicalResourceId
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const subdomain = event.ResourceProperties[PROP_SUB_DOMAIN];
|
|
59
|
+
const hostedZoneParameterName = event.ResourceProperties[PROP_HOSTED_ZONE_PARAMETER_NAME];
|
|
60
|
+
const r53ChangeInfoIdParameterName = event.ResourceProperties[PROP_R53_CHANGEINFO_ID_PARAMETER_NAME];
|
|
61
|
+
switch (event.RequestType) {
|
|
62
|
+
case "Create":
|
|
63
|
+
const hostedZoneNameServerParameterResponse = await ssm.getParameter({
|
|
64
|
+
Name: hostedZoneParameterName
|
|
65
|
+
});
|
|
66
|
+
const hostedZoneNameServersAsString = hostedZoneNameServerParameterResponse.Parameter?.Value;
|
|
67
|
+
log({
|
|
68
|
+
event: hostedZoneNameServersAsString,
|
|
69
|
+
level: "debug"
|
|
70
|
+
});
|
|
71
|
+
if (hostedZoneNameServersAsString === void 0 || hostedZoneNameServersAsString === "") {
|
|
72
|
+
throw new Error(`hosted zone name servers not found or empty in parameter store for ${domain}: ${hostedZoneNameServersAsString}`);
|
|
73
|
+
}
|
|
74
|
+
const hostedZoneNameServers = hostedZoneNameServersAsString?.split(",");
|
|
75
|
+
if (hostedZoneNameServers.length !== 4) {
|
|
76
|
+
throw new Error(`expected exactly 4 hosted zone name servers for ${domain}. Got ${hostedZoneNameServers.length}: ${hostedZoneNameServers}`);
|
|
77
|
+
}
|
|
78
|
+
const hostedZoneResponse = await route53.listHostedZonesByName({
|
|
79
|
+
DNSName: domain
|
|
80
|
+
});
|
|
81
|
+
if (hostedZoneResponse.HostedZones === void 0 || hostedZoneResponse.HostedZones?.length === 0) {
|
|
82
|
+
log({
|
|
83
|
+
event: hostedZoneResponse,
|
|
84
|
+
level: "debug"
|
|
85
|
+
});
|
|
86
|
+
throw new Error(`expected to find at least one hosted zone for ${domain}`);
|
|
87
|
+
}
|
|
88
|
+
const filteredHostedZones = hostedZoneResponse.HostedZones?.filter((hostedZone) => {
|
|
89
|
+
return hostedZone.Id === `/hostedzone/${parentHostedZoneId}`;
|
|
90
|
+
});
|
|
91
|
+
if (filteredHostedZones.length !== 1) {
|
|
92
|
+
log({
|
|
93
|
+
event: hostedZoneResponse,
|
|
94
|
+
level: "debug"
|
|
95
|
+
});
|
|
96
|
+
throw new Error(`expected to find & filter exactly 1 hosted zone for ${domain}. Got ${filteredHostedZones.length}`);
|
|
97
|
+
}
|
|
98
|
+
const listResourceRecordSetsResponse = await route53.listResourceRecordSets({
|
|
99
|
+
// remove the prefix for using it as parameter
|
|
100
|
+
HostedZoneId: parentHostedZoneId.replace("/hostedzone/", "")
|
|
101
|
+
});
|
|
102
|
+
if (listResourceRecordSetsResponse.ResourceRecordSets === void 0) {
|
|
103
|
+
log({
|
|
104
|
+
event: listResourceRecordSetsResponse,
|
|
105
|
+
level: "debug"
|
|
106
|
+
});
|
|
107
|
+
throw new Error(`expected to find at least one resource record set for ${domain}`);
|
|
108
|
+
}
|
|
109
|
+
const existingNSRecordSet = listResourceRecordSetsResponse.ResourceRecordSets?.find((recordSet) => {
|
|
110
|
+
return recordSet.Name === `${subdomain}.${domain}.` && recordSet.Type === "NS";
|
|
111
|
+
});
|
|
112
|
+
if (existingNSRecordSet !== void 0) {
|
|
113
|
+
log({
|
|
114
|
+
event: existingNSRecordSet,
|
|
115
|
+
level: "debug"
|
|
116
|
+
});
|
|
117
|
+
log(`NS record for Name '${subdomain}.${domain}' and type NS already exists. Skipping.`);
|
|
118
|
+
return {
|
|
119
|
+
PhysicalResourceId: event.RequestId
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
log(`NS record for Name '${subdomain}.${domain}' and type NS does not exist. Creating.`);
|
|
123
|
+
const recordSetCreationResponse = await route53.changeResourceRecordSets({
|
|
124
|
+
HostedZoneId: parentHostedZoneId,
|
|
125
|
+
ChangeBatch: {
|
|
126
|
+
Comment: "rootmail-autowire-dns",
|
|
127
|
+
Changes: [
|
|
128
|
+
{
|
|
129
|
+
Action: "CREATE",
|
|
130
|
+
ResourceRecordSet: {
|
|
131
|
+
Name: `${subdomain}.${domain}`,
|
|
132
|
+
Type: "NS",
|
|
133
|
+
TTL: 60,
|
|
134
|
+
ResourceRecords: [
|
|
135
|
+
// are always 4
|
|
136
|
+
{ Value: hostedZoneNameServers[0] },
|
|
137
|
+
{ Value: hostedZoneNameServers[1] },
|
|
138
|
+
{ Value: hostedZoneNameServers[2] },
|
|
139
|
+
{ Value: hostedZoneNameServers[3] }
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
await ssm.putParameter({
|
|
147
|
+
Name: r53ChangeInfoIdParameterName,
|
|
148
|
+
Value: recordSetCreationResponse.ChangeInfo.Id,
|
|
149
|
+
Overwrite: true
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
PhysicalResourceId: event.RequestId
|
|
153
|
+
};
|
|
154
|
+
case "Update":
|
|
155
|
+
log(`Skipping update for NS record for Name '${subdomain}.${domain}'`);
|
|
156
|
+
return {
|
|
157
|
+
PhysicalResourceId: event.PhysicalResourceId
|
|
158
|
+
};
|
|
159
|
+
case "Delete":
|
|
160
|
+
log(`Deleting NS record for Name '${subdomain}.${domain}' in the hosted zone with ID ${parentHostedZoneId}`);
|
|
161
|
+
const recordName = `${subdomain}.${domain}`;
|
|
162
|
+
try {
|
|
163
|
+
let nextRecordName;
|
|
164
|
+
let isRecordDeleted = false;
|
|
165
|
+
do {
|
|
166
|
+
const recordsResponse = await route53.listResourceRecordSets({
|
|
167
|
+
HostedZoneId: parentHostedZoneId,
|
|
168
|
+
StartRecordName: nextRecordName
|
|
169
|
+
});
|
|
170
|
+
for (const recordSet of recordsResponse.ResourceRecordSets || []) {
|
|
171
|
+
if (recordSet.Name === `${recordName}.` && recordSet.Type === "NS") {
|
|
172
|
+
console.log(`Deleting record: ${recordSet.Name} ${recordSet.Type}`);
|
|
173
|
+
await route53.changeResourceRecordSets({
|
|
174
|
+
HostedZoneId: parentHostedZoneId,
|
|
175
|
+
ChangeBatch: {
|
|
176
|
+
Changes: [
|
|
177
|
+
{
|
|
178
|
+
Action: "DELETE",
|
|
179
|
+
ResourceRecordSet: recordSet
|
|
180
|
+
}
|
|
181
|
+
]
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
console.log(`Deleted record: ${recordSet.Name} ${recordSet.Type}. Stopping here.`);
|
|
185
|
+
isRecordDeleted = true;
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
nextRecordName = recordsResponse.NextRecordName;
|
|
190
|
+
if (isRecordDeleted) {
|
|
191
|
+
console.log(`Record deleted: ${recordName} type 'NS'. Quitting.`);
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
} while (nextRecordName);
|
|
195
|
+
} catch (err) {
|
|
196
|
+
console.log(`Error deleting records: ${err}`);
|
|
197
|
+
throw err;
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
PhysicalResourceId: event.PhysicalResourceId
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function log(msg) {
|
|
205
|
+
console.log(JSON.stringify(msg));
|
|
206
|
+
}
|
|
207
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
208
|
+
0 && (module.exports = {
|
|
209
|
+
PROP_DOMAIN,
|
|
210
|
+
PROP_HOSTED_ZONE_PARAMETER_NAME,
|
|
211
|
+
PROP_PARENT_HOSTED_ZONE_ID,
|
|
212
|
+
PROP_R53_CHANGEINFO_ID_PARAMETER_NAME,
|
|
213
|
+
PROP_SUB_DOMAIN,
|
|
214
|
+
handler
|
|
215
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// asset-input/integ-tests/functions/send-email-handler.ts
|
|
21
|
+
var send_email_handler_exports = {};
|
|
22
|
+
__export(send_email_handler_exports, {
|
|
23
|
+
handler: () => handler
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(send_email_handler_exports);
|
|
26
|
+
var import_client_ses = require("@aws-sdk/client-ses");
|
|
27
|
+
var ses = new import_client_ses.SES();
|
|
28
|
+
var handler = async (event) => {
|
|
29
|
+
const id = event.id || "test-id-1";
|
|
30
|
+
const text = event.text || "test";
|
|
31
|
+
const sourceMail = event.sourceMail || "test@example.com";
|
|
32
|
+
const toMail = event.toMail || "root@example.com";
|
|
33
|
+
const ruleAfter = await ses.describeReceiptRule({
|
|
34
|
+
RuleSetName: "RootMail",
|
|
35
|
+
RuleName: "Receive"
|
|
36
|
+
});
|
|
37
|
+
log({ message: "Rule:", rule: ruleAfter.Rule });
|
|
38
|
+
const params = {
|
|
39
|
+
Source: sourceMail,
|
|
40
|
+
Destination: {
|
|
41
|
+
ToAddresses: [toMail]
|
|
42
|
+
},
|
|
43
|
+
Message: {
|
|
44
|
+
Subject: {
|
|
45
|
+
Data: id
|
|
46
|
+
},
|
|
47
|
+
Body: {
|
|
48
|
+
Text: {
|
|
49
|
+
Data: text
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
try {
|
|
55
|
+
const res = await ses.sendEmail(params);
|
|
56
|
+
if (res.$metadata.httpStatusCode !== 200) {
|
|
57
|
+
log({
|
|
58
|
+
message: "Error sending email",
|
|
59
|
+
params,
|
|
60
|
+
messageId: res.MessageId,
|
|
61
|
+
err: `httpStatusCode: ${res.$metadata.httpStatusCode}`
|
|
62
|
+
});
|
|
63
|
+
return { sendStatusCode: 500, err: res.$metadata.httpStatusCode };
|
|
64
|
+
}
|
|
65
|
+
log({
|
|
66
|
+
message: "Email sent",
|
|
67
|
+
params,
|
|
68
|
+
res
|
|
69
|
+
});
|
|
70
|
+
return { sendStatusCode: 200 };
|
|
71
|
+
} catch (err) {
|
|
72
|
+
log({
|
|
73
|
+
message: "Error (catch) sending email",
|
|
74
|
+
err
|
|
75
|
+
});
|
|
76
|
+
return { sendStatusCode: 500, err };
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
function log(msg) {
|
|
80
|
+
console.log(JSON.stringify(msg));
|
|
81
|
+
}
|
|
82
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
83
|
+
0 && (module.exports = {
|
|
84
|
+
handler
|
|
85
|
+
});
|