@renovosolutions/cdk-library-aws-iam-access-key
Version:
AWS CDK Construct Library for generating AWS access keys and storing them in Secrets Manager
205 lines • 28.1 kB
JavaScript
"use strict";
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AccessKeyFunctionCodeCache = exports.AccessKey = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path = require("path");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
class AccessKey extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
const secretName = `${aws_cdk_lib_1.Names.uniqueId(this)}${props.user.userName}`;
aws_cdk_lib_1.Tags.of(props.user).add('CfnStackIdForAccessKeyLibrary', aws_cdk_lib_1.Stack.of(this).stackId);
const lambdaPolicy = new aws_cdk_lib_1.aws_iam.ManagedPolicy(this, 'SecretsManagerPolicy', {
statements: [
new aws_cdk_lib_1.aws_iam.PolicyStatement({
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
sid: 'SecretsManagerPolicy',
actions: [
'secretsmanager:PutSecretValue',
'secretsmanager:CreateSecret',
'secretsmanager:DeleteSecret',
'secretsmanager:UpdateSecret',
'secretsmanager:TagResource',
'secretsmanager:RestoreSecret',
],
resources: [`arn:aws:secretsmanager:${aws_cdk_lib_1.Stack.of(this).region}:${aws_cdk_lib_1.Stack.of(this).account}:secret:${secretName}-*`],
}),
new aws_cdk_lib_1.aws_iam.PolicyStatement({
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
sid: 'IamAllowKeyManagementPolicy',
actions: [
'iam:CreateAccessKey',
'iam:DeleteAccessKey',
'iam:ListAccessKeys',
],
resources: ['*'],
conditions: {
StringEquals: {
'iam:ResourceTag/CfnStackIdForAccessKeyLibrary': aws_cdk_lib_1.Stack.of(this).stackId,
},
},
}),
],
});
if (props.kmsKey) {
lambdaPolicy.addStatements(new aws_cdk_lib_1.aws_iam.PolicyStatement({
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
sid: 'KmsAllowKeyManagementPolicy',
actions: [
'kms:Encrypt',
'kms:Decrypt',
'kms:ReEncrypt*',
'kms:GenerateDataKey*',
],
resources: [props.kmsKey.keyArn],
}));
}
const role = new aws_cdk_lib_1.aws_iam.Role(this, 'Role', {
assumedBy: new aws_cdk_lib_1.aws_iam.ServicePrincipal('lambda.amazonaws.com'),
managedPolicies: [
lambdaPolicy,
aws_cdk_lib_1.aws_iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'),
],
});
const bundlingCmds = [
'mkdir -p /asset-output',
'pip install -r /asset-input/requirements.txt -t /asset-output',
'cp index.py /asset-output/index.py',
];
const onEventHandler = new aws_cdk_lib_1.aws_lambda.Function(this, 'OnEventHandler', {
runtime: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_9,
handler: 'index.handler',
code: props.lambdaCode ?? aws_cdk_lib_1.aws_lambda.Code.fromAsset(path.join(__dirname, '../lambda'), {
bundling: {
image: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_9.bundlingImage,
command: [
'bash', '-c', bundlingCmds.join(' && '),
],
},
}),
timeout: aws_cdk_lib_1.Duration.seconds(30),
role,
});
const secret = new aws_cdk_lib_1.CustomResource(this, 'SecretArn', {
serviceToken: onEventHandler.functionArn,
properties: {
UserName: props.user.userName,
SecretName: secretName,
Region: aws_cdk_lib_1.Stack.of(this).region,
Override: props.overwriteSecret ?? true,
Restore: props.restoreSecret ?? true,
KmsKeyId: props.kmsKey == undefined ? 'alias/aws/secretsmanager' : props.kmsKey.keyId,
},
});
this.secret = aws_cdk_lib_1.aws_secretsmanager.Secret.fromSecretCompleteArn(this, 'Secret', secret.getAttString('SecretArn'));
}
}
exports.AccessKey = AccessKey;
_a = JSII_RTTI_SYMBOL_1;
AccessKey[_a] = { fqn: "@renovosolutions/cdk-library-aws-iam-access-key.AccessKey", version: "0.0.38" };
class AccessKeyFunctionCodeCache extends aws_cdk_lib_1.aws_s3.Bucket {
constructor(scope, id, props) {
const removalPolicy = props.removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.DESTROY;
const autoDeleteObjects = removalPolicy === aws_cdk_lib_1.RemovalPolicy.DESTROY;
super(scope, id, {
removalPolicy,
autoDeleteObjects,
...props,
});
/** Force the final unzipped asset to be a zip by nesting zips */
const bundlingCmds = [
'mkdir -p /asset-output',
'mkdir -p temp',
'pip install -r /asset-input/requirements.txt -t /asset-input/temp',
'cp index.py /asset-input/temp/index.py',
'cd temp',
'zip -r lambda.zip .',
'zip -r /asset-output/temp.zip lambda.zip',
'cd ..',
'rm -rf ./temp',
];
new aws_cdk_lib_1.aws_s3_deployment.BucketDeployment(this, 'Deployment', {
sources: [aws_cdk_lib_1.aws_s3_deployment.Source.asset(path.join(__dirname, '../lambda'), {
bundling: {
image: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_9.bundlingImage,
command: [
'bash', '-c', bundlingCmds.join(' && '),
],
},
})],
destinationBucket: this,
exclude: ['__pycache__/*', '*.pyc'],
include: ['*.py'],
});
this.lambdaCode = aws_cdk_lib_1.aws_lambda.Code.fromBucket(this, 'index.py');
}
/**
* Add access to the whole organization to get
* the lambda function code from the bucket.
*
* @param principalOrgId The organization ID to require for any accounts accessing the bucket.
*/
addOrgWideAccessPolicy(principalOrgId) {
return this.addToResourcePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
principals: [new aws_cdk_lib_1.aws_iam.StarPrincipal],
actions: [
's3:GetObject',
],
resources: [this.arnForObjects('*')],
conditions: {
StringEquals: {
'aws:PrincipalOrgID': principalOrgId,
},
},
}));
}
;
/**
* Add access to the specified accounts to get
* the lambda function code from the bucket.
*
* @param principalAccountId The account ID to add access for.
* @param principalOrgId (Optional) The organization ID to require for the account accessing the bucket.
*/
addAccountAccessPolicy(principalAccountId, principalOrgId) {
return this.addToResourcePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
principals: [new aws_cdk_lib_1.aws_iam.AccountPrincipal(principalAccountId)],
actions: ['s3:GetObject'],
resources: [this.arnForObjects('*')],
conditions: principalOrgId === undefined ? undefined : {
StringEquals: {
'aws:PrincipalOrgID': principalOrgId,
},
},
}));
}
;
/**
* Add access to the specified organizational units to get
* the lambda function code from the bucket.
*
* @param principalOrgPaths The organizational unit paths to add access for.
*/
addOrgOuAccessPolicy(principalOrgPaths) {
return this.addToResourcePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
principals: [new aws_cdk_lib_1.aws_iam.StarPrincipal],
actions: ['s3:GetObject'],
resources: [this.arnForObjects('*')],
conditions: {
StringLike: {
'aws:PrincipalOrgPaths': principalOrgPaths,
},
},
}));
}
}
exports.AccessKeyFunctionCodeCache = AccessKeyFunctionCodeCache;
_b = JSII_RTTI_SYMBOL_1;
AccessKeyFunctionCodeCache[_b] = { fqn: "@renovosolutions/cdk-library-aws-iam-access-key.AccessKeyFunctionCodeCache", version: "0.0.38" };
;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUFDN0IsNkNBYXFCO0FBQ3JCLDJDQUF1QztBQW9EdkMsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFNdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFxQjtRQUM3RCxLQUFLLENBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWxCLE1BQU0sVUFBVSxHQUFHLEdBQUcsbUJBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVuRSxrQkFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLCtCQUErQixFQUFFLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpGLE1BQU0sWUFBWSxHQUFHLElBQUkscUJBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQ3ZFLFVBQVUsRUFBRTtnQkFDVixJQUFJLHFCQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixNQUFNLEVBQUUscUJBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztvQkFDeEIsR0FBRyxFQUFFLHNCQUFzQjtvQkFDM0IsT0FBTyxFQUFFO3dCQUNQLCtCQUErQjt3QkFDL0IsNkJBQTZCO3dCQUM3Qiw2QkFBNkI7d0JBQzdCLDZCQUE2Qjt3QkFDN0IsNEJBQTRCO3dCQUM1Qiw4QkFBOEI7cUJBQy9CO29CQUNELFNBQVMsRUFBRSxDQUFDLDBCQUEwQixtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxXQUFXLFVBQVUsSUFBSSxDQUFDO2lC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LElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsVUFBVSxFQUFFLGNBQWMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELFlBQVksRUFBRTtvQkFDWixvQkFBb0IsRUFBRSxjQUFjO2lCQUNyQzthQUNGO1NBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQUEsQ0FBQztJQUVGOzs7OztPQUtHO0lBQ0ksb0JBQW9CLENBQUMsaUJBQTJCO1FBQ3JELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUkscUJBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEQsTUFBTSxFQUFFLHFCQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDeEIsVUFBVSxFQUFFLENBQUMsSUFBSSxxQkFBRyxDQUFDLGFBQWEsQ0FBQztZQUNuQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFDekIsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFO29CQUNWLHVCQUF1QixFQUFFLGlCQUFpQjtpQkFDM0M7YUFDRjtTQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7QUExR0gsZ0VBMkdDOzs7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIGF3c19pYW0gYXMgaWFtLFxuICBDdXN0b21SZXNvdXJjZSxcbiAgYXdzX2xhbWJkYSBhcyBsYW1iZGEsXG4gIGF3c19zZWNyZXRzbWFuYWdlciBhcyBzZWNyZXRzbWFuYWdlcixcbiAgRHVyYXRpb24sXG4gIE5hbWVzLFxuICBTdGFjayxcbiAgVGFncyxcbiAgYXdzX2ttcyBhcyBrbXMsXG4gIFJlbW92YWxQb2xpY3ksXG4gIGF3c19zMyBhcyBzMyxcbiAgYXdzX3MzX2RlcGxveW1lbnQgYXMgczNEZXBsb3ksXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFRoZSBwcm9wZXJ0aWVzIG9mIGEgbmV3IHNldCBvZiBTTVRQIENyZWRlbnRpYWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzS2V5UHJvcHMge1xuICAvKipcbiAgICogVGhlIElBTSB1c2VyIHRoZSBhY2Nlc3Mga2V5IHdpbGwgYmUgY3JlYXRlZCBmb3IuXG4gICAqL1xuICByZWFkb25seSB1c2VyOiBpYW0uVXNlcjtcbiAgLyoqXG4gICAqIElmIGEgc2VjcmV0IGlzIHBlbmRpbmcgZGVsZXRpb24gc2hvdWxkIGl0IGJlIHJlc3RvcmVkP1xuICAgKlxuICAgKiBUaGlzIGhlbHBzIGluIGNhc2VzIHdoZXJlIGNsb3VkZm9ybWF0aW9uIHJvbGwgYmFja3MgcHV0cyBhIHNlY3JldCBpbiBwZW5kaW5nIGRlbGV0ZSBzdGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdG9yZVNlY3JldD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiBhIHNlY3JldCBhbHJlYWR5IGV4aXN0cyBzaG91bGQgaXQgYmUgb3ZlcndyaXR0ZW4/XG4gICAqXG4gICAqIFRoaXMgaGVscHMgaW4gY2FzZXMgd2hlcmUgY2xvdWRmb3JtYXRpb24gY3JlYXRlcyBhIHNlY3JldCBzdWNjZXNzZnVsbHkgYnV0IGl0IGdldHMgb3JwaGFuZWQgZm9yIHNvbWUgcmVhc29uLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBvdmVyd3JpdGVTZWNyZXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIEtNUyBrZXkgdG8gdXNlIGZvciB0aGUgc2VjcmV0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuICAvKipcbiAgICogVGhlIGxhbWJkYSBmdW5jdGlvbiBjb2RlIHRvIHVzZSBmb3IgdGhlIGN1c3RvbSByZXNvdXJjZS5cbiAgICpcbiAgICogRm9yIG1vc3QgdXNlIGNhc2VzIHRoaXMgc2hvdWxkIGJlIGxlZnQgYXMgdGhlIGRlZmF1bHQsIGJ1dFxuICAgKiBpbiBjYXNlcyB3aGVyZSB0aGUgY3VzdG9tIHJlc291cmNlIG5lZWRzIHRvIGJlIGRlcGxveWVkIHRocm91Z2hcbiAgICogc29tZXRoaW5nIGxpa2UgQ2xvdWRGb3JtYXRpb24gU3RhY2tTZXRzIHlvdSBtYXkgbmVlZCB0byBzb3VyY2VcbiAgICogdGhlIGxhbWJkYSBmdW5jdGlvbiBjb2RlIGZyb20gUzMgb3Igc29tZSBvdGhlciBsb2NhdGlvbiBiZWNhdXNlXG4gICAqIHRoZSBDREsgY2FudCB1cGxvYWQgdGhlIGxvY2FsIGNvZGUgdG8gdGhlIGNvcnJlY3QgYXNzZXQgbG9jYXRpb25cbiAgICogZm9yIHRoZSBTdGFja1NldCB0YXJnZXQgYWNjb3VudHMuXG4gICAqXG4gICAqIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlZCBgQWNjZXNzS2V5RnVuY3Rpb25Db2RlQ2FjaGVgIGNsYXNzIHRvXG4gICAqIGNhY2hlIHRoZSBsYW1iZGEgZnVuY3Rpb24gY29kZSBpbiBTMyBhbmQgY3JlYXRlIGEgY3Jvc3NcbiAgICogYWNjb3VudCBhY2Nlc3MgcG9saWN5IHRvIGFsbG93IHRoZSBTdGFja1NldCB0YXJnZXQgYWNjb3VudHNcbiAgICogdG8gYWNjZXNzIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgbGFtYmRhIGZ1bmN0aW9uIGNvZGVcbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUNvZGU/OiBsYW1iZGEuQ29kZTtcbn1cblxuZXhwb3J0IGNsYXNzIEFjY2Vzc0tleSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgQVdTIHNlY3JldHMgbWFuYWdlciBzZWNyZXQgdGhhdCBjb250YWlucyB0aGUgYWNjZXNzIGtleS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFjY2Vzc0tleVByb3BzKSB7XG4gICAgc3VwZXIgKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBzZWNyZXROYW1lID0gYCR7TmFtZXMudW5pcXVlSWQodGhpcyl9JHtwcm9wcy51c2VyLnVzZXJOYW1lfWA7XG5cbiAgICBUYWdzLm9mKHByb3BzLnVzZXIpLmFkZCgnQ2ZuU3RhY2tJZEZvckFjY2Vzc0tleUxpYnJhcnknLCBTdGFjay5vZih0aGlzKS5zdGFja0lkKTtcblxuICAgIGNvbnN0IGxhbWJkYVBvbGljeSA9IG5ldyBpYW0uTWFuYWdlZFBvbGljeSh0aGlzLCAnU2VjcmV0c01hbmFnZXJQb2xpY3knLCB7XG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgc2lkOiAnU2VjcmV0c01hbmFnZXJQb2xpY3knLFxuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdzZWNyZXRzbWFuYWdlcjpQdXRTZWNyZXRWYWx1ZScsXG4gICAgICAgICAgICAnc2VjcmV0c21hbmFnZXI6Q3JlYXRlU2VjcmV0JyxcbiAgICAgICAgICAgICdzZWNyZXRzbWFuYWdlcjpEZWxldGVTZWNyZXQnLFxuICAgICAgICAgICAgJ3NlY3JldHNtYW5hZ2VyOlVwZGF0ZVNlY3JldCcsXG4gICAgICAgICAgICAnc2VjcmV0c21hbmFnZXI6VGFnUmVzb3VyY2UnLFxuICAgICAgICAgICAgJ3NlY3JldHNtYW5hZ2VyOlJlc3RvcmVTZWNyZXQnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6c2VjcmV0c21hbmFnZXI6JHtTdGFjay5vZih0aGlzKS5yZWdpb259OiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06c2VjcmV0OiR7c2VjcmV0TmFtZX0tKmBdLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICBzaWQ6ICdJYW1BbGxvd0tleU1hbmFnZW1lbnRQb2xpY3knLFxuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdpYW06Q3JlYXRlQWNjZXNzS2V5JyxcbiAgICAgICAgICAgICdpYW06RGVsZXRlQWNjZXNzS2V5JyxcbiAgICAgICAgICAgICdpYW06TGlzdEFjY2Vzc0tleXMnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgJ2lhbTpSZXNvdXJjZVRhZy9DZm5TdGFja0lkRm9yQWNjZXNzS2V5TGlicmFyeSc6IFN0YWNrLm9mKHRoaXMpLnN0YWNrSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5rbXNLZXkpIHtcbiAgICAgIGxhbWJkYVBvbGljeS5hZGRTdGF0ZW1lbnRzKG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBzaWQ6ICdLbXNBbGxvd0tleU1hbmFnZW1lbnRQb2xpY3knLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2ttczpFbmNyeXB0JyxcbiAgICAgICAgICAna21zOkRlY3J5cHQnLFxuICAgICAgICAgICdrbXM6UmVFbmNyeXB0KicsXG4gICAgICAgICAgJ2ttczpHZW5lcmF0ZURhdGFLZXkqJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMua21zS2V5LmtleUFybl0sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgIGxhbWJkYVBvbGljeSxcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJyksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYnVuZGxpbmdDbWRzID0gW1xuICAgICAgJ21rZGlyIC1wIC9hc3NldC1vdXRwdXQnLFxuICAgICAgJ3BpcCBpbnN0YWxsIC1yIC9hc3NldC1pbnB1dC9yZXF1aXJlbWVudHMudHh0IC10IC9hc3NldC1vdXRwdXQnLFxuICAgICAgJ2NwIGluZGV4LnB5IC9hc3NldC1vdXRwdXQvaW5kZXgucHknLFxuICAgIF07XG5cbiAgICBjb25zdCBvbkV2ZW50SGFuZGxlciA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ09uRXZlbnRIYW5kbGVyJywge1xuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfOSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHByb3BzLmxhbWJkYUNvZGUgPz8gbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9sYW1iZGEnKSwge1xuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIGltYWdlOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM185LmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgY29tbWFuZDogW1xuICAgICAgICAgICAgJ2Jhc2gnLCAnLWMnLCBidW5kbGluZ0NtZHMuam9pbignICYmICcpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMzApLFxuICAgICAgcm9sZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNlY3JldCA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnU2VjcmV0QXJuJywge1xuICAgICAgc2VydmljZVRva2VuOiBvbkV2ZW50SGFuZGxlci5mdW5jdGlvbkFybixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgVXNlck5hbWU6IHByb3BzLnVzZXIudXNlck5hbWUsXG4gICAgICAgIFNlY3JldE5hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgIFJlZ2lvbjogU3RhY2sub2YodGhpcykucmVnaW9uLFxuICAgICAgICBPdmVycmlkZTogcHJvcHMub3ZlcndyaXRlU2VjcmV0ID8/IHRydWUsXG4gICAgICAgIFJlc3RvcmU6IHByb3BzLnJlc3RvcmVTZWNyZXQgPz8gdHJ1ZSxcbiAgICAgICAgS21zS2V5SWQ6IHByb3BzLmttc0tleSA9PSB1bmRlZmluZWQgPyAnYWxpYXMvYXdzL3NlY3JldHNtYW5hZ2VyJyA6IHByb3BzLmttc0tleS5rZXlJZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlY3JldCA9IHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0Q29tcGxldGVBcm4odGhpcywgJ1NlY3JldCcsIHNlY3JldC5nZXRBdHRTdHJpbmcoJ1NlY3JldEFybicpKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0tleUZ1bmN0aW9uQ29kZUNhY2hlUHJvcHMgZXh0ZW5kcyBzMy5CdWNrZXRQcm9wcyB7fVxuXG5leHBvcnQgY2xhc3MgQWNjZXNzS2V5RnVuY3Rpb25Db2RlQ2FjaGUgZXh0ZW5kcyBzMy5CdWNrZXQge1xuICAvKipcbiAgICogVGhlIGxhbWJkYS5Db2RlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhQ29kZTogbGFtYmRhLkNvZGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFjY2Vzc0tleUZ1bmN0aW9uQ29kZUNhY2hlUHJvcHMpIHtcbiAgICBjb25zdCByZW1vdmFsUG9saWN5ID0gcHJvcHMucmVtb3ZhbFBvbGljeSA/PyBSZW1vdmFsUG9saWN5LkRFU1RST1k7XG4gICAgY29uc3QgYXV0b0RlbGV0ZU9iamVjdHMgPSByZW1vdmFsUG9saWN5ID09PSBSZW1vdmFsUG9saWN5LkRFU1RST1k7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICByZW1vdmFsUG9saWN5LFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcblxuICAgIC8qKiBGb3JjZSB0aGUgZmluYWwgdW56aXBwZWQgYXNzZXQgdG8gYmUgYSB6aXAgYnkgbmVzdGluZyB6aXBzICovXG4gICAgY29uc3QgYnVuZGxpbmdDbWRzID0gW1xuICAgICAgJ21rZGlyIC1wIC9hc3NldC1vdXRwdXQnLFxuICAgICAgJ21rZGlyIC1wIHRlbXAnLFxuICAgICAgJ3BpcCBpbnN0YWxsIC1yIC9hc3NldC1pbnB1dC9yZXF1aXJlbWVudHMudHh0IC10IC9hc3NldC1pbnB1dC90ZW1wJyxcbiAgICAgICdjcCBpbmRleC5weSAvYXNzZXQtaW5wdXQvdGVtcC9pbmRleC5weScsXG4gICAgICAnY2QgdGVtcCcsXG4gICAgICAnemlwIC1yIGxhbWJkYS56aXAgLicsXG4gICAgICAnemlwIC1yIC9hc3NldC1vdXRwdXQvdGVtcC56aXAgbGFtYmRhLnppcCcsXG4gICAgICAnY2QgLi4nLFxuICAgICAgJ3JtIC1yZiAuL3RlbXAnLFxuICAgIF07XG5cbiAgICBuZXcgczNEZXBsb3kuQnVja2V0RGVwbG95bWVudCh0aGlzLCAnRGVwbG95bWVudCcsIHtcbiAgICAgIHNvdXJjZXM6IFtzM0RlcGxveS5Tb3VyY2UuYXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYScpLCB7XG4gICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgaW1hZ2U6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzkuYnVuZGxpbmdJbWFnZSxcbiAgICAgICAgICBjb21tYW5kOiBbXG4gICAgICAgICAgICAnYmFzaCcsICctYycsIGJ1bmRsaW5nQ21kcy5qb2luKCcgJiYgJyksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0pXSxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB0aGlzLFxuICAgICAgZXhjbHVkZTogWydfX3B5Y2FjaGVfXy8qJywgJyoucHljJ10sXG4gICAgICBpbmNsdWRlOiBbJyoucHknXSxcbiAgICB9KTtcblxuICAgIHRoaXMubGFtYmRhQ29kZSA9IGxhbWJkYS5Db2RlLmZyb21CdWNrZXQodGhpcywgJ2luZGV4LnB5Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFjY2VzcyB0byB0aGUgd2hvbGUgb3JnYW5pemF0aW9uIHRvIGdldFxuICAgKiB0aGUgbGFtYmRhIGZ1bmN0aW9uIGNvZGUgZnJvbSB0aGUgYnVja2V0LlxuICAgKlxuICAgKiBAcGFyYW0gcHJpbmNpcGFsT3JnSWQgVGhlIG9yZ2FuaXphdGlvbiBJRCB0byByZXF1aXJlIGZvciBhbnkgYWNjb3VudHMgYWNjZXNzaW5nIHRoZSBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgYWRkT3JnV2lkZUFjY2Vzc1BvbGljeShwcmluY2lwYWxPcmdJZDogc3RyaW5nKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uU3RhclByaW5jaXBhbF0sXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdzMzpHZXRPYmplY3QnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogW3RoaXMuYXJuRm9yT2JqZWN0cygnKicpXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2F3czpQcmluY2lwYWxPcmdJRCc6IHByaW5jaXBhbE9yZ0lkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBhY2NvdW50cyB0byBnZXRcbiAgICogdGhlIGxhbWJkYSBmdW5jdGlvbiBjb2RlIGZyb20gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbEFjY291bnRJZCBUaGUgYWNjb3VudCBJRCB0byBhZGQgYWNjZXNzIGZvci5cbiAgICogQHBhcmFtIHByaW5jaXBhbE9yZ0lkIChPcHRpb25hbCkgVGhlIG9yZ2FuaXphdGlvbiBJRCB0byByZXF1aXJlIGZvciB0aGUgYWNjb3VudCBhY2Nlc3NpbmcgdGhlIGJ1Y2tldC5cbiAgICovXG4gIHB1YmxpYyBhZGRBY2NvdW50QWNjZXNzUG9saWN5KHByaW5jaXBhbEFjY291bnRJZDogc3RyaW5nLCBwcmluY2lwYWxPcmdJZD86IHN0cmluZyk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFjY291bnRQcmluY2lwYWwocHJpbmNpcGFsQWNjb3VudElkKV0sXG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCddLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5hcm5Gb3JPYmplY3RzKCcqJyldLFxuICAgICAgY29uZGl0aW9uczogcHJpbmNpcGFsT3JnSWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2F3czpQcmluY2lwYWxPcmdJRCc6IHByaW5jaXBhbE9yZ0lkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBvcmdhbml6YXRpb25hbCB1bml0cyB0byBnZXRcbiAgICogdGhlIGxhbWJkYSBmdW5jdGlvbiBjb2RlIGZyb20gdGhlIGJ1Y2tldC5cbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbE9yZ1BhdGhzIFRoZSBvcmdhbml6YXRpb25hbCB1bml0IHBhdGhzIHRvIGFkZCBhY2Nlc3MgZm9yLlxuICAgKi9cbiAgcHVibGljIGFkZE9yZ091QWNjZXNzUG9saWN5KHByaW5jaXBhbE9yZ1BhdGhzOiBzdHJpbmdbXSk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLlN0YXJQcmluY2lwYWxdLFxuICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnXSxcbiAgICAgIHJlc291cmNlczogW3RoaXMuYXJuRm9yT2JqZWN0cygnKicpXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nTGlrZToge1xuICAgICAgICAgICdhd3M6UHJpbmNpcGFsT3JnUGF0aHMnOiBwcmluY2lwYWxPcmdQYXRocyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkpO1xuICB9XG59O1xuIl19