raindancers-cloudfront 0.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.
Files changed (103) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +176 -0
  3. package/lib/bicep/deploy/deploy.d.ts +46 -0
  4. package/lib/bicep/deploy/deploy.js +123 -0
  5. package/lib/bicep/deploy/index.d.ts +3 -0
  6. package/lib/bicep/deploy/index.js +20 -0
  7. package/lib/bicep/deploy/template.d.ts +75 -0
  8. package/lib/bicep/deploy/template.js +364 -0
  9. package/lib/bicep/deploy/templateBuilder.d.ts +16 -0
  10. package/lib/bicep/deploy/templateBuilder.js +35 -0
  11. package/lib/bicep/index.d.ts +3 -0
  12. package/lib/bicep/index.js +40 -0
  13. package/lib/bicep/patterns/azureAdApplicationFederated.d.ts +58 -0
  14. package/lib/bicep/patterns/azureAdApplicationFederated.js +317 -0
  15. package/lib/bicep/patterns/index.d.ts +1 -0
  16. package/lib/bicep/patterns/index.js +18 -0
  17. package/lib/bicep/resources/azure/appServicePlan.d.ts +11 -0
  18. package/lib/bicep/resources/azure/appServicePlan.js +24 -0
  19. package/lib/bicep/resources/azure/applicationInsights.d.ts +13 -0
  20. package/lib/bicep/resources/azure/applicationInsights.js +27 -0
  21. package/lib/bicep/resources/azure/deploymentScript.d.ts +16 -0
  22. package/lib/bicep/resources/azure/deploymentScript.js +43 -0
  23. package/lib/bicep/resources/azure/functionApp.d.ts +20 -0
  24. package/lib/bicep/resources/azure/functionApp.js +54 -0
  25. package/lib/bicep/resources/azure/index.d.ts +8 -0
  26. package/lib/bicep/resources/azure/index.js +25 -0
  27. package/lib/bicep/resources/azure/logAnalyticsWorkspace.d.ts +11 -0
  28. package/lib/bicep/resources/azure/logAnalyticsWorkspace.js +26 -0
  29. package/lib/bicep/resources/azure/managedIdentity.d.ts +13 -0
  30. package/lib/bicep/resources/azure/managedIdentity.js +24 -0
  31. package/lib/bicep/resources/azure/roleAssignment.d.ts +18 -0
  32. package/lib/bicep/resources/azure/roleAssignment.js +34 -0
  33. package/lib/bicep/resources/azure/storageAccount.d.ts +11 -0
  34. package/lib/bicep/resources/azure/storageAccount.js +28 -0
  35. package/lib/bicep/resources/graph/appRoleAssignment.d.ts +25 -0
  36. package/lib/bicep/resources/graph/appRoleAssignment.js +33 -0
  37. package/lib/bicep/resources/graph/application.d.ts +51 -0
  38. package/lib/bicep/resources/graph/application.js +88 -0
  39. package/lib/bicep/resources/graph/bicepConstruct.d.ts +14 -0
  40. package/lib/bicep/resources/graph/bicepConstruct.js +29 -0
  41. package/lib/bicep/resources/graph/existingServicePrincipal.d.ts +19 -0
  42. package/lib/bicep/resources/graph/existingServicePrincipal.js +26 -0
  43. package/lib/bicep/resources/graph/federatedIdentityCredential.d.ts +29 -0
  44. package/lib/bicep/resources/graph/federatedIdentityCredential.js +31 -0
  45. package/lib/bicep/resources/graph/group.d.ts +26 -0
  46. package/lib/bicep/resources/graph/group.js +31 -0
  47. package/lib/bicep/resources/graph/index.d.ts +8 -0
  48. package/lib/bicep/resources/graph/index.js +25 -0
  49. package/lib/bicep/resources/graph/servicePrincipal.d.ts +22 -0
  50. package/lib/bicep/resources/graph/servicePrincipal.js +27 -0
  51. package/lib/bicep/resources/graph/types/index.d.ts +1 -0
  52. package/lib/bicep/resources/graph/types/index.js +18 -0
  53. package/lib/bicep/resources/graph/types/permissions.d.ts +54 -0
  54. package/lib/bicep/resources/graph/types/permissions.js +73 -0
  55. package/lib/bicep/resources/index.d.ts +2 -0
  56. package/lib/bicep/resources/index.js +39 -0
  57. package/lib/cloudfront/auth/authLambdaFunctions.d.ts +20 -0
  58. package/lib/cloudfront/auth/authLambdaFunctions.js +159 -0
  59. package/lib/cloudfront/auth/authSecretManager.d.ts +19 -0
  60. package/lib/cloudfront/auth/authSecretManager.js +92 -0
  61. package/lib/cloudfront/auth/cognitoAuthSecretManager.d.ts +20 -0
  62. package/lib/cloudfront/auth/cognitoAuthSecretManager.js +93 -0
  63. package/lib/cloudfront/auth/index.d.ts +3 -0
  64. package/lib/cloudfront/auth/index.js +20 -0
  65. package/lib/cloudfront/authSecurityTable.d.ts +10 -0
  66. package/lib/cloudfront/authSecurityTable.js +78 -0
  67. package/lib/cloudfront/cloudfront-functions/function-composer.d.ts +21 -0
  68. package/lib/cloudfront/cloudfront-functions/function-composer.js +132 -0
  69. package/lib/cloudfront/cloudfrontCertificate.d.ts +40 -0
  70. package/lib/cloudfront/cloudfrontCertificate.js +116 -0
  71. package/lib/cloudfront/cloudfrontWebAcl.d.ts +72 -0
  72. package/lib/cloudfront/cloudfrontWebAcl.js +249 -0
  73. package/lib/cloudfront/countries.d.ts +260 -0
  74. package/lib/cloudfront/countries.js +263 -0
  75. package/lib/cloudfront/deployment/viteFrontendDeployment.d.ts +12 -0
  76. package/lib/cloudfront/deployment/viteFrontendDeployment.js +63 -0
  77. package/lib/cloudfront/index.d.ts +11 -0
  78. package/lib/cloudfront/index.js +28 -0
  79. package/lib/cloudfront/jwtDecoder.d.ts +5 -0
  80. package/lib/cloudfront/jwtDecoder.js +57 -0
  81. package/lib/cloudfront/logging/auditLogArchive.d.ts +18 -0
  82. package/lib/cloudfront/logging/auditLogArchive.js +205 -0
  83. package/lib/cloudfront/logging/index.d.ts +1 -0
  84. package/lib/cloudfront/logging/index.js +18 -0
  85. package/lib/cloudfront/oauthEdgeRole.d.ts +9 -0
  86. package/lib/cloudfront/oauthEdgeRole.js +56 -0
  87. package/lib/cloudfront/patterns/authInfrastructure.d.ts +34 -0
  88. package/lib/cloudfront/patterns/authInfrastructure.js +140 -0
  89. package/lib/cloudfront/patterns/cognito-secured-cloudfront.d.ts +36 -0
  90. package/lib/cloudfront/patterns/cognito-secured-cloudfront.js +285 -0
  91. package/lib/cloudfront/patterns/cognitoAuthInfrastructure.d.ts +28 -0
  92. package/lib/cloudfront/patterns/cognitoAuthInfrastructure.js +157 -0
  93. package/lib/cloudfront/patterns/index.d.ts +4 -0
  94. package/lib/cloudfront/patterns/index.js +21 -0
  95. package/lib/cloudfront/patterns/securedCloudFront.d.ts +73 -0
  96. package/lib/cloudfront/patterns/securedCloudFront.js +416 -0
  97. package/lib/cloudfront/ssmCrossRegionWriter.d.ts +9 -0
  98. package/lib/cloudfront/ssmCrossRegionWriter.js +65 -0
  99. package/lib/cloudfront/syncSecretToKvs.d.ts +9 -0
  100. package/lib/cloudfront/syncSecretToKvs.js +89 -0
  101. package/lib/index.d.ts +2 -0
  102. package/lib/index.js +19 -0
  103. package/package.json +105 -0
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AuditLogArchive = void 0;
37
+ const core = __importStar(require("aws-cdk-lib"));
38
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
39
+ const constructs = __importStar(require("constructs"));
40
+ class AuditLogArchive extends constructs.Construct {
41
+ constructor(scope, id, props) {
42
+ super(scope, id);
43
+ const archiveRetentionDays = props.archiveRetentionDays ?? 365;
44
+ const databaseName = props.databaseName ?? 'audit_logs';
45
+ const tableName = 'logs';
46
+ // Create S3 bucket for audit log archive
47
+ this.bucket = new aws_cdk_lib_1.aws_s3.Bucket(this, 'Bucket', {
48
+ bucketName: props.bucketName ?? `audit-logs-${core.Stack.of(this).account}-${core.Stack.of(this).region}`,
49
+ encryption: aws_cdk_lib_1.aws_s3.BucketEncryption.S3_MANAGED,
50
+ blockPublicAccess: aws_cdk_lib_1.aws_s3.BlockPublicAccess.BLOCK_ALL,
51
+ intelligentTieringConfigurations: [{
52
+ name: 'archive-tiering',
53
+ archiveAccessTierTime: core.Duration.days(90),
54
+ deepArchiveAccessTierTime: core.Duration.days(180),
55
+ }],
56
+ lifecycleRules: [{
57
+ id: 'delete-old-logs',
58
+ enabled: true,
59
+ expiration: core.Duration.days(archiveRetentionDays),
60
+ }],
61
+ removalPolicy: props.removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.RETAIN,
62
+ autoDeleteObjects: props.removalPolicy === aws_cdk_lib_1.RemovalPolicy.DESTROY,
63
+ });
64
+ // Create Glue database
65
+ this.database = new aws_cdk_lib_1.aws_glue.CfnDatabase(this, 'Database', {
66
+ catalogId: core.Stack.of(this).account,
67
+ databaseInput: {
68
+ name: databaseName,
69
+ description: 'Audit logs database for Athena queries',
70
+ },
71
+ });
72
+ // Create Glue table for Parquet schema
73
+ this.table = new aws_cdk_lib_1.aws_glue.CfnTable(this, 'Table', {
74
+ catalogId: core.Stack.of(this).account,
75
+ databaseName: this.database.ref,
76
+ tableInput: {
77
+ name: tableName,
78
+ description: 'Audit logs in Parquet format',
79
+ storageDescriptor: {
80
+ columns: [
81
+ { name: 'timestamp', type: 'bigint', comment: 'Log timestamp in milliseconds' },
82
+ { name: 'message', type: 'string', comment: 'Log message' },
83
+ { name: 'log_group', type: 'string', comment: 'CloudWatch log group name' },
84
+ { name: 'log_stream', type: 'string', comment: 'CloudWatch log stream name' },
85
+ { name: 'event_type', type: 'string', comment: 'Event type (extracted from message)' },
86
+ { name: 'user_id', type: 'string', comment: 'User identifier (if available)' },
87
+ { name: 'ip_address', type: 'string', comment: 'Client IP address (if available)' },
88
+ ],
89
+ location: `s3://${this.bucket.bucketName}/logs/`,
90
+ inputFormat: 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat',
91
+ outputFormat: 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat',
92
+ serdeInfo: {
93
+ serializationLibrary: 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe',
94
+ parameters: {
95
+ 'serialization.format': '1',
96
+ },
97
+ },
98
+ },
99
+ partitionKeys: [
100
+ { name: 'year', type: 'string' },
101
+ { name: 'month', type: 'string' },
102
+ { name: 'day', type: 'string' },
103
+ ],
104
+ tableType: 'EXTERNAL_TABLE',
105
+ },
106
+ });
107
+ // Create IAM role for Firehose
108
+ const firehoseRole = new aws_cdk_lib_1.aws_iam.Role(this, 'FirehoseRole', {
109
+ assumedBy: new aws_cdk_lib_1.aws_iam.ServicePrincipal('firehose.amazonaws.com'),
110
+ });
111
+ this.bucket.grantWrite(firehoseRole);
112
+ props.kmsKey.grantEncryptDecrypt(firehoseRole);
113
+ firehoseRole.addToPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
114
+ actions: ['glue:GetTable', 'glue:GetTableVersion', 'glue:GetTableVersions'],
115
+ resources: [
116
+ `arn:aws:glue:${core.Stack.of(this).region}:${core.Stack.of(this).account}:catalog`,
117
+ `arn:aws:glue:${core.Stack.of(this).region}:${core.Stack.of(this).account}:database/${databaseName}`,
118
+ `arn:aws:glue:${core.Stack.of(this).region}:${core.Stack.of(this).account}:table/${databaseName}/${tableName}`,
119
+ ],
120
+ }));
121
+ // Create Kinesis Firehose delivery stream with Parquet conversion
122
+ this.deliveryStream = new aws_cdk_lib_1.aws_kinesisfirehose.CfnDeliveryStream(this, 'DeliveryStream', {
123
+ deliveryStreamType: 'DirectPut',
124
+ extendedS3DestinationConfiguration: {
125
+ bucketArn: this.bucket.bucketArn,
126
+ roleArn: firehoseRole.roleArn,
127
+ prefix: 'logs/year=!{timestamp:yyyy}/month=!{timestamp:MM}/day=!{timestamp:dd}/',
128
+ errorOutputPrefix: 'errors/!{firehose:error-output-type}/year=!{timestamp:yyyy}/month=!{timestamp:MM}/day=!{timestamp:dd}/',
129
+ bufferingHints: {
130
+ intervalInSeconds: 300,
131
+ sizeInMBs: 128,
132
+ },
133
+ compressionFormat: 'UNCOMPRESSED',
134
+ dataFormatConversionConfiguration: {
135
+ enabled: true,
136
+ schemaConfiguration: {
137
+ roleArn: firehoseRole.roleArn,
138
+ databaseName: this.database.ref,
139
+ tableName: this.table.ref,
140
+ region: core.Stack.of(this).region,
141
+ versionId: 'LATEST',
142
+ },
143
+ inputFormatConfiguration: {
144
+ deserializer: {
145
+ openXJsonSerDe: {},
146
+ },
147
+ },
148
+ outputFormatConfiguration: {
149
+ serializer: {
150
+ parquetSerDe: {
151
+ compression: 'SNAPPY',
152
+ },
153
+ },
154
+ },
155
+ },
156
+ },
157
+ });
158
+ this.deliveryStream.addDependency(this.database);
159
+ this.deliveryStream.addDependency(this.table);
160
+ this.deliveryStream.node.addDependency(firehoseRole);
161
+ // Create IAM role for CloudWatch Logs subscription
162
+ const logsRole = new aws_cdk_lib_1.aws_iam.Role(this, 'LogsRole', {
163
+ assumedBy: new aws_cdk_lib_1.aws_iam.ServicePrincipal('logs.amazonaws.com'),
164
+ inlinePolicies: {
165
+ FirehosePermissions: new aws_cdk_lib_1.aws_iam.PolicyDocument({
166
+ statements: [
167
+ new aws_cdk_lib_1.aws_iam.PolicyStatement({
168
+ effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
169
+ actions: ['firehose:PutRecord'],
170
+ resources: [this.deliveryStream.attrArn],
171
+ }),
172
+ ],
173
+ }),
174
+ },
175
+ });
176
+ // Create subscription filters for each log group
177
+ props.logGroupNames.forEach((logGroupName, index) => {
178
+ new aws_cdk_lib_1.aws_logs.CfnSubscriptionFilter(this, `Subscription${index}`, {
179
+ logGroupName: logGroupName,
180
+ filterPattern: '',
181
+ destinationArn: this.deliveryStream.attrArn,
182
+ roleArn: logsRole.roleArn,
183
+ });
184
+ });
185
+ // Outputs
186
+ new core.CfnOutput(this, 'BucketName', {
187
+ value: this.bucket.bucketName,
188
+ description: 'S3 Bucket for Audit Log Archive',
189
+ });
190
+ new core.CfnOutput(this, 'DatabaseName', {
191
+ value: this.database.ref,
192
+ description: 'Glue Database Name for Athena Queries',
193
+ });
194
+ new core.CfnOutput(this, 'TableName', {
195
+ value: this.table.ref,
196
+ description: 'Glue Table Name for Athena Queries',
197
+ });
198
+ new core.CfnOutput(this, 'DeliveryStreamArn', {
199
+ value: this.deliveryStream.attrArn,
200
+ description: 'Kinesis Firehose Delivery Stream ARN',
201
+ });
202
+ }
203
+ }
204
+ exports.AuditLogArchive = AuditLogArchive;
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXRMb2dBcmNoaXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Nsb3VkZnJvbnQvbG9nZ2luZy9hdWRpdExvZ0FyY2hpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQW9DO0FBQ3BDLDZDQVFxQjtBQUNyQix1REFBeUM7QUFZekMsTUFBYSxlQUFnQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBTXZELFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDOUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxHQUFHLENBQUM7UUFDL0QsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUM7UUFDeEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBRXpCLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksb0JBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUMxQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxjQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDekcsVUFBVSxFQUFFLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtZQUMxQyxpQkFBaUIsRUFBRSxvQkFBRSxDQUFDLGlCQUFpQixDQUFDLFNBQVM7WUFDakQsZ0NBQWdDLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxD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LEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHO1lBQ3hCLFdBQVcsRUFBRSx1Q0FBdUM7U0FDckQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUU7WUFDcEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNyQixXQUFXLEVBQUUsb0NBQW9DO1NBQ2xELENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDNUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTztZQUNsQyxXQUFXLEVBQUUsc0NBQXNDO1NBQ3BELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXZMRCwwQ0F1TEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb3JlIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIGF3c19zMyBhcyBzMyxcbiAgYXdzX2ttcyBhcyBrbXMsXG4gIGF3c19sb2dzIGFzIGxvZ3MsXG4gIGF3c19raW5lc2lzZmlyZWhvc2UgYXMgZmlyZWhvc2UsXG4gIGF3c19nbHVlIGFzIGdsdWUsXG4gIGF3c19pYW0gYXMgaWFtLFxuICBSZW1vdmFsUG9saWN5LFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0TG9nQXJjaGl2ZVByb3BzIHtcbiAgcmVhZG9ubHkgbG9nR3JvdXBOYW1lczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGttc0tleToga21zLklLZXk7XG4gIHJlYWRvbmx5IHJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGFyY2hpdmVSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICByZWFkb25seSBidWNrZXROYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG5leHBvcnQgY2xhc3MgQXVkaXRMb2dBcmNoaXZlIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0OiBzMy5CdWNrZXQ7XG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZTogZ2x1ZS5DZm5EYXRhYmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlOiBnbHVlLkNmblRhYmxlO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVsaXZlcnlTdHJlYW06IGZpcmVob3NlLkNmbkRlbGl2ZXJ5U3RyZWFtO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEF1ZGl0TG9nQXJjaGl2ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGFyY2hpdmVSZXRlbnRpb25EYXlzID0gcHJvcHMuYXJjaGl2ZVJldGVudGlvbkRheXMgPz8gMzY1O1xuICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZSA/PyAnYXVkaXRfbG9ncyc7XG4gICAgY29uc3QgdGFibGVOYW1lID0gJ2xvZ3MnO1xuXG4gICAgLy8gQ3JlYXRlIFMzIGJ1Y2tldCBmb3IgYXVkaXQgbG9nIGFyY2hpdmVcbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ0J1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmJ1Y2tldE5hbWUgPz8gYGF1ZGl0LWxvZ3MtJHtjb3JlLlN0YWNrLm9mKHRoaXMpLmFjY291bnR9LSR7Y29yZS5TdGFjay5vZih0aGlzKS5yZWdpb259YCxcbiAgICAgIGVuY3J5cHRpb246IHMzLkJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBzMy5CbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICBpbnRlbGxpZ2VudFRpZXJpbmdDb25maWd1cmF0aW9uczogW3tcbiAgICAgICAgbmFtZTogJ2FyY2hpdmUtdGllcmluZycsXG4gICAgICAgIGFyY2hpdmVBY2Nlc3NUaWVyVGltZTogY29yZS5EdXJhdGlvbi5kYXlzKDkwKSxcbiAgICAgICAgZGVlcEFyY2hpdmVBY2Nlc3NUaWVyVGltZTogY29yZS5EdXJhdGlvbi5kYXlzKDE4MCksXG4gICAgICB9XSxcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbe1xuICAgICAgICBpZDogJ2RlbGV0ZS1vbGQtbG9ncycsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGV4cGlyYXRpb246IGNvcmUuRHVyYXRpb24uZGF5cyhhcmNoaXZlUmV0ZW50aW9uRGF5cyksXG4gICAgICB9XSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogcHJvcHMucmVtb3ZhbFBvbGljeSA9PT0gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIEdsdWUgZGF0YWJhc2VcbiAgICB0aGlzLmRhdGFiYXNlID0gbmV3IGdsdWUuQ2ZuRGF0YWJhc2UodGhpcywgJ0RhdGFiYXNlJywge1xuICAgICAgY2F0YWxvZ0lkOiBjb3JlLlN0YWNrLm9mKHRoaXMpLmFjY291bnQsXG4gICAgICBkYXRhYmFzZUlucHV0OiB7XG4gICAgICAgIG5hbWU6IGRhdGFiYXNlTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdBdWRpdCBsb2dzIGRhdGFiYXNlIGZvciBBdGhlbmEgcXVlcmllcycsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIEdsdWUgdGFibGUgZm9yIFBhcnF1ZXQgc2NoZW1hXG4gICAgdGhpcy50YWJsZSA9IG5ldyBnbHVlLkNmblRhYmxlKHRoaXMsICdUYWJsZScsIHtcbiAgICAgIGNhdGFsb2dJZDogY29yZS5TdGFjay5vZih0aGlzKS5hY2NvdW50LFxuICAgICAgZGF0YWJhc2VOYW1lOiB0aGlzLmRhdGFiYXNlLnJlZixcbiAgICAgIHRhYmxlSW5wdXQ6IHtcbiAgICAgICAgbmFtZTogdGFibGVOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0F1ZGl0IGxvZ3MgaW4gUGFycXVldCBmb3JtYXQnLFxuICAgICAgICBzdG9yYWdlRGVzY3JpcHRvcjoge1xuICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdiaWdpbnQnLCBjb21tZW50OiAnTG9nIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdtZXNzYWdlJywgdHlwZTogJ3N0cmluZycsIGNvbW1lbnQ6ICdMb2cgbWVzc2FnZScgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2xvZ19ncm91cCcsIHR5cGU6ICdzdHJpbmcnLCBjb21tZW50OiAnQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgbmFtZScgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2xvZ19zdHJlYW0nLCB0eXBlOiAnc3RyaW5nJywgY29tbWVudDogJ0Nsb3VkV2F0Y2ggbG9nIHN0cmVhbSBuYW1lJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnZXZlbnRfdHlwZScsIHR5cGU6ICdzdHJpbmcnLCBjb21tZW50OiAnRXZlbnQgdHlwZSAoZXh0cmFjdGVkIGZyb20gbWVzc2FnZSknIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICd1c2VyX2lkJywgdHlwZTogJ3N0cmluZycsIGNvbW1lbnQ6ICdVc2VyIGlkZW50aWZpZXIgKGlmIGF2YWlsYWJsZSknIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdpcF9hZGRyZXNzJywgdHlwZTogJ3N0cmluZycsIGNvbW1lbnQ6ICdDbGllbnQgSVAgYWRkcmVzcyAoaWYgYXZhaWxhYmxlKScgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGxvY2F0aW9uOiBgczM6Ly8ke3RoaXMuYnVja2V0LmJ1Y2tldE5hbWV9L2xvZ3MvYCxcbiAgICAgICAgICBpbnB1dEZvcm1hdDogJ29yZy5hcGFjaGUuaGFkb29wLmhpdmUucWwuaW8ucGFycXVldC5NYXByZWRQYXJxdWV0SW5wdXRGb3JtYXQnLFxuICAgICAgICAgIG91dHB1dEZvcm1hdDogJ29yZy5hcGFjaGUuaGFkb29wLmhpdmUucWwuaW8ucGFycXVldC5NYXByZWRQYXJxdWV0T3V0cHV0Rm9ybWF0JyxcbiAgICAgICAgICBzZXJkZUluZm86IHtcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25MaWJyYXJ5OiAnb3JnLmFwYWNoZS5oYWRvb3AuaGl2ZS5xbC5pby5wYXJxdWV0LnNlcmRlLlBhcnF1ZXRIaXZlU2VyRGUnLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAnc2VyaWFsaXphdGlvbi5mb3JtYXQnOiAnMScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHBhcnRpdGlvbktleXM6IFtcbiAgICAgICAgICB7IG5hbWU6ICd5ZWFyJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICB7IG5hbWU6ICdtb250aCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgeyBuYW1lOiAnZGF5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgXSxcbiAgICAgICAgdGFibGVUeXBlOiAnRVhURVJOQUxfVEFCTEUnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBJQU0gcm9sZSBmb3IgRmlyZWhvc2VcbiAgICBjb25zdCBmaXJlaG9zZVJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ0ZpcmVob3NlUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdmaXJlaG9zZS5hbWF6b25hd3MuY29tJyksXG4gICAgfSk7XG5cbiAgICB0aGlzLmJ1Y2tldC5ncmFudFdyaXRlKGZpcmVob3NlUm9sZSk7XG4gICAgcHJvcHMua21zS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoZmlyZWhvc2VSb2xlKTtcblxuICAgIGZpcmVob3NlUm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbJ2dsdWU6R2V0VGFibGUnLCAnZ2x1ZTpHZXRUYWJsZVZlcnNpb24nLCAnZ2x1ZTpHZXRUYWJsZVZlcnNpb25zJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6Z2x1ZToke2NvcmUuU3RhY2sub2YodGhpcykucmVnaW9ufToke2NvcmUuU3RhY2sub2YodGhpcykuYWNjb3VudH06Y2F0YWxvZ2AsXG4gICAgICAgIGBhcm46YXdzOmdsdWU6JHtjb3JlLlN0YWNrLm9mKHRoaXMpLnJlZ2lvbn06JHtjb3JlLlN0YWNrLm9mKHRoaXMpLmFjY291bnR9OmRhdGFiYXNlLyR7ZGF0YWJhc2VOYW1lfWAsXG4gICAgICAgIGBhcm46YXdzOmdsdWU6JHtjb3JlLlN0YWNrLm9mKHRoaXMpLnJlZ2lvbn06JHtjb3JlLlN0YWNrLm9mKHRoaXMpLmFjY291bnR9OnRhYmxlLyR7ZGF0YWJhc2VOYW1lfS8ke3RhYmxlTmFtZX1gLFxuICAgICAgXSxcbiAgICB9KSk7XG5cbiAgICAvLyBDcmVhdGUgS2luZXNpcyBGaXJlaG9zZSBkZWxpdmVyeSBzdHJlYW0gd2l0aCBQYXJxdWV0IGNvbnZlcnNpb25cbiAgICB0aGlzLmRlbGl2ZXJ5U3RyZWFtID0gbmV3IGZpcmVob3NlLkNmbkRlbGl2ZXJ5U3RyZWFtKHRoaXMsICdEZWxpdmVyeVN0cmVhbScsIHtcbiAgICAgIGRlbGl2ZXJ5U3RyZWFtVHlwZTogJ0RpcmVjdFB1dCcsXG4gICAgICBleHRlbmRlZFMzRGVzdGluYXRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICAgIGJ1Y2tldEFybjogdGhpcy5idWNrZXQuYnVja2V0QXJuLFxuICAgICAgICByb2xlQXJuOiBmaXJlaG9zZVJvbGUucm9sZUFybixcbiAgICAgICAgcHJlZml4OiAnbG9ncy95ZWFyPSF7dGltZXN0YW1wOnl5eXl9L21vbnRoPSF7dGltZXN0YW1wOk1NfS9kYXk9IXt0aW1lc3RhbXA6ZGR9LycsXG4gICAgICAgIGVycm9yT3V0cHV0UHJlZml4OiAnZXJyb3JzLyF7ZmlyZWhvc2U6ZXJyb3Itb3V0cHV0LXR5cGV9L3llYXI9IXt0aW1lc3RhbXA6eXl5eX0vbW9udGg9IXt0aW1lc3RhbXA6TU19L2RheT0he3RpbWVzdGFtcDpkZH0vJyxcbiAgICAgICAgYnVmZmVyaW5nSGludHM6IHtcbiAgICAgICAgICBpbnRlcnZhbEluU2Vjb25kczogMzAwLFxuICAgICAgICAgIHNpemVJbk1CczogMTI4LFxuICAgICAgICB9LFxuICAgICAgICBjb21wcmVzc2lvbkZvcm1hdDogJ1VOQ09NUFJFU1NFRCcsXG4gICAgICAgIGRhdGFGb3JtYXRDb252ZXJzaW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc2NoZW1hQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgcm9sZUFybjogZmlyZWhvc2VSb2xlLnJvbGVBcm4sXG4gICAgICAgICAgICBkYXRhYmFzZU5hbWU6IHRoaXMuZGF0YWJhc2UucmVmLFxuICAgICAgICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlLnJlZixcbiAgICAgICAgICAgIHJlZ2lvbjogY29yZS5TdGFjay5vZih0aGlzKS5yZWdpb24sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6ICdMQVRFU1QnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5wdXRGb3JtYXRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICBkZXNlcmlhbGl6ZXI6IHtcbiAgICAgICAgICAgICAgb3BlblhKc29uU2VyRGU6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG91dHB1dEZvcm1hdENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZXI6IHtcbiAgICAgICAgICAgICAgcGFycXVldFNlckRlOiB7XG4gICAgICAgICAgICAgICAgY29tcHJlc3Npb246ICdTTkFQUFknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGVsaXZlcnlTdHJlYW0uYWRkRGVwZW5kZW5jeSh0aGlzLmRhdGFiYXNlKTtcbiAgICB0aGlzLmRlbGl2ZXJ5U3RyZWFtLmFkZERlcGVuZGVuY3kodGhpcy50YWJsZSk7XG4gICAgdGhpcy5kZWxpdmVyeVN0cmVhbS5ub2RlLmFkZERlcGVuZGVuY3koZmlyZWhvc2VSb2xlKTtcblxuICAgIC8vIENyZWF0ZSBJQU0gcm9sZSBmb3IgQ2xvdWRXYXRjaCBMb2dzIHN1YnNjcmlwdGlvblxuICAgIGNvbnN0IGxvZ3NSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdMb2dzUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsb2dzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIEZpcmVob3NlUGVybWlzc2lvbnM6IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ2ZpcmVob3NlOlB1dFJlY29yZCddLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmRlbGl2ZXJ5U3RyZWFtLmF0dHJBcm5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHN1YnNjcmlwdGlvbiBmaWx0ZXJzIGZvciBlYWNoIGxvZyBncm91cFxuICAgIHByb3BzLmxvZ0dyb3VwTmFtZXMuZm9yRWFjaCgobG9nR3JvdXBOYW1lLCBpbmRleCkgPT4ge1xuICAgICAgbmV3IGxvZ3MuQ2ZuU3Vic2NyaXB0aW9uRmlsdGVyKHRoaXMsIGBTdWJzY3JpcHRpb24ke2luZGV4fWAsIHtcbiAgICAgICAgbG9nR3JvdXBOYW1lOiBsb2dHcm91cE5hbWUsXG4gICAgICAgIGZpbHRlclBhdHRlcm46ICcnLFxuICAgICAgICBkZXN0aW5hdGlvbkFybjogdGhpcy5kZWxpdmVyeVN0cmVhbS5hdHRyQXJuLFxuICAgICAgICByb2xlQXJuOiBsb2dzUm9sZS5yb2xlQXJuLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBPdXRwdXRzXG4gICAgbmV3IGNvcmUuQ2ZuT3V0cHV0KHRoaXMsICdCdWNrZXROYW1lJywge1xuICAgICAgdmFsdWU6IHRoaXMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1MzIEJ1Y2tldCBmb3IgQXVkaXQgTG9nIEFyY2hpdmUnLFxuICAgIH0pO1xuXG4gICAgbmV3IGNvcmUuQ2ZuT3V0cHV0KHRoaXMsICdEYXRhYmFzZU5hbWUnLCB7XG4gICAgICB2YWx1ZTogdGhpcy5kYXRhYmFzZS5yZWYsXG4gICAgICBkZXNjcmlwdGlvbjogJ0dsdWUgRGF0YWJhc2UgTmFtZSBmb3IgQXRoZW5hIFF1ZXJpZXMnLFxuICAgIH0pO1xuXG4gICAgbmV3IGNvcmUuQ2ZuT3V0cHV0KHRoaXMsICdUYWJsZU5hbWUnLCB7XG4gICAgICB2YWx1ZTogdGhpcy50YWJsZS5yZWYsXG4gICAgICBkZXNjcmlwdGlvbjogJ0dsdWUgVGFibGUgTmFtZSBmb3IgQXRoZW5hIFF1ZXJpZXMnLFxuICAgIH0pO1xuXG4gICAgbmV3IGNvcmUuQ2ZuT3V0cHV0KHRoaXMsICdEZWxpdmVyeVN0cmVhbUFybicsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmRlbGl2ZXJ5U3RyZWFtLmF0dHJBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogJ0tpbmVzaXMgRmlyZWhvc2UgRGVsaXZlcnkgU3RyZWFtIEFSTicsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export * from './auditLogArchive';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./auditLogArchive"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xvdWRmcm9udC9sb2dnaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2F1ZGl0TG9nQXJjaGl2ZSc7XG4iXX0=
@@ -0,0 +1,9 @@
1
+ import { aws_iam as iam } from 'aws-cdk-lib';
2
+ import * as constructs from 'constructs';
3
+ export interface OAuthEdgeRoleProps {
4
+ readonly roleName: string;
5
+ }
6
+ export declare class OAuthEdgeRole extends constructs.Construct {
7
+ readonly role: iam.Role;
8
+ constructor(scope: constructs.Construct, id: string, props: OAuthEdgeRoleProps);
9
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OAuthEdgeRole = void 0;
37
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
38
+ const constructs = __importStar(require("constructs"));
39
+ class OAuthEdgeRole extends constructs.Construct {
40
+ constructor(scope, id, props) {
41
+ super(scope, id);
42
+ this.role = new aws_cdk_lib_1.aws_iam.Role(this, 'Role', {
43
+ roleName: props.roleName,
44
+ assumedBy: new aws_cdk_lib_1.aws_iam.CompositePrincipal(new aws_cdk_lib_1.aws_iam.ServicePrincipal('lambda.amazonaws.com'), new aws_cdk_lib_1.aws_iam.ServicePrincipal('edgelambda.amazonaws.com')),
45
+ managedPolicies: [
46
+ aws_cdk_lib_1.aws_iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'),
47
+ ],
48
+ });
49
+ this.role.addToPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
50
+ actions: ['sts:GetWebIdentityToken'],
51
+ resources: ['*'],
52
+ }));
53
+ }
54
+ }
55
+ exports.OAuthEdgeRole = OAuthEdgeRole;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGhFZGdlUm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbG91ZGZyb250L29hdXRoRWRnZVJvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBRXFCO0FBQ3JCLHVEQUF5QztBQU16QyxNQUFhLGFBQWMsU0FBUSxVQUFVLENBQUMsU0FBUztJQUdyRCxZQUFZLEtBQTJCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQzVFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLHFCQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDckMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFNBQVMsRUFBRSxJQUFJLHFCQUFHLENBQUMsa0JBQWtCLENBQ25DLElBQUkscUJBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxFQUNoRCxJQUFJLHFCQUFHLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsQ0FDckQ7WUFDRCxlQUFlLEVBQUU7Z0JBQ2YscUJBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsMENBQTBDLENBQUM7YUFDdkY7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLHFCQUFHLENBQUMsZUFBZSxDQUFDO1lBQzVDLE9BQU8sRUFBRSxDQUFDLHlCQUF5QixDQUFDO1lBQ3BDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNqQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7Q0FDRjtBQXRCRCxzQ0FzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhd3NfaWFtIGFzIGlhbSxcbn0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGludGVyZmFjZSBPQXV0aEVkZ2VSb2xlUHJvcHMge1xuICByZWFkb25seSByb2xlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgT0F1dGhFZGdlUm9sZSBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5Sb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9BdXRoRWRnZVJvbGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ1JvbGUnLCB7XG4gICAgICByb2xlTmFtZTogcHJvcHMucm9sZU5hbWUsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZWRnZWxhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICApLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMucm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbJ3N0czpHZXRXZWJJZGVudGl0eVRva2VuJ10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,34 @@
1
+ import * as core from 'aws-cdk-lib';
2
+ import { aws_iam as iam } from 'aws-cdk-lib';
3
+ import * as constructs from 'constructs';
4
+ export interface AppSpec {
5
+ readonly name: string;
6
+ readonly groups?: string[];
7
+ }
8
+ export interface AuthInfrastructureProps {
9
+ readonly ssmParamPrefix?: string;
10
+ readonly zoneName: string;
11
+ readonly tenantId: string;
12
+ readonly clientId: string;
13
+ readonly oauth2CallbackRoleName: string;
14
+ readonly appSpec: AppSpec;
15
+ readonly securityAlertsTopicArn?: string;
16
+ readonly sessionRevocationTopicArn?: string;
17
+ readonly autoRevokeOnReuse?: boolean;
18
+ readonly jwtClaimsWhitelist?: string[];
19
+ readonly hmacSecretRotationSchedule?: core.Duration;
20
+ readonly auditLogRetentionDays?: number;
21
+ readonly auditArchiveRetentionDays?: number;
22
+ readonly removalPolicy?: core.RemovalPolicy;
23
+ }
24
+ export declare class AuthInfrastructure extends constructs.Construct {
25
+ readonly configSecretArn: string;
26
+ readonly kmsKeyArn: string;
27
+ readonly authTableArn: string;
28
+ readonly kvsArn: string;
29
+ readonly tenantId: string;
30
+ readonly clientId: string;
31
+ readonly oauth2CallbackRoleName: string;
32
+ readonly oidcProvider: iam.IOpenIdConnectProvider;
33
+ constructor(scope: constructs.Construct, id: string, props: AuthInfrastructureProps);
34
+ }
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AuthInfrastructure = void 0;
37
+ const core = __importStar(require("aws-cdk-lib"));
38
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
39
+ const constructs = __importStar(require("constructs"));
40
+ const authLambdaFunctions_1 = require("../auth/authLambdaFunctions");
41
+ const authSecretManager_1 = require("../auth/authSecretManager");
42
+ const authSecurityTable_1 = require("../authSecurityTable");
43
+ const auditLogArchive_1 = require("../logging/auditLogArchive");
44
+ const ssmCrossRegionWriter_1 = require("../ssmCrossRegionWriter");
45
+ const AZURE_RESERVED_WORDS = [
46
+ 'admin', 'administrator', 'root', 'sys', 'system', 'guest', 'public',
47
+ 'user', 'users', 'microsoft', 'windows', 'office', 'azure', 'exchange',
48
+ 'sharepoint', 'teams', 'support', 'help', 'service',
49
+ ];
50
+ function validateGroupNames(groups) {
51
+ const invalidGroups = [];
52
+ groups.forEach(group => {
53
+ const reservedWord = AZURE_RESERVED_WORDS.find(word => {
54
+ if (group.toLowerCase() === word)
55
+ return true;
56
+ return new RegExp(`\\b${word}\\b`, 'i').test(group);
57
+ });
58
+ if (reservedWord) {
59
+ invalidGroups.push(`'${group}' (contains reserved word '${reservedWord}')`);
60
+ }
61
+ });
62
+ if (invalidGroups.length > 0) {
63
+ throw new Error(`Invalid Azure AD group names detected:\n${invalidGroups.join('\n')}\n\n` +
64
+ 'Azure AD blocks group names containing reserved words.');
65
+ }
66
+ }
67
+ // SHA-1 fingerprint of DigiCert Global Root G2 (Azure AD root CA). Stable 10-20 years.
68
+ const AZURE_AD_THUMBPRINT = '6938fd4d98bab03faadb97b34396831e3780aea1';
69
+ class AuthInfrastructure extends constructs.Construct {
70
+ constructor(scope, id, props) {
71
+ super(scope, id);
72
+ if (props.appSpec.groups && props.appSpec.groups.length > 0) {
73
+ validateGroupNames(props.appSpec.groups);
74
+ }
75
+ this.tenantId = props.tenantId;
76
+ this.clientId = props.clientId;
77
+ this.oauth2CallbackRoleName = props.oauth2CallbackRoleName;
78
+ const authSecurityTable = new authSecurityTable_1.AuthSecurityTable(this, 'AuthSecurityTable', {
79
+ tableName: `auth-security-${props.zoneName}`,
80
+ removalPolicy: props.removalPolicy ?? core.RemovalPolicy.RETAIN,
81
+ });
82
+ const secretManager = new authSecretManager_1.AuthSecretManager(this, 'SecretManager', {
83
+ domainName: props.zoneName,
84
+ tableName: authSecurityTable.table.tableName,
85
+ tableRegion: core.Stack.of(this).region,
86
+ azureTenantId: props.tenantId,
87
+ azureClientId: props.clientId,
88
+ stsAudience: 'api://AzureADTokenExchange',
89
+ securityAlertsTopicArn: props.securityAlertsTopicArn,
90
+ autoRevokeOnReuse: props.autoRevokeOnReuse,
91
+ jwtClaimsWhitelist: props.jwtClaimsWhitelist,
92
+ });
93
+ const auditLogRetentionDays = props.auditLogRetentionDays ?? 30;
94
+ const auditArchiveRetentionDays = props.auditArchiveRetentionDays ?? 365;
95
+ const lambdaFunctions = new authLambdaFunctions_1.AuthLambdaFunctions(this, 'LambdaFunctions', {
96
+ configSecret: secretManager.configSecret,
97
+ kmsKey: secretManager.kmsKey,
98
+ kvs: secretManager.kvs,
99
+ authTable: authSecurityTable.table,
100
+ rotationSchedule: props.hmacSecretRotationSchedule,
101
+ sessionRevocationTopicArn: props.sessionRevocationTopicArn,
102
+ logRetentionDays: auditLogRetentionDays,
103
+ });
104
+ new auditLogArchive_1.AuditLogArchive(this, 'AuditLogArchive', {
105
+ logGroupNames: lambdaFunctions.logGroups.map(lg => lg.logGroupName),
106
+ kmsKey: secretManager.kmsKey,
107
+ retentionDays: auditLogRetentionDays,
108
+ archiveRetentionDays: auditArchiveRetentionDays,
109
+ bucketName: `auth-audit-logs-${core.Stack.of(this).account}-${core.Stack.of(this).region}`,
110
+ databaseName: 'auth_audit_logs',
111
+ removalPolicy: props.removalPolicy ?? core.RemovalPolicy.RETAIN,
112
+ });
113
+ const oidcProvider = new aws_cdk_lib_1.aws_iam.OpenIdConnectProvider(this, 'OidcProvider', {
114
+ url: `https://login.microsoftonline.com/${props.tenantId}/v2.0`,
115
+ clientIds: [props.clientId],
116
+ thumbprints: [AZURE_AD_THUMBPRINT],
117
+ });
118
+ this.configSecretArn = secretManager.configSecret.secretArn;
119
+ this.kmsKeyArn = secretManager.kmsKey.keyArn;
120
+ this.authTableArn = authSecurityTable.table.tableArn;
121
+ this.kvsArn = secretManager.kvs.keyValueStoreArn;
122
+ this.oidcProvider = oidcProvider;
123
+ const prefix = props.ssmParamPrefix ?? `/auth/${props.zoneName}`;
124
+ new ssmCrossRegionWriter_1.SsmCrossRegionWriter(this, 'SsmWriter', {
125
+ prefix: prefix,
126
+ region: 'us-east-1',
127
+ params: {
128
+ configSecretArn: secretManager.configSecret.secretArn,
129
+ kmsKeyArn: secretManager.kmsKey.keyArn,
130
+ authTableArn: authSecurityTable.table.tableArn,
131
+ kvsArn: secretManager.kvs.keyValueStoreArn,
132
+ tenantId: props.tenantId,
133
+ clientId: props.clientId,
134
+ oauth2CallbackRoleName: props.oauth2CallbackRoleName,
135
+ },
136
+ });
137
+ }
138
+ }
139
+ exports.AuthInfrastructure = AuthInfrastructure;
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aEluZnJhc3RydWN0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Nsb3VkZnJvbnQvcGF0dGVybnMvYXV0aEluZnJhc3RydWN0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUFvQztBQUNwQyw2Q0FFcUI7QUFDckIsdURBQXlDO0FBQ3pDLHFFQUFrRTtBQUNsRSxpRUFBOEQ7QUFDOUQsNERBQXlEO0FBQ3pELGdFQUE2RDtBQUM3RCxrRUFBK0Q7QUFFL0QsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO0lBQ3BFLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVU7SUFDdEUsWUFBWSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVM7Q0FDcEQsQ0FBQztBQUVGLFNBQVMsa0JBQWtCLENBQUMsTUFBZ0I7SUFDMUMsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDckIsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BELElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDOUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJ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MUMsTUFBTSxFQUFFLE1BQU07WUFDZCxNQUFNLEVBQUUsV0FBVztZQUNuQixNQUFNLEVBQUU7Z0JBQ04sZUFBZSxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUztnQkFDckQsU0FBUyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFDdEMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxRQUFRO2dCQUM5QyxNQUFNLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7Z0JBQzFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtnQkFDeEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO2dCQUN4QixzQkFBc0IsRUFBRSxLQUFLLENBQUMsc0JBQXNCO2FBQ3JEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBekZELGdEQXlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvcmUgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgYXdzX2lhbSBhcyBpYW0sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBdXRoTGFtYmRhRnVuY3Rpb25zIH0gZnJvbSAnLi4vYXV0aC9hdXRoTGFtYmRhRnVuY3Rpb25zJztcbmltcG9ydCB7IEF1dGhTZWNyZXRNYW5hZ2VyIH0gZnJvbSAnLi4vYXV0aC9hdXRoU2VjcmV0TWFuYWdlcic7XG5pbXBvcnQgeyBBdXRoU2VjdXJpdHlUYWJsZSB9IGZyb20gJy4uL2F1dGhTZWN1cml0eVRhYmxlJztcbmltcG9ydCB7IEF1ZGl0TG9nQXJjaGl2ZSB9IGZyb20gJy4uL2xvZ2dpbmcvYXVkaXRMb2dBcmNoaXZlJztcbmltcG9ydCB7IFNzbUNyb3NzUmVnaW9uV3JpdGVyIH0gZnJvbSAnLi4vc3NtQ3Jvc3NSZWdpb25Xcml0ZXInO1xuXG5jb25zdCBBWlVSRV9SRVNFUlZFRF9XT1JEUyA9IFtcbiAgJ2FkbWluJywgJ2FkbWluaXN0cmF0b3InLCAncm9vdCcsICdzeXMnLCAnc3lzdGVtJywgJ2d1ZXN0JywgJ3B1YmxpYycsXG4gICd1c2VyJywgJ3VzZXJzJywgJ21pY3Jvc29mdCcsICd3aW5kb3dzJywgJ29mZmljZScsICdhenVyZScsICdleGNoYW5nZScsXG4gICdzaGFyZXBvaW50JywgJ3RlYW1zJywgJ3N1cHBvcnQnLCAnaGVscCcsICdzZXJ2aWNlJyxcbl07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlR3JvdXBOYW1lcyhncm91cHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGludmFsaWRHcm91cHM6IHN0cmluZ1tdID0gW107XG4gIGdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICBjb25zdCByZXNlcnZlZFdvcmQgPSBBWlVSRV9SRVNFUlZFRF9XT1JEUy5maW5kKHdvcmQgPT4ge1xuICAgICAgaWYgKGdyb3VwLnRvTG93ZXJDYXNlKCkgPT09IHdvcmQpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYFxcXFxiJHt3b3JkfVxcXFxiYCwgJ2knKS50ZXN0KGdyb3VwKTtcbiAgICB9KTtcbiAgICBpZiAocmVzZXJ2ZWRXb3JkKSB7XG4gICAgICBpbnZhbGlkR3JvdXBzLnB1c2goYCcke2dyb3VwfScgKGNvbnRhaW5zIHJlc2VydmVkIHdvcmQgJyR7cmVzZXJ2ZWRXb3JkfScpYCk7XG4gICAgfVxuICB9KTtcbiAgaWYgKGludmFsaWRHcm91cHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIEF6dXJlIEFEIGdyb3VwIG5hbWVzIGRldGVjdGVkOlxcbiR7aW52YWxpZEdyb3Vwcy5qb2luKCdcXG4nKX1cXG5cXG5gICtcbiAgICAgICdBenVyZSBBRCBibG9ja3MgZ3JvdXAgbmFtZXMgY29udGFpbmluZyByZXNlcnZlZCB3b3Jkcy4nLFxuICAgICk7XG4gIH1cbn1cblxuLy8gU0hBLTEgZmluZ2VycHJpbnQgb2YgRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIgKEF6dXJlIEFEIHJvb3QgQ0EpLiBTdGFibGUgMTAtMjAgeWVhcnMuXG5jb25zdCBBWlVSRV9BRF9USFVNQlBSSU5UID0gJzY5MzhmZDRkOThiYWIwM2ZhYWRiOTdiMzQzOTY4MzFlMzc4MGFlYTEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcFNwZWMge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdyb3Vwcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhJbmZyYXN0cnVjdHVyZVByb3BzIHtcbiAgcmVhZG9ubHkgc3NtUGFyYW1QcmVmaXg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHpvbmVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlbmFudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNsaWVudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9hdXRoMkNhbGxiYWNrUm9sZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXBwU3BlYzogQXBwU3BlYztcbiAgcmVhZG9ubHkgc2VjdXJpdHlBbGVydHNUb3BpY0Fybj86IHN0cmluZztcbiAgcmVhZG9ubHkgc2Vzc2lvblJldm9jYXRpb25Ub3BpY0Fybj86IHN0cmluZztcbiAgcmVhZG9ubHkgYXV0b1Jldm9rZU9uUmV1c2U/OiBib29sZWFuO1xuICByZWFkb25seSBqd3RDbGFpbXNXaGl0ZWxpc3Q/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaG1hY1NlY3JldFJvdGF0aW9uU2NoZWR1bGU/OiBjb3JlLkR1cmF0aW9uO1xuICByZWFkb25seSBhdWRpdExvZ1JldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGF1ZGl0QXJjaGl2ZVJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBjb3JlLlJlbW92YWxQb2xpY3k7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoSW5mcmFzdHJ1Y3R1cmUgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWdTZWNyZXRBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGttc0tleUFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgYXV0aFRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBrdnNBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRlbmFudElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnRJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgb2F1dGgyQ2FsbGJhY2tSb2xlTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgb2lkY1Byb3ZpZGVyOiBpYW0uSU9wZW5JZENvbm5lY3RQcm92aWRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBdXRoSW5mcmFzdHJ1Y3R1cmVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMuYXBwU3BlYy5ncm91cHMgJiYgcHJvcHMuYXBwU3BlYy5ncm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgdmFsaWRhdGVHcm91cE5hbWVzKHByb3BzLmFwcFNwZWMuZ3JvdXBzKTtcbiAgICB9XG5cbiAgICB0aGlzLnRlbmFudElkID0gcHJvcHMudGVuYW50SWQ7XG4gICAgdGhpcy5jbGllbnRJZCA9IHByb3BzLmNsaWVudElkO1xuICAgIHRoaXMub2F1dGgyQ2FsbGJhY2tSb2xlTmFtZSA9IHByb3BzLm9hdXRoMkNhbGxiYWNrUm9sZU5hbWU7XG5cbiAgICBjb25zdCBhdXRoU2VjdXJpdHlUYWJsZSA9IG5ldyBBdXRoU2VjdXJpdHlUYWJsZSh0aGlzLCAnQXV0aFNlY3VyaXR5VGFibGUnLCB7XG4gICAgICB0YWJsZU5hbWU6IGBhdXRoLXNlY3VyaXR5LSR7cHJvcHMuem9uZU5hbWV9YCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3kgPz8gY29yZS5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICB9KTtcblxuICAgIGNvbnN0IHNlY3JldE1hbmFnZXIgPSBuZXcgQXV0aFNlY3JldE1hbmFnZXIodGhpcywgJ1NlY3JldE1hbmFnZXInLCB7XG4gICAgICBkb21haW5OYW1lOiBwcm9wcy56b25lTmFtZSxcbiAgICAgIHRhYmxlTmFtZTogYXV0aFNlY3VyaXR5VGFibGUudGFibGUudGFibGVOYW1lLFxuICAgICAgdGFibGVSZWdpb246IGNvcmUuU3RhY2sub2YodGhpcykucmVnaW9uLFxuICAgICAgYXp1cmVUZW5hbnRJZDogcHJvcHMudGVuYW50SWQsXG4gICAgICBhenVyZUNsaWVudElkOiBwcm9wcy5jbGllbnRJZCxcbiAgICAgIHN0c0F1ZGllbmNlOiAnYXBpOi8vQXp1cmVBRFRva2VuRXhjaGFuZ2UnLFxuICAgICAgc2VjdXJpdHlBbGVydHNUb3BpY0FybjogcHJvcHMuc2VjdXJpdHlBbGVydHNUb3BpY0FybixcbiAgICAgIGF1dG9SZXZva2VPblJldXNlOiBwcm9wcy5hdXRvUmV2b2tlT25SZXVzZSxcbiAgICAgIGp3dENsYWltc1doaXRlbGlzdDogcHJvcHMuand0Q2xhaW1zV2hpdGVsaXN0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXVkaXRMb2dSZXRlbnRpb25EYXlzID0gcHJvcHMuYXVkaXRMb2dSZXRlbnRpb25EYXlzID8/IDMwO1xuICAgIGNvbnN0IGF1ZGl0QXJjaGl2ZVJldGVudGlvbkRheXMgPSBwcm9wcy5hdWRpdEFyY2hpdmVSZXRlbnRpb25EYXlzID8/IDM2NTtcblxuICAgIGNvbnN0IGxhbWJkYUZ1bmN0aW9ucyA9IG5ldyBBdXRoTGFtYmRhRnVuY3Rpb25zKHRoaXMsICdMYW1iZGFGdW5jdGlvbnMnLCB7XG4gICAgICBjb25maWdTZWNyZXQ6IHNlY3JldE1hbmFnZXIuY29uZmlnU2VjcmV0LFxuICAgICAga21zS2V5OiBzZWNyZXRNYW5hZ2VyLmttc0tleSxcbiAgICAgIGt2czogc2VjcmV0TWFuYWdlci5rdnMsXG4gICAgICBhdXRoVGFibGU6IGF1dGhTZWN1cml0eVRhYmxlLnRhYmxlLFxuICAgICAgcm90YXRpb25TY2hlZHVsZTogcHJvcHMuaG1hY1NlY3JldFJvdGF0aW9uU2NoZWR1bGUsXG4gICAgICBzZXNzaW9uUmV2b2NhdGlvblRvcGljQXJuOiBwcm9wcy5zZXNzaW9uUmV2b2NhdGlvblRvcGljQXJuLFxuICAgICAgbG9nUmV0ZW50aW9uRGF5czogYXVkaXRMb2dSZXRlbnRpb25EYXlzLFxuICAgIH0pO1xuXG4gICAgbmV3IEF1ZGl0TG9nQXJjaGl2ZSh0aGlzLCAnQXVkaXRMb2dBcmNoaXZlJywge1xuICAgICAgbG9nR3JvdXBOYW1lczogbGFtYmRhRnVuY3Rpb25zLmxvZ0dyb3Vwcy5tYXAobGcgPT4gbGcubG9nR3JvdXBOYW1lKSxcbiAgICAgIGttc0tleTogc2VjcmV0TWFuYWdlci5rbXNLZXksXG4gICAgICByZXRlbnRpb25EYXlzOiBhdWRpdExvZ1JldGVudGlvbkRheXMsXG4gICAgICBhcmNoaXZlUmV0ZW50aW9uRGF5czogYXVkaXRBcmNoaXZlUmV0ZW50aW9uRGF5cyxcbiAgICAgIGJ1Y2tldE5hbWU6IGBhdXRoLWF1ZGl0LWxvZ3MtJHtjb3JlLlN0YWNrLm9mKHRoaXMpLmFjY291bnR9LSR7Y29yZS5TdGFjay5vZih0aGlzKS5yZWdpb259YCxcbiAgICAgIGRhdGFiYXNlTmFtZTogJ2F1dGhfYXVkaXRfbG9ncycsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5ID8/IGNvcmUuUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgfSk7XG5cbiAgICBjb25zdCBvaWRjUHJvdmlkZXIgPSBuZXcgaWFtLk9wZW5JZENvbm5lY3RQcm92aWRlcih0aGlzLCAnT2lkY1Byb3ZpZGVyJywge1xuICAgICAgdXJsOiBgaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tLyR7cHJvcHMudGVuYW50SWR9L3YyLjBgLFxuICAgICAgY2xpZW50SWRzOiBbcHJvcHMuY2xpZW50SWRdLFxuICAgICAgdGh1bWJwcmludHM6IFtBWlVSRV9BRF9USFVNQlBSSU5UXSxcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZmlnU2VjcmV0QXJuID0gc2VjcmV0TWFuYWdlci5jb25maWdTZWNyZXQuc2VjcmV0QXJuO1xuICAgIHRoaXMua21zS2V5QXJuID0gc2VjcmV0TWFuYWdlci5rbXNLZXkua2V5QXJuO1xuICAgIHRoaXMuYXV0aFRhYmxlQXJuID0gYXV0aFNlY3VyaXR5VGFibGUudGFibGUudGFibGVBcm47XG4gICAgdGhpcy5rdnNBcm4gPSBzZWNyZXRNYW5hZ2VyLmt2cy5rZXlWYWx1ZVN0b3JlQXJuO1xuICAgIHRoaXMub2lkY1Byb3ZpZGVyID0gb2lkY1Byb3ZpZGVyO1xuXG4gICAgY29uc3QgcHJlZml4ID0gcHJvcHMuc3NtUGFyYW1QcmVmaXggPz8gYC9hdXRoLyR7cHJvcHMuem9uZU5hbWV9YDtcblxuICAgIG5ldyBTc21Dcm9zc1JlZ2lvbldyaXRlcih0aGlzLCAnU3NtV3JpdGVyJywge1xuICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGNvbmZpZ1NlY3JldEFybjogc2VjcmV0TWFuYWdlci5jb25maWdTZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgICBrbXNLZXlBcm46IHNlY3JldE1hbmFnZXIua21zS2V5LmtleUFybixcbiAgICAgICAgYXV0aFRhYmxlQXJuOiBhdXRoU2VjdXJpdHlUYWJsZS50YWJsZS50YWJsZUFybixcbiAgICAgICAga3ZzQXJuOiBzZWNyZXRNYW5hZ2VyLmt2cy5rZXlWYWx1ZVN0b3JlQXJuLFxuICAgICAgICB0ZW5hbnRJZDogcHJvcHMudGVuYW50SWQsXG4gICAgICAgIGNsaWVudElkOiBwcm9wcy5jbGllbnRJZCxcbiAgICAgICAgb2F1dGgyQ2FsbGJhY2tSb2xlTmFtZTogcHJvcHMub2F1dGgyQ2FsbGJhY2tSb2xlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,36 @@
1
+ import { aws_cloudfront as cloudfront } from 'aws-cdk-lib';
2
+ import * as constructs from 'constructs';
3
+ import { Extension, ExtensionConfig, AddBehaviorOptions } from './securedCloudFront';
4
+ export interface CognitoCloudFrontProps<TRole extends string = string> {
5
+ readonly defaultBehavior: Omit<cloudfront.BehaviorOptions, 'functionAssociations'>;
6
+ readonly domainNames: string[];
7
+ readonly certificate: any;
8
+ readonly authSsmParamPrefix: string;
9
+ readonly authRegion: string;
10
+ readonly defaultExtensions?: Extension[];
11
+ readonly defaultExtensionConfig?: ExtensionConfig<TRole>;
12
+ readonly defaultRootObject?: string;
13
+ readonly errorResponsePagePath?: string;
14
+ readonly enableUserInfoInjection?: boolean;
15
+ readonly userInfoNameFields?: string[];
16
+ }
17
+ export declare class CognitoSecuredCloudFront<TRole extends string = string> extends constructs.Construct {
18
+ readonly distribution: cloudfront.Distribution;
19
+ private readonly authCheckFunction;
20
+ private readonly userInfoFunction?;
21
+ private readonly functionComposer;
22
+ private readonly composedFunctions;
23
+ private lastCreatedFunction;
24
+ private readonly tlsOriginRequestPolicy;
25
+ private readonly cognitoDomain;
26
+ private readonly clientId;
27
+ private readonly redirectUri;
28
+ private readonly kvs;
29
+ constructor(scope: constructs.Construct, id: string, props: CognitoCloudFrontProps<TRole>);
30
+ addBehavior(pathPattern: string, origin: cloudfront.IOrigin, options?: AddBehaviorOptions<TRole>): void;
31
+ private buildFunctionAssociations;
32
+ private generateFunctionCacheKey;
33
+ private generateFunctionId;
34
+ private buildAuthCheckCode;
35
+ private loadAndReplaceUserInfoCode;
36
+ }