@renovosolutions/cdk-library-aws-ses-smtp-credentials
Version:
AWS CDK Construct Library for generating SMTP credentials for SES and storing them in Secrets Manager
123 lines • 18.5 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SesSmtpCredentials = 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 SesSmtpCredentials extends constructs_1.Construct {
/**
* Constructs a new instance of the SesSmtpCredentials class.
*
* @param scope the parent construct
* @param id the construct id
* @param props the properties of the SMTP credentials @see SesSmtpCredentialsProps
*/
constructor(scope, id, props) {
super(scope, id);
const secretName = `${aws_cdk_lib_1.Names.uniqueId(this)}${props.iamUserName}`;
const sesSendPolicy = new aws_cdk_lib_1.aws_iam.ManagedPolicy(this, 'SesSendPolicy', {
statements: [
new aws_cdk_lib_1.aws_iam.PolicyStatement({
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
sid: 'SesAllowSendPolicy',
actions: ['ses:SendRawEmail'],
resources: ['*'],
}),
],
});
this.iamUser = new aws_cdk_lib_1.aws_iam.User(this, 'User', {
userName: props.iamUserName,
managedPolicies: [
sesSendPolicy,
],
});
aws_cdk_lib_1.Tags.of(this.iamUser).add('CfnStackIdForSesCredLibrary', 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/CfnStackIdForSesCredLibrary': 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,
],
});
const onEventHandler = new aws_cdk_lib_1.aws_lambda.Function(this, 'OnEventHandler', {
runtime: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_14,
handler: 'index.on_event',
code: aws_cdk_lib_1.aws_lambda.Code.fromAsset(path.join(__dirname, '../lambda')),
timeout: aws_cdk_lib_1.Duration.seconds(30),
role,
});
const provider = new aws_cdk_lib_1.custom_resources.Provider(this, 'Provider', {
onEventHandler,
});
const secret = new aws_cdk_lib_1.CustomResource(this, 'SecretArn', {
serviceToken: provider.serviceToken,
properties: {
UserName: props.iamUserName,
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,
...(props.rotationVersion !== undefined && { RotationVersion: props.rotationVersion }),
},
});
secret.node.addDependency(this.iamUser);
this.secret = aws_cdk_lib_1.aws_secretsmanager.Secret.fromSecretCompleteArn(this, 'Secret', secret.getAttString('SecretArn'));
if (props.secretResourcePolicy) {
new aws_cdk_lib_1.aws_secretsmanager.CfnResourcePolicy(this, 'SecretResourcePolicy', {
secretId: this.secret.secretArn,
resourcePolicy: props.secretResourcePolicy.toString(),
});
}
}
}
exports.SesSmtpCredentials = SesSmtpCredentials;
_a = JSII_RTTI_SYMBOL_1;
SesSmtpCredentials[_a] = { fqn: "@renovosolutions/cdk-library-aws-ses-smtp-credentials.SesSmtpCredentials", version: "0.0.113" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUFDN0IsNkNBV3FCO0FBQ3JCLDJDQUF1QztBQWtEdkMsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUztJQVUvQzs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxVQUFVLEdBQUcsR0FBRyxtQkFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakUsTUFBTSxhQUFhLEdBQUcsSUFBSSxxQkFBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ2pFLFVBQVUsRUFBRTtnQkFDVixJQUFJLHFCQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixNQUFNLEVBQUUscUJBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztvQkFDeEIsR0FBRyxFQUFFLG9CQUFvQjtvQkFDekIsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7b0JBQzdCLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztpQkFDakIsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLHFCQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDeEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzNCLGVBQWUsRUFBRTtnQkFDZixhQUFhO2FBQ2Q7U0FDRixDQUFDLENBQUM7UUFFSCxrQkFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FB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Z0JBQ3RCLE1BQU0sRUFBRSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNO2dCQUM3QixRQUFRLEVBQUUsS0FBSyxDQUFDLGVBQWUsSUFBSSxJQUFJO2dCQUN2QyxPQUFPLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJO2dCQUNwQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQ3JGLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLFNBQVMsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDdkY7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxnQ0FBYyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUU1RyxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQy9CLElBQUksZ0NBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7Z0JBQ2pFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVM7Z0JBQy9CLGNBQWMsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFO2FBQ3RELENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOztBQW5JSCxnREFvSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19rbXMgYXMga21zLFxuICBhd3NfbGFtYmRhIGFzIGxhbWJkYSxcbiAgYXdzX3NlY3JldHNtYW5hZ2VyIGFzIHNlY3JldHNtYW5hZ2VyLFxuICBjdXN0b21fcmVzb3VyY2VzIGFzIGNyLFxuICBDdXN0b21SZXNvdXJjZSxcbiAgRHVyYXRpb24sXG4gIE5hbWVzLFxuICBTdGFjayxcbiAgVGFncyxcbn0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogVGhlIHByb3BlcnRpZXMgb2YgYSBuZXcgc2V0IG9mIFNNVFAgQ3JlZGVudGlhbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNTbXRwQ3JlZGVudGlhbHNQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgSUFNIHVzZXIgdG8gY3JlYXRlXG4gICAqL1xuICByZWFkb25seSBpYW1Vc2VyTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSB0byBhcHBseSB0byB0aGUgcmVzdWx0aW5nIHNlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0UmVzb3VyY2VQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gIC8qKlxuICAgKiBJZiBhIHNlY3JldCBpcyBwZW5kaW5nIGRlbGV0aW9uIHNob3VsZCBpdCBiZSByZXN0b3JlZD9cbiAgICpcbiAgICogVGhpcyBoZWxwcyBpbiBjYXNlcyB3aGVyZSBjbG91ZGZvcm1hdGlvbiByb2xsIGJhY2tzIHB1dHMgYSBzZWNyZXQgaW4gcGVuZGluZyBkZWxldGUgc3RhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJlc3RvcmVTZWNyZXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogSWYgYSBzZWNyZXQgYWxyZWFkeSBleGlzdHMgc2hvdWxkIGl0IGJlIG92ZXJ3cml0dGVuP1xuICAgKlxuICAgKiBUaGlzIGhlbHBzIGluIGNhc2VzIHdoZXJlIGNsb3VkZm9ybWF0aW9uIGNyZWF0ZXMgYSBzZWNyZXQgc3VjY2Vzc2Z1bGx5IGJ1dCBpdCBnZXRzIG9ycGhhbmVkIGZvciBzb21lIHJlYXNvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcndyaXRlU2VjcmV0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBLTVMga2V5IHRvIHVzZSBmb3IgdGhlIHNlY3JldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQga2V5XG4gICAqL1xuICByZWFkb25seSBrbXNLZXk/OiBrbXMuSUtleTtcbiAgLyoqXG4gICAqIEluY3JlbWVudCB0aGlzIHZhbHVlIHRvIHRyaWdnZXIgcm90YXRpb24gb2YgdGhlIFNNVFAgY3JlZGVudGlhbHMuXG4gICAqIEVhY2ggY2hhbmdlIGNyZWF0ZXMgYSBuZXcgSUFNIGFjY2VzcyBrZXksIGRlcml2ZXMgYSBuZXcgU01UUCBwYXNzd29yZCxcbiAgICogdXBkYXRlcyB0aGUgc2VjcmV0LCBhbmQgZGVsZXRlcyB0aGUgb2xkIGtleS5cbiAgICpcbiAgICogV2hlbiBub3Qgc2V0LCBubyBSb3RhdGlvblZlcnNpb24gcHJvcGVydHkgaXMgaW5jbHVkZWQgaW4gdGhlIEN1c3RvbSBSZXNvdXJjZSxcbiAgICogc28gdXBncmFkaW5nIHRoZSBsaWJyYXJ5IHdpdGhvdXQgc2V0dGluZyB0aGlzIHByb3Agd2lsbCBub3QgdHJpZ2dlciBhblxuICAgKiB1bmludGVuZGVkIHJvdGF0aW9uIG9uIGV4aXN0aW5nIGRlcGxveW1lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdCBzZXQ7IG5vIHJvdGF0aW9uIHRyaWdnZXJlZCBvbiBsaWJyYXJ5IHVwZ3JhZGVcbiAgICovXG4gIHJlYWRvbmx5IHJvdGF0aW9uVmVyc2lvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFNlc1NtdHBDcmVkZW50aWFscyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgSUFNIHVzZXIgdG8gd2hpY2ggdGhlIFNNVFAgY3JlZGVudGlhbHMgYXJlIGF0dGFjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlhbVVzZXI6IGlhbS5Vc2VyO1xuICAvKipcbiAgICogVGhlIEFXUyBzZWNyZXRzIG1hbmFnZXIgc2VjcmV0IHRoYXQgY29udGFpbnMgdGhlIFNNVFAgY3JlZGVudGlhbHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0OiBzZWNyZXRzbWFuYWdlci5JU2VjcmV0O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTZXNTbXRwQ3JlZGVudGlhbHMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSB0aGUgcGFyZW50IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgdGhlIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gcHJvcHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFNNVFAgY3JlZGVudGlhbHMgQHNlZSBTZXNTbXRwQ3JlZGVudGlhbHNQcm9wc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNlc1NtdHBDcmVkZW50aWFsc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHNlY3JldE5hbWUgPSBgJHtOYW1lcy51bmlxdWVJZCh0aGlzKX0ke3Byb3BzLmlhbVVzZXJOYW1lfWA7XG5cbiAgICBjb25zdCBzZXNTZW5kUG9saWN5ID0gbmV3IGlhbS5NYW5hZ2VkUG9saWN5KHRoaXMsICdTZXNTZW5kUG9saWN5Jywge1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIHNpZDogJ1Nlc0FsbG93U2VuZFBvbGljeScsXG4gICAgICAgICAgYWN0aW9uczogWydzZXM6U2VuZFJhd0VtYWlsJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pYW1Vc2VyID0gbmV3IGlhbS5Vc2VyKHRoaXMsICdVc2VyJywge1xuICAgICAgdXNlck5hbWU6IHByb3BzLmlhbVVzZXJOYW1lLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgIHNlc1NlbmRQb2xpY3ksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgVGFncy5vZih0aGlzLmlhbVVzZXIpLmFkZCgnQ2ZuU3RhY2tJZEZvclNlc0NyZWRMaWJyYXJ5JywgU3RhY2sub2YodGhpcykuc3RhY2tJZCk7XG5cbiAgICBjb25zdCBsYW1iZGFQb2xpY3kgPSBuZXcgaWFtLk1hbmFnZWRQb2xpY3kodGhpcywgJ1NlY3JldHNNYW5hZ2VyUG9saWN5Jywge1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIHNpZDogJ1NlY3JldHNNYW5hZ2VyUG9saWN5JyxcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAnc2VjcmV0c21hbmFnZXI6UHV0U2VjcmV0VmFsdWUnLFxuICAgICAgICAgICAgJ3NlY3JldHNtYW5hZ2VyOkNyZWF0ZVNlY3JldCcsXG4gICAgICAgICAgICAnc2VjcmV0c21hbmFnZXI6RGVsZXRlU2VjcmV0JyxcbiAgICAgICAgICAgICdzZWNyZXRzbWFuYWdlcjpVcGRhdGVTZWNyZXQnLFxuICAgICAgICAgICAgJ3NlY3JldHNtYW5hZ2VyOlRhZ1Jlc291cmNlJyxcbiAgICAgICAgICAgICdzZWNyZXRzbWFuYWdlcjpSZXN0b3JlU2VjcmV0JyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOnNlY3JldHNtYW5hZ2VyOiR7U3RhY2sub2YodGhpcykucmVnaW9ufToke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnNlY3JldDoke3NlY3JldE5hbWV9LSpgXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgc2lkOiAnSWFtQWxsb3dLZXlNYW5hZ2VtZW50UG9saWN5JyxcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAnaWFtOkNyZWF0ZUFjY2Vzc0tleScsXG4gICAgICAgICAgICAnaWFtOkRlbGV0ZUFjY2Vzc0tleScsXG4gICAgICAgICAgICAnaWFtOkxpc3RBY2Nlc3NLZXlzJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAgICdpYW06UmVzb3VyY2VUYWcvQ2ZuU3RhY2tJZEZvclNlc0NyZWRMaWJyYXJ5JzogU3RhY2sub2YodGhpcykuc3RhY2tJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmttc0tleSkge1xuICAgICAgbGFtYmRhUG9saWN5LmFkZFN0YXRlbWVudHMobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIHNpZDogJ0ttc0FsbG93S2V5TWFuYWdlbWVudFBvbGljeScsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAna21zOkVuY3J5cHQnLFxuICAgICAgICAgICdrbXM6RGVjcnlwdCcsXG4gICAgICAgICAgJ2ttczpSZUVuY3J5cHQqJyxcbiAgICAgICAgICAna21zOkdlbmVyYXRlRGF0YUtleSonLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtwcm9wcy5rbXNLZXkua2V5QXJuXSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgbGFtYmRhUG9saWN5LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG9uRXZlbnRIYW5kbGVyID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnT25FdmVudEhhbmRsZXInLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xNCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5vbl9ldmVudCcsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYScpKSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMzApLFxuICAgICAgcm9sZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNyLlByb3ZpZGVyKHRoaXMsICdQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VjcmV0ID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdTZWNyZXRBcm4nLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgVXNlck5hbWU6IHByb3BzLmlhbVVzZXJOYW1lLFxuICAgICAgICBTZWNyZXROYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICBSZWdpb246IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbixcbiAgICAgICAgT3ZlcnJpZGU6IHByb3BzLm92ZXJ3cml0ZVNlY3JldCA/PyB0cnVlLFxuICAgICAgICBSZXN0b3JlOiBwcm9wcy5yZXN0b3JlU2VjcmV0ID8/IHRydWUsXG4gICAgICAgIEttc0tleUlkOiBwcm9wcy5rbXNLZXkgPT0gdW5kZWZpbmVkID8gJ2FsaWFzL2F3cy9zZWNyZXRzbWFuYWdlcicgOiBwcm9wcy5rbXNLZXkua2V5SWQsXG4gICAgICAgIC4uLihwcm9wcy5yb3RhdGlvblZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiB7IFJvdGF0aW9uVmVyc2lvbjogcHJvcHMucm90YXRpb25WZXJzaW9uIH0pLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlY3JldC5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5pYW1Vc2VyKTtcblxuICAgIHRoaXMuc2VjcmV0ID0gc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXRDb21wbGV0ZUFybih0aGlzLCAnU2VjcmV0Jywgc2VjcmV0LmdldEF0dFN0cmluZygnU2VjcmV0QXJuJykpO1xuXG4gICAgaWYgKHByb3BzLnNlY3JldFJlc291cmNlUG9saWN5KSB7XG4gICAgICBuZXcgc2VjcmV0c21hbmFnZXIuQ2ZuUmVzb3VyY2VQb2xpY3kodGhpcywgJ1NlY3JldFJlc291cmNlUG9saWN5Jywge1xuICAgICAgICBzZWNyZXRJZDogdGhpcy5zZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgICByZXNvdXJjZVBvbGljeTogcHJvcHMuc2VjcmV0UmVzb3VyY2VQb2xpY3kudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19