@liflig/cdk-cloudfront-auth 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +63 -0
  3. package/dist/check-auth/index.js +2 -0
  4. package/dist/check-auth/index.js.LICENSE.txt +17 -0
  5. package/dist/generate-secret/index.js +1 -0
  6. package/dist/http-headers/index.js +2 -0
  7. package/dist/http-headers/index.js.LICENSE.txt +6 -0
  8. package/dist/parse-auth/index.js +2 -0
  9. package/dist/parse-auth/index.js.LICENSE.txt +31 -0
  10. package/dist/refresh-auth/index.js +2 -0
  11. package/dist/refresh-auth/index.js.LICENSE.txt +31 -0
  12. package/dist/sign-out/index.js +2 -0
  13. package/dist/sign-out/index.js.LICENSE.txt +17 -0
  14. package/lib/client-secret.d.ts +10 -0
  15. package/lib/client-secret.js +54 -0
  16. package/lib/client-update.d.ts +14 -0
  17. package/lib/client-update.js +59 -0
  18. package/lib/cloudfront-auth.d.ts +132 -0
  19. package/lib/cloudfront-auth.js +267 -0
  20. package/lib/generate-secret.d.ts +15 -0
  21. package/lib/generate-secret.js +71 -0
  22. package/lib/handlers/check-auth.d.ts +7 -0
  23. package/lib/handlers/generate-secret.d.ts +9 -0
  24. package/lib/handlers/http-headers.d.ts +1 -0
  25. package/lib/handlers/parse-auth.d.ts +1 -0
  26. package/lib/handlers/refresh-auth.d.ts +1 -0
  27. package/lib/handlers/sign-out.d.ts +1 -0
  28. package/lib/handlers/util/axios.d.ts +4 -0
  29. package/lib/handlers/util/axios.js +42 -0
  30. package/lib/handlers/util/base64.d.ts +8 -0
  31. package/lib/handlers/util/base64.js +26 -0
  32. package/lib/handlers/util/cloudfront.d.ts +17 -0
  33. package/lib/handlers/util/cloudfront.js +102 -0
  34. package/lib/handlers/util/config.d.ts +26 -0
  35. package/lib/handlers/util/config.js +48 -0
  36. package/lib/handlers/util/cookies.d.ts +29 -0
  37. package/lib/handlers/util/cookies.js +115 -0
  38. package/lib/handlers/util/jwt.d.ts +17 -0
  39. package/lib/handlers/util/jwt.js +59 -0
  40. package/lib/handlers/util/logger.d.ts +16 -0
  41. package/lib/handlers/util/logger.js +55 -0
  42. package/lib/handlers/util/nonce.d.ts +9 -0
  43. package/lib/handlers/util/nonce.js +47 -0
  44. package/lib/index.d.ts +2 -0
  45. package/lib/index.js +19 -0
  46. package/lib/lambdas.d.ts +33 -0
  47. package/lib/lambdas.js +88 -0
  48. package/package.json +75 -0
@@ -0,0 +1,17 @@
1
+ /*!
2
+ * cookie
3
+ * Copyright(c) 2012-2014 Roman Shtylman
4
+ * Copyright(c) 2015 Douglas Christopher Wilson
5
+ * MIT Licensed
6
+ */
7
+
8
+ /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
9
+
10
+ /**
11
+ * @license
12
+ * Lodash <https://lodash.com/>
13
+ * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
14
+ * Released under MIT license <https://lodash.com/license>
15
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
16
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
17
+ */
@@ -0,0 +1,10 @@
1
+ import * as cognito from "aws-cdk-lib/aws-cognito";
2
+ import { Construct } from "constructs";
3
+ export interface RetrieveClientSecretProps {
4
+ client: cognito.IUserPoolClient;
5
+ userPool: cognito.IUserPool;
6
+ }
7
+ export declare class RetrieveClientSecret extends Construct {
8
+ clientSecretValue: string;
9
+ constructor(scope: Construct, id: string, props: RetrieveClientSecretProps);
10
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.RetrieveClientSecret = void 0;
27
+ const iam = __importStar(require("aws-cdk-lib/aws-iam"));
28
+ const cr = __importStar(require("aws-cdk-lib/custom-resources"));
29
+ const constructs_1 = require("constructs");
30
+ class RetrieveClientSecret extends constructs_1.Construct {
31
+ constructor(scope, id, props) {
32
+ super(scope, id);
33
+ const clientSecret = new cr.AwsCustomResource(this, "Resource", {
34
+ onUpdate: {
35
+ service: "CognitoIdentityServiceProvider",
36
+ action: "describeUserPoolClient",
37
+ parameters: {
38
+ UserPoolId: props.userPool.userPoolId,
39
+ ClientId: props.client.userPoolClientId,
40
+ },
41
+ physicalResourceId: cr.PhysicalResourceId.of(`${props.userPool.userPoolId}-${props.client.userPoolClientId}`),
42
+ },
43
+ policy: cr.AwsCustomResourcePolicy.fromStatements([
44
+ new iam.PolicyStatement({
45
+ actions: ["cognito-idp:DescribeUserPoolClient"],
46
+ resources: [props.userPool.userPoolArn],
47
+ }),
48
+ ]),
49
+ });
50
+ this.clientSecretValue = clientSecret.getResponseField("UserPoolClient.ClientSecret");
51
+ }
52
+ }
53
+ exports.RetrieveClientSecret = RetrieveClientSecret;
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXNlY3JldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQtc2VjcmV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EseURBQTBDO0FBQzFDLGlFQUFrRDtBQUNsRCwyQ0FBc0M7QUFPdEMsTUFBYSxvQkFBcUIsU0FBUSxzQkFBUztJQUdqRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM5RCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGdDQUFnQztnQkFDekMsTUFBTSxFQUFFLHdCQUF3QjtnQkFDaEMsVUFBVSxFQUFFO29CQUNWLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVU7b0JBQ3JDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQjtpQkFDeEM7Z0JBQ0Qsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FDMUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQ2hFO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsRUFBRSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDaEQsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixPQUFPLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQztvQkFDL0MsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7aUJBQ3hDLENBQUM7YUFDSCxDQUFDO1NBQ0gsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDcEQsNkJBQTZCLENBQzlCLENBQUE7SUFDSCxDQUFDO0NBQ0Y7QUE5QkQsb0RBOEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29nbml0byBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNvZ25pdG9cIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIGNyIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuZXhwb3J0IGludGVyZmFjZSBSZXRyaWV2ZUNsaWVudFNlY3JldFByb3BzIHtcbiAgY2xpZW50OiBjb2duaXRvLklVc2VyUG9vbENsaWVudFxuICB1c2VyUG9vbDogY29nbml0by5JVXNlclBvb2xcbn1cblxuZXhwb3J0IGNsYXNzIFJldHJpZXZlQ2xpZW50U2VjcmV0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIGNsaWVudFNlY3JldFZhbHVlOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmV0cmlldmVDbGllbnRTZWNyZXRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGNvbnN0IGNsaWVudFNlY3JldCA9IG5ldyBjci5Bd3NDdXN0b21SZXNvdXJjZSh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiQ29nbml0b0lkZW50aXR5U2VydmljZVByb3ZpZGVyXCIsXG4gICAgICAgIGFjdGlvbjogXCJkZXNjcmliZVVzZXJQb29sQ2xpZW50XCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBVc2VyUG9vbElkOiBwcm9wcy51c2VyUG9vbC51c2VyUG9vbElkLFxuICAgICAgICAgIENsaWVudElkOiBwcm9wcy5jbGllbnQudXNlclBvb2xDbGllbnRJZCxcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjci5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgYCR7cHJvcHMudXNlclBvb2wudXNlclBvb2xJZH0tJHtwcm9wcy5jbGllbnQudXNlclBvb2xDbGllbnRJZH1gLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1wiY29nbml0by1pZHA6RGVzY3JpYmVVc2VyUG9vbENsaWVudFwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtwcm9wcy51c2VyUG9vbC51c2VyUG9vbEFybl0sXG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgfSlcblxuICAgIHRoaXMuY2xpZW50U2VjcmV0VmFsdWUgPSBjbGllbnRTZWNyZXQuZ2V0UmVzcG9uc2VGaWVsZChcbiAgICAgIFwiVXNlclBvb2xDbGllbnQuQ2xpZW50U2VjcmV0XCIsXG4gICAgKVxuICB9XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import * as cognito from "aws-cdk-lib/aws-cognito";
2
+ import { Construct } from "constructs";
3
+ interface ClientUpdateProps {
4
+ oauthScopes: string[];
5
+ client: cognito.IUserPoolClient;
6
+ userPool: cognito.IUserPool;
7
+ callbackUrl: string;
8
+ signOutUrl: string;
9
+ identityProviders: string[];
10
+ }
11
+ export declare class ClientUpdate extends Construct {
12
+ constructor(scope: Construct, id: string, props: ClientUpdateProps);
13
+ }
14
+ export {};
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ClientUpdate = void 0;
27
+ const iam = __importStar(require("aws-cdk-lib/aws-iam"));
28
+ const cr = __importStar(require("aws-cdk-lib/custom-resources"));
29
+ const constructs_1 = require("constructs");
30
+ class ClientUpdate extends constructs_1.Construct {
31
+ constructor(scope, id, props) {
32
+ super(scope, id);
33
+ new cr.AwsCustomResource(this, "Resource", {
34
+ onUpdate: {
35
+ service: "CognitoIdentityServiceProvider",
36
+ action: "updateUserPoolClient",
37
+ parameters: {
38
+ AllowedOAuthFlows: ["code"],
39
+ AllowedOAuthFlowsUserPoolClient: true,
40
+ SupportedIdentityProviders: props.identityProviders,
41
+ AllowedOAuthScopes: props.oauthScopes,
42
+ ClientId: props.client.userPoolClientId,
43
+ CallbackURLs: [props.callbackUrl],
44
+ LogoutURLs: [props.signOutUrl],
45
+ UserPoolId: props.userPool.userPoolId,
46
+ },
47
+ physicalResourceId: cr.PhysicalResourceId.of(`${props.userPool.userPoolId}-${props.client.userPoolClientId}`),
48
+ },
49
+ policy: cr.AwsCustomResourcePolicy.fromStatements([
50
+ new iam.PolicyStatement({
51
+ actions: ["cognito-idp:UpdateUserPoolClient"],
52
+ resources: [props.userPool.userPoolArn],
53
+ }),
54
+ ]),
55
+ });
56
+ }
57
+ }
58
+ exports.ClientUpdate = ClientUpdate;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXVwZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQtdXBkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EseURBQTBDO0FBQzFDLGlFQUFrRDtBQUNsRCwyQ0FBc0M7QUFXdEMsTUFBYSxZQUFhLFNBQVEsc0JBQVM7SUFDekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNoRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDekMsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxnQ0FBZ0M7Z0JBQ3pDLE1BQU0sRUFBRSxzQkFBc0I7Z0JBQzlCLFVBQVUsRUFBRTtvQkFDVixpQkFBaUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztvQkFDM0IsK0JBQStCLEVBQUUsSUFBSTtvQkFDckMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtvQkFDbkQsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQ3JDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQjtvQkFDdkMsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztvQkFDakMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztvQkFDOUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVTtpQkFDdEM7Z0JBQ0Qsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FDMUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQ2hFO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsRUFBRSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDaEQsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixPQUFPLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQztvQkFDN0MsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7aUJBQ3hDLENBQUM7YUFDSCxDQUFDO1NBQ0gsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBOUJELG9DQThCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvZ25pdG8gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2duaXRvXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBjciBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5cbmludGVyZmFjZSBDbGllbnRVcGRhdGVQcm9wcyB7XG4gIG9hdXRoU2NvcGVzOiBzdHJpbmdbXVxuICBjbGllbnQ6IGNvZ25pdG8uSVVzZXJQb29sQ2xpZW50XG4gIHVzZXJQb29sOiBjb2duaXRvLklVc2VyUG9vbFxuICBjYWxsYmFja1VybDogc3RyaW5nXG4gIHNpZ25PdXRVcmw6IHN0cmluZ1xuICBpZGVudGl0eVByb3ZpZGVyczogc3RyaW5nW11cbn1cblxuZXhwb3J0IGNsYXNzIENsaWVudFVwZGF0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbGllbnRVcGRhdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIG5ldyBjci5Bd3NDdXN0b21SZXNvdXJjZSh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiQ29nbml0b0lkZW50aXR5U2VydmljZVByb3ZpZGVyXCIsXG4gICAgICAgIGFjdGlvbjogXCJ1cGRhdGVVc2VyUG9vbENsaWVudFwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQWxsb3dlZE9BdXRoRmxvd3M6IFtcImNvZGVcIl0sXG4gICAgICAgICAgQWxsb3dlZE9BdXRoRmxvd3NVc2VyUG9vbENsaWVudDogdHJ1ZSxcbiAgICAgICAgICBTdXBwb3J0ZWRJZGVudGl0eVByb3ZpZGVyczogcHJvcHMuaWRlbnRpdHlQcm92aWRlcnMsXG4gICAgICAgICAgQWxsb3dlZE9BdXRoU2NvcGVzOiBwcm9wcy5vYXV0aFNjb3BlcyxcbiAgICAgICAgICBDbGllbnRJZDogcHJvcHMuY2xpZW50LnVzZXJQb29sQ2xpZW50SWQsXG4gICAgICAgICAgQ2FsbGJhY2tVUkxzOiBbcHJvcHMuY2FsbGJhY2tVcmxdLFxuICAgICAgICAgIExvZ291dFVSTHM6IFtwcm9wcy5zaWduT3V0VXJsXSxcbiAgICAgICAgICBVc2VyUG9vbElkOiBwcm9wcy51c2VyUG9vbC51c2VyUG9vbElkLFxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGNyLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgJHtwcm9wcy51c2VyUG9vbC51c2VyUG9vbElkfS0ke3Byb3BzLmNsaWVudC51c2VyUG9vbENsaWVudElkfWAsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXCJjb2duaXRvLWlkcDpVcGRhdGVVc2VyUG9vbENsaWVudFwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtwcm9wcy51c2VyUG9vbC51c2VyUG9vbEFybl0sXG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgfSlcbiAgfVxufVxuIl19
@@ -0,0 +1,132 @@
1
+ import * as cloudfront from "aws-cdk-lib/aws-cloudfront";
2
+ import { AddBehaviorOptions, BehaviorOptions, IOrigin } from "aws-cdk-lib/aws-cloudfront";
3
+ import * as cognito from "aws-cdk-lib/aws-cognito";
4
+ import { ClientUpdate } from "./client-update";
5
+ import { AuthLambdas } from "./lambdas";
6
+ import { Construct } from "constructs";
7
+ export interface CloudFrontAuthProps {
8
+ /**
9
+ * Cognito Client that will be used to authenticate the user.
10
+ *
11
+ * If a custom client is provided, the updateClient method cannot
12
+ * be used since we cannot know which parameters was set.
13
+ *
14
+ * @default - a new client will be generated
15
+ */
16
+ client?: cognito.UserPoolClient;
17
+ userPool: cognito.IUserPool;
18
+ /**
19
+ * The domain that is used for Cognito Auth.
20
+ *
21
+ * If not using custom domains this will be a name under amazoncognito.com.
22
+ *
23
+ * @example `${domain.domainName}.auth.${region}.amazoncognito.com`
24
+ */
25
+ cognitoAuthDomain: string;
26
+ authLambdas: AuthLambdas;
27
+ /**
28
+ * @default /auth/callback
29
+ */
30
+ callbackPath?: string;
31
+ /**
32
+ * @default /
33
+ */
34
+ signOutRedirectTo?: string;
35
+ /**
36
+ * @default /auth/sign-out
37
+ */
38
+ signOutPath?: string;
39
+ /**
40
+ * @default /auth/refresh
41
+ */
42
+ refreshAuthPath?: string;
43
+ /**
44
+ * Log level.
45
+ *
46
+ * A log level of debug will log secrets and should only be used in
47
+ * a development environment.
48
+ *
49
+ * @default warn
50
+ */
51
+ logLevel?: "none" | "error" | "warn" | "info" | "debug";
52
+ /**
53
+ * Require the user to be part of a specific Cognito group to
54
+ * access any resource.
55
+ */
56
+ requireGroupAnyOf?: string[];
57
+ }
58
+ export interface UpdateClientProps {
59
+ signOutUrl: string;
60
+ callbackUrl: string;
61
+ /**
62
+ * List of identity providers used for the client.
63
+ *
64
+ * @default - COGNITO and identity providers registered in the UserPool construct
65
+ */
66
+ identityProviders?: string[];
67
+ }
68
+ /**
69
+ * Configure previously deployed lambda functions, Cognito client
70
+ * and CloudFront distribution.
71
+ */
72
+ export declare class CloudFrontAuth extends Construct {
73
+ readonly callbackPath: string;
74
+ readonly signOutRedirectTo: string;
75
+ readonly signOutPath: string;
76
+ readonly refreshAuthPath: string;
77
+ private readonly userPool;
78
+ private readonly clientCreated;
79
+ readonly client: cognito.UserPoolClient;
80
+ private readonly checkAuthFn;
81
+ private readonly httpHeadersFn;
82
+ private readonly parseAuthFn;
83
+ private readonly refreshAuthFn;
84
+ private readonly signOutFn;
85
+ private readonly oauthScopes;
86
+ constructor(scope: Construct, id: string, props: CloudFrontAuthProps);
87
+ private createPathLambda;
88
+ /**
89
+ * Create behaviors for authentication pages:
90
+ *
91
+ * - callback page
92
+ * - refresh page
93
+ * - sign out page
94
+ *
95
+ * This is to be used with CloudFrontWebDistribution. See
96
+ * createAuthPagesBehaviors if using Distribution.
97
+ */
98
+ get authPages(): cloudfront.Behavior[];
99
+ /**
100
+ * Create behaviors for authentication pages.
101
+ *
102
+ * - callback page
103
+ * - refresh page
104
+ * - sign out page
105
+ *
106
+ * This is to be used with Distribution.
107
+ */
108
+ createAuthPagesBehaviors(origin: IOrigin, options?: AddBehaviorOptions): Record<string, BehaviorOptions>;
109
+ /**
110
+ * Create lambda function association for viewer request to check
111
+ * authentication and original response to add headers.
112
+ *
113
+ * This is to be used with CloudFrontWebDistribution. See
114
+ * createProtectedBehavior if using Distribution.
115
+ */
116
+ get authFilters(): cloudfront.LambdaFunctionAssociation[];
117
+ /**
118
+ * Create behavior that includes authorization check.
119
+ *
120
+ * This is to be used with Distribution.
121
+ */
122
+ createProtectedBehavior(origin: IOrigin, options?: AddBehaviorOptions): BehaviorOptions;
123
+ /**
124
+ * Update Cognito client to use the proper URLs and OAuth scopes.
125
+ *
126
+ * TODO: In case the client configuration changes and is updated
127
+ * by CloudFormation, this will not be reapplied causing the client
128
+ * to not be correctly configured.
129
+ * How can we avoid this scenario?
130
+ */
131
+ updateClient(id: string, props: UpdateClientProps): ClientUpdate;
132
+ }
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.CloudFrontAuth = void 0;
27
+ const cloudfront = __importStar(require("aws-cdk-lib/aws-cloudfront"));
28
+ const aws_cloudfront_1 = require("aws-cdk-lib/aws-cloudfront");
29
+ const cdk_lambda_config_1 = require("@liflig/cdk-lambda-config");
30
+ const client_secret_1 = require("./client-secret");
31
+ const client_update_1 = require("./client-update");
32
+ const generate_secret_1 = require("./generate-secret");
33
+ const constructs_1 = require("constructs");
34
+ /**
35
+ * Configure previously deployed lambda functions, Cognito client
36
+ * and CloudFront distribution.
37
+ */
38
+ class CloudFrontAuth extends constructs_1.Construct {
39
+ constructor(scope, id, props) {
40
+ var _a, _b, _c, _d, _e, _f;
41
+ super(scope, id);
42
+ this.callbackPath = (_a = props.callbackPath) !== null && _a !== void 0 ? _a : "/auth/callback";
43
+ this.signOutRedirectTo = (_b = props.signOutRedirectTo) !== null && _b !== void 0 ? _b : "/";
44
+ this.signOutPath = (_c = props.signOutPath) !== null && _c !== void 0 ? _c : "/auth/sign-out";
45
+ this.refreshAuthPath = (_d = props.refreshAuthPath) !== null && _d !== void 0 ? _d : "/auth/refresh";
46
+ this.oauthScopes = [
47
+ "phone",
48
+ "email",
49
+ "profile",
50
+ "openid",
51
+ "aws.cognito.signin.user.admin",
52
+ ];
53
+ this.userPool = props.userPool;
54
+ this.clientCreated = !props.client;
55
+ this.client =
56
+ (_e = props.client) !== null && _e !== void 0 ? _e : props.userPool.addClient("UserPoolClient", {
57
+ // Note: The following must be kept in sync with the API
58
+ // call performed in ClientUpdate.
59
+ authFlows: {
60
+ userPassword: true,
61
+ userSrp: true,
62
+ },
63
+ oAuth: {
64
+ flows: {
65
+ authorizationCodeGrant: true,
66
+ },
67
+ },
68
+ preventUserExistenceErrors: true,
69
+ generateSecret: true,
70
+ });
71
+ const nonceSigningSecret = new generate_secret_1.GenerateSecret(this, "NonceSigningSecret")
72
+ .value;
73
+ const { clientSecretValue } = new client_secret_1.RetrieveClientSecret(this, "ClientSecret", {
74
+ client: this.client,
75
+ userPool: this.userPool,
76
+ });
77
+ const config = {
78
+ httpHeaders: {
79
+ "Content-Security-Policy": "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'; connect-src 'self'",
80
+ "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload",
81
+ "Referrer-Policy": "same-origin",
82
+ "X-XSS-Protection": "1; mode=block",
83
+ "X-Frame-Options": "DENY",
84
+ "X-Content-Type-Options": "nosniff",
85
+ "Cache-Control": "no-cache",
86
+ },
87
+ logLevel: (_f = props.logLevel) !== null && _f !== void 0 ? _f : "warn",
88
+ userPoolId: this.userPool.userPoolId,
89
+ clientId: this.client.userPoolClientId,
90
+ clientSecret: clientSecretValue,
91
+ oauthScopes: this.oauthScopes,
92
+ cognitoAuthDomain: props.cognitoAuthDomain,
93
+ callbackPath: this.callbackPath,
94
+ signOutRedirectTo: this.signOutRedirectTo,
95
+ signOutPath: this.signOutPath,
96
+ refreshAuthPath: this.refreshAuthPath,
97
+ requireGroupAnyOf: props.requireGroupAnyOf,
98
+ cookieSettings: {
99
+ /*
100
+ spaMode - consider if this should be supported
101
+ idToken: "Path=/; Secure; SameSite=Lax",
102
+ accessToken: "Path=/; Secure; SameSite=Lax",
103
+ refreshToken: "Path=/; Secure; SameSite=Lax",
104
+ nonce: "Path=/; Secure; HttpOnly; SameSite=Lax",
105
+ */
106
+ idToken: "Path=/; Secure; HttpOnly; SameSite=Lax",
107
+ accessToken: "Path=/; Secure; HttpOnly; SameSite=Lax",
108
+ refreshToken: "Path=/; Secure; HttpOnly; SameSite=Lax",
109
+ nonce: "Path=/; Secure; HttpOnly; SameSite=Lax",
110
+ },
111
+ nonceSigningSecret,
112
+ };
113
+ this.checkAuthFn = new cdk_lambda_config_1.LambdaConfig(this, "CheckAuthFn", {
114
+ function: props.authLambdas.checkAuthFn.get(this, "CheckAuthFnImport"),
115
+ config,
116
+ }).version;
117
+ this.httpHeadersFn = new cdk_lambda_config_1.LambdaConfig(this, "HttpHeadersFn", {
118
+ function: props.authLambdas.httpHeadersFn.get(this, "HttpHeadersFnImport"),
119
+ config,
120
+ }).version;
121
+ this.parseAuthFn = new cdk_lambda_config_1.LambdaConfig(this, "ParseAuthFn", {
122
+ function: props.authLambdas.parseAuthFn.get(this, "ParseAuthFnImport"),
123
+ config,
124
+ }).version;
125
+ this.refreshAuthFn = new cdk_lambda_config_1.LambdaConfig(this, "RefreshAuthFn", {
126
+ function: props.authLambdas.refreshAuthFn.get(this, "RefreshAuthFnImport"),
127
+ config,
128
+ }).version;
129
+ this.signOutFn = new cdk_lambda_config_1.LambdaConfig(this, "SignOutFn", {
130
+ function: props.authLambdas.signOutFn.get(this, "SignOutFnImport"),
131
+ config,
132
+ }).version;
133
+ }
134
+ createPathLambda(path, fn) {
135
+ return {
136
+ pathPattern: path,
137
+ forwardedValues: {
138
+ queryString: true,
139
+ },
140
+ lambdaFunctionAssociations: [
141
+ {
142
+ eventType: cloudfront.LambdaEdgeEventType.VIEWER_REQUEST,
143
+ lambdaFunction: fn,
144
+ },
145
+ ],
146
+ };
147
+ }
148
+ /**
149
+ * Create behaviors for authentication pages:
150
+ *
151
+ * - callback page
152
+ * - refresh page
153
+ * - sign out page
154
+ *
155
+ * This is to be used with CloudFrontWebDistribution. See
156
+ * createAuthPagesBehaviors if using Distribution.
157
+ */
158
+ get authPages() {
159
+ return [
160
+ this.createPathLambda(this.callbackPath, this.parseAuthFn),
161
+ this.createPathLambda(this.refreshAuthPath, this.refreshAuthFn),
162
+ this.createPathLambda(this.signOutPath, this.signOutFn),
163
+ ];
164
+ }
165
+ /**
166
+ * Create behaviors for authentication pages.
167
+ *
168
+ * - callback page
169
+ * - refresh page
170
+ * - sign out page
171
+ *
172
+ * This is to be used with Distribution.
173
+ */
174
+ createAuthPagesBehaviors(origin, options) {
175
+ function path(path, fn) {
176
+ return {
177
+ [path]: {
178
+ origin,
179
+ compress: true,
180
+ viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
181
+ edgeLambdas: [
182
+ {
183
+ eventType: cloudfront.LambdaEdgeEventType.VIEWER_REQUEST,
184
+ functionVersion: fn,
185
+ },
186
+ ],
187
+ ...options,
188
+ },
189
+ };
190
+ }
191
+ return {
192
+ ...path(this.callbackPath, this.parseAuthFn),
193
+ ...path(this.refreshAuthPath, this.refreshAuthFn),
194
+ ...path(this.signOutPath, this.signOutFn),
195
+ };
196
+ }
197
+ /**
198
+ * Create lambda function association for viewer request to check
199
+ * authentication and original response to add headers.
200
+ *
201
+ * This is to be used with CloudFrontWebDistribution. See
202
+ * createProtectedBehavior if using Distribution.
203
+ */
204
+ get authFilters() {
205
+ return [
206
+ {
207
+ eventType: cloudfront.LambdaEdgeEventType.VIEWER_REQUEST,
208
+ lambdaFunction: this.checkAuthFn,
209
+ },
210
+ {
211
+ eventType: cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE,
212
+ lambdaFunction: this.httpHeadersFn,
213
+ },
214
+ ];
215
+ }
216
+ /**
217
+ * Create behavior that includes authorization check.
218
+ *
219
+ * This is to be used with Distribution.
220
+ */
221
+ createProtectedBehavior(origin, options) {
222
+ if ((options === null || options === void 0 ? void 0 : options.edgeLambdas) != null) {
223
+ throw Error("User-defined edgeLambdas is currently not supported");
224
+ }
225
+ return {
226
+ origin,
227
+ compress: true,
228
+ viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
229
+ edgeLambdas: [
230
+ {
231
+ eventType: cloudfront.LambdaEdgeEventType.VIEWER_REQUEST,
232
+ functionVersion: this.checkAuthFn,
233
+ },
234
+ {
235
+ eventType: cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE,
236
+ functionVersion: this.httpHeadersFn,
237
+ },
238
+ ],
239
+ ...options,
240
+ };
241
+ }
242
+ /**
243
+ * Update Cognito client to use the proper URLs and OAuth scopes.
244
+ *
245
+ * TODO: In case the client configuration changes and is updated
246
+ * by CloudFormation, this will not be reapplied causing the client
247
+ * to not be correctly configured.
248
+ * How can we avoid this scenario?
249
+ */
250
+ updateClient(id, props) {
251
+ var _a;
252
+ if (!this.clientCreated) {
253
+ throw new Error("You cannot use updateClient with a user-provided Cognito Client " +
254
+ "since it would override the user-provided settings");
255
+ }
256
+ return new client_update_1.ClientUpdate(this, id, {
257
+ client: this.client,
258
+ userPool: this.userPool,
259
+ signOutUrl: props.signOutUrl,
260
+ callbackUrl: props.callbackUrl,
261
+ oauthScopes: this.oauthScopes,
262
+ identityProviders: (_a = props.identityProviders) !== null && _a !== void 0 ? _a : ["COGNITO"].concat(this.userPool.identityProviders.map((it) => it.providerName)),
263
+ });
264
+ }
265
+ }
266
+ exports.CloudFrontAuth = CloudFrontAuth;
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmcm9udC1hdXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nsb3VkZnJvbnQtYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVFQUF3RDtBQUN4RCwrREFLbUM7QUFJbkMsaUVBQXdEO0FBQ3hELG1EQUFzRDtBQUN0RCxtREFBOEM7QUFDOUMsdURBQWtEO0FBR2xELDJDQUFzQztBQWlFdEM7OztHQUdHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFrQjNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7O1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFBLEtBQUssQ0FBQyxZQUFZLG1DQUFJLGdCQUFnQixDQUFBO1FBQzFELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFBLEtBQUssQ0FBQyxpQkFBaUIsbUNBQUksR0FBRyxDQUFBO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBQSxLQUFLLENBQUMsV0FBVyxtQ0FBSSxnQkFBZ0IsQ0FBQTtRQUN4RCxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQUEsS0FBSyxDQUFDLGVBQWUsbUNBQUksZUFBZSxDQUFBO1FBRS9ELElBQUksQ0FBQyxXQUFXLEdBQUc7WUFDakIsT0FBTztZQUNQLE9BQU87WUFDUCxTQUFTO1lBQ1QsUUFBUTtZQUNSLCtCQUErQjtTQUNoQyxDQUFBO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFBO1FBRTlCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxNQUFNO1lBQ1QsTUFBQSxLQUFLLENBQUMsTUFBTSxtQ0FDWixLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDekMs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QVcsRUFBRTtnQkFDWDtvQkFDRSxTQUFTLEVBQUUsVUFBVSxDQUFDLG1CQUFtQixDQUFDLGNBQWM7b0JBQ3hELGVBQWUsRUFBRSxJQUFJLENBQUMsV0FBVztpQkFDbEM7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlO29CQUN6RCxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWE7aUJBQ3BDO2FBQ0Y7WUFDRCxHQUFHLE9BQU87U0FDWCxDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxZQUFZLENBQUMsRUFBVSxFQUFFLEtBQXdCOztRQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUNiLGtFQUFrRTtnQkFDaEUsb0RBQW9ELENBQ3ZELENBQUE7U0FDRjtRQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixpQkFBaUIsRUFDZixNQUFBLEtBQUssQ0FBQyxpQkFBaUIsbUNBQ3ZCLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUM3RDtTQUNKLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRjtBQW5TRCx3Q0FtU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjbG91ZGZyb250IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiXG5pbXBvcnQge1xuICBBZGRCZWhhdmlvck9wdGlvbnMsXG4gIEJlaGF2aW9yT3B0aW9ucyxcbiAgSU9yaWdpbixcbiAgVmlld2VyUHJvdG9jb2xQb2xpY3ksXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiXG5pbXBvcnQgKiBhcyBjb2duaXRvIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29nbml0b1wiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0IHsgSVZlcnNpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgeyBMYW1iZGFDb25maWcgfSBmcm9tIFwiQGxpZmxpZy9jZGstbGFtYmRhLWNvbmZpZ1wiXG5pbXBvcnQgeyBSZXRyaWV2ZUNsaWVudFNlY3JldCB9IGZyb20gXCIuL2NsaWVudC1zZWNyZXRcIlxuaW1wb3J0IHsgQ2xpZW50VXBkYXRlIH0gZnJvbSBcIi4vY2xpZW50LXVwZGF0ZVwiXG5pbXBvcnQgeyBHZW5lcmF0ZVNlY3JldCB9IGZyb20gXCIuL2dlbmVyYXRlLXNlY3JldFwiXG5pbXBvcnQgeyBTdG9yZWRDb25maWcgfSBmcm9tIFwiLi9oYW5kbGVycy91dGlsL2NvbmZpZ1wiXG5pbXBvcnQgeyBBdXRoTGFtYmRhcyB9IGZyb20gXCIuL2xhbWJkYXNcIlxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnJvbnRBdXRoUHJvcHMge1xuICAvKipcbiAgICogQ29nbml0byBDbGllbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLlxuICAgKlxuICAgKiBJZiBhIGN1c3RvbSBjbGllbnQgaXMgcHJvdmlkZWQsIHRoZSB1cGRhdGVDbGllbnQgbWV0aG9kIGNhbm5vdFxuICAgKiBiZSB1c2VkIHNpbmNlIHdlIGNhbm5vdCBrbm93IHdoaWNoIHBhcmFtZXRlcnMgd2FzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5ldyBjbGllbnQgd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICovXG4gIGNsaWVudD86IGNvZ25pdG8uVXNlclBvb2xDbGllbnRcbiAgdXNlclBvb2w6IGNvZ25pdG8uSVVzZXJQb29sXG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIHRoYXQgaXMgdXNlZCBmb3IgQ29nbml0byBBdXRoLlxuICAgKlxuICAgKiBJZiBub3QgdXNpbmcgY3VzdG9tIGRvbWFpbnMgdGhpcyB3aWxsIGJlIGEgbmFtZSB1bmRlciBhbWF6b25jb2duaXRvLmNvbS5cbiAgICpcbiAgICogQGV4YW1wbGUgYCR7ZG9tYWluLmRvbWFpbk5hbWV9LmF1dGguJHtyZWdpb259LmFtYXpvbmNvZ25pdG8uY29tYFxuICAgKi9cbiAgY29nbml0b0F1dGhEb21haW46IHN0cmluZ1xuICBhdXRoTGFtYmRhczogQXV0aExhbWJkYXNcbiAgLyoqXG4gICAqIEBkZWZhdWx0IC9hdXRoL2NhbGxiYWNrXG4gICAqL1xuICBjYWxsYmFja1BhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEBkZWZhdWx0IC9cbiAgICovXG4gIHNpZ25PdXRSZWRpcmVjdFRvPzogc3RyaW5nXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAvYXV0aC9zaWduLW91dFxuICAgKi9cbiAgc2lnbk91dFBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEBkZWZhdWx0IC9hdXRoL3JlZnJlc2hcbiAgICovXG4gIHJlZnJlc2hBdXRoUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogTG9nIGxldmVsLlxuICAgKlxuICAgKiBBIGxvZyBsZXZlbCBvZiBkZWJ1ZyB3aWxsIGxvZyBzZWNyZXRzIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGluXG4gICAqIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHdhcm5cbiAgICovXG4gIGxvZ0xldmVsPzogXCJub25lXCIgfCBcImVycm9yXCIgfCBcIndhcm5cIiB8IFwiaW5mb1wiIHwgXCJkZWJ1Z1wiXG4gIC8qKlxuICAgKiBSZXF1aXJlIHRoZSB1c2VyIHRvIGJlIHBhcnQgb2YgYSBzcGVjaWZpYyBDb2duaXRvIGdyb3VwIHRvXG4gICAqIGFjY2VzcyBhbnkgcmVzb3VyY2UuXG4gICAqL1xuICByZXF1aXJlR3JvdXBBbnlPZj86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ2xpZW50UHJvcHMge1xuICBzaWduT3V0VXJsOiBzdHJpbmdcbiAgY2FsbGJhY2tVcmw6IHN0cmluZ1xuICAvKipcbiAgICogTGlzdCBvZiBpZGVudGl0eSBwcm92aWRlcnMgdXNlZCBmb3IgdGhlIGNsaWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBDT0dOSVRPIGFuZCBpZGVudGl0eSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBpbiB0aGUgVXNlclBvb2wgY29uc3RydWN0XG4gICAqL1xuICBpZGVudGl0eVByb3ZpZGVycz86IHN0cmluZ1tdXG59XG5cbi8qKlxuICogQ29uZmlndXJlIHByZXZpb3VzbHkgZGVwbG95ZWQgbGFtYmRhIGZ1bmN0aW9ucywgQ29nbml0byBjbGllbnRcbiAqIGFuZCBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkRnJvbnRBdXRoIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGNhbGxiYWNrUGF0aDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBzaWduT3V0UmVkaXJlY3RUbzogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBzaWduT3V0UGF0aDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSByZWZyZXNoQXV0aFBhdGg6IHN0cmluZ1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlclBvb2w6IGNvZ25pdG8uSVVzZXJQb29sXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50Q3JlYXRlZDogYm9vbGVhblxuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBjb2duaXRvLlVzZXJQb29sQ2xpZW50XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGVja0F1dGhGbjogbGFtYmRhLklWZXJzaW9uXG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cEhlYWRlcnNGbjogbGFtYmRhLklWZXJzaW9uXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyc2VBdXRoRm46IGxhbWJkYS5JVmVyc2lvblxuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hBdXRoRm46IGxhbWJkYS5JVmVyc2lvblxuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25PdXRGbjogbGFtYmRhLklWZXJzaW9uXG5cbiAgcHJpdmF0ZSByZWFkb25seSBvYXV0aFNjb3Blczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2xvdWRGcm9udEF1dGhQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMuY2FsbGJhY2tQYXRoID0gcHJvcHMuY2FsbGJhY2tQYXRoID8/IFwiL2F1dGgvY2FsbGJhY2tcIlxuICAgIHRoaXMuc2lnbk91dFJlZGlyZWN0VG8gPSBwcm9wcy5zaWduT3V0UmVkaXJlY3RUbyA/PyBcIi9cIlxuICAgIHRoaXMuc2lnbk91dFBhdGggPSBwcm9wcy5zaWduT3V0UGF0aCA/PyBcIi9hdXRoL3NpZ24tb3V0XCJcbiAgICB0aGlzLnJlZnJlc2hBdXRoUGF0aCA9IHByb3BzLnJlZnJlc2hBdXRoUGF0aCA/PyBcIi9hdXRoL3JlZnJlc2hcIlxuXG4gICAgdGhpcy5vYXV0aFNjb3BlcyA9IFtcbiAgICAgIFwicGhvbmVcIixcbiAgICAgIFwiZW1haWxcIixcbiAgICAgIFwicHJvZmlsZVwiLFxuICAgICAgXCJvcGVuaWRcIixcbiAgICAgIFwiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW5cIixcbiAgICBdXG5cbiAgICB0aGlzLnVzZXJQb29sID0gcHJvcHMudXNlclBvb2xcblxuICAgIHRoaXMuY2xpZW50Q3JlYXRlZCA9ICFwcm9wcy5jbGllbnRcbiAgICB0aGlzLmNsaWVudCA9XG4gICAgICBwcm9wcy5jbGllbnQgPz9cbiAgICAgIHByb3BzLnVzZXJQb29sLmFkZENsaWVudChcIlVzZXJQb29sQ2xpZW50XCIsIHtcbiAgICAgICAgLy8gTm90ZTogVGhlIGZvbGxvd2luZyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBBUElcbiAgICAgICAgLy8gY2FsbCBwZXJmb3JtZWQgaW4gQ2xpZW50VXBkYXRlLlxuICAgICAgICBhdXRoRmxvd3M6IHtcbiAgICAgICAgICB1c2VyUGFzc3dvcmQ6IHRydWUsXG4gICAgICAgICAgdXNlclNycDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgb0F1dGg6IHtcbiAgICAgICAgICBmbG93czoge1xuICAgICAgICAgICAgYXV0aG9yaXphdGlvbkNvZGVHcmFudDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwcmV2ZW50VXNlckV4aXN0ZW5jZUVycm9yczogdHJ1ZSxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXQ6IHRydWUsXG4gICAgICB9KVxuXG4gICAgY29uc3Qgbm9uY2VTaWduaW5nU2VjcmV0ID0gbmV3IEdlbmVyYXRlU2VjcmV0KHRoaXMsIFwiTm9uY2VTaWduaW5nU2VjcmV0XCIpXG4gICAgICAudmFsdWVcblxuICAgIGNvbnN0IHsgY2xpZW50U2VjcmV0VmFsdWUgfSA9IG5ldyBSZXRyaWV2ZUNsaWVudFNlY3JldChcbiAgICAgIHRoaXMsXG4gICAgICBcIkNsaWVudFNlY3JldFwiLFxuICAgICAge1xuICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICB1c2VyUG9vbDogdGhpcy51c2VyUG9vbCxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgY29uc3QgY29uZmlnOiBTdG9yZWRDb25maWcgPSB7XG4gICAgICBodHRwSGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5XCI6XG4gICAgICAgICAgXCJkZWZhdWx0LXNyYyAnbm9uZSc7IGltZy1zcmMgJ3NlbGYnOyBzY3JpcHQtc3JjICdzZWxmJzsgc3R5bGUtc3JjICdzZWxmJyAndW5zYWZlLWlubGluZSc7IG9iamVjdC1zcmMgJ25vbmUnOyBjb25uZWN0LXNyYyAnc2VsZidcIixcbiAgICAgICAgXCJTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5XCI6XG4gICAgICAgICAgXCJtYXgtYWdlPTMxNTM2MDAwOyBpbmNsdWRlU3ViZG9tYWluczsgcHJlbG9hZFwiLFxuICAgICAgICBcIlJlZmVycmVyLVBvbGljeVwiOiBcInNhbWUtb3JpZ2luXCIsXG4gICAgICAgIFwiWC1YU1MtUHJvdGVjdGlvblwiOiBcIjE7IG1vZGU9YmxvY2tcIixcbiAgICAgICAgXCJYLUZyYW1lLU9wdGlvbnNcIjogXCJERU5ZXCIsXG4gICAgICAgIFwiWC1Db250ZW50LVR5cGUtT3B0aW9uc1wiOiBcIm5vc25pZmZcIixcbiAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tY2FjaGVcIixcbiAgICAgIH0sXG4gICAgICBsb2dMZXZlbDogcHJvcHMubG9nTGV2ZWwgPz8gXCJ3YXJuXCIsXG4gICAgICB1c2VyUG9vbElkOiB0aGlzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnQudXNlclBvb2xDbGllbnRJZCxcbiAgICAgIGNsaWVudFNlY3JldDogY2xpZW50U2VjcmV0VmFsdWUsXG4gICAgICBvYXV0aFNjb3BlczogdGhpcy5vYXV0aFNjb3BlcyxcbiAgICAgIGNvZ25pdG9BdXRoRG9tYWluOiBwcm9wcy5jb2duaXRvQXV0aERvbWFpbixcbiAgICAgIGNhbGxiYWNrUGF0aDogdGhpcy5jYWxsYmFja1BhdGgsXG4gICAgICBzaWduT3V0UmVkaXJlY3RUbzogdGhpcy5zaWduT3V0UmVkaXJlY3RUbyxcbiAgICAgIHNpZ25PdXRQYXRoOiB0aGlzLnNpZ25PdXRQYXRoLFxuICAgICAgcmVmcmVzaEF1dGhQYXRoOiB0aGlzLnJlZnJlc2hBdXRoUGF0aCxcbiAgICAgIHJlcXVpcmVHcm91cEFueU9mOiBwcm9wcy5yZXF1aXJlR3JvdXBBbnlPZixcbiAgICAgIGNvb2tpZVNldHRpbmdzOiB7XG4gICAgICAgIC8qXG4gICAgICAgIHNwYU1vZGUgLSBjb25zaWRlciBpZiB0aGlzIHNob3VsZCBiZSBzdXBwb3J0ZWRcbiAgICAgICAgaWRUb2tlbjogXCJQYXRoPS87IFNlY3VyZTsgU2FtZVNpdGU9TGF4XCIsXG4gICAgICAgIGFjY2Vzc1Rva2VuOiBcIlBhdGg9LzsgU2VjdXJlOyBTYW1lU2l0ZT1MYXhcIixcbiAgICAgICAgcmVmcmVzaFRva2VuOiBcIlBhdGg9LzsgU2VjdXJlOyBTYW1lU2l0ZT1MYXhcIixcbiAgICAgICAgbm9uY2U6IFwiUGF0aD0vOyBTZWN1cmU7IEh0dHBPbmx5OyBTYW1lU2l0ZT1MYXhcIixcbiAgICAgICAgKi9cbiAgICAgICAgaWRUb2tlbjogXCJQYXRoPS87IFNlY3VyZTsgSHR0cE9ubHk7IFNhbWVTaXRlPUxheFwiLFxuICAgICAgICBhY2Nlc3NUb2tlbjogXCJQYXRoPS87IFNlY3VyZTsgSHR0cE9ubHk7IFNhbWVTaXRlPUxheFwiLFxuICAgICAgICByZWZyZXNoVG9rZW46IFwiUGF0aD0vOyBTZWN1cmU7IEh0dHBPbmx5OyBTYW1lU2l0ZT1MYXhcIixcbiAgICAgICAgbm9uY2U6IFwiUGF0aD0vOyBTZWN1cmU7IEh0dHBPbmx5OyBTYW1lU2l0ZT1MYXhcIixcbiAgICAgIH0sXG4gICAgICBub25jZVNpZ25pbmdTZWNyZXQsXG4gICAgfVxuXG4gICAgdGhpcy5jaGVja0F1dGhGbiA9IG5ldyBMYW1iZGFDb25maWcodGhpcywgXCJDaGVja0F1dGhGblwiLCB7XG4gICAgICBmdW5jdGlvbjogcHJvcHMuYXV0aExhbWJkYXMuY2hlY2tBdXRoRm4uZ2V0KHRoaXMsIFwiQ2hlY2tBdXRoRm5JbXBvcnRcIiksXG4gICAgICBjb25maWcsXG4gICAgfSkudmVyc2lvblxuXG4gICAgdGhpcy5odHRwSGVhZGVyc0ZuID0gbmV3IExhbWJkYUNvbmZpZyh0aGlzLCBcIkh0dHBIZWFkZXJzRm5cIiwge1xuICAgICAgZnVuY3Rpb246IHByb3BzLmF1dGhMYW1iZGFzLmh0dHBIZWFkZXJzRm4uZ2V0KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkh0dHBIZWFkZXJzRm5JbXBvcnRcIixcbiAgICAgICksXG4gICAgICBjb25maWcsXG4gICAgfSkudmVyc2lvblxuXG4gICAgdGhpcy5wYXJzZUF1dGhGbiA9IG5ldyBMYW1iZGFDb25maWcodGhpcywgXCJQYXJzZUF1dGhGblwiLCB7XG4gICAgICBmdW5jdGlvbjogcHJvcHMuYXV0aExhbWJkYXMucGFyc2VBdXRoRm4uZ2V0KHRoaXMsIFwiUGFyc2VBdXRoRm5JbXBvcnRcIiksXG4gICAgICBjb25maWcsXG4gICAgfSkudmVyc2lvblxuXG4gICAgdGhpcy5yZWZyZXNoQXV0aEZuID0gbmV3IExhbWJkYUNvbmZpZyh0aGlzLCBcIlJlZnJlc2hBdXRoRm5cIiwge1xuICAgICAgZnVuY3Rpb246IHByb3BzLmF1dGhMYW1iZGFzLnJlZnJlc2hBdXRoRm4uZ2V0KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlJlZnJlc2hBdXRoRm5JbXBvcnRcIixcbiAgICAgICksXG4gICAgICBjb25maWcsXG4gICAgfSkudmVyc2lvblxuXG4gICAgdGhpcy5zaWduT3V0Rm4gPSBuZXcgTGFtYmRhQ29uZmlnKHRoaXMsIFwiU2lnbk91dEZuXCIsIHtcbiAgICAgIGZ1bmN0aW9uOiBwcm9wcy5hdXRoTGFtYmRhcy5zaWduT3V0Rm4uZ2V0KHRoaXMsIFwiU2lnbk91dEZuSW1wb3J0XCIpLFxuICAgICAgY29uZmlnLFxuICAgIH0pLnZlcnNpb25cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGF0aExhbWJkYShcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZm46IGxhbWJkYS5JVmVyc2lvbixcbiAgKTogY2xvdWRmcm9udC5CZWhhdmlvciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhQYXR0ZXJuOiBwYXRoLFxuICAgICAgZm9yd2FyZGVkVmFsdWVzOiB7XG4gICAgICAgIHF1ZXJ5U3RyaW5nOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGxhbWJkYUZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGU6IGNsb3VkZnJvbnQuTGFtYmRhRWRnZUV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogZm4sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYmVoYXZpb3JzIGZvciBhdXRoZW50aWNhdGlvbiBwYWdlczpcbiAgICpcbiAgICogLSBjYWxsYmFjayBwYWdlXG4gICAqIC0gcmVmcmVzaCBwYWdlXG4gICAqIC0gc2lnbiBvdXQgcGFnZVxuICAgKlxuICAgKiBUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCBDbG91ZEZyb250V2ViRGlzdHJpYnV0aW9uLiBTZWVcbiAgICogY3JlYXRlQXV0aFBhZ2VzQmVoYXZpb3JzIGlmIHVzaW5nIERpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgYXV0aFBhZ2VzKCk6IGNsb3VkZnJvbnQuQmVoYXZpb3JbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlUGF0aExhbWJkYSh0aGlzLmNhbGxiYWNrUGF0aCwgdGhpcy5wYXJzZUF1dGhGbiksXG4gICAgICB0aGlzLmNyZWF0ZVBhdGhMYW1iZGEodGhpcy5yZWZyZXNoQXV0aFBhdGgsIHRoaXMucmVmcmVzaEF1dGhGbiksXG4gICAgICB0aGlzLmNyZWF0ZVBhdGhMYW1iZGEodGhpcy5zaWduT3V0UGF0aCwgdGhpcy5zaWduT3V0Rm4pLFxuICAgIF1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYmVoYXZpb3JzIGZvciBhdXRoZW50aWNhdGlvbiBwYWdlcy5cbiAgICpcbiAgICogLSBjYWxsYmFjayBwYWdlXG4gICAqIC0gcmVmcmVzaCBwYWdlXG4gICAqIC0gc2lnbiBvdXQgcGFnZVxuICAgKlxuICAgKiBUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCBEaXN0cmlidXRpb24uXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlQXV0aFBhZ2VzQmVoYXZpb3JzKFxuICAgIG9yaWdpbjogSU9yaWdpbixcbiAgICBvcHRpb25zPzogQWRkQmVoYXZpb3JPcHRpb25zLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICBmdW5jdGlvbiBwYXRoKHBhdGg6IHN0cmluZywgZm46IElWZXJzaW9uKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbcGF0aF06IHtcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICAgIGVkZ2VMYW1iZGFzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogY2xvdWRmcm9udC5MYW1iZGFFZGdlRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICAgICAgICAgICBmdW5jdGlvblZlcnNpb246IGZuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhdGgodGhpcy5jYWxsYmFja1BhdGgsIHRoaXMucGFyc2VBdXRoRm4pLFxuICAgICAgLi4ucGF0aCh0aGlzLnJlZnJlc2hBdXRoUGF0aCwgdGhpcy5yZWZyZXNoQXV0aEZuKSxcbiAgICAgIC4uLnBhdGgodGhpcy5zaWduT3V0UGF0aCwgdGhpcy5zaWduT3V0Rm4pLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbGFtYmRhIGZ1bmN0aW9uIGFzc29jaWF0aW9uIGZvciB2aWV3ZXIgcmVxdWVzdCB0byBjaGVja1xuICAgKiBhdXRoZW50aWNhdGlvbiBhbmQgb3JpZ2luYWwgcmVzcG9uc2UgdG8gYWRkIGhlYWRlcnMuXG4gICAqXG4gICAqIFRoaXMgaXMgdG8gYmUgdXNlZCB3aXRoIENsb3VkRnJvbnRXZWJEaXN0cmlidXRpb24uIFNlZVxuICAgKiBjcmVhdGVQcm90ZWN0ZWRCZWhhdmlvciBpZiB1c2luZyBEaXN0cmlidXRpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGF1dGhGaWx0ZXJzKCk6IGNsb3VkZnJvbnQuTGFtYmRhRnVuY3Rpb25Bc3NvY2lhdGlvbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBldmVudFR5cGU6IGNsb3VkZnJvbnQuTGFtYmRhRWRnZUV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2hlY2tBdXRoRm4sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBldmVudFR5cGU6IGNsb3VkZnJvbnQuTGFtYmRhRWRnZUV2ZW50VHlwZS5PUklHSU5fUkVTUE9OU0UsXG4gICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmh0dHBIZWFkZXJzRm4sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYmVoYXZpb3IgdGhhdCBpbmNsdWRlcyBhdXRob3JpemF0aW9uIGNoZWNrLlxuICAgKlxuICAgKiBUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCBEaXN0cmlidXRpb24uXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUHJvdGVjdGVkQmVoYXZpb3IoXG4gICAgb3JpZ2luOiBJT3JpZ2luLFxuICAgIG9wdGlvbnM/OiBBZGRCZWhhdmlvck9wdGlvbnMsXG4gICk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgaWYgKG9wdGlvbnM/LmVkZ2VMYW1iZGFzICE9IG51bGwpIHtcbiAgICAgIHRocm93IEVycm9yKFwiVXNlci1kZWZpbmVkIGVkZ2VMYW1iZGFzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9yaWdpbixcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgZWRnZUxhbWJkYXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogY2xvdWRmcm9udC5MYW1iZGFFZGdlRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogdGhpcy5jaGVja0F1dGhGbixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogY2xvdWRmcm9udC5MYW1iZGFFZGdlRXZlbnRUeXBlLk9SSUdJTl9SRVNQT05TRSxcbiAgICAgICAgICBmdW5jdGlvblZlcnNpb246IHRoaXMuaHR0cEhlYWRlcnNGbixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgQ29nbml0byBjbGllbnQgdG8gdXNlIHRoZSBwcm9wZXIgVVJMcyBhbmQgT0F1dGggc2NvcGVzLlxuICAgKlxuICAgKiBUT0RPOiBJbiBjYXNlIHRoZSBjbGllbnQgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFuZCBpcyB1cGRhdGVkXG4gICAqICBieSBDbG91ZEZvcm1hdGlvbiwgdGhpcyB3aWxsIG5vdCBiZSByZWFwcGxpZWQgY2F1c2luZyB0aGUgY2xpZW50XG4gICAqICB0byBub3QgYmUgY29ycmVjdGx5IGNvbmZpZ3VyZWQuXG4gICAqICBIb3cgY2FuIHdlIGF2b2lkIHRoaXMgc2NlbmFyaW8/XG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2xpZW50KGlkOiBzdHJpbmcsIHByb3BzOiBVcGRhdGVDbGllbnRQcm9wcyk6IENsaWVudFVwZGF0ZSB7XG4gICAgaWYgKCF0aGlzLmNsaWVudENyZWF0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJZb3UgY2Fubm90IHVzZSB1cGRhdGVDbGllbnQgd2l0aCBhIHVzZXItcHJvdmlkZWQgQ29nbml0byBDbGllbnQgXCIgK1xuICAgICAgICAgIFwic2luY2UgaXQgd291bGQgb3ZlcnJpZGUgdGhlIHVzZXItcHJvdmlkZWQgc2V0dGluZ3NcIixcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENsaWVudFVwZGF0ZSh0aGlzLCBpZCwge1xuICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgIHVzZXJQb29sOiB0aGlzLnVzZXJQb29sLFxuICAgICAgc2lnbk91dFVybDogcHJvcHMuc2lnbk91dFVybCxcbiAgICAgIGNhbGxiYWNrVXJsOiBwcm9wcy5jYWxsYmFja1VybCxcbiAgICAgIG9hdXRoU2NvcGVzOiB0aGlzLm9hdXRoU2NvcGVzLFxuICAgICAgaWRlbnRpdHlQcm92aWRlcnM6XG4gICAgICAgIHByb3BzLmlkZW50aXR5UHJvdmlkZXJzID8/XG4gICAgICAgIFtcIkNPR05JVE9cIl0uY29uY2F0KFxuICAgICAgICAgIHRoaXMudXNlclBvb2wuaWRlbnRpdHlQcm92aWRlcnMubWFwKChpdCkgPT4gaXQucHJvdmlkZXJOYW1lKSxcbiAgICAgICAgKSxcbiAgICB9KVxuICB9XG59XG4iXX0=
@@ -0,0 +1,15 @@
1
+ import { Construct } from "constructs";
2
+ interface GenerateSecretProps {
3
+ /**
4
+ * Nonce to force secret update.
5
+ */
6
+ nonce?: string;
7
+ }
8
+ /**
9
+ * Generate a secret to be used in other parts of the deployment.
10
+ */
11
+ export declare class GenerateSecret extends Construct {
12
+ readonly value: string;
13
+ constructor(scope: Construct, id: string, props?: GenerateSecretProps);
14
+ }
15
+ export {};