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,285 @@
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.CognitoSecuredCloudFront = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const core = __importStar(require("aws-cdk-lib"));
41
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
42
+ const constructs = __importStar(require("constructs"));
43
+ const securedCloudFront_1 = require("./securedCloudFront");
44
+ const function_composer_1 = require("../cloudfront-functions/function-composer");
45
+ class CognitoSecuredCloudFront extends constructs.Construct {
46
+ constructor(scope, id, props) {
47
+ super(scope, id);
48
+ const redirectUri = `https://${props.domainNames[0]}/oauth2/callback`;
49
+ const p = props.authSsmParamPrefix;
50
+ const configSecretArn = aws_cdk_lib_1.aws_ssm.StringParameter.valueForStringParameter(this, `${p}/configSecretArn`);
51
+ const kmsKeyArn = aws_cdk_lib_1.aws_ssm.StringParameter.valueForStringParameter(this, `${p}/kmsKeyArn`);
52
+ const authTableArn = aws_cdk_lib_1.aws_ssm.StringParameter.valueForStringParameter(this, `${p}/authTableArn`);
53
+ const kvsArn = aws_cdk_lib_1.aws_ssm.StringParameter.valueForStringParameter(this, `${p}/kvsArn`);
54
+ const cognitoDomain = aws_cdk_lib_1.aws_ssm.StringParameter.valueForStringParameter(this, `${p}/cognitoDomain`);
55
+ const clientId = aws_cdk_lib_1.aws_ssm.StringParameter.valueForStringParameter(this, `${p}/clientId`);
56
+ this.cognitoDomain = cognitoDomain;
57
+ this.clientId = clientId;
58
+ this.redirectUri = redirectUri;
59
+ const kvs = aws_cdk_lib_1.aws_cloudfront.KeyValueStore.fromKeyValueStoreArn(this, 'KVS', kvsArn);
60
+ this.kvs = kvs;
61
+ const lambdaEdgeRole = new aws_cdk_lib_1.aws_iam.Role(this, 'LambdaEdgeRole', {
62
+ 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')),
63
+ managedPolicies: [
64
+ aws_cdk_lib_1.aws_iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'),
65
+ ],
66
+ });
67
+ lambdaEdgeRole.addToPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
68
+ effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
69
+ actions: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'],
70
+ resources: [configSecretArn],
71
+ }));
72
+ lambdaEdgeRole.addToPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
73
+ effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
74
+ actions: ['kms:Decrypt'],
75
+ resources: [kmsKeyArn],
76
+ }));
77
+ lambdaEdgeRole.addToPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
78
+ effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
79
+ actions: ['dynamodb:GetItem', 'dynamodb:PutItem', 'dynamodb:Query', 'dynamodb:Scan', 'dynamodb:UpdateItem', 'dynamodb:DeleteItem'],
80
+ resources: [authTableArn],
81
+ }));
82
+ const configPyContent = `# Generated configuration
83
+ import json
84
+ import boto3
85
+ import logging
86
+
87
+ logger = logging.getLogger()
88
+
89
+ CONFIG_SECRET_NAME = 'cloudfront-auth-config-${props.domainNames[0]}'
90
+ CONFIG_REGION = '${props.authRegion}'
91
+
92
+ def get_config():
93
+ logger.info(f'Loading config from Secrets Manager')
94
+ try:
95
+ client = boto3.client('secretsmanager', region_name=CONFIG_REGION)
96
+ response = client.get_secret_value(SecretId=CONFIG_SECRET_NAME)
97
+ return json.loads(response['SecretString'])
98
+ except Exception as e:
99
+ logger.error(f'Failed to get secret: {str(e)}')
100
+ raise
101
+ `;
102
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cognito-auth-'));
103
+ const configPyPath = path.join(tempDir, 'config_generated.py');
104
+ fs.writeFileSync(configPyPath, configPyContent);
105
+ const oauthCallbackFn = new aws_cdk_lib_1.aws_cloudfront.experimental.EdgeFunction(this, 'OAuthCallback', {
106
+ runtime: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_11,
107
+ handler: 'oauth-callback.lambda_handler',
108
+ code: aws_cdk_lib_1.aws_lambda.Code.fromAsset(path.join(__dirname, '../lambda/cognito-auth'), {
109
+ bundling: {
110
+ image: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_11.bundlingImage,
111
+ command: [
112
+ 'bash', '-c',
113
+ 'pip install -r requirements.txt -t /asset-output && ' +
114
+ 'cp -r . /asset-output && ' +
115
+ 'cp /tmp/config_generated.py /asset-output/config_generated.py',
116
+ ],
117
+ volumes: [
118
+ {
119
+ hostPath: configPyPath,
120
+ containerPath: '/tmp/config_generated.py',
121
+ },
122
+ ],
123
+ },
124
+ }),
125
+ timeout: core.Duration.seconds(30),
126
+ memorySize: 128,
127
+ role: lambdaEdgeRole,
128
+ });
129
+ const authCheckCode = this.buildAuthCheckCode(cognitoDomain, clientId, redirectUri);
130
+ this.authCheckFunction = new aws_cdk_lib_1.aws_cloudfront.Function(this, 'AuthCheck', {
131
+ code: aws_cdk_lib_1.aws_cloudfront.FunctionCode.fromInline(authCheckCode),
132
+ runtime: aws_cdk_lib_1.aws_cloudfront.FunctionRuntime.JS_2_0,
133
+ keyValueStore: kvs,
134
+ comment: 'Cognito auth check',
135
+ });
136
+ this.lastCreatedFunction = this.authCheckFunction;
137
+ if (props.enableUserInfoInjection !== false) {
138
+ if (!props.userInfoNameFields || props.userInfoNameFields.length === 0) {
139
+ throw new Error('userInfoNameFields must be provided when enableUserInfoInjection is true');
140
+ }
141
+ const userInfoCode = this.loadAndReplaceUserInfoCode(props.userInfoNameFields);
142
+ this.userInfoFunction = new aws_cdk_lib_1.aws_cloudfront.Function(this, 'UserInfoEndpoint', {
143
+ code: aws_cdk_lib_1.aws_cloudfront.FunctionCode.fromInline(userInfoCode),
144
+ runtime: aws_cdk_lib_1.aws_cloudfront.FunctionRuntime.JS_2_0,
145
+ keyValueStore: kvs,
146
+ comment: 'Returns user info JSON from JWT',
147
+ });
148
+ this.userInfoFunction.node.addDependency(this.authCheckFunction);
149
+ this.lastCreatedFunction = this.userInfoFunction;
150
+ }
151
+ this.tlsOriginRequestPolicy = new aws_cdk_lib_1.aws_cloudfront.OriginRequestPolicy(this, 'TlsOriginRequestPolicy', {
152
+ headerBehavior: aws_cdk_lib_1.aws_cloudfront.OriginRequestHeaderBehavior.allowList('CloudFront-Viewer-TLS'),
153
+ cookieBehavior: aws_cdk_lib_1.aws_cloudfront.OriginRequestCookieBehavior.none(),
154
+ queryStringBehavior: aws_cdk_lib_1.aws_cloudfront.OriginRequestQueryStringBehavior.none(),
155
+ });
156
+ this.functionComposer = new function_composer_1.FunctionComposer();
157
+ this.composedFunctions = new Map();
158
+ const oauthCallbackBehavior = {
159
+ origin: props.defaultBehavior.origin,
160
+ viewerProtocolPolicy: aws_cdk_lib_1.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
161
+ edgeLambdas: [{
162
+ functionVersion: oauthCallbackFn.currentVersion,
163
+ eventType: aws_cdk_lib_1.aws_cloudfront.LambdaEdgeEventType.ORIGIN_REQUEST,
164
+ }],
165
+ cachePolicy: new aws_cdk_lib_1.aws_cloudfront.CachePolicy(this, 'CallbackCachePolicy', {
166
+ cachePolicyName: `${core.Stack.of(this).stackName}-cognito-callback`,
167
+ defaultTtl: core.Duration.seconds(0),
168
+ minTtl: core.Duration.seconds(0),
169
+ maxTtl: core.Duration.seconds(1),
170
+ cookieBehavior: aws_cdk_lib_1.aws_cloudfront.CacheCookieBehavior.allowList('oauth_state', 'code_verifier'),
171
+ headerBehavior: aws_cdk_lib_1.aws_cloudfront.CacheHeaderBehavior.none(),
172
+ queryStringBehavior: aws_cdk_lib_1.aws_cloudfront.CacheQueryStringBehavior.all(),
173
+ enableAcceptEncodingGzip: false,
174
+ enableAcceptEncodingBrotli: false,
175
+ }),
176
+ };
177
+ this.distribution = new aws_cdk_lib_1.aws_cloudfront.Distribution(this, 'Distribution', {
178
+ httpVersion: aws_cdk_lib_1.aws_cloudfront.HttpVersion.HTTP2_AND_3,
179
+ minimumProtocolVersion: aws_cdk_lib_1.aws_cloudfront.SecurityPolicyProtocol.TLS_V1_2_2025,
180
+ defaultBehavior: (() => {
181
+ const built = this.buildFunctionAssociations(props.defaultExtensions, props.defaultExtensionConfig);
182
+ return {
183
+ ...props.defaultBehavior,
184
+ functionAssociations: built?.functionAssociations,
185
+ originRequestPolicy: built?.originRequestPolicy,
186
+ };
187
+ })(),
188
+ additionalBehaviors: {
189
+ '/oauth2/callback': oauthCallbackBehavior,
190
+ },
191
+ domainNames: props.domainNames,
192
+ certificate: props.certificate,
193
+ defaultRootObject: props.defaultRootObject ?? 'index.html',
194
+ errorResponses: [
195
+ { httpStatus: 403, responseHttpStatus: 200, responsePagePath: props.errorResponsePagePath ?? '/error.html', ttl: core.Duration.minutes(5) },
196
+ { httpStatus: 404, responseHttpStatus: 200, responsePagePath: props.errorResponsePagePath ?? '/error.html', ttl: core.Duration.minutes(5) },
197
+ { httpStatus: 500, responseHttpStatus: 200, responsePagePath: props.errorResponsePagePath ?? '/error.html', ttl: core.Duration.seconds(10) },
198
+ { httpStatus: 502, responseHttpStatus: 200, responsePagePath: props.errorResponsePagePath ?? '/error.html', ttl: core.Duration.seconds(10) },
199
+ { httpStatus: 503, responseHttpStatus: 200, responsePagePath: props.errorResponsePagePath ?? '/error.html', ttl: core.Duration.seconds(10) },
200
+ { httpStatus: 504, responseHttpStatus: 200, responsePagePath: props.errorResponsePagePath ?? '/error.html', ttl: core.Duration.seconds(10) },
201
+ ],
202
+ });
203
+ if (this.userInfoFunction) {
204
+ this.distribution.addBehavior('/userinfo', props.defaultBehavior.origin, {
205
+ viewerProtocolPolicy: aws_cdk_lib_1.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
206
+ functionAssociations: [{ function: this.userInfoFunction, eventType: aws_cdk_lib_1.aws_cloudfront.FunctionEventType.VIEWER_REQUEST }],
207
+ cachePolicy: aws_cdk_lib_1.aws_cloudfront.CachePolicy.CACHING_DISABLED,
208
+ });
209
+ }
210
+ }
211
+ addBehavior(pathPattern, origin, options = {}) {
212
+ const built = this.buildFunctionAssociations(options.extensions, options.extensionConfig);
213
+ this.distribution.addBehavior(pathPattern, origin, {
214
+ ...options.behaviorOptions,
215
+ functionAssociations: built?.functionAssociations ?? options.behaviorOptions?.functionAssociations,
216
+ originRequestPolicy: built?.originRequestPolicy ?? options.behaviorOptions?.originRequestPolicy,
217
+ });
218
+ }
219
+ buildFunctionAssociations(extensions, config) {
220
+ if (!extensions || extensions.length === 0) {
221
+ return undefined;
222
+ }
223
+ const cacheKey = this.generateFunctionCacheKey(extensions, config);
224
+ let func = this.composedFunctions.get(cacheKey);
225
+ if (!func) {
226
+ const code = this.functionComposer.compose(extensions, config, {
227
+ cognitoDomain: this.cognitoDomain,
228
+ clientId: this.clientId,
229
+ redirectUri: this.redirectUri,
230
+ });
231
+ const functionId = this.generateFunctionId(extensions, config);
232
+ const functionProps = extensions.includes(securedCloudFront_1.Extension.REQUIRE_AUTH)
233
+ ? { code: aws_cdk_lib_1.aws_cloudfront.FunctionCode.fromInline(code), runtime: aws_cdk_lib_1.aws_cloudfront.FunctionRuntime.JS_2_0, comment: `Combined: ${extensions.join(', ')}`, keyValueStore: this.kvs }
234
+ : { code: aws_cdk_lib_1.aws_cloudfront.FunctionCode.fromInline(code), runtime: aws_cdk_lib_1.aws_cloudfront.FunctionRuntime.JS_2_0, comment: `Combined: ${extensions.join(', ')}` };
235
+ func = new aws_cdk_lib_1.aws_cloudfront.Function(this, functionId, functionProps);
236
+ if (this.lastCreatedFunction) {
237
+ func.node.addDependency(this.lastCreatedFunction);
238
+ }
239
+ this.lastCreatedFunction = func;
240
+ this.composedFunctions.set(cacheKey, func);
241
+ }
242
+ const result = {
243
+ functionAssociations: [{ function: func, eventType: aws_cdk_lib_1.aws_cloudfront.FunctionEventType.VIEWER_REQUEST }],
244
+ };
245
+ if (extensions.includes(securedCloudFront_1.Extension.REQUIRE_TLS_13)) {
246
+ result.originRequestPolicy = this.tlsOriginRequestPolicy;
247
+ }
248
+ return result;
249
+ }
250
+ generateFunctionCacheKey(extensions, config) {
251
+ const parts = [extensions.sort().join(',')];
252
+ if (config?.requiredRoles) {
253
+ parts.push([...config.requiredRoles].sort().join(','));
254
+ }
255
+ if (config?.roleMatchMode && config.roleMatchMode !== securedCloudFront_1.RoleMatchMode.OR) {
256
+ parts.push(config.roleMatchMode);
257
+ }
258
+ return parts.join('|');
259
+ }
260
+ generateFunctionId(extensions, config) {
261
+ const extensionPart = extensions.map(e => e.replace('REQUIRE_', '')).join('');
262
+ if (config?.requiredRoles && config.requiredRoles.length > 0) {
263
+ const roleHash = config.requiredRoles.join('').replace(/[^a-zA-Z0-9]/g, '').substring(0, 8);
264
+ const modePart = config.roleMatchMode && config.roleMatchMode !== securedCloudFront_1.RoleMatchMode.OR ? config.roleMatchMode : '';
265
+ return `ComposedFunction${extensionPart}${roleHash}${modePart}`;
266
+ }
267
+ return `ComposedFunction${extensionPart}`;
268
+ }
269
+ buildAuthCheckCode(cognitoDomain, clientId, redirectUri) {
270
+ const codePath = path.join(__dirname, '../cloudfront-functions/modules/cognito-auth-check.js');
271
+ let code = fs.readFileSync(codePath, 'utf-8');
272
+ code = code.replace(/COGNITO_DOMAIN_PLACEHOLDER/g, cognitoDomain);
273
+ code = code.replace(/CLIENT_ID_PLACEHOLDER/g, clientId);
274
+ code = code.replace(/REDIRECT_URI_PLACEHOLDER/g, redirectUri);
275
+ return code;
276
+ }
277
+ loadAndReplaceUserInfoCode(nameFields) {
278
+ const codePath = path.join(__dirname, '../cloudfront-functions/userinfo-endpoint.js');
279
+ let code = fs.readFileSync(codePath, 'utf-8');
280
+ code = code.replace("var nameFields = ['key1', 'key2', 'key3'];", `var nameFields = ${JSON.stringify(nameFields)};`);
281
+ return code;
282
+ }
283
+ }
284
+ exports.CognitoSecuredCloudFront = CognitoSecuredCloudFront;
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by1zZWN1cmVkLWNsb3VkZnJvbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xvdWRmcm9udC9wYXR0ZXJucy9jb2duaXRvLXNlY3VyZWQtY2xvdWRmcm9udC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixrREFBb0M7QUFDcEMsNkNBS3FCO0FBQ3JCLHVEQUF5QztBQUN6QywyREFBb0c7QUFDcEcsaUZBQTZFO0FBZ0I3RSxNQUFhLHdCQUF3RCxTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBYS9GLFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBb0M7UUFDdkYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFdBQVcsR0FBRyxXQUFXLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1FBRXRFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztRQUNuQyxNQUFNLGVBQWUsR0FBRyxxQkFBRyxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbEcsTUFBTSxTQUFTLEdBQUcscUJBQUcsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RixNQUFNLFlBQVksR0FBRyxxQkFBRyxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sTUFBTSxHQUFHLHFCQUFHLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEYs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QUMsVUFBVSxDQUFDLEdBQUcsQ0FDbEQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBdlNELDREQXVTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIGF3c19jbG91ZGZyb250IGFzIGNsb3VkZnJvbnQsXG4gIGF3c19pYW0gYXMgaWFtLFxuICBhd3NfbGFtYmRhIGFzIGxhbWJkYSxcbiAgYXdzX3NzbSBhcyBzc20sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBFeHRlbnNpb24sIEV4dGVuc2lvbkNvbmZpZywgQWRkQmVoYXZpb3JPcHRpb25zLCBSb2xlTWF0Y2hNb2RlIH0gZnJvbSAnLi9zZWN1cmVkQ2xvdWRGcm9udCc7XG5pbXBvcnQgeyBGdW5jdGlvbkNvbXBvc2VyIH0gZnJvbSAnLi4vY2xvdWRmcm9udC1mdW5jdGlvbnMvZnVuY3Rpb24tY29tcG9zZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZ25pdG9DbG91ZEZyb250UHJvcHM8VFJvbGUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgcmVhZG9ubHkgZGVmYXVsdEJlaGF2aW9yOiBPbWl0PGNsb3VkZnJvbnQuQmVoYXZpb3JPcHRpb25zLCAnZnVuY3Rpb25Bc3NvY2lhdGlvbnMnPjtcbiAgcmVhZG9ubHkgZG9tYWluTmFtZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZTogYW55O1xuICByZWFkb25seSBhdXRoU3NtUGFyYW1QcmVmaXg6IHN0cmluZztcbiAgcmVhZG9ubHkgYXV0aFJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBkZWZhdWx0RXh0ZW5zaW9ucz86IEV4dGVuc2lvbltdO1xuICByZWFkb25seSBkZWZhdWx0RXh0ZW5zaW9uQ29uZmlnPzogRXh0ZW5zaW9uQ29uZmlnPFRSb2xlPjtcbiAgcmVhZG9ubHkgZGVmYXVsdFJvb3RPYmplY3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVycm9yUmVzcG9uc2VQYWdlUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgZW5hYmxlVXNlckluZm9JbmplY3Rpb24/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VySW5mb05hbWVGaWVsZHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENvZ25pdG9TZWN1cmVkQ2xvdWRGcm9udDxUUm9sZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkaXN0cmlidXRpb246IGNsb3VkZnJvbnQuRGlzdHJpYnV0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGhDaGVja0Z1bmN0aW9uOiBjbG91ZGZyb250LkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJJbmZvRnVuY3Rpb24/OiBjbG91ZGZyb250LkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bmN0aW9uQ29tcG9zZXI6IEZ1bmN0aW9uQ29tcG9zZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9zZWRGdW5jdGlvbnM6IE1hcDxzdHJpbmcsIGNsb3VkZnJvbnQuRnVuY3Rpb24+O1xuICBwcml2YXRlIGxhc3RDcmVhdGVkRnVuY3Rpb246IGNsb3VkZnJvbnQuRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGxzT3JpZ2luUmVxdWVzdFBvbGljeTogY2xvdWRmcm9udC5PcmlnaW5SZXF1ZXN0UG9saWN5O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvZ25pdG9Eb21haW46IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnRJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkga3ZzOiBjbG91ZGZyb250LklLZXlWYWx1ZVN0b3JlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENvZ25pdG9DbG91ZEZyb250UHJvcHM8VFJvbGU+KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gYGh0dHBzOi8vJHtwcm9wcy5kb21haW5OYW1lc1swXX0vb2F1dGgyL2NhbGxiYWNrYDtcblxuICAgIGNvbnN0IHAgPSBwcm9wcy5hdXRoU3NtUGFyYW1QcmVmaXg7XG4gICAgY29uc3QgY29uZmlnU2VjcmV0QXJuID0gc3NtLlN0cmluZ1BhcmFtZXRlci52YWx1ZUZvclN0cmluZ1BhcmFtZXRlcih0aGlzLCBgJHtwfS9jb25maWdTZWNyZXRBcm5gKTtcbiAgICBjb25zdCBrbXNLZXlBcm4gPSBzc20uU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIGAke3B9L2ttc0tleUFybmApO1xuICAgIGNvbnN0IGF1dGhUYWJsZUFybiA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGhpcywgYCR7cH0vYXV0aFRhYmxlQXJuYCk7XG4gICAgY29uc3Qga3ZzQXJuID0gc3NtLlN0cmluZ1BhcmFtZXRlci52YWx1ZUZvclN0cmluZ1BhcmFtZXRlcih0aGlzLCBgJHtwfS9rdnNBcm5gKTtcbiAgICBjb25zdCBjb2duaXRvRG9tYWluID0gc3NtLlN0cmluZ1BhcmFtZXRlci52YWx1ZUZvclN0cmluZ1BhcmFtZXRlcih0aGlzLCBgJHtwfS9jb2duaXRvRG9tYWluYCk7XG4gICAgY29uc3QgY2xpZW50SWQgPSBzc20uU3RyaW5nUGFyYW1ldGVyLnZhbHVlRm9yU3RyaW5nUGFyYW1ldGVyKHRoaXMsIGAke3B9L2NsaWVudElkYCk7XG5cbiAgICB0aGlzLmNvZ25pdG9Eb21haW4gPSBjb2duaXRvRG9tYWluO1xuICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcbiAgICB0aGlzLnJlZGlyZWN0VXJpID0gcmVkaXJlY3RVcmk7XG5cbiAgICBjb25zdCBrdnMgPSBjbG91ZGZyb250LktleVZhbHVlU3RvcmUuZnJvbUtleVZhbHVlU3RvcmVBcm4odGhpcywgJ0tWUycsIGt2c0Fybik7XG4gICAgdGhpcy5rdnMgPSBrdnM7XG5cbiAgICBjb25zdCBsYW1iZGFFZGdlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnTGFtYmRhRWRnZVJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZWRnZWxhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICApLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGxhbWJkYUVkZ2VSb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnLCAnc2VjcmV0c21hbmFnZXI6RGVzY3JpYmVTZWNyZXQnXSxcbiAgICAgIHJlc291cmNlczogW2NvbmZpZ1NlY3JldEFybl0sXG4gICAgfSkpO1xuXG4gICAgbGFtYmRhRWRnZVJvbGUuYWRkVG9Qb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydrbXM6RGVjcnlwdCddLFxuICAgICAgcmVzb3VyY2VzOiBba21zS2V5QXJuXSxcbiAgICB9KSk7XG5cbiAgICBsYW1iZGFFZGdlUm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2R5bmFtb2RiOkdldEl0ZW0nLCAnZHluYW1vZGI6UHV0SXRlbScsICdkeW5hbW9kYjpRdWVyeScsICdkeW5hbW9kYjpTY2FuJywgJ2R5bmFtb2RiOlVwZGF0ZUl0ZW0nLCAnZHluYW1vZGI6RGVsZXRlSXRlbSddLFxuICAgICAgcmVzb3VyY2VzOiBbYXV0aFRhYmxlQXJuXSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjb25maWdQeUNvbnRlbnQgPSBgIyBHZW5lcmF0ZWQgY29uZmlndXJhdGlvblxuaW1wb3J0IGpzb25cbmltcG9ydCBib3RvM1xuaW1wb3J0IGxvZ2dpbmdcblxubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoKVxuXG5DT05GSUdfU0VDUkVUX05BTUUgPSAnY2xvdWRmcm9udC1hdXRoLWNvbmZpZy0ke3Byb3BzLmRvbWFpbk5hbWVzWzBdfSdcbkNPTkZJR19SRUdJT04gPSAnJHtwcm9wcy5hdXRoUmVnaW9ufSdcblxuZGVmIGdldF9jb25maWcoKTpcbiAgICBsb2dnZXIuaW5mbyhmJ0xvYWRpbmcgY29uZmlnIGZyb20gU2VjcmV0cyBNYW5hZ2VyJylcbiAgICB0cnk6XG4gICAgICAgIGNsaWVudCA9IGJvdG8zLmNsaWVudCgnc2VjcmV0c21hbmFnZXInLCByZWdpb25fbmFtZT1DT05GSUdfUkVHSU9OKVxuICAgICAgICByZXNwb25zZSA9IGNsaWVudC5nZXRfc2VjcmV0X3ZhbHVlKFNlY3JldElkPUNPTkZJR19TRUNSRVRfTkFNRSlcbiAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMocmVzcG9uc2VbJ1NlY3JldFN0cmluZyddKVxuICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTpcbiAgICAgICAgbG9nZ2VyLmVycm9yKGYnRmFpbGVkIHRvIGdldCBzZWNyZXQ6IHtzdHIoZSl9JylcbiAgICAgICAgcmFpc2VcbmA7XG5cbiAgICBjb25zdCB0ZW1wRGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnY29nbml0by1hdXRoLScpKTtcbiAgICBjb25zdCBjb25maWdQeVBhdGggPSBwYXRoLmpvaW4odGVtcERpciwgJ2NvbmZpZ19nZW5lcmF0ZWQucHknKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1B5UGF0aCwgY29uZmlnUHlDb250ZW50KTtcblxuICAgIGNvbnN0IG9hdXRoQ2FsbGJhY2tGbiA9IG5ldyBjbG91ZGZyb250LmV4cGVyaW1lbnRhbC5FZGdlRnVuY3Rpb24odGhpcywgJ09BdXRoQ2FsbGJhY2snLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMSxcbiAgICAgIGhhbmRsZXI6ICdvYXV0aC1jYWxsYmFjay5sYW1iZGFfaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS9jb2duaXRvLWF1dGgnKSwge1xuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIGltYWdlOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMS5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgIGNvbW1hbmQ6IFtcbiAgICAgICAgICAgICdiYXNoJywgJy1jJyxcbiAgICAgICAgICAgICdwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0IC10IC9hc3NldC1vdXRwdXQgJiYgJyArXG4gICAgICAgICAgICAnY3AgLXIgLiAvYXNzZXQtb3V0cHV0ICYmICcgK1xuICAgICAgICAgICAgJ2NwIC90bXAvY29uZmlnX2dlbmVyYXRlZC5weSAvYXNzZXQtb3V0cHV0L2NvbmZpZ19nZW5lcmF0ZWQucHknLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdm9sdW1lczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBob3N0UGF0aDogY29uZmlnUHlQYXRoLFxuICAgICAgICAgICAgICBjb250YWluZXJQYXRoOiAnL3RtcC9jb25maWdfZ2VuZXJhdGVkLnB5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgdGltZW91dDogY29yZS5EdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIG1lbW9yeVNpemU6IDEyOCxcbiAgICAgIHJvbGU6IGxhbWJkYUVkZ2VSb2xlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aENoZWNrQ29kZSA9IHRoaXMuYnVpbGRBdXRoQ2hlY2tDb2RlKGNvZ25pdG9Eb21haW4sIGNsaWVudElkLCByZWRpcmVjdFVyaSk7XG5cbiAgICB0aGlzLmF1dGhDaGVja0Z1bmN0aW9uID0gbmV3IGNsb3VkZnJvbnQuRnVuY3Rpb24odGhpcywgJ0F1dGhDaGVjaycsIHtcbiAgICAgIGNvZGU6IGNsb3VkZnJvbnQuRnVuY3Rpb25Db2RlLmZyb21JbmxpbmUoYXV0aENoZWNrQ29kZSksXG4gICAgICBydW50aW1lOiBjbG91ZGZyb250LkZ1bmN0aW9uUnVudGltZS5KU18yXzAsXG4gICAgICBrZXlWYWx1ZVN0b3JlOiBrdnMsXG4gICAgICBjb21tZW50OiAnQ29nbml0byBhdXRoIGNoZWNrJyxcbiAgICB9KTtcbiAgICB0aGlzLmxhc3RDcmVhdGVkRnVuY3Rpb24gPSB0aGlzLmF1dGhDaGVja0Z1bmN0aW9uO1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZVVzZXJJbmZvSW5qZWN0aW9uICE9PSBmYWxzZSkge1xuICAgICAgaWYgKCFwcm9wcy51c2VySW5mb05hbWVGaWVsZHMgfHwgcHJvcHMudXNlckluZm9OYW1lRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJJbmZvTmFtZUZpZWxkcyBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gZW5hYmxlVXNlckluZm9JbmplY3Rpb24gaXMgdHJ1ZScpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckluZm9Db2RlID0gdGhpcy5sb2FkQW5kUmVwbGFjZVVzZXJJbmZvQ29kZShwcm9wcy51c2VySW5mb05hbWVGaWVsZHMpO1xuICAgICAgdGhpcy51c2VySW5mb0Z1bmN0aW9uID0gbmV3IGNsb3VkZnJvbnQuRnVuY3Rpb24odGhpcywgJ1VzZXJJbmZvRW5kcG9pbnQnLCB7XG4gICAgICAgIGNvZGU6IGNsb3VkZnJvbnQuRnVuY3Rpb25Db2RlLmZyb21JbmxpbmUodXNlckluZm9Db2RlKSxcbiAgICAgICAgcnVudGltZTogY2xvdWRmcm9udC5GdW5jdGlvblJ1bnRpbWUuSlNfMl8wLFxuICAgICAgICBrZXlWYWx1ZVN0b3JlOiBrdnMsXG4gICAgICAgIGNvbW1lbnQ6ICdSZXR1cm5zIHVzZXIgaW5mbyBKU09OIGZyb20gSldUJyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy51c2VySW5mb0Z1bmN0aW9uLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLmF1dGhDaGVja0Z1bmN0aW9uKTtcbiAgICAgIHRoaXMubGFzdENyZWF0ZWRGdW5jdGlvbiA9IHRoaXMudXNlckluZm9GdW5jdGlvbjtcbiAgICB9XG5cbiAgICB0aGlzLnRsc09yaWdpblJlcXVlc3RQb2xpY3kgPSBuZXcgY2xvdWRmcm9udC5PcmlnaW5SZXF1ZXN0UG9saWN5KHRoaXMsICdUbHNPcmlnaW5SZXF1ZXN0UG9saWN5Jywge1xuICAgICAgaGVhZGVyQmVoYXZpb3I6IGNsb3VkZnJvbnQuT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCgnQ2xvdWRGcm9udC1WaWV3ZXItVExTJyksXG4gICAgICBjb29raWVCZWhhdmlvcjogY2xvdWRmcm9udC5PcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogY2xvdWRmcm9udC5PcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvci5ub25lKCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uQ29tcG9zZXIgPSBuZXcgRnVuY3Rpb25Db21wb3NlcigpO1xuICAgIHRoaXMuY29tcG9zZWRGdW5jdGlvbnMgPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdCBvYXV0aENhbGxiYWNrQmVoYXZpb3I6IGNsb3VkZnJvbnQuQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiBwcm9wcy5kZWZhdWx0QmVoYXZpb3Iub3JpZ2luLFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNsb3VkZnJvbnQuVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICBlZGdlTGFtYmRhczogW3tcbiAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiBvYXV0aENhbGxiYWNrRm4uY3VycmVudFZlcnNpb24sXG4gICAgICAgIGV2ZW50VHlwZTogY2xvdWRmcm9udC5MYW1iZGFFZGdlRXZlbnRUeXBlLk9SSUdJTl9SRVFVRVNULFxuICAgICAgfV0sXG4gICAgICBjYWNoZVBvbGljeTogbmV3IGNsb3VkZnJvbnQuQ2FjaGVQb2xpY3kodGhpcywgJ0NhbGxiYWNrQ2FjaGVQb2xpY3knLCB7XG4gICAgICAgIGNhY2hlUG9saWN5TmFtZTogYCR7Y29yZS5TdGFjay5vZih0aGlzKS5zdGFja05hbWV9LWNvZ25pdG8tY2FsbGJhY2tgLFxuICAgICAgICBkZWZhdWx0VHRsOiBjb3JlLkR1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgIG1pblR0bDogY29yZS5EdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICBtYXhUdGw6IGNvcmUuRHVyYXRpb24uc2Vjb25kcygxKSxcbiAgICAgICAgY29va2llQmVoYXZpb3I6IGNsb3VkZnJvbnQuQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoJ29hdXRoX3N0YXRlJywgJ2NvZGVfdmVyaWZpZXInKSxcbiAgICAgICAgaGVhZGVyQmVoYXZpb3I6IGNsb3VkZnJvbnQuQ2FjaGVIZWFkZXJCZWhhdmlvci5ub25lKCksXG4gICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IGNsb3VkZnJvbnQuQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IGZhbHNlLFxuICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogZmFsc2UsXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgdGhpcy5kaXN0cmlidXRpb24gPSBuZXcgY2xvdWRmcm9udC5EaXN0cmlidXRpb24odGhpcywgJ0Rpc3RyaWJ1dGlvbicsIHtcbiAgICAgIGh0dHBWZXJzaW9uOiBjbG91ZGZyb250Lkh0dHBWZXJzaW9uLkhUVFAyX0FORF8zLFxuICAgICAgbWluaW11bVByb3RvY29sVmVyc2lvbjogY2xvdWRmcm9udC5TZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMjUsXG4gICAgICBkZWZhdWx0QmVoYXZpb3I6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWx0ID0gdGhpcy5idWlsZEZ1bmN0aW9uQXNzb2NpYXRpb25zKHByb3BzLmRlZmF1bHRFeHRlbnNpb25zLCBwcm9wcy5kZWZhdWx0RXh0ZW5zaW9uQ29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcm9wcy5kZWZhdWx0QmVoYXZpb3IsXG4gICAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IGJ1aWx0Py5mdW5jdGlvbkFzc29jaWF0aW9ucyxcbiAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiBidWlsdD8ub3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgICAgICAgfTtcbiAgICAgIH0pKCksXG4gICAgICBhZGRpdGlvbmFsQmVoYXZpb3JzOiB7XG4gICAgICAgICcvb2F1dGgyL2NhbGxiYWNrJzogb2F1dGhDYWxsYmFja0JlaGF2aW9yLFxuICAgICAgfSxcbiAgICAgIGRvbWFpbk5hbWVzOiBwcm9wcy5kb21haW5OYW1lcyxcbiAgICAgIGNlcnRpZmljYXRlOiBwcm9wcy5jZXJ0aWZpY2F0ZSxcbiAgICAgIGRlZmF1bHRSb290T2JqZWN0OiBwcm9wcy5kZWZhdWx0Um9vdE9iamVjdCA/PyAnaW5kZXguaHRtbCcsXG4gICAgICBlcnJvclJlc3BvbnNlczogW1xuICAgICAgICB7IGh0dHBTdGF0dXM6IDQwMywgcmVzcG9uc2VIdHRwU3RhdHVzOiAyMDAsIHJlc3BvbnNlUGFnZVBhdGg6IHByb3BzLmVycm9yUmVzcG9uc2VQYWdlUGF0aCA/PyAnL2Vycm9yLmh0bWwnLCB0dGw6IGNvcmUuRHVyYXRpb24ubWludXRlcyg1KSB9LFxuICAgICAgICB7IGh0dHBTdGF0dXM6IDQwNCwgcmVzcG9uc2VIdHRwU3RhdHVzOiAyMDAsIHJlc3BvbnNlUGFnZVBhdGg6IHByb3BzLmVycm9yUmVzcG9uc2VQYWdlUGF0aCA/PyAnL2Vycm9yLmh0bWwnLCB0dGw6IGNvcmUuRHVyYXRpb24ubWludXRlcyg1KSB9LFxuICAgICAgICB7IGh0dHBTdGF0dXM6IDUwMCwgcmVzcG9uc2VIdHRwU3RhdHVzOiAyMDAsIHJlc3BvbnNlUGFnZVBhdGg6IHByb3BzLmVycm9yUmVzcG9uc2VQYWdlUGF0aCA/PyAnL2Vycm9yLmh0bWwnLCB0dGw6IGNvcmUuRHVyYXRpb24uc2Vjb25kcygxMCkgfSxcbiAgICAgICAgeyBodHRwU3RhdHVzOiA1MDIsIHJlc3BvbnNlSHR0cFN0YXR1czogMjAwLCByZXNwb25zZVBhZ2VQYXRoOiBwcm9wcy5lcnJvclJlc3BvbnNlUGFnZVBhdGggPz8gJy9lcnJvci5odG1sJywgdHRsOiBjb3JlLkR1cmF0aW9uLnNlY29uZHMoMTApIH0sXG4gICAgICAgIHsgaHR0cFN0YXR1czogNTAzLCByZXNwb25zZUh0dHBTdGF0dXM6IDIwMCwgcmVzcG9uc2VQYWdlUGF0aDogcHJvcHMuZXJyb3JSZXNwb25zZVBhZ2VQYXRoID8/ICcvZXJyb3IuaHRtbCcsIHR0bDogY29yZS5EdXJhdGlvbi5zZWNvbmRzKDEwKSB9LFxuICAgICAgICB7IGh0dHBTdGF0dXM6IDUwNCwgcmVzcG9uc2VIdHRwU3RhdHVzOiAyMDAsIHJlc3BvbnNlUGFnZVBhdGg6IHByb3BzLmVycm9yUmVzcG9uc2VQYWdlUGF0aCA/PyAnL2Vycm9yLmh0bWwnLCB0dGw6IGNvcmUuRHVyYXRpb24uc2Vjb25kcygxMCkgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy51c2VySW5mb0Z1bmN0aW9uKSB7XG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcignL3VzZXJpbmZvJywgcHJvcHMuZGVmYXVsdEJlaGF2aW9yLm9yaWdpbiwge1xuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2xvdWRmcm9udC5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IFt7IGZ1bmN0aW9uOiB0aGlzLnVzZXJJbmZvRnVuY3Rpb24sIGV2ZW50VHlwZTogY2xvdWRmcm9udC5GdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCB9XSxcbiAgICAgICAgY2FjaGVQb2xpY3k6IGNsb3VkZnJvbnQuQ2FjaGVQb2xpY3kuQ0FDSElOR19ESVNBQkxFRCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRCZWhhdmlvcihcbiAgICBwYXRoUGF0dGVybjogc3RyaW5nLFxuICAgIG9yaWdpbjogY2xvdWRmcm9udC5JT3JpZ2luLFxuICAgIG9wdGlvbnM6IEFkZEJlaGF2aW9yT3B0aW9uczxUUm9sZT4gPSB7fSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYnVpbHQgPSB0aGlzLmJ1aWxkRnVuY3Rpb25Bc3NvY2lhdGlvbnMob3B0aW9ucy5leHRlbnNpb25zLCBvcHRpb25zLmV4dGVuc2lvbkNvbmZpZyk7XG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IocGF0aFBhdHRlcm4sIG9yaWdpbiwge1xuICAgICAgLi4ub3B0aW9ucy5iZWhhdmlvck9wdGlvbnMsXG4gICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogYnVpbHQ/LmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IG9wdGlvbnMuYmVoYXZpb3JPcHRpb25zPy5mdW5jdGlvbkFzc29jaWF0aW9ucyxcbiAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IGJ1aWx0Py5vcmlnaW5SZXF1ZXN0UG9saWN5ID8/IG9wdGlvbnMuYmVoYXZpb3JPcHRpb25zPy5vcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZ1bmN0aW9uQXNzb2NpYXRpb25zKFxuICAgIGV4dGVuc2lvbnM/OiBFeHRlbnNpb25bXSxcbiAgICBjb25maWc/OiBFeHRlbnNpb25Db25maWc8VFJvbGU+LFxuICApOiB7IGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBjbG91ZGZyb250LkZ1bmN0aW9uQXNzb2NpYXRpb25bXTsgb3JpZ2luUmVxdWVzdFBvbGljeT86IGNsb3VkZnJvbnQuT3JpZ2luUmVxdWVzdFBvbGljeSB9IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWV4dGVuc2lvbnMgfHwgZXh0ZW5zaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmdlbmVyYXRlRnVuY3Rpb25DYWNoZUtleShleHRlbnNpb25zLCBjb25maWcpO1xuICAgIGxldCBmdW5jID0gdGhpcy5jb21wb3NlZEZ1bmN0aW9ucy5nZXQoY2FjaGVLZXkpO1xuXG4gICAgaWYgKCFmdW5jKSB7XG4gICAgICBjb25zdCBjb2RlID0gdGhpcy5mdW5jdGlvbkNvbXBvc2VyLmNvbXBvc2UoZXh0ZW5zaW9ucywgY29uZmlnLCB7XG4gICAgICAgIGNvZ25pdG9Eb21haW46IHRoaXMuY29nbml0b0RvbWFpbixcbiAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICAgIHJlZGlyZWN0VXJpOiB0aGlzLnJlZGlyZWN0VXJpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGZ1bmN0aW9uSWQgPSB0aGlzLmdlbmVyYXRlRnVuY3Rpb25JZChleHRlbnNpb25zLCBjb25maWcpO1xuICAgICAgY29uc3QgZnVuY3Rpb25Qcm9wcyA9IGV4dGVuc2lvbnMuaW5jbHVkZXMoRXh0ZW5zaW9uLlJFUVVJUkVfQVVUSClcbiAgICAgICAgPyB7IGNvZGU6IGNsb3VkZnJvbnQuRnVuY3Rpb25Db2RlLmZyb21JbmxpbmUoY29kZSksIHJ1bnRpbWU6IGNsb3VkZnJvbnQuRnVuY3Rpb25SdW50aW1lLkpTXzJfMCwgY29tbWVudDogYENvbWJpbmVkOiAke2V4dGVuc2lvbnMuam9pbignLCAnKX1gLCBrZXlWYWx1ZVN0b3JlOiB0aGlzLmt2cyB9XG4gICAgICAgIDogeyBjb2RlOiBjbG91ZGZyb250LkZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGNvZGUpLCBydW50aW1lOiBjbG91ZGZyb250LkZ1bmN0aW9uUnVudGltZS5KU18yXzAsIGNvbW1lbnQ6IGBDb21iaW5lZDogJHtleHRlbnNpb25zLmpvaW4oJywgJyl9YCB9O1xuXG4gICAgICBmdW5jID0gbmV3IGNsb3VkZnJvbnQuRnVuY3Rpb24odGhpcywgZnVuY3Rpb25JZCwgZnVuY3Rpb25Qcm9wcyk7XG4gICAgICBpZiAodGhpcy5sYXN0Q3JlYXRlZEZ1bmN0aW9uKSB7XG4gICAgICAgIGZ1bmMubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMubGFzdENyZWF0ZWRGdW5jdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RDcmVhdGVkRnVuY3Rpb24gPSBmdW5jO1xuICAgICAgdGhpcy5jb21wb3NlZEZ1bmN0aW9ucy5zZXQoY2FjaGVLZXksIGZ1bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogeyBmdW5jdGlvbkFzc29jaWF0aW9uczogY2xvdWRmcm9udC5GdW5jdGlvbkFzc29jaWF0aW9uW107IG9yaWdpblJlcXVlc3RQb2xpY3k/OiBjbG91ZGZyb250Lk9yaWdpblJlcXVlc3RQb2xpY3kgfSA9IHtcbiAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbeyBmdW5jdGlvbjogZnVuYywgZXZlbnRUeXBlOiBjbG91ZGZyb250LkZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNUIH1dLFxuICAgIH07XG5cbiAgICBpZiAoZXh0ZW5zaW9ucy5pbmNsdWRlcyhFeHRlbnNpb24uUkVRVUlSRV9UTFNfMTMpKSB7XG4gICAgICByZXN1bHQub3JpZ2luUmVxdWVzdFBvbGljeSA9IHRoaXMudGxzT3JpZ2luUmVxdWVzdFBvbGljeTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUZ1bmN0aW9uQ2FjaGVLZXkoZXh0ZW5zaW9uczogRXh0ZW5zaW9uW10sIGNvbmZpZz86IEV4dGVuc2lvbkNvbmZpZzxUUm9sZT4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzID0gW2V4dGVuc2lvbnMuc29ydCgpLmpvaW4oJywnKV07XG4gICAgaWYgKGNvbmZpZz8ucmVxdWlyZWRSb2xlcykge1xuICAgICAgcGFydHMucHVzaChbLi4uY29uZmlnLnJlcXVpcmVkUm9sZXNdLnNvcnQoKS5qb2luKCcsJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnPy5yb2xlTWF0Y2hNb2RlICYmIGNvbmZpZy5yb2xlTWF0Y2hNb2RlICE9PSBSb2xlTWF0Y2hNb2RlLk9SKSB7XG4gICAgICBwYXJ0cy5wdXNoKGNvbmZpZy5yb2xlTWF0Y2hNb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJ3wnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVGdW5jdGlvbklkKGV4dGVuc2lvbnM6IEV4dGVuc2lvbltdLCBjb25maWc/OiBFeHRlbnNpb25Db25maWc8VFJvbGU+KTogc3RyaW5nIHtcbiAgICBjb25zdCBleHRlbnNpb25QYXJ0ID0gZXh0ZW5zaW9ucy5tYXAoZSA9PiBlLnJlcGxhY2UoJ1JFUVVJUkVfJywgJycpKS5qb2luKCcnKTtcbiAgICBpZiAoY29uZmlnPy5yZXF1aXJlZFJvbGVzICYmIGNvbmZpZy5yZXF1aXJlZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJvbGVIYXNoID0gY29uZmlnLnJlcXVpcmVkUm9sZXMuam9pbignJykucmVwbGFjZSgvW15hLXpBLVowLTldL2csICcnKS5zdWJzdHJpbmcoMCwgOCk7XG4gICAgICBjb25zdCBtb2RlUGFydCA9IGNvbmZpZy5yb2xlTWF0Y2hNb2RlICYmIGNvbmZpZy5yb2xlTWF0Y2hNb2RlICE9PSBSb2xlTWF0Y2hNb2RlLk9SID8gY29uZmlnLnJvbGVNYXRjaE1vZGUgOiAnJztcbiAgICAgIHJldHVybiBgQ29tcG9zZWRGdW5jdGlvbiR7ZXh0ZW5zaW9uUGFydH0ke3JvbGVIYXNofSR7bW9kZVBhcnR9YDtcbiAgICB9XG4gICAgcmV0dXJuIGBDb21wb3NlZEZ1bmN0aW9uJHtleHRlbnNpb25QYXJ0fWA7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQXV0aENoZWNrQ29kZShjb2duaXRvRG9tYWluOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcsIHJlZGlyZWN0VXJpOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvZGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2Nsb3VkZnJvbnQtZnVuY3Rpb25zL21vZHVsZXMvY29nbml0by1hdXRoLWNoZWNrLmpzJyk7XG4gICAgbGV0IGNvZGUgPSBmcy5yZWFkRmlsZVN5bmMoY29kZVBhdGgsICd1dGYtOCcpO1xuICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoL0NPR05JVE9fRE9NQUlOX1BMQUNFSE9MREVSL2csIGNvZ25pdG9Eb21haW4pO1xuICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoL0NMSUVOVF9JRF9QTEFDRUhPTERFUi9nLCBjbGllbnRJZCk7XG4gICAgY29kZSA9IGNvZGUucmVwbGFjZSgvUkVESVJFQ1RfVVJJX1BMQUNFSE9MREVSL2csIHJlZGlyZWN0VXJpKTtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEFuZFJlcGxhY2VVc2VySW5mb0NvZGUobmFtZUZpZWxkczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvZGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2Nsb3VkZnJvbnQtZnVuY3Rpb25zL3VzZXJpbmZvLWVuZHBvaW50LmpzJyk7XG4gICAgbGV0IGNvZGUgPSBmcy5yZWFkRmlsZVN5bmMoY29kZVBhdGgsICd1dGYtOCcpO1xuICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoXG4gICAgICBcInZhciBuYW1lRmllbGRzID0gWydrZXkxJywgJ2tleTInLCAna2V5MyddO1wiLFxuICAgICAgYHZhciBuYW1lRmllbGRzID0gJHtKU09OLnN0cmluZ2lmeShuYW1lRmllbGRzKX07YCxcbiAgICApO1xuICAgIHJldHVybiBjb2RlO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,28 @@
1
+ import * as core from 'aws-cdk-lib';
2
+ import { aws_cognito as cognito } from 'aws-cdk-lib';
3
+ import * as constructs from 'constructs';
4
+ import { AppSpec } from './authInfrastructure';
5
+ export interface CognitoAuthInfrastructureProps {
6
+ readonly ssmParamPrefix?: string;
7
+ readonly zoneName: string;
8
+ readonly appSpec: AppSpec;
9
+ readonly cognitoDomainPrefix: string;
10
+ readonly securityAlertsTopicArn?: string;
11
+ readonly sessionRevocationTopicArn?: string;
12
+ readonly autoRevokeOnReuse?: boolean;
13
+ readonly jwtClaimsWhitelist?: string[];
14
+ readonly hmacSecretRotationSchedule?: core.Duration;
15
+ readonly auditLogRetentionDays?: number;
16
+ readonly auditArchiveRetentionDays?: number;
17
+ readonly removalPolicy?: core.RemovalPolicy;
18
+ }
19
+ export declare class CognitoAuthInfrastructure extends constructs.Construct {
20
+ readonly configSecretArn: string;
21
+ readonly kmsKeyArn: string;
22
+ readonly authTableArn: string;
23
+ readonly kvsArn: string;
24
+ readonly userPool: cognito.UserPool;
25
+ readonly userPoolClient: cognito.UserPoolClient;
26
+ readonly cognitoDomain: cognito.UserPoolDomain;
27
+ constructor(scope: constructs.Construct, id: string, props: CognitoAuthInfrastructureProps);
28
+ }
@@ -0,0 +1,157 @@
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.CognitoAuthInfrastructure = void 0;
37
+ const path = __importStar(require("path"));
38
+ const core = __importStar(require("aws-cdk-lib"));
39
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
40
+ const constructs = __importStar(require("constructs"));
41
+ const authLambdaFunctions_1 = require("../auth/authLambdaFunctions");
42
+ const cognitoAuthSecretManager_1 = require("../auth/cognitoAuthSecretManager");
43
+ const authSecurityTable_1 = require("../authSecurityTable");
44
+ const auditLogArchive_1 = require("../logging/auditLogArchive");
45
+ const ssmCrossRegionWriter_1 = require("../ssmCrossRegionWriter");
46
+ class CognitoAuthInfrastructure extends constructs.Construct {
47
+ constructor(scope, id, props) {
48
+ super(scope, id);
49
+ const preTokenLambda = new aws_cdk_lib_1.aws_lambda.Function(this, 'PreTokenLambda', {
50
+ runtime: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_12,
51
+ handler: 'index.handler',
52
+ code: aws_cdk_lib_1.aws_lambda.Code.fromAsset(path.join(__dirname, '../cloudfront/lambda/pre-token')),
53
+ timeout: core.Duration.seconds(5),
54
+ });
55
+ this.userPool = new aws_cdk_lib_1.aws_cognito.UserPool(this, 'UserPool', {
56
+ userPoolName: `${props.appSpec.name}-user-pool`,
57
+ selfSignUpEnabled: false,
58
+ signInAliases: { email: true },
59
+ mfa: aws_cdk_lib_1.aws_cognito.Mfa.REQUIRED,
60
+ mfaSecondFactor: { otp: true, sms: false },
61
+ passwordPolicy: {
62
+ minLength: 12,
63
+ requireLowercase: true,
64
+ requireUppercase: true,
65
+ requireDigits: true,
66
+ requireSymbols: true,
67
+ },
68
+ removalPolicy: props.removalPolicy ?? core.RemovalPolicy.RETAIN,
69
+ });
70
+ this.userPool.addTrigger(aws_cdk_lib_1.aws_cognito.UserPoolOperation.PRE_TOKEN_GENERATION_CONFIG, preTokenLambda, aws_cdk_lib_1.aws_cognito.LambdaVersion.V2_0);
71
+ if (props.appSpec.groups) {
72
+ for (const group of props.appSpec.groups) {
73
+ new aws_cdk_lib_1.aws_cognito.CfnUserPoolGroup(this, `Group${group}`, {
74
+ userPoolId: this.userPool.userPoolId,
75
+ groupName: group,
76
+ });
77
+ }
78
+ }
79
+ this.userPoolClient = new aws_cdk_lib_1.aws_cognito.UserPoolClient(this, 'UserPoolClient', {
80
+ userPool: this.userPool,
81
+ generateSecret: false,
82
+ authFlows: { userSrp: true },
83
+ oAuth: {
84
+ flows: { authorizationCodeGrant: true },
85
+ scopes: [
86
+ aws_cdk_lib_1.aws_cognito.OAuthScope.OPENID,
87
+ aws_cdk_lib_1.aws_cognito.OAuthScope.EMAIL,
88
+ aws_cdk_lib_1.aws_cognito.OAuthScope.PROFILE,
89
+ ],
90
+ callbackUrls: [`https://${props.zoneName}/oauth2/callback`],
91
+ logoutUrls: [`https://${props.zoneName}`],
92
+ },
93
+ supportedIdentityProviders: [aws_cdk_lib_1.aws_cognito.UserPoolClientIdentityProvider.COGNITO],
94
+ });
95
+ this.cognitoDomain = this.userPool.addDomain('CognitoDomain', {
96
+ cognitoDomain: { domainPrefix: props.cognitoDomainPrefix },
97
+ });
98
+ const authSecurityTable = new authSecurityTable_1.AuthSecurityTable(this, 'AuthSecurityTable', {
99
+ tableName: `auth-security-${props.zoneName}`,
100
+ removalPolicy: props.removalPolicy ?? core.RemovalPolicy.RETAIN,
101
+ });
102
+ const cognitoRegion = core.Stack.of(this).region;
103
+ const cognitoDomainUrl = `${props.cognitoDomainPrefix}.auth.${cognitoRegion}.amazoncognito.com`;
104
+ const secretManager = new cognitoAuthSecretManager_1.CognitoAuthSecretManager(this, 'SecretManager', {
105
+ domainName: props.zoneName,
106
+ tableName: authSecurityTable.table.tableName,
107
+ tableRegion: cognitoRegion,
108
+ userPoolId: this.userPool.userPoolId,
109
+ clientId: this.userPoolClient.userPoolClientId,
110
+ cognitoDomain: cognitoDomainUrl,
111
+ cognitoRegion: cognitoRegion,
112
+ securityAlertsTopicArn: props.securityAlertsTopicArn,
113
+ autoRevokeOnReuse: props.autoRevokeOnReuse,
114
+ jwtClaimsWhitelist: props.jwtClaimsWhitelist,
115
+ });
116
+ const auditLogRetentionDays = props.auditLogRetentionDays ?? 30;
117
+ const auditArchiveRetentionDays = props.auditArchiveRetentionDays ?? 365;
118
+ const lambdaFunctions = new authLambdaFunctions_1.AuthLambdaFunctions(this, 'LambdaFunctions', {
119
+ configSecret: secretManager.configSecret,
120
+ kmsKey: secretManager.kmsKey,
121
+ kvs: secretManager.kvs,
122
+ authTable: authSecurityTable.table,
123
+ rotationSchedule: props.hmacSecretRotationSchedule,
124
+ sessionRevocationTopicArn: props.sessionRevocationTopicArn,
125
+ logRetentionDays: auditLogRetentionDays,
126
+ });
127
+ new auditLogArchive_1.AuditLogArchive(this, 'AuditLogArchive', {
128
+ logGroupNames: lambdaFunctions.logGroups.map(lg => lg.logGroupName),
129
+ kmsKey: secretManager.kmsKey,
130
+ retentionDays: auditLogRetentionDays,
131
+ archiveRetentionDays: auditArchiveRetentionDays,
132
+ bucketName: `auth-audit-logs-cognito-${core.Stack.of(this).account}-${core.Stack.of(this).region}`,
133
+ databaseName: 'auth_audit_logs_cognito',
134
+ removalPolicy: props.removalPolicy ?? core.RemovalPolicy.RETAIN,
135
+ });
136
+ const prefix = props.ssmParamPrefix ?? `/auth/${props.zoneName}`;
137
+ new ssmCrossRegionWriter_1.SsmCrossRegionWriter(this, 'SsmWriter', {
138
+ prefix: prefix,
139
+ region: 'us-east-1',
140
+ params: {
141
+ configSecretArn: secretManager.configSecret.secretArn,
142
+ kmsKeyArn: secretManager.kmsKey.keyArn,
143
+ authTableArn: authSecurityTable.table.tableArn,
144
+ kvsArn: secretManager.kvs.keyValueStoreArn,
145
+ cognitoDomain: cognitoDomainUrl,
146
+ clientId: this.userPoolClient.userPoolClientId,
147
+ userPoolId: this.userPool.userPoolId,
148
+ },
149
+ });
150
+ this.configSecretArn = secretManager.configSecret.secretArn;
151
+ this.kmsKeyArn = secretManager.kmsKey.keyArn;
152
+ this.authTableArn = authSecurityTable.table.tableArn;
153
+ this.kvsArn = secretManager.kvs.keyValueStoreArn;
154
+ }
155
+ }
156
+ exports.CognitoAuthInfrastructure = CognitoAuthInfrastructure;
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0b0F1dGhJbmZyYXN0cnVjdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbG91ZGZyb250L3BhdHRlcm5zL2NvZ25pdG9BdXRoSW5mcmFzdHJ1Y3R1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBQzdCLGtEQUFvQztBQUNwQyw2Q0FHcUI7QUFDckIsdURBQXlDO0FBQ3pDLHFFQUFrRTtBQUNsRSwrRUFBNEU7QUFDNUUsNERBQXlEO0FBQ3pELGdFQUE2RDtBQUM3RCxrRUFBK0Q7QUFrQi9ELE1BQWEseUJBQTBCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFTakUsWUFBWSxLQUEyQixFQUFFLEVBQVUsRUFBRSxLQUFxQztRQUN4RixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sY0FBYyxHQUFHLElBQUksd0JBQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ2pFLE9BQU8sRUFBRSx3QkFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSx3QkFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztZQUNuRixPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2xDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSx5QkFBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3JELFlBQVksRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxZQUFZO1lBQy9DLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsYUFBYSxFQUFFLEVBQUUs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Q3JELElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFwSUQsOERBb0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGNvcmUgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgYXdzX2NvZ25pdG8gYXMgY29nbml0byxcbiAgYXdzX2xhbWJkYSBhcyBsYW1iZGEsXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBdXRoTGFtYmRhRnVuY3Rpb25zIH0gZnJvbSAnLi4vYXV0aC9hdXRoTGFtYmRhRnVuY3Rpb25zJztcbmltcG9ydCB7IENvZ25pdG9BdXRoU2VjcmV0TWFuYWdlciB9IGZyb20gJy4uL2F1dGgvY29nbml0b0F1dGhTZWNyZXRNYW5hZ2VyJztcbmltcG9ydCB7IEF1dGhTZWN1cml0eVRhYmxlIH0gZnJvbSAnLi4vYXV0aFNlY3VyaXR5VGFibGUnO1xuaW1wb3J0IHsgQXVkaXRMb2dBcmNoaXZlIH0gZnJvbSAnLi4vbG9nZ2luZy9hdWRpdExvZ0FyY2hpdmUnO1xuaW1wb3J0IHsgU3NtQ3Jvc3NSZWdpb25Xcml0ZXIgfSBmcm9tICcuLi9zc21Dcm9zc1JlZ2lvbldyaXRlcic7XG5pbXBvcnQgeyBBcHBTcGVjIH0gZnJvbSAnLi9hdXRoSW5mcmFzdHJ1Y3R1cmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZ25pdG9BdXRoSW5mcmFzdHJ1Y3R1cmVQcm9wcyB7XG4gIHJlYWRvbmx5IHNzbVBhcmFtUHJlZml4Pzogc3RyaW5nO1xuICByZWFkb25seSB6b25lTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcHBTcGVjOiBBcHBTcGVjO1xuICByZWFkb25seSBjb2duaXRvRG9tYWluUHJlZml4OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlY3VyaXR5QWxlcnRzVG9waWNBcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlc3Npb25SZXZvY2F0aW9uVG9waWNBcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dG9SZXZva2VPblJldXNlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgand0Q2xhaW1zV2hpdGVsaXN0Pzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGhtYWNTZWNyZXRSb3RhdGlvblNjaGVkdWxlPzogY29yZS5EdXJhdGlvbjtcbiAgcmVhZG9ubHkgYXVkaXRMb2dSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICByZWFkb25seSBhdWRpdEFyY2hpdmVSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogY29yZS5SZW1vdmFsUG9saWN5O1xufVxuXG5leHBvcnQgY2xhc3MgQ29nbml0b0F1dGhJbmZyYXN0cnVjdHVyZSBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZ1NlY3JldEFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkga21zS2V5QXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBhdXRoVGFibGVBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGt2c0Fybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2w6IGNvZ25pdG8uVXNlclBvb2w7XG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbENsaWVudDogY29nbml0by5Vc2VyUG9vbENsaWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGNvZ25pdG9Eb21haW46IGNvZ25pdG8uVXNlclBvb2xEb21haW47XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ29nbml0b0F1dGhJbmZyYXN0cnVjdHVyZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHByZVRva2VuTGFtYmRhID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnUHJlVG9rZW5MYW1iZGEnLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMixcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vY2xvdWRmcm9udC9sYW1iZGEvcHJlLXRva2VuJykpLFxuICAgICAgdGltZW91dDogY29yZS5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgIH0pO1xuXG4gICAgdGhpcy51c2VyUG9vbCA9IG5ldyBjb2duaXRvLlVzZXJQb29sKHRoaXMsICdVc2VyUG9vbCcsIHtcbiAgICAgIHVzZXJQb29sTmFtZTogYCR7cHJvcHMuYXBwU3BlYy5uYW1lfS11c2VyLXBvb2xgLFxuICAgICAgc2VsZlNpZ25VcEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgc2lnbkluQWxpYXNlczogeyBlbWFpbDogdHJ1ZSB9LFxuICAgICAgbWZhOiBjb2duaXRvLk1mYS5SRVFVSVJFRCxcbiAgICAgIG1mYVNlY29uZEZhY3RvcjogeyBvdHA6IHRydWUsIHNtczogZmFsc2UgfSxcbiAgICAgIHBhc3N3b3JkUG9saWN5OiB7XG4gICAgICAgIG1pbkxlbmd0aDogMTIsXG4gICAgICAgIHJlcXVpcmVMb3dlcmNhc2U6IHRydWUsXG4gICAgICAgIHJlcXVpcmVVcHBlcmNhc2U6IHRydWUsXG4gICAgICAgIHJlcXVpcmVEaWdpdHM6IHRydWUsXG4gICAgICAgIHJlcXVpcmVTeW1ib2xzOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3kgPz8gY29yZS5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICB9KTtcblxuICAgIHRoaXMudXNlclBvb2wuYWRkVHJpZ2dlcihjb2duaXRvLlVzZXJQb29sT3BlcmF0aW9uLlBSRV9UT0tFTl9HRU5FUkFUSU9OX0NPTkZJRywgcHJlVG9rZW5MYW1iZGEsIGNvZ25pdG8uTGFtYmRhVmVyc2lvbi5WMl8wKTtcblxuICAgIGlmIChwcm9wcy5hcHBTcGVjLmdyb3Vwcykge1xuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBwcm9wcy5hcHBTcGVjLmdyb3Vwcykge1xuICAgICAgICBuZXcgY29nbml0by5DZm5Vc2VyUG9vbEdyb3VwKHRoaXMsIGBHcm91cCR7Z3JvdXB9YCwge1xuICAgICAgICAgIHVzZXJQb29sSWQ6IHRoaXMudXNlclBvb2wudXNlclBvb2xJZCxcbiAgICAgICAgICBncm91cE5hbWU6IGdyb3VwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVzZXJQb29sQ2xpZW50ID0gbmV3IGNvZ25pdG8uVXNlclBvb2xDbGllbnQodGhpcywgJ1VzZXJQb29sQ2xpZW50Jywge1xuICAgICAgdXNlclBvb2w6IHRoaXMudXNlclBvb2wsXG4gICAgICBnZW5lcmF0ZVNlY3JldDogZmFsc2UsXG4gICAgICBhdXRoRmxvd3M6IHsgdXNlclNycDogdHJ1ZSB9LFxuICAgICAgb0F1dGg6IHtcbiAgICAgICAgZmxvd3M6IHsgYXV0aG9yaXphdGlvbkNvZGVHcmFudDogdHJ1ZSB9LFxuICAgICAgICBzY29wZXM6IFtcbiAgICAgICAgICBjb2duaXRvLk9BdXRoU2NvcGUuT1BFTklELFxuICAgICAgICAgIGNvZ25pdG8uT0F1dGhTY29wZS5FTUFJTCxcbiAgICAgICAgICBjb2duaXRvLk9BdXRoU2NvcGUuUFJPRklMRSxcbiAgICAgICAgXSxcbiAgICAgICAgY2FsbGJhY2tVcmxzOiBbYGh0dHBzOi8vJHtwcm9wcy56b25lTmFtZX0vb2F1dGgyL2NhbGxiYWNrYF0sXG4gICAgICAgIGxvZ291dFVybHM6IFtgaHR0cHM6Ly8ke3Byb3BzLnpvbmVOYW1lfWBdLFxuICAgICAgfSxcbiAgICAgIHN1cHBvcnRlZElkZW50aXR5UHJvdmlkZXJzOiBbY29nbml0by5Vc2VyUG9vbENsaWVudElkZW50aXR5UHJvdmlkZXIuQ09HTklUT10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvZ25pdG9Eb21haW4gPSB0aGlzLnVzZXJQb29sLmFkZERvbWFpbignQ29nbml0b0RvbWFpbicsIHtcbiAgICAgIGNvZ25pdG9Eb21haW46IHsgZG9tYWluUHJlZml4OiBwcm9wcy5jb2duaXRvRG9tYWluUHJlZml4IH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBhdXRoU2VjdXJpdHlUYWJsZSA9IG5ldyBBdXRoU2VjdXJpdHlUYWJsZSh0aGlzLCAnQXV0aFNlY3VyaXR5VGFibGUnLCB7XG4gICAgICB0YWJsZU5hbWU6IGBhdXRoLXNlY3VyaXR5LSR7cHJvcHMuem9uZU5hbWV9YCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3kgPz8gY29yZS5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvZ25pdG9SZWdpb24gPSBjb3JlLlN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBjb25zdCBjb2duaXRvRG9tYWluVXJsID0gYCR7cHJvcHMuY29nbml0b0RvbWFpblByZWZpeH0uYXV0aC4ke2NvZ25pdG9SZWdpb259LmFtYXpvbmNvZ25pdG8uY29tYDtcblxuICAgIGNvbnN0IHNlY3JldE1hbmFnZXIgPSBuZXcgQ29nbml0b0F1dGhTZWNyZXRNYW5hZ2VyKHRoaXMsICdTZWNyZXRNYW5hZ2VyJywge1xuICAgICAgZG9tYWluTmFtZTogcHJvcHMuem9uZU5hbWUsXG4gICAgICB0YWJsZU5hbWU6IGF1dGhTZWN1cml0eVRhYmxlLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIHRhYmxlUmVnaW9uOiBjb2duaXRvUmVnaW9uLFxuICAgICAgdXNlclBvb2xJZDogdGhpcy51c2VyUG9vbC51c2VyUG9vbElkLFxuICAgICAgY2xpZW50SWQ6IHRoaXMudXNlclBvb2xDbGllbnQudXNlclBvb2xDbGllbnRJZCxcbiAgICAgIGNvZ25pdG9Eb21haW46IGNvZ25pdG9Eb21haW5VcmwsXG4gICAgICBjb2duaXRvUmVnaW9uOiBjb2duaXRvUmVnaW9uLFxuICAgICAgc2VjdXJpdHlBbGVydHNUb3BpY0FybjogcHJvcHMuc2VjdXJpdHlBbGVydHNUb3BpY0FybixcbiAgICAgIGF1dG9SZXZva2VPblJldXNlOiBwcm9wcy5hdXRvUmV2b2tlT25SZXVzZSxcbiAgICAgIGp3dENsYWltc1doaXRlbGlzdDogcHJvcHMuand0Q2xhaW1zV2hpdGVsaXN0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXVkaXRMb2dSZXRlbnRpb25EYXlzID0gcHJvcHMuYXVkaXRMb2dSZXRlbnRpb25EYXlzID8/IDMwO1xuICAgIGNvbnN0IGF1ZGl0QXJjaGl2ZVJldGVudGlvbkRheXMgPSBwcm9wcy5hdWRpdEFyY2hpdmVSZXRlbnRpb25EYXlzID8/IDM2NTtcblxuICAgIGNvbnN0IGxhbWJkYUZ1bmN0aW9ucyA9IG5ldyBBdXRoTGFtYmRhRnVuY3Rpb25zKHRoaXMsICdMYW1iZGFGdW5jdGlvbnMnLCB7XG4gICAgICBjb25maWdTZWNyZXQ6IHNlY3JldE1hbmFnZXIuY29uZmlnU2VjcmV0LFxuICAgICAga21zS2V5OiBzZWNyZXRNYW5hZ2VyLmttc0tleSxcbiAgICAgIGt2czogc2VjcmV0TWFuYWdlci5rdnMsXG4gICAgICBhdXRoVGFibGU6IGF1dGhTZWN1cml0eVRhYmxlLnRhYmxlLFxuICAgICAgcm90YXRpb25TY2hlZHVsZTogcHJvcHMuaG1hY1NlY3JldFJvdGF0aW9uU2NoZWR1bGUsXG4gICAgICBzZXNzaW9uUmV2b2NhdGlvblRvcGljQXJuOiBwcm9wcy5zZXNzaW9uUmV2b2NhdGlvblRvcGljQXJuLFxuICAgICAgbG9nUmV0ZW50aW9uRGF5czogYXVkaXRMb2dSZXRlbnRpb25EYXlzLFxuICAgIH0pO1xuXG4gICAgbmV3IEF1ZGl0TG9nQXJjaGl2ZSh0aGlzLCAnQXVkaXRMb2dBcmNoaXZlJywge1xuICAgICAgbG9nR3JvdXBOYW1lczogbGFtYmRhRnVuY3Rpb25zLmxvZ0dyb3Vwcy5tYXAobGcgPT4gbGcubG9nR3JvdXBOYW1lKSxcbiAgICAgIGttc0tleTogc2VjcmV0TWFuYWdlci5rbXNLZXksXG4gICAgICByZXRlbnRpb25EYXlzOiBhdWRpdExvZ1JldGVudGlvbkRheXMsXG4gICAgICBhcmNoaXZlUmV0ZW50aW9uRGF5czogYXVkaXRBcmNoaXZlUmV0ZW50aW9uRGF5cyxcbiAgICAgIGJ1Y2tldE5hbWU6IGBhdXRoLWF1ZGl0LWxvZ3MtY29nbml0by0ke2NvcmUuU3RhY2sub2YodGhpcykuYWNjb3VudH0tJHtjb3JlLlN0YWNrLm9mKHRoaXMpLnJlZ2lvbn1gLFxuICAgICAgZGF0YWJhc2VOYW1lOiAnYXV0aF9hdWRpdF9sb2dzX2NvZ25pdG8nLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSA/PyBjb3JlLlJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJlZml4ID0gcHJvcHMuc3NtUGFyYW1QcmVmaXggPz8gYC9hdXRoLyR7cHJvcHMuem9uZU5hbWV9YDtcblxuICAgIG5ldyBTc21Dcm9zc1JlZ2lvbldyaXRlcih0aGlzLCAnU3NtV3JpdGVyJywge1xuICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGNvbmZpZ1NlY3JldEFybjogc2VjcmV0TWFuYWdlci5jb25maWdTZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgICBrbXNLZXlBcm46IHNlY3JldE1hbmFnZXIua21zS2V5LmtleUFybixcbiAgICAgICAgYXV0aFRhYmxlQXJuOiBhdXRoU2VjdXJpdHlUYWJsZS50YWJsZS50YWJsZUFybixcbiAgICAgICAga3ZzQXJuOiBzZWNyZXRNYW5hZ2VyLmt2cy5rZXlWYWx1ZVN0b3JlQXJuLFxuICAgICAgICBjb2duaXRvRG9tYWluOiBjb2duaXRvRG9tYWluVXJsLFxuICAgICAgICBjbGllbnRJZDogdGhpcy51c2VyUG9vbENsaWVudC51c2VyUG9vbENsaWVudElkLFxuICAgICAgICB1c2VyUG9vbElkOiB0aGlzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWdTZWNyZXRBcm4gPSBzZWNyZXRNYW5hZ2VyLmNvbmZpZ1NlY3JldC5zZWNyZXRBcm47XG4gICAgdGhpcy5rbXNLZXlBcm4gPSBzZWNyZXRNYW5hZ2VyLmttc0tleS5rZXlBcm47XG4gICAgdGhpcy5hdXRoVGFibGVBcm4gPSBhdXRoU2VjdXJpdHlUYWJsZS50YWJsZS50YWJsZUFybjtcbiAgICB0aGlzLmt2c0FybiA9IHNlY3JldE1hbmFnZXIua3ZzLmtleVZhbHVlU3RvcmVBcm47XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from './securedCloudFront';
2
+ export * from './cognito-secured-cloudfront';
3
+ export * from './authInfrastructure';
4
+ export * from './cognitoAuthInfrastructure';
@@ -0,0 +1,21 @@
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("./securedCloudFront"), exports);
18
+ __exportStar(require("./cognito-secured-cloudfront"), exports);
19
+ __exportStar(require("./authInfrastructure"), exports);
20
+ __exportStar(require("./cognitoAuthInfrastructure"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xvdWRmcm9udC9wYXR0ZXJucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQW9DO0FBQ3BDLCtEQUE2QztBQUM3Qyx1REFBcUM7QUFDckMsOERBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zZWN1cmVkQ2xvdWRGcm9udCc7XG5leHBvcnQgKiBmcm9tICcuL2NvZ25pdG8tc2VjdXJlZC1jbG91ZGZyb250JztcbmV4cG9ydCAqIGZyb20gJy4vYXV0aEluZnJhc3RydWN0dXJlJztcbmV4cG9ydCAqIGZyb20gJy4vY29nbml0b0F1dGhJbmZyYXN0cnVjdHVyZSc7XG4iXX0=