@alliander-opensource/aws-jwt-sts 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +201 -0
- package/README.md +130 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.js +451 -0
- package/dist/index.keyrotate.d.ts +1 -0
- package/dist/index.keyrotate.js +193 -0
- package/dist/index.sign.d.ts +2 -0
- package/dist/index.sign.js +120 -0
- package/dist/test/index.keyrotate.test.d.ts +1 -0
- package/dist/test/index.keyrotate.test.js +152 -0
- package/dist/test/index.sign.test.d.ts +1 -0
- package/dist/test/index.sign.test.js +146 -0
- package/dist/test/index.test.d.ts +1 -0
- package/dist/test/index.test.js +62 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +56 -0
- package/src/index.keyrotate.ts +228 -0
- package/src/index.sign.ts +145 -0
- package/src/index.ts +597 -0
- package/src/test/index.keyrotate.test.ts +168 -0
- package/src/test/index.sign.test.ts +187 -0
- package/src/test/index.test.ts +72 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// SPDX-FileCopyrightText: 2023 Alliander NV
|
|
3
|
+
//
|
|
4
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AwsJwtSts = exports.wafUsage = void 0;
|
|
7
|
+
/* eslint-disable no-unused-vars */
|
|
8
|
+
const cdk = require("aws-cdk-lib");
|
|
9
|
+
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
10
|
+
const sfn = require("aws-cdk-lib/aws-stepfunctions");
|
|
11
|
+
const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks");
|
|
12
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
13
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
14
|
+
const s3 = require("aws-cdk-lib/aws-s3");
|
|
15
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
16
|
+
const cloudfront = require("aws-cdk-lib/aws-cloudfront");
|
|
17
|
+
const cloudfrontOrigins = require("aws-cdk-lib/aws-cloudfront-origins");
|
|
18
|
+
const events = require("aws-cdk-lib/aws-events");
|
|
19
|
+
const targets = require("aws-cdk-lib/aws-events-targets");
|
|
20
|
+
const acm = require("aws-cdk-lib/aws-certificatemanager");
|
|
21
|
+
const route53 = require("aws-cdk-lib/aws-route53");
|
|
22
|
+
const route53targets = require("aws-cdk-lib/aws-route53-targets");
|
|
23
|
+
const apigateway = require("aws-cdk-lib/aws-apigateway");
|
|
24
|
+
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
|
|
25
|
+
const wafv2 = require("aws-cdk-lib/aws-wafv2");
|
|
26
|
+
const sns = require("aws-cdk-lib/aws-sns");
|
|
27
|
+
const logs = require("aws-cdk-lib/aws-logs");
|
|
28
|
+
const cloudwatch = require("aws-cdk-lib/aws-cloudwatch");
|
|
29
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
30
|
+
const lambdaNodejs = require("aws-cdk-lib/aws-lambda-nodejs");
|
|
31
|
+
const constructs_1 = require("constructs");
|
|
32
|
+
var wafUsage;
|
|
33
|
+
(function (wafUsage) {
|
|
34
|
+
wafUsage[wafUsage["ConstructProvided"] = 0] = "ConstructProvided";
|
|
35
|
+
wafUsage[wafUsage["ProvideWebAclArn"] = 1] = "ProvideWebAclArn";
|
|
36
|
+
})(wafUsage = exports.wafUsage || (exports.wafUsage = {}));
|
|
37
|
+
/* eslint-disable no-new */
|
|
38
|
+
class AwsJwtSts extends constructs_1.Construct {
|
|
39
|
+
constructor(app, id, props) {
|
|
40
|
+
super(app, id);
|
|
41
|
+
/** ---------------------- Custom domain thingies ----------------------- */
|
|
42
|
+
let distributionDomainNames = [];
|
|
43
|
+
let oidcCertificate;
|
|
44
|
+
let tokenCertificate;
|
|
45
|
+
let hostedZone;
|
|
46
|
+
const oidcSubdomain = props.oidcSubdomain ? props.oidcSubdomain : 'oidc';
|
|
47
|
+
const tokenSubdomain = props.tokenSubdomain ? props.tokenSubdomain : 'token';
|
|
48
|
+
const architecture = props.architecture ? props.architecture : lambda.Architecture.X86_64;
|
|
49
|
+
let oidcDomainName = '';
|
|
50
|
+
let tokenDomainName = '';
|
|
51
|
+
const useCustomDomain = props.hostedZoneId && props.hostedZoneName;
|
|
52
|
+
if (useCustomDomain) {
|
|
53
|
+
oidcDomainName = oidcSubdomain + '.' + props.hostedZoneName;
|
|
54
|
+
tokenDomainName = tokenSubdomain + '.' + props.hostedZoneName;
|
|
55
|
+
distributionDomainNames = [oidcDomainName];
|
|
56
|
+
hostedZone = route53.HostedZone.fromHostedZoneAttributes(this, 'hostedZone', {
|
|
57
|
+
zoneName: props.hostedZoneName,
|
|
58
|
+
hostedZoneId: props.hostedZoneId
|
|
59
|
+
});
|
|
60
|
+
oidcCertificate = new acm.DnsValidatedCertificate(this, 'CrossRegionCertificate', {
|
|
61
|
+
domainName: oidcDomainName,
|
|
62
|
+
hostedZone,
|
|
63
|
+
region: 'us-east-1'
|
|
64
|
+
});
|
|
65
|
+
tokenCertificate = new acm.Certificate(this, 'tokenCertificate', {
|
|
66
|
+
domainName: tokenDomainName,
|
|
67
|
+
validation: acm.CertificateValidation.fromDns(hostedZone)
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** ---------------------- S3 Definition ----------------------- */
|
|
71
|
+
// Create bucket where oidc information can be stored
|
|
72
|
+
const oidcbucket = new s3.Bucket(this, 'oidcbucket', {
|
|
73
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
74
|
+
autoDeleteObjects: true,
|
|
75
|
+
encryption: aws_s3_1.BucketEncryption.S3_MANAGED,
|
|
76
|
+
versioned: true,
|
|
77
|
+
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL
|
|
78
|
+
});
|
|
79
|
+
/** ------------------- Cloudfront Definition ------------------- */
|
|
80
|
+
const cloudfrontOAI = new cloudfront.OriginAccessIdentity(this, 'cloudfront-OAI', {
|
|
81
|
+
comment: 'OAI for oidc'
|
|
82
|
+
});
|
|
83
|
+
const distribution = new cloudfront.Distribution(this, 'oidcDistribution', {
|
|
84
|
+
domainNames: distributionDomainNames,
|
|
85
|
+
comment: 'Discovery endpoint for OIDC',
|
|
86
|
+
certificate: oidcCertificate,
|
|
87
|
+
defaultBehavior: {
|
|
88
|
+
origin: new cloudfrontOrigins.S3Origin(oidcbucket, { originAccessIdentity: cloudfrontOAI }),
|
|
89
|
+
compress: true,
|
|
90
|
+
allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
|
|
91
|
+
viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
/** ------------------ Lambda Handlers Definition ------------------ */
|
|
95
|
+
const issuer = useCustomDomain ? 'https://' + oidcDomainName : 'https://' + distribution.distributionDomainName;
|
|
96
|
+
const rotateKeysRole = new iam.Role(this, 'rotateKeysRole', {
|
|
97
|
+
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
|
|
98
|
+
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')]
|
|
99
|
+
});
|
|
100
|
+
const rotateKeys = new lambdaNodejs.NodejsFunction(this, 'keyrotate', {
|
|
101
|
+
timeout: cdk.Duration.seconds(5),
|
|
102
|
+
runtime: lambda.Runtime.NODEJS_18_X,
|
|
103
|
+
role: rotateKeysRole,
|
|
104
|
+
architecture,
|
|
105
|
+
environment: {
|
|
106
|
+
S3_BUCKET: oidcbucket.bucketName,
|
|
107
|
+
ISSUER: issuer
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
const signRole = new iam.Role(this, 'signRole', {
|
|
111
|
+
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
|
|
112
|
+
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')]
|
|
113
|
+
});
|
|
114
|
+
const sign = new lambdaNodejs.NodejsFunction(this, 'sign', {
|
|
115
|
+
timeout: cdk.Duration.seconds(5),
|
|
116
|
+
runtime: lambda.Runtime.NODEJS_18_X,
|
|
117
|
+
role: signRole,
|
|
118
|
+
architecture,
|
|
119
|
+
environment: {
|
|
120
|
+
ISSUER: issuer,
|
|
121
|
+
DEFAULT_AUDIENCE: props.defaultAudience
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
/** ------------------------ SNS Topic ------------------------- */
|
|
125
|
+
this.failedRotationTopic = new sns.Topic(this, 'sts');
|
|
126
|
+
const snsFail = new tasks.SnsPublish(this, 'snsFailed', {
|
|
127
|
+
topic: this.failedRotationTopic,
|
|
128
|
+
subject: 'STS KeyRotate step function execution failed',
|
|
129
|
+
message: sfn.TaskInput.fromJsonPathAt('$')
|
|
130
|
+
});
|
|
131
|
+
/** ------------------ Step functions Definition ------------------ */
|
|
132
|
+
const deletePreviousStep = new tasks.LambdaInvoke(this, 'delete Previous', {
|
|
133
|
+
lambdaFunction: rotateKeys,
|
|
134
|
+
payload: sfn.TaskInput.fromObject({
|
|
135
|
+
step: 'deletePrevious'
|
|
136
|
+
}),
|
|
137
|
+
outputPath: '$.Payload'
|
|
138
|
+
});
|
|
139
|
+
const movePreviousStep = new tasks.LambdaInvoke(this, 'move Previous', {
|
|
140
|
+
lambdaFunction: rotateKeys,
|
|
141
|
+
payload: sfn.TaskInput.fromObject({
|
|
142
|
+
step: 'movePrevious'
|
|
143
|
+
}),
|
|
144
|
+
outputPath: '$.Payload'
|
|
145
|
+
});
|
|
146
|
+
const moveCurrentStep = new tasks.LambdaInvoke(this, 'move Current', {
|
|
147
|
+
lambdaFunction: rotateKeys,
|
|
148
|
+
payload: sfn.TaskInput.fromObject({
|
|
149
|
+
step: 'moveCurrent'
|
|
150
|
+
}),
|
|
151
|
+
outputPath: '$.Payload'
|
|
152
|
+
});
|
|
153
|
+
const createPendingStep = new tasks.LambdaInvoke(this, 'create Pending', {
|
|
154
|
+
lambdaFunction: rotateKeys,
|
|
155
|
+
payload: sfn.TaskInput.fromObject({
|
|
156
|
+
step: 'createPending'
|
|
157
|
+
}),
|
|
158
|
+
outputPath: '$.Payload'
|
|
159
|
+
});
|
|
160
|
+
const generateArtifactsStep = new tasks.LambdaInvoke(this, 'generate artifacts', {
|
|
161
|
+
lambdaFunction: rotateKeys,
|
|
162
|
+
payload: sfn.TaskInput.fromObject({
|
|
163
|
+
step: 'generateArtifacts'
|
|
164
|
+
}),
|
|
165
|
+
outputPath: '$.Payload'
|
|
166
|
+
});
|
|
167
|
+
const jobFailed = new sfn.Fail(this, 'Failed', {
|
|
168
|
+
cause: 'AWS Batch Job Failed',
|
|
169
|
+
error: 'DescribeJob returned FAILED'
|
|
170
|
+
});
|
|
171
|
+
const jobSuccess = new sfn.Succeed(this, 'Success!');
|
|
172
|
+
deletePreviousStep.addCatch(snsFail);
|
|
173
|
+
movePreviousStep.addCatch(snsFail);
|
|
174
|
+
moveCurrentStep.addCatch(snsFail);
|
|
175
|
+
createPendingStep.addCatch(snsFail);
|
|
176
|
+
generateArtifactsStep.addCatch(snsFail);
|
|
177
|
+
// Create chain
|
|
178
|
+
const definition = deletePreviousStep
|
|
179
|
+
.next(movePreviousStep)
|
|
180
|
+
.next(moveCurrentStep)
|
|
181
|
+
.next(createPendingStep)
|
|
182
|
+
.next(generateArtifactsStep)
|
|
183
|
+
.next(jobSuccess);
|
|
184
|
+
snsFail.next(jobFailed);
|
|
185
|
+
// Create state machine
|
|
186
|
+
const rotateKeysMachine = new sfn.StateMachine(this, 'RotateKeys', {
|
|
187
|
+
definition,
|
|
188
|
+
timeout: cdk.Duration.minutes(5)
|
|
189
|
+
});
|
|
190
|
+
rotateKeys.grantInvoke(rotateKeysMachine.role);
|
|
191
|
+
oidcbucket.grantReadWrite(rotateKeys);
|
|
192
|
+
const statementSign = new iam.PolicyStatement();
|
|
193
|
+
statementSign.addActions('kms:*');
|
|
194
|
+
statementSign.addResources('*');
|
|
195
|
+
const signPolicy = new iam.ManagedPolicy(this, 'SignPolicy', {
|
|
196
|
+
statements: [statementSign]
|
|
197
|
+
});
|
|
198
|
+
signRole.addManagedPolicy(signPolicy);
|
|
199
|
+
const statementRotateKeys = new iam.PolicyStatement();
|
|
200
|
+
statementRotateKeys.addActions('kms:*');
|
|
201
|
+
statementRotateKeys.addResources('*');
|
|
202
|
+
const rotateKeysPolicy = new iam.ManagedPolicy(this, 'RotateKeysPolicy', {
|
|
203
|
+
statements: [statementRotateKeys]
|
|
204
|
+
});
|
|
205
|
+
rotateKeysRole.addManagedPolicy(rotateKeysPolicy);
|
|
206
|
+
/** ------------------ Events Rule Definition ------------------ */
|
|
207
|
+
// Run every 3 months at 8 PM UTC
|
|
208
|
+
const scheduledRotateRule = new events.Rule(this, 'scheduledRotateRule', {
|
|
209
|
+
schedule: events.Schedule.expression('cron(0 20 1 */3 ? *)')
|
|
210
|
+
});
|
|
211
|
+
scheduledRotateRule.addTarget(new targets.SfnStateMachine(rotateKeysMachine));
|
|
212
|
+
// Create state machine and trigger to populate initial keys
|
|
213
|
+
if (!props.disableKeyRotateOnCreate) {
|
|
214
|
+
const rotateOnce = new tasks.StepFunctionsStartExecution(this, 'rotateOnce', {
|
|
215
|
+
stateMachine: rotateKeysMachine,
|
|
216
|
+
integrationPattern: sfn.IntegrationPattern.RUN_JOB
|
|
217
|
+
});
|
|
218
|
+
const rotateTwice = new tasks.StepFunctionsStartExecution(this, 'rotateTwice', {
|
|
219
|
+
stateMachine: rotateKeysMachine,
|
|
220
|
+
integrationPattern: sfn.IntegrationPattern.RUN_JOB
|
|
221
|
+
});
|
|
222
|
+
const populateKeys = new sfn.StateMachine(this, 'populateKeys', {
|
|
223
|
+
definition: rotateOnce.next(rotateTwice),
|
|
224
|
+
timeout: cdk.Duration.minutes(10)
|
|
225
|
+
});
|
|
226
|
+
const initialRunRule = new events.Rule(this, 'initialRunRule', {
|
|
227
|
+
eventPattern: {
|
|
228
|
+
source: ['aws.cloudformation'],
|
|
229
|
+
resources: [cdk.Stack.of(this).stackId],
|
|
230
|
+
detailType: ['CloudFormation Stack Status Change'],
|
|
231
|
+
detail: {
|
|
232
|
+
'status-details': {
|
|
233
|
+
status: ['CREATE_COMPLETE']
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
initialRunRule.addTarget(new targets.SfnStateMachine(populateKeys));
|
|
239
|
+
}
|
|
240
|
+
/** ---------------------- API Gateway ----------------------- */
|
|
241
|
+
// only set policy when orgId is set
|
|
242
|
+
let apiPolicy;
|
|
243
|
+
if (props.orgId) {
|
|
244
|
+
apiPolicy = new iam.PolicyDocument({
|
|
245
|
+
statements: [
|
|
246
|
+
new iam.PolicyStatement({
|
|
247
|
+
actions: ['execute-api:Invoke'],
|
|
248
|
+
resources: ['*'],
|
|
249
|
+
principals: [
|
|
250
|
+
new aws_iam_1.OrganizationPrincipal(props.orgId)
|
|
251
|
+
]
|
|
252
|
+
})
|
|
253
|
+
]
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
const logGroup = new logs.LogGroup(this, 'APIGatewayAccessLogs', {
|
|
257
|
+
retention: 7
|
|
258
|
+
});
|
|
259
|
+
// Create API
|
|
260
|
+
const api = new apigateway.LambdaRestApi(this, 'jwk-sts-api', {
|
|
261
|
+
description: 'STS Token API Gateway',
|
|
262
|
+
handler: sign,
|
|
263
|
+
defaultMethodOptions: {
|
|
264
|
+
authorizationType: apigateway.AuthorizationType.IAM
|
|
265
|
+
},
|
|
266
|
+
endpointConfiguration: {
|
|
267
|
+
types: [apigateway.EndpointType.REGIONAL]
|
|
268
|
+
},
|
|
269
|
+
policy: apiPolicy,
|
|
270
|
+
deployOptions: {
|
|
271
|
+
loggingLevel: aws_apigateway_1.MethodLoggingLevel.INFO,
|
|
272
|
+
accessLogDestination: new apigateway.LogGroupLogDestination(logGroup)
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
/** ------------------- Route53 Definition for custom domain ------------------- */
|
|
276
|
+
if (useCustomDomain && hostedZone) {
|
|
277
|
+
api.addDomainName('apiCustomDomainName', {
|
|
278
|
+
domainName: tokenDomainName,
|
|
279
|
+
certificate: tokenCertificate
|
|
280
|
+
});
|
|
281
|
+
// Add A record for cloudfront distribution
|
|
282
|
+
new route53.ARecord(this, 'oidcRecord', {
|
|
283
|
+
recordName: oidcDomainName,
|
|
284
|
+
zone: hostedZone,
|
|
285
|
+
target: route53.RecordTarget.fromAlias(new route53targets.CloudFrontTarget(distribution))
|
|
286
|
+
});
|
|
287
|
+
new route53.ARecord(this, 'tokenRecord', {
|
|
288
|
+
recordName: tokenDomainName,
|
|
289
|
+
zone: hostedZone,
|
|
290
|
+
target: route53.RecordTarget.fromAlias(new route53targets.ApiGateway(api))
|
|
291
|
+
});
|
|
292
|
+
new cdk.CfnOutput(this, 'tokenEndpoint', {
|
|
293
|
+
value: 'https://' + tokenDomainName + '/token',
|
|
294
|
+
description: 'Url of the token endpoint',
|
|
295
|
+
exportName: 'tokenEndpoint'
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
new cdk.CfnOutput(this, 'tokenEndpoint', {
|
|
300
|
+
value: api.url + 'token',
|
|
301
|
+
description: 'Url of the token endpoint',
|
|
302
|
+
exportName: 'tokenEndpoint'
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
new cdk.CfnOutput(this, 'issuer', {
|
|
306
|
+
value: issuer,
|
|
307
|
+
description: 'Url of the issuer',
|
|
308
|
+
exportName: 'issuer'
|
|
309
|
+
});
|
|
310
|
+
/** ---------------------- WAF ----------------------- */
|
|
311
|
+
if (props.apiGwWaf === wafUsage.ConstructProvided) {
|
|
312
|
+
// API gateway WAF ACL and rules
|
|
313
|
+
const APIGatewayWebACL = new wafv2.CfnWebACL(this, 'APIGatewayWebACL', {
|
|
314
|
+
description: 'This is WebACL for Auth APi Gateway',
|
|
315
|
+
scope: 'REGIONAL',
|
|
316
|
+
defaultAction: { allow: {} },
|
|
317
|
+
visibilityConfig: {
|
|
318
|
+
metricName: 'APIWebACL',
|
|
319
|
+
cloudWatchMetricsEnabled: true,
|
|
320
|
+
sampledRequestsEnabled: true
|
|
321
|
+
},
|
|
322
|
+
rules: [
|
|
323
|
+
{
|
|
324
|
+
name: 'AWS-AWSManagedRulesCommonRuleSet',
|
|
325
|
+
priority: 0,
|
|
326
|
+
statement: {
|
|
327
|
+
managedRuleGroupStatement: {
|
|
328
|
+
vendorName: 'AWS',
|
|
329
|
+
name: 'AWSManagedRulesCommonRuleSet'
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
overrideAction: {
|
|
333
|
+
none: {}
|
|
334
|
+
},
|
|
335
|
+
visibilityConfig: {
|
|
336
|
+
sampledRequestsEnabled: true,
|
|
337
|
+
cloudWatchMetricsEnabled: true,
|
|
338
|
+
metricName: 'AWS-AWSManagedRulesCommonRuleSet'
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
name: 'AWS-AWSManagedRulesAmazonIpReputationList',
|
|
343
|
+
priority: 1,
|
|
344
|
+
statement: {
|
|
345
|
+
managedRuleGroupStatement: {
|
|
346
|
+
vendorName: 'AWS',
|
|
347
|
+
name: 'AWSManagedRulesAmazonIpReputationList'
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
overrideAction: {
|
|
351
|
+
none: {}
|
|
352
|
+
},
|
|
353
|
+
visibilityConfig: {
|
|
354
|
+
sampledRequestsEnabled: true,
|
|
355
|
+
cloudWatchMetricsEnabled: true,
|
|
356
|
+
metricName: 'AWS-AWSManagedRulesAmazonIpReputationList'
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
name: 'api-gw-AuthAPIGeoLocation',
|
|
361
|
+
priority: 3,
|
|
362
|
+
action: { block: {} },
|
|
363
|
+
visibilityConfig: {
|
|
364
|
+
metricName: 'AuthAPIGeoLocation',
|
|
365
|
+
cloudWatchMetricsEnabled: true,
|
|
366
|
+
sampledRequestsEnabled: false
|
|
367
|
+
},
|
|
368
|
+
statement: {
|
|
369
|
+
geoMatchStatement: {
|
|
370
|
+
countryCodes: ['BY', 'CN', 'IR', 'RU', 'SY', 'KP']
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
name: 'api-gw-rateLimitRule',
|
|
376
|
+
priority: 4,
|
|
377
|
+
action: { block: {} },
|
|
378
|
+
visibilityConfig: {
|
|
379
|
+
metricName: 'rateLimitRule',
|
|
380
|
+
cloudWatchMetricsEnabled: true,
|
|
381
|
+
sampledRequestsEnabled: false
|
|
382
|
+
},
|
|
383
|
+
statement: {
|
|
384
|
+
rateBasedStatement: {
|
|
385
|
+
aggregateKeyType: 'IP',
|
|
386
|
+
limit: 100
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
]
|
|
391
|
+
});
|
|
392
|
+
// Web ACL Association
|
|
393
|
+
new wafv2.CfnWebACLAssociation(this, 'APIGatewayWebACLAssociation', {
|
|
394
|
+
webAclArn: APIGatewayWebACL.attrArn,
|
|
395
|
+
resourceArn: api.deploymentStage.stageArn
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
else if (props.apiGwWaf === wafUsage.ProvideWebAclArn && props.apiGwWafWebAclArn) {
|
|
399
|
+
// Web ACL Association
|
|
400
|
+
new wafv2.CfnWebACLAssociation(this, 'APIGatewayWebACLAssociation', {
|
|
401
|
+
webAclArn: props.apiGwWafWebAclArn,
|
|
402
|
+
resourceArn: api.deploymentStage.stageArn
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
/** ---------------------- Cloudwatch ----------------------- */
|
|
406
|
+
new cloudwatch.Alarm(this, 'StepFunctionError', {
|
|
407
|
+
alarmName: props.alarmNameKeyRotationStepFunctionFailed ?? 'sts-key_rotate_sfn-alarm',
|
|
408
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
409
|
+
threshold: 1,
|
|
410
|
+
evaluationPeriods: 1,
|
|
411
|
+
metric: rotateKeysMachine.metricFailed(),
|
|
412
|
+
alarmDescription: 'Key Rotation Failed',
|
|
413
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING
|
|
414
|
+
});
|
|
415
|
+
new cloudwatch.Alarm(this, 'ApiGateway5XXAlarm', {
|
|
416
|
+
alarmName: props.alarmNameApiGateway5xx ?? 'sts-5xx_api_gw-alarm',
|
|
417
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
418
|
+
threshold: 1,
|
|
419
|
+
evaluationPeriods: 1,
|
|
420
|
+
metric: api.metricServerError(),
|
|
421
|
+
alarmDescription: '5xx STS API gateway failures',
|
|
422
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING
|
|
423
|
+
});
|
|
424
|
+
const signErrors = sign.metricErrors({
|
|
425
|
+
period: cdk.Duration.minutes(1)
|
|
426
|
+
});
|
|
427
|
+
const rotateErrors = rotateKeys.metricErrors({
|
|
428
|
+
period: cdk.Duration.minutes(1)
|
|
429
|
+
});
|
|
430
|
+
new cloudwatch.Alarm(this, 'LambdaSignError', {
|
|
431
|
+
alarmName: props.alarmNameSignLambdaFailed ?? 'sts-sign_errors_lambda-alarm',
|
|
432
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
433
|
+
threshold: 1,
|
|
434
|
+
evaluationPeriods: 1,
|
|
435
|
+
metric: signErrors,
|
|
436
|
+
alarmDescription: 'Sign Lambda Failed',
|
|
437
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING
|
|
438
|
+
});
|
|
439
|
+
new cloudwatch.Alarm(this, 'LambdaRotateError', {
|
|
440
|
+
alarmName: props.alarmNameKeyRotationLambdaFailed ?? 'sts-key_rotate_errors_lambda-alarm',
|
|
441
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
|
|
442
|
+
threshold: 1,
|
|
443
|
+
evaluationPeriods: 1,
|
|
444
|
+
metric: rotateErrors,
|
|
445
|
+
alarmDescription: 'Key Rotation Lambda Failed',
|
|
446
|
+
treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
exports.AwsJwtSts = AwsJwtSts;
|
|
451
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDRDQUE0QztBQUM1QyxFQUFFO0FBQ0Ysc0NBQXNDOzs7QUFFdEMsbUNBQW1DO0FBQ25DLG1DQUFrQztBQUNsQyxpREFBZ0Q7QUFDaEQscURBQW9EO0FBQ3BELDZEQUE0RDtBQUM1RCwyQ0FBMEM7QUFDMUMsaURBQTJFO0FBQzNFLHlDQUF3QztBQUN4QywrQ0FBcUQ7QUFDckQseURBQXdEO0FBQ3hELHdFQUF1RTtBQUN2RSxpREFBZ0Q7QUFDaEQsMERBQXlEO0FBQ3pELDBEQUF5RDtBQUN6RCxtREFBa0Q7QUFDbEQsa0VBQWlFO0FBQ2pFLHlEQUF3RDtBQUN4RCwrREFBK0Q7QUFDL0QsK0NBQThDO0FBQzlDLDJDQUEwQztBQUMxQyw2Q0FBNEM7QUFDNUMseURBQXdEO0FBQ3hELCtEQUE2RDtBQUM3RCw4REFBNkQ7QUFDN0QsMkNBQXNDO0FBSXRDLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNsQixpRUFBaUIsQ0FBQTtJQUNqQiwrREFBZ0IsQ0FBQTtBQUNsQixDQUFDLEVBSFcsUUFBUSxHQUFSLGdCQUFRLEtBQVIsZ0JBQVEsUUFHbkI7QUFnRkQsMkJBQTJCO0FBQzNCLE1BQWEsU0FBVSxTQUFRLHNCQUFTO0lBTXRDLFlBQWEsR0FBYyxFQUFFLEVBQVUsRUFBRSxLQUFxQjtRQUM1RCxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWQsNEVBQTRFO1FBRTVFLElBQUksdUJBQXVCLEdBQWEsRUFBRSxDQUFBO1FBQzFDLElBQUksZUFBeUMsQ0FBQTtRQUM3QyxJQUFJLGdCQUEwQyxDQUFBO1FBQzlDLElBQUksVUFBbUMsQ0FBQTtRQUN2QyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7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Q0FBQyxhQUFhO1NBQ2pELENBQUMsQ0FBQTtRQUVGLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDOUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxnQ0FBZ0MsSUFBSSxvQ0FBb0M7WUFDekYsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQjtZQUN4RSxTQUFTLEVBQUUsQ0FBQztZQUNaLGlCQUFpQixFQUFFLENBQUM7WUFDcEIsTUFBTSxFQUFFLFlBQVk7WUFDcEIsZ0JBQWdCLEVBQUUsNEJBQTRCO1lBQzlDLGdCQUFnQixFQUFFLGlDQUFnQixDQUFDLGFBQWE7U0FDakQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBaGVELDhCQWdlQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IDIwMjMgQWxsaWFuZGVyIE5WXG4vL1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYidcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJ1xuaW1wb3J0ICogYXMgc2ZuIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zJ1xuaW1wb3J0ICogYXMgdGFza3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSdcbmltcG9ydCB7IE9yZ2FuaXphdGlvblByaW5jaXBhbCwgUG9saWN5RG9jdW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJ1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJ1xuaW1wb3J0IHsgQnVja2V0RW5jcnlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMydcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnXG5pbXBvcnQgKiBhcyBjbG91ZGZyb250T3JpZ2lucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJ1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnXG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cydcbmltcG9ydCAqIGFzIGFjbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJ1xuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1MydcbmltcG9ydCAqIGFzIHJvdXRlNTN0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnXG5pbXBvcnQgKiBhcyBhcGlnYXRld2F5IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5J1xuaW1wb3J0IHsgTWV0aG9kTG9nZ2luZ0xldmVsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknXG5pbXBvcnQgKiBhcyB3YWZ2MiBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtd2FmdjInXG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucydcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnXG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJ1xuaW1wb3J0IHsgVHJlYXRNaXNzaW5nRGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJ1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZWpzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzJ1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cydcbmltcG9ydCB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInXG5pbXBvcnQgeyBJSG9zdGVkWm9uZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzJ1xuXG5leHBvcnQgZW51bSB3YWZVc2FnZSB7XG4gIENvbnN0cnVjdFByb3ZpZGVkLFxuICBQcm92aWRlV2ViQWNsQXJuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzSnd0U3RzUHJvcHMge1xuICAvKipcbiAgICogZGVmYXVsdEF1ZGllbmNlIHdoaWNoIGlzIHVzZWQgaW4gZGUgSldUJ3NcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRBdWRpZW5jZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3N0ZWRab25lSWQgb2YgdGhlIGRvbWFpbiB1c2VkIGZvciBob3N0aW5nIHRoZSBzdHMgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZD86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgaG9zdGVkWm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAqIE9wdGlvbmFsIHN1YmRvbWFpbiBuYW1lIG9mIG9pZGMgZGlzY292ZXJ5LCBkZWZhdWx0OiBvaWRjLlxuICAqL1xuICByZWFkb25seSBvaWRjU3ViZG9tYWluPzogc3RyaW5nO1xuXG4gIC8qKlxuICAqIE9wdGlvbmFsIHN1YmRvbWFpbiBuYW1lIG9mIHRoZSB0b2tlbiBhcGkgKG9uIGFwaSBndyksIGRlZmF1bHQ6IHRva2VuLlxuICAqL1xuICByZWFkb25seSB0b2tlblN1YmRvbWFpbj86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgd2FmIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBBUEkgR1dcbiAgICpcbiAgICogTm9uZTogbm8gd2FmIGlzIHVzZWRcbiAgICogQ29uc3RydWN0UHJvdmlkZWQ6IHRoZSBjb25zdHJ1Y3Qgd2lsbCBkZXBsb3kgYSB3YWZBY2wgd2l0aCBvcGluaW9uYXRlZCBydWxlc1xuICAgKiBQcm92aWRlV2ViQWNsQXJuOiBwcm92aWRlIHlvdXIgb3duIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgYXBpR3dXYWY/OiB3YWZVc2FnZTtcblxuICAvKipcbiAgICogQXJuIG9mIHRoZSB3YWYgd2ViQWNsIHJ1bGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBBUEkgR1dcbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IGFwaUd3V2FmV2ViQWNsQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIEFXUyBPcmdhbml6YXRpb24gMC14eHh4XG4gICAqXG4gICAqL1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQ1BVIEFyY2hpdGVjdHVyZVxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogbGFtYmRhLkFyY2hpdGVjdHVyZVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBib29sZWFuIHRvIHNwZWNpZnkgaWYga2V5IHJvdGF0aW9uIHNob3VsZCBiZSB0cmlnZ2VyZWQgb24gY3JlYXRpb24gb2YgdGhlIHN0YWNrLCBkZWZhdWx0OiBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZUtleVJvdGF0ZU9uQ3JlYXRlPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gbmFtZSBmb3IgdGhlIENsb3VkV2F0Y2ggQWxhcm0gbW9uaXRvcmluZyBTdGVwIEZ1bmN0aW9uIGZhaWx1cmVzLCBkZWZhdWx0OiBzdHMta2V5X3JvdGF0ZV9zZm4tYWxhcm1cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtTmFtZUtleVJvdGF0aW9uU3RlcEZ1bmN0aW9uRmFpbGVkPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGN1c3RvbSBuYW1lIGZvciB0aGUgQ2xvdWRXYXRjaCBBbGFybSBtb25pdG9yaW5nIDV4eCBlcnJvcnMgb24gdGhlIEFQSSBHYXRld2F5LCBkZWZhdWx0OiBzdHMtNXh4X2FwaV9ndy1hbGFybVxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lQXBpR2F0ZXdheTV4eD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gbmFtZSBmb3IgdGhlIENsb3VkV2F0Y2ggQWxhcm0gbW9uaXRvcmluZyBTaWduIExhbWJkYSBmYWlsdXJlcywgZGVmYXVsdDogc3RzLXNpZ25fZXJyb3JzX2xhbWJkYS1hbGFybVxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lU2lnbkxhbWJkYUZhaWxlZD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gbmFtZSBmb3IgdGhlIENsb3VkV2F0Y2ggQWxhcm0gbW9uaXRvcmluZyBLZXkgUm90YXRpb24gTGFtYmRhIGZhaWx1cmVzLCBkZWZhdWx0OiBzdHMta2V5X3JvdGF0ZV9lcnJvcnNfbGFtYmRhLWFsYXJtXG4gICAqL1xuICByZWFkb25seSBhbGFybU5hbWVLZXlSb3RhdGlvbkxhbWJkYUZhaWxlZD86IHN0cmluZ1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi9cbmV4cG9ydCBjbGFzcyBBd3NKd3RTdHMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogU05TIHRvcGljIHVzZWQgdG8gcHVibGlzaCBlcnJvcnMgZnJvbSB0aGUgU3RlcCBGdW5jdGlvbiByb3RhdGlvbiBmbG93XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZmFpbGVkUm90YXRpb25Ub3BpYzogc25zLlRvcGljXG5cbiAgY29uc3RydWN0b3IgKGFwcDogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzSnd0U3RzUHJvcHMpIHtcbiAgICBzdXBlcihhcHAsIGlkKVxuXG4gICAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ3VzdG9tIGRvbWFpbiB0aGluZ2llcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgbGV0IGRpc3RyaWJ1dGlvbkRvbWFpbk5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gICAgbGV0IG9pZGNDZXJ0aWZpY2F0ZTogSUNlcnRpZmljYXRlIHwgdW5kZWZpbmVkXG4gICAgbGV0IHRva2VuQ2VydGlmaWNhdGU6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZFxuICAgIGxldCBob3N0ZWRab25lOiBJSG9zdGVkWm9uZSB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IG9pZGNTdWJkb21haW4gPSBwcm9wcy5vaWRjU3ViZG9tYWluID8gcHJvcHMub2lkY1N1YmRvbWFpbiA6ICdvaWRjJ1xuICAgIGNvbnN0IHRva2VuU3ViZG9tYWluID0gcHJvcHMudG9rZW5TdWJkb21haW4gPyBwcm9wcy50b2tlblN1YmRvbWFpbiA6ICd0b2tlbidcbiAgICBjb25zdCBhcmNoaXRlY3R1cmUgPSBwcm9wcy5hcmNoaXRlY3R1cmUgPyBwcm9wcy5hcmNoaXRlY3R1cmUgOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgIGxldCBvaWRjRG9tYWluTmFtZSA9ICcnXG4gICAgbGV0IHRva2VuRG9tYWluTmFtZSA9ICcnXG5cbiAgICBjb25zdCB1c2VDdXN0b21Eb21haW4gPSBwcm9wcy5ob3N0ZWRab25lSWQgJiYgcHJvcHMuaG9zdGVkWm9uZU5hbWVcblxuICAgIGlmICh1c2VDdXN0b21Eb21haW4pIHtcbiAgICAgIG9pZGNEb21haW5OYW1lID0gb2lkY1N1YmRvbWFpbiArICcuJyArIHByb3BzLmhvc3RlZFpvbmVOYW1lXG4gICAgICB0b2tlbkRvbWFpbk5hbWUgPSB0b2tlblN1YmRvbWFpbiArICcuJyArIHByb3BzLmhvc3RlZFpvbmVOYW1lXG5cbiAgICAgIGRpc3RyaWJ1dGlvbkRvbWFpbk5hbWVzID0gW29pZGNEb21haW5OYW1lXVxuXG4gICAgICBob3N0ZWRab25lID0gcm91dGU1My5Ib3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgJ2hvc3RlZFpvbmUnLFxuICAgICAgICB7XG4gICAgICAgICAgem9uZU5hbWU6IHByb3BzLmhvc3RlZFpvbmVOYW1lISxcbiAgICAgICAgICBob3N0ZWRab25lSWQ6IHByb3BzLmhvc3RlZFpvbmVJZCFcbiAgICAgICAgfVxuICAgICAgKVxuXG4gICAgICBvaWRjQ2VydGlmaWNhdGUgPSBuZXcgYWNtLkRuc1ZhbGlkYXRlZENlcnRpZmljYXRlKHRoaXMsICdDcm9zc1JlZ2lvbkNlcnRpZmljYXRlJywge1xuICAgICAgICBkb21haW5OYW1lOiBvaWRjRG9tYWluTmFtZSxcbiAgICAgICAgaG9zdGVkWm9uZSxcbiAgICAgICAgcmVnaW9uOiAndXMtZWFzdC0xJ1xuICAgICAgfSlcblxuICAgICAgdG9rZW5DZXJ0aWZpY2F0ZSA9IG5ldyBhY20uQ2VydGlmaWNhdGUodGhpcywgJ3Rva2VuQ2VydGlmaWNhdGUnLCB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRva2VuRG9tYWluTmFtZSxcbiAgICAgICAgdmFsaWRhdGlvbjogYWNtLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKGhvc3RlZFpvbmUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFMzIERlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIC8vIENyZWF0ZSBidWNrZXQgd2hlcmUgb2lkYyBpbmZvcm1hdGlvbiBjYW4gYmUgc3RvcmVkXG4gICAgY29uc3Qgb2lkY2J1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ29pZGNidWNrZXQnLCB7XG4gICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICB2ZXJzaW9uZWQ6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMXG4gICAgfSlcblxuICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tIENsb3VkZnJvbnQgRGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBjb25zdCBjbG91ZGZyb250T0FJID0gbmV3IGNsb3VkZnJvbnQuT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgJ2Nsb3VkZnJvbnQtT0FJJywge1xuICAgICAgY29tbWVudDogJ09BSSBmb3Igb2lkYydcbiAgICB9KVxuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IGNsb3VkZnJvbnQuRGlzdHJpYnV0aW9uKHRoaXMsICdvaWRjRGlzdHJpYnV0aW9uJywge1xuICAgICAgZG9tYWluTmFtZXM6IGRpc3RyaWJ1dGlvbkRvbWFpbk5hbWVzLFxuICAgICAgY29tbWVudDogJ0Rpc2NvdmVyeSBlbmRwb2ludCBmb3IgT0lEQycsXG4gICAgICBjZXJ0aWZpY2F0ZTogb2lkY0NlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogbmV3IGNsb3VkZnJvbnRPcmlnaW5zLlMzT3JpZ2luKG9pZGNidWNrZXQsIHsgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IGNsb3VkZnJvbnRPQUkgfSksXG4gICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICBhbGxvd2VkTWV0aG9kczogY2xvdWRmcm9udC5BbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2xvdWRmcm9udC5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQU1xuICAgICAgfVxuICAgIH0pXG5cbiAgICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tIExhbWJkYSBIYW5kbGVycyBEZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgaXNzdWVyID0gdXNlQ3VzdG9tRG9tYWluID8gJ2h0dHBzOi8vJyArIG9pZGNEb21haW5OYW1lIDogJ2h0dHBzOi8vJyArIGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lXG5cbiAgICBjb25zdCByb3RhdGVLZXlzUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAncm90YXRlS2V5c1JvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpXVxuICAgIH0pXG4gICAgY29uc3Qgcm90YXRlS2V5cyA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ2tleXJvdGF0ZScsIHtcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICByb2xlOiByb3RhdGVLZXlzUm9sZSxcbiAgICAgIGFyY2hpdGVjdHVyZSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFMzX0JVQ0tFVDogb2lkY2J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICBJU1NVRVI6IGlzc3VlclxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBzaWduUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnc2lnblJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpXVxuICAgIH0pXG4gICAgY29uc3Qgc2lnbiA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ3NpZ24nLCB7XG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgcm9sZTogc2lnblJvbGUsXG4gICAgICBhcmNoaXRlY3R1cmUsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBJU1NVRVI6IGlzc3VlcixcbiAgICAgICAgREVGQVVMVF9BVURJRU5DRTogcHJvcHMuZGVmYXVsdEF1ZGllbmNlXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU05TIFRvcGljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIHRoaXMuZmFpbGVkUm90YXRpb25Ub3BpYyA9IG5ldyBzbnMuVG9waWModGhpcywgJ3N0cycpXG4gICAgY29uc3Qgc25zRmFpbCA9IG5ldyB0YXNrcy5TbnNQdWJsaXNoKHRoaXMsICdzbnNGYWlsZWQnLCB7XG4gICAgICB0b3BpYzogdGhpcy5mYWlsZWRSb3RhdGlvblRvcGljLFxuICAgICAgc3ViamVjdDogJ1NUUyBLZXlSb3RhdGUgc3RlcCBmdW5jdGlvbiBleGVjdXRpb24gZmFpbGVkJyxcbiAgICAgIG1lc3NhZ2U6IHNmbi5UYXNrSW5wdXQuZnJvbUpzb25QYXRoQXQoJyQnKVxuICAgIH0pXG5cbiAgICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tIFN0ZXAgZnVuY3Rpb25zIERlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBjb25zdCBkZWxldGVQcmV2aW91c1N0ZXAgPSBuZXcgdGFza3MuTGFtYmRhSW52b2tlKHRoaXMsICdkZWxldGUgUHJldmlvdXMnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogcm90YXRlS2V5cyxcbiAgICAgIHBheWxvYWQ6IHNmbi5UYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgIHN0ZXA6ICdkZWxldGVQcmV2aW91cydcbiAgICAgIH0pLFxuICAgICAgb3V0cHV0UGF0aDogJyQuUGF5bG9hZCdcbiAgICB9KVxuXG4gICAgY29uc3QgbW92ZVByZXZpb3VzU3RlcCA9IG5ldyB0YXNrcy5MYW1iZGFJbnZva2UodGhpcywgJ21vdmUgUHJldmlvdXMnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogcm90YXRlS2V5cyxcbiAgICAgIHBheWxvYWQ6IHNmbi5UYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgIHN0ZXA6ICdtb3ZlUHJldmlvdXMnXG4gICAgICB9KSxcbiAgICAgIG91dHB1dFBhdGg6ICckLlBheWxvYWQnXG4gICAgfSlcblxuICAgIGNvbnN0IG1vdmVDdXJyZW50U3RlcCA9IG5ldyB0YXNrcy5MYW1iZGFJbnZva2UodGhpcywgJ21vdmUgQ3VycmVudCcsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiByb3RhdGVLZXlzLFxuICAgICAgcGF5bG9hZDogc2ZuLlRhc2tJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAgICAgc3RlcDogJ21vdmVDdXJyZW50J1xuICAgICAgfSksXG4gICAgICBvdXRwdXRQYXRoOiAnJC5QYXlsb2FkJ1xuICAgIH0pXG5cbiAgICBjb25zdCBjcmVhdGVQZW5kaW5nU3RlcCA9IG5ldyB0YXNrcy5MYW1iZGFJbnZva2UodGhpcywgJ2NyZWF0ZSBQZW5kaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHJvdGF0ZUtleXMsXG4gICAgICBwYXlsb2FkOiBzZm4uVGFza0lucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICBzdGVwOiAnY3JlYXRlUGVuZGluZydcbiAgICAgIH0pLFxuICAgICAgb3V0cHV0UGF0aDogJyQuUGF5bG9hZCdcbiAgICB9KVxuXG4gICAgY29uc3QgZ2VuZXJhdGVBcnRpZmFjdHNTdGVwID0gbmV3IHRhc2tzLkxhbWJkYUludm9rZSh0aGlzLCAnZ2VuZXJhdGUgYXJ0aWZhY3RzJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHJvdGF0ZUtleXMsXG4gICAgICBwYXlsb2FkOiBzZm4uVGFza0lucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICBzdGVwOiAnZ2VuZXJhdGVBcnRpZmFjdHMnXG4gICAgICB9KSxcbiAgICAgIG91dHB1dFBhdGg6ICckLlBheWxvYWQnXG4gICAgfSlcblxuICAgIGNvbnN0IGpvYkZhaWxlZCA9IG5ldyBzZm4uRmFpbCh0aGlzLCAnRmFpbGVkJywge1xuICAgICAgY2F1c2U6ICdBV1MgQmF0Y2ggSm9iIEZhaWxlZCcsXG4gICAgICBlcnJvcjogJ0Rlc2NyaWJlSm9iIHJldHVybmVkIEZBSUxFRCdcbiAgICB9KVxuXG4gICAgY29uc3Qgam9iU3VjY2VzcyA9IG5ldyBzZm4uU3VjY2VlZCh0aGlzLCAnU3VjY2VzcyEnKVxuXG4gICAgZGVsZXRlUHJldmlvdXNTdGVwLmFkZENhdGNoKHNuc0ZhaWwpXG4gICAgbW92ZVByZXZpb3VzU3RlcC5hZGRDYXRjaChzbnNGYWlsKVxuICAgIG1vdmVDdXJyZW50U3RlcC5hZGRDYXRjaChzbnNGYWlsKVxuICAgIGNyZWF0ZVBlbmRpbmdTdGVwLmFkZENhdGNoKHNuc0ZhaWwpXG4gICAgZ2VuZXJhdGVBcnRpZmFjdHNTdGVwLmFkZENhdGNoKHNuc0ZhaWwpXG5cbiAgICAvLyBDcmVhdGUgY2hhaW5cbiAgICBjb25zdCBkZWZpbml0aW9uID0gZGVsZXRlUHJldmlvdXNTdGVwXG4gICAgICAubmV4dChtb3ZlUHJldmlvdXNTdGVwKVxuICAgICAgLm5leHQobW92ZUN1cnJlbnRTdGVwKVxuICAgICAgLm5leHQoY3JlYXRlUGVuZGluZ1N0ZXApXG4gICAgICAubmV4dChnZW5lcmF0ZUFydGlmYWN0c1N0ZXApXG4gICAgICAubmV4dChqb2JTdWNjZXNzKVxuXG4gICAgc25zRmFpbC5uZXh0KGpvYkZhaWxlZClcblxuICAgIC8vIENyZWF0ZSBzdGF0ZSBtYWNoaW5lXG4gICAgY29uc3Qgcm90YXRlS2V5c01hY2hpbmUgPSBuZXcgc2ZuLlN0YXRlTWFjaGluZSh0aGlzLCAnUm90YXRlS2V5cycsIHtcbiAgICAgIGRlZmluaXRpb24sXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcyg1KVxuICAgIH0pXG5cbiAgICByb3RhdGVLZXlzLmdyYW50SW52b2tlKHJvdGF0ZUtleXNNYWNoaW5lLnJvbGUpXG4gICAgb2lkY2J1Y2tldC5ncmFudFJlYWRXcml0ZShyb3RhdGVLZXlzKVxuXG4gICAgY29uc3Qgc3RhdGVtZW50U2lnbiA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KClcbiAgICBzdGF0ZW1lbnRTaWduLmFkZEFjdGlvbnMoJ2ttczoqJylcbiAgICBzdGF0ZW1lbnRTaWduLmFkZFJlc291cmNlcygnKicpXG4gICAgY29uc3Qgc2lnblBvbGljeSA9IG5ldyBpYW0uTWFuYWdlZFBvbGljeSh0aGlzLCAnU2lnblBvbGljeScsIHtcbiAgICAgIHN0YXRlbWVudHM6IFtzdGF0ZW1lbnRTaWduXVxuICAgIH0pXG4gICAgc2lnblJvbGUuYWRkTWFuYWdlZFBvbGljeShzaWduUG9saWN5KVxuXG4gICAgY29uc3Qgc3RhdGVtZW50Um90YXRlS2V5cyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KClcbiAgICBzdGF0ZW1lbnRSb3RhdGVLZXlzLmFkZEFjdGlvbnMoJ2ttczoqJylcbiAgICBzdGF0ZW1lbnRSb3RhdGVLZXlzLmFkZFJlc291cmNlcygnKicpXG4gICAgY29uc3Qgcm90YXRlS2V5c1BvbGljeSA9IG5ldyBpYW0uTWFuYWdlZFBvbGljeSh0aGlzLCAnUm90YXRlS2V5c1BvbGljeScsIHtcbiAgICAgIHN0YXRlbWVudHM6IFtzdGF0ZW1lbnRSb3RhdGVLZXlzXVxuICAgIH0pXG4gICAgcm90YXRlS2V5c1JvbGUuYWRkTWFuYWdlZFBvbGljeShyb3RhdGVLZXlzUG9saWN5KVxuXG4gICAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLSBFdmVudHMgUnVsZSBEZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgLy8gUnVuIGV2ZXJ5IDMgbW9udGhzIGF0IDggUE0gVVRDXG4gICAgY29uc3Qgc2NoZWR1bGVkUm90YXRlUnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCAnc2NoZWR1bGVkUm90YXRlUnVsZScsIHtcbiAgICAgIHNjaGVkdWxlOiBldmVudHMuU2NoZWR1bGUuZXhwcmVzc2lvbignY3JvbigwIDIwIDEgKi8zID8gKiknKVxuICAgIH0pXG4gICAgc2NoZWR1bGVkUm90YXRlUnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuU2ZuU3RhdGVNYWNoaW5lKHJvdGF0ZUtleXNNYWNoaW5lKSlcblxuICAgIC8vIENyZWF0ZSBzdGF0ZSBtYWNoaW5lIGFuZCB0cmlnZ2VyIHRvIHBvcHVsYXRlIGluaXRpYWwga2V5c1xuICAgIGlmICghcHJvcHMuZGlzYWJsZUtleVJvdGF0ZU9uQ3JlYXRlKSB7XG4gICAgICBjb25zdCByb3RhdGVPbmNlID0gbmV3IHRhc2tzLlN0ZXBGdW5jdGlvbnNTdGFydEV4ZWN1dGlvbih0aGlzLCAncm90YXRlT25jZScsIHtcbiAgICAgICAgc3RhdGVNYWNoaW5lOiByb3RhdGVLZXlzTWFjaGluZSxcbiAgICAgICAgaW50ZWdyYXRpb25QYXR0ZXJuOiBzZm4uSW50ZWdyYXRpb25QYXR0ZXJuLlJVTl9KT0JcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHJvdGF0ZVR3aWNlID0gbmV3IHRhc2tzLlN0ZXBGdW5jdGlvbnNTdGFydEV4ZWN1dGlvbih0aGlzLCAncm90YXRlVHdpY2UnLCB7XG4gICAgICAgIHN0YXRlTWFjaGluZTogcm90YXRlS2V5c01hY2hpbmUsXG4gICAgICAgIGludGVncmF0aW9uUGF0dGVybjogc2ZuLkludGVncmF0aW9uUGF0dGVybi5SVU5fSk9CXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBwb3B1bGF0ZUtleXMgPSBuZXcgc2ZuLlN0YXRlTWFjaGluZSh0aGlzLCAncG9wdWxhdGVLZXlzJywge1xuICAgICAgICBkZWZpbml0aW9uOiByb3RhdGVPbmNlLm5leHQocm90YXRlVHdpY2UpLFxuICAgICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygxMClcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGluaXRpYWxSdW5SdWxlID0gbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdpbml0aWFsUnVuUnVsZScsIHtcbiAgICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgICAgc291cmNlOiBbJ2F3cy5jbG91ZGZvcm1hdGlvbiddLFxuICAgICAgICAgIHJlc291cmNlczogW2Nkay5TdGFjay5vZih0aGlzKS5zdGFja0lkXSxcbiAgICAgICAgICBkZXRhaWxUeXBlOiBbJ0Nsb3VkRm9ybWF0aW9uIFN0YWNrIFN0YXR1cyBDaGFuZ2UnXSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICdzdGF0dXMtZGV0YWlscyc6IHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBbJ0NSRUFURV9DT01QTEVURSddXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpbml0aWFsUnVuUnVsZS5hZGRUYXJnZXQobmV3IHRhcmdldHMuU2ZuU3RhdGVNYWNoaW5lKHBvcHVsYXRlS2V5cykpXG4gICAgfVxuXG4gICAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVBJIEdhdGV3YXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIC8vIG9ubHkgc2V0IHBvbGljeSB3aGVuIG9yZ0lkIGlzIHNldFxuICAgIGxldCBhcGlQb2xpY3k6IFBvbGljeURvY3VtZW50IHwgdW5kZWZpbmVkXG4gICAgaWYgKHByb3BzLm9yZ0lkKSB7XG4gICAgICBhcGlQb2xpY3kgPSBuZXcgaWFtLlBvbGljeURvY3VtZW50KHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFsnZXhlY3V0ZS1hcGk6SW52b2tlJ10sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgICAgICBuZXcgT3JnYW5pemF0aW9uUHJpbmNpcGFsKHByb3BzLm9yZ0lkKVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCAnQVBJR2F0ZXdheUFjY2Vzc0xvZ3MnLCB7XG4gICAgICByZXRlbnRpb246IDdcbiAgICB9KVxuXG4gICAgLy8gQ3JlYXRlIEFQSVxuICAgIGNvbnN0IGFwaSA9IG5ldyBhcGlnYXRld2F5LkxhbWJkYVJlc3RBcGkodGhpcywgJ2p3ay1zdHMtYXBpJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTVFMgVG9rZW4gQVBJIEdhdGV3YXknLFxuICAgICAgaGFuZGxlcjogc2lnbixcbiAgICAgIGRlZmF1bHRNZXRob2RPcHRpb25zOiB7XG4gICAgICAgIGF1dGhvcml6YXRpb25UeXBlOiBhcGlnYXRld2F5LkF1dGhvcml6YXRpb25UeXBlLklBTVxuICAgICAgfSxcbiAgICAgIGVuZHBvaW50Q29uZmlndXJhdGlvbjoge1xuICAgICAgICB0eXBlczogW2FwaWdhdGV3YXkuRW5kcG9pbnRUeXBlLlJFR0lPTkFMXVxuICAgICAgfSxcbiAgICAgIHBvbGljeTogYXBpUG9saWN5LFxuICAgICAgZGVwbG95T3B0aW9uczoge1xuICAgICAgICBsb2dnaW5nTGV2ZWw6IE1ldGhvZExvZ2dpbmdMZXZlbC5JTkZPLFxuICAgICAgICBhY2Nlc3NMb2dEZXN0aW5hdGlvbjogbmV3IGFwaWdhdGV3YXkuTG9nR3JvdXBMb2dEZXN0aW5hdGlvbihsb2dHcm91cClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0gUm91dGU1MyBEZWZpbml0aW9uIGZvciBjdXN0b20gZG9tYWluIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAgIGlmICh1c2VDdXN0b21Eb21haW4gJiYgaG9zdGVkWm9uZSkge1xuICAgICAgYXBpLmFkZERvbWFpbk5hbWUoJ2FwaUN1c3RvbURvbWFpbk5hbWUnLCB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRva2VuRG9tYWluTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGU6IHRva2VuQ2VydGlmaWNhdGUhXG4gICAgICB9KVxuXG4gICAgICAvLyBBZGQgQSByZWNvcmQgZm9yIGNsb3VkZnJvbnQgZGlzdHJpYnV0aW9uXG5cbiAgICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQodGhpcywgJ29pZGNSZWNvcmQnLCB7XG4gICAgICAgIHJlY29yZE5hbWU6IG9pZGNEb21haW5OYW1lLFxuICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgcm91dGU1M3RhcmdldHMuQ2xvdWRGcm9udFRhcmdldChkaXN0cmlidXRpb24pKVxuICAgICAgfSlcblxuICAgICAgbmV3IHJvdXRlNTMuQVJlY29yZCh0aGlzLCAndG9rZW5SZWNvcmQnLCB7XG4gICAgICAgIHJlY29yZE5hbWU6IHRva2VuRG9tYWluTmFtZSxcbiAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IHJvdXRlNTN0YXJnZXRzLkFwaUdhdGV3YXkoYXBpKSlcbiAgICAgIH0pXG5cbiAgICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICd0b2tlbkVuZHBvaW50Jywge1xuICAgICAgICB2YWx1ZTogJ2h0dHBzOi8vJyArIHRva2VuRG9tYWluTmFtZSArICcvdG9rZW4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VybCBvZiB0aGUgdG9rZW4gZW5kcG9pbnQnLFxuICAgICAgICBleHBvcnROYW1lOiAndG9rZW5FbmRwb2ludCdcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICd0b2tlbkVuZHBvaW50Jywge1xuICAgICAgICB2YWx1ZTogYXBpLnVybCArICd0b2tlbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXJsIG9mIHRoZSB0b2tlbiBlbmRwb2ludCcsXG4gICAgICAgIGV4cG9ydE5hbWU6ICd0b2tlbkVuZHBvaW50J1xuICAgICAgfSlcbiAgICB9XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnaXNzdWVyJywge1xuICAgICAgdmFsdWU6IGlzc3VlcixcbiAgICAgIGRlc2NyaXB0aW9uOiAnVXJsIG9mIHRoZSBpc3N1ZXInLFxuICAgICAgZXhwb3J0TmFtZTogJ2lzc3VlcidcbiAgICB9KVxuXG4gICAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV0FGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBpZiAocHJvcHMuYXBpR3dXYWYgPT09IHdhZlVzYWdlLkNvbnN0cnVjdFByb3ZpZGVkKSB7XG4gICAgICAvLyBBUEkgZ2F0ZXdheSBXQUYgQUNMIGFuZCBydWxlc1xuICAgICAgY29uc3QgQVBJR2F0ZXdheVdlYkFDTCA9IG5ldyB3YWZ2Mi5DZm5XZWJBQ0wodGhpcywgJ0FQSUdhdGV3YXlXZWJBQ0wnLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyBXZWJBQ0wgZm9yIEF1dGggQVBpIEdhdGV3YXknLFxuICAgICAgICBzY29wZTogJ1JFR0lPTkFMJyxcbiAgICAgICAgZGVmYXVsdEFjdGlvbjogeyBhbGxvdzoge30gfSxcbiAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgIG1ldHJpY05hbWU6ICdBUElXZWJBQ0wnLFxuICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0FXUy1BV1NNYW5hZ2VkUnVsZXNDb21tb25SdWxlU2V0JyxcbiAgICAgICAgICAgIHByaW9yaXR5OiAwLFxuICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICB2ZW5kb3JOYW1lOiAnQVdTJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQ29tbW9uUnVsZVNldCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG92ZXJyaWRlQWN0aW9uOiB7XG4gICAgICAgICAgICAgIG5vbmU6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG1ldHJpY05hbWU6ICdBV1MtQVdTTWFuYWdlZFJ1bGVzQ29tbW9uUnVsZVNldCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdBV1MtQVdTTWFuYWdlZFJ1bGVzQW1hem9uSXBSZXB1dGF0aW9uTGlzdCcsXG4gICAgICAgICAgICBwcmlvcml0eTogMSxcbiAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICBtYW5hZ2VkUnVsZUdyb3VwU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUycsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0FtYXpvbklwUmVwdXRhdGlvbkxpc3QnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge1xuICAgICAgICAgICAgICBub25lOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICBtZXRyaWNOYW1lOiAnQVdTLUFXU01hbmFnZWRSdWxlc0FtYXpvbklwUmVwdXRhdGlvbkxpc3QnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnYXBpLWd3LUF1dGhBUElHZW9Mb2NhdGlvbicsXG4gICAgICAgICAgICBwcmlvcml0eTogMyxcbiAgICAgICAgICAgIGFjdGlvbjogeyBibG9jazoge30gfSxcbiAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgbWV0cmljTmFtZTogJ0F1dGhBUElHZW9Mb2NhdGlvbicsXG4gICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgZ2VvTWF0Y2hTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZXM6IFsnQlknLCAnQ04nLCAnSVInLCAnUlUnLCAnU1knLCAnS1AnXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnYXBpLWd3LXJhdGVMaW1pdFJ1bGUnLFxuICAgICAgICAgICAgcHJpb3JpdHk6IDQsXG4gICAgICAgICAgICBhY3Rpb246IHsgYmxvY2s6IHt9IH0sXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgIG1ldHJpY05hbWU6ICdyYXRlTGltaXRSdWxlJyxcbiAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICByYXRlQmFzZWRTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICBhZ2dyZWdhdGVLZXlUeXBlOiAnSVAnLFxuICAgICAgICAgICAgICAgIGxpbWl0OiAxMDBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSlcblxuICAgICAgLy8gV2ViIEFDTCBBc3NvY2lhdGlvblxuICAgICAgbmV3IHdhZnYyLkNmbldlYkFDTEFzc29jaWF0aW9uKHRoaXMsICdBUElHYXRld2F5V2ViQUNMQXNzb2NpYXRpb24nLCB7XG4gICAgICAgIHdlYkFjbEFybjogQVBJR2F0ZXdheVdlYkFDTC5hdHRyQXJuLFxuICAgICAgICByZXNvdXJjZUFybjogYXBpLmRlcGxveW1lbnRTdGFnZS5zdGFnZUFyblxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHByb3BzLmFwaUd3V2FmID09PSB3YWZVc2FnZS5Qcm92aWRlV2ViQWNsQXJuICYmIHByb3BzLmFwaUd3V2FmV2ViQWNsQXJuKSB7XG4gICAgICAvLyBXZWIgQUNMIEFzc29jaWF0aW9uXG4gICAgICBuZXcgd2FmdjIuQ2ZuV2ViQUNMQXNzb2NpYXRpb24odGhpcywgJ0FQSUdhdGV3YXlXZWJBQ0xBc3NvY2lhdGlvbicsIHtcbiAgICAgICAgd2ViQWNsQXJuOiBwcm9wcy5hcGlHd1dhZldlYkFjbEFybixcbiAgICAgICAgcmVzb3VyY2VBcm46IGFwaS5kZXBsb3ltZW50U3RhZ2Uuc3RhZ2VBcm5cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xvdWR3YXRjaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgJ1N0ZXBGdW5jdGlvbkVycm9yJywge1xuICAgICAgYWxhcm1OYW1lOiBwcm9wcy5hbGFybU5hbWVLZXlSb3RhdGlvblN0ZXBGdW5jdGlvbkZhaWxlZCA/PyAnc3RzLWtleV9yb3RhdGVfc2ZuLWFsYXJtJyxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgbWV0cmljOiByb3RhdGVLZXlzTWFjaGluZS5tZXRyaWNGYWlsZWQoKSxcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246ICdLZXkgUm90YXRpb24gRmFpbGVkJyxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IFRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElOR1xuICAgIH0pXG5cbiAgICBuZXcgY2xvdWR3YXRjaC5BbGFybSh0aGlzLCAnQXBpR2F0ZXdheTVYWEFsYXJtJywge1xuICAgICAgYWxhcm1OYW1lOiBwcm9wcy5hbGFybU5hbWVBcGlHYXRld2F5NXh4ID8/ICdzdHMtNXh4X2FwaV9ndy1hbGFybScsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgIG1ldHJpYzogYXBpLm1ldHJpY1NlcnZlckVycm9yKCksXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiAnNXh4IFNUUyBBUEkgZ2F0ZXdheSBmYWlsdXJlcycsXG4gICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkdcbiAgICB9KVxuXG4gICAgY29uc3Qgc2lnbkVycm9ycyA9IHNpZ24ubWV0cmljRXJyb3JzKHtcbiAgICAgIHBlcmlvZDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMSlcbiAgICB9KVxuXG4gICAgY29uc3Qgcm90YXRlRXJyb3JzID0gcm90YXRlS2V5cy5tZXRyaWNFcnJvcnMoe1xuICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24ubWludXRlcygxKVxuICAgIH0pXG5cbiAgICBuZXcgY2xvdWR3YXRjaC5BbGFybSh0aGlzLCAnTGFtYmRhU2lnbkVycm9yJywge1xuICAgICAgYWxhcm1OYW1lOiBwcm9wcy5hbGFybU5hbWVTaWduTGFtYmRhRmFpbGVkID8/ICdzdHMtc2lnbl9lcnJvcnNfbGFtYmRhLWFsYXJtJyxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgbWV0cmljOiBzaWduRXJyb3JzLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogJ1NpZ24gTGFtYmRhIEZhaWxlZCcsXG4gICAgICB0cmVhdE1pc3NpbmdEYXRhOiBUcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkdcbiAgICB9KVxuXG4gICAgbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgJ0xhbWJkYVJvdGF0ZUVycm9yJywge1xuICAgICAgYWxhcm1OYW1lOiBwcm9wcy5hbGFybU5hbWVLZXlSb3RhdGlvbkxhbWJkYUZhaWxlZCA/PyAnc3RzLWtleV9yb3RhdGVfZXJyb3JzX2xhbWJkYS1hbGFybScsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgIG1ldHJpYzogcm90YXRlRXJyb3JzLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogJ0tleSBSb3RhdGlvbiBMYW1iZGEgRmFpbGVkJyxcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IFRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElOR1xuICAgIH0pXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const handler: (event: any) => Promise<any>;
|