UNPKG

@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
"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