s3-secure-bucket 0.1.6 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +47 -14
- package/API.md +33 -11
- package/README.md +41 -19
- package/lib/index.d.ts +46 -13
- package/lib/index.js +56 -15
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -8455,7 +8455,7 @@
|
|
|
8455
8455
|
},
|
|
8456
8456
|
"name": "s3-secure-bucket",
|
|
8457
8457
|
"readme": {
|
|
8458
|
-
"markdown": "# S3 Secure Bucket (AWS CDK v2)\n\n[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/blob/main/LICENSE)\n[](https://www.npmjs.com/package/s3-secure-bucket)\n[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/build.yml)\n[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/release.yml)\n[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/releases)\n\
|
|
8458
|
+
"markdown": "# S3 Secure Bucket (AWS CDK v2)\n\n[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/blob/main/LICENSE)\n[](https://www.npmjs.com/package/s3-secure-bucket)\n[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/build.yml)\n[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/release.yml)\n[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/releases)\n\nAWS CDK v2 construct library: an [`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html) with security-focused defaults (private ACLs, block public access, TLS-only access, encryption, versioning, `BucketOwnerEnforced`, `RemovalPolicy.RETAIN`). Use `bucketType` for pipeline artifacts, CloudFront origins, and centralized access logs so encryption and bucket policies match each workload.\n\n## Features\n\n- Private access, block public access, and deny insecure transport (`enforceSSL`)\n- **Default bucket**: KMS-managed encryption (`aws:kms`) unless overridden\n- **Log / origin types**: S3-managed encryption (`AES256`) for `ACCESS_LOG_BUCKET` and `CLOUDFRONT_ORIGIN_BUCKET`\n- Versioning on by default; object ownership `BucketOwnerEnforced` by default\n- `RemovalPolicy.RETAIN` on the bucket\n- **`bucketType` presets**\n - **`DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET`**: optional `s3:*` grant for the CDK deploy role when using a **non-default** bootstrap qualifier\n - **`CLOUDFRONT_ORIGIN_BUCKET`**: S3-managed encryption for typical origin use\n - **`ACCESS_LOG_BUCKET`**: `s3:PutObject` on `AWSLogs/<account>/*` for ALB/NLB (`logdelivery.elasticloadbalancing.amazonaws.com` + regional **ELBv2 account** from `aws-cdk-lib/region-info` when known), CloudFront standard logging (`delivery.logs.amazonaws.com`), and S3 server access logging (`logging.s3.amazonaws.com`)\n- **`accessLogBucketPolicyDependable`** (access-log buckets only): use with `loadBalancer.node.addDependency(...)` so ALB/NLB access-log enablement runs after the bucket policy exists (avoids validation `PutObject` failures)\n\n## Installation\n\n**npm**\n\n```shell\nnpm install s3-secure-bucket\n```\n\n**yarn**\n\n```shell\nyarn add s3-secure-bucket\n```\n\n## Usage\n\n### Default secure bucket\n\n```typescript\nimport { Stack } from 'aws-cdk-lib';\nimport { S3SecureBucket } from 's3-secure-bucket';\n\ndeclare const stack: Stack;\n\nconst bucket = new S3SecureBucket(stack, 'S3SecureBucket', {\n bucketName: 'example-secure-bucket',\n});\n```\n\n### Centralized access log bucket (ALB / NLB / CloudFront / S3)\n\nFor `ACCESS_LOG_BUCKET`, the stack **`env.region` must be a concrete region** at synthesis time (not a token) so the regional ELBv2 log-delivery account ID can be resolved.\n\n```typescript\nimport { Stack } from 'aws-cdk-lib';\nimport { S3SecureBucket, S3SecureBucketType } from 's3-secure-bucket';\n\ndeclare const stack: Stack;\n\nconst accessLogBucket = new S3SecureBucket(stack, 'AccessLogBucket', {\n bucketType: S3SecureBucketType.ACCESS_LOG_BUCKET,\n});\n\n// After creating your load balancer (e.g. elbv2.ApplicationLoadBalancer), depend on the bucket policy\n// so ELB's validation PutObject runs after the policy exists:\n// loadBalancer.node.addDependency(accessLogBucket.accessLogBucketPolicyDependable!);\n```\n\nWire logging on the load balancer using your normal approach (for example L1 attributes or another construct). This library only configures the **bucket** and its **resource policy**.\n\n## Options\n\n`S3SecureBucket` accepts `S3SecureBucketProps`, which extends [`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html). Standard options such as `bucketName`, `versioned`, `encryption`, and `lifecycleRules` work as usual alongside the secure defaults.\n\n### Construct props (`S3SecureBucketProps`)\n\n| Property | Type | Default | Description |\n| --- | --- | --- | --- |\n| `bucketType` | `S3SecureBucketType` | `DEFAULT_BUCKET` | Selects encryption defaults and optional resource-policy statements. |\n| *(inherited)* | `s3.BucketProps` | — | All other `Bucket` properties are passed through (some receive overrides inside the construct). |\n\n### `S3SecureBucketType` values\n\n| Constant | Use case |\n| --- | --- |\n| `S3SecureBucketType.DEFAULT_BUCKET` | General-purpose secure bucket |\n| `S3SecureBucketType.ACCESS_LOG_BUCKET` | Centralized access logs (`AWSLogs/<account>/*` writers only) |\n| `S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET` | CDK pipeline artifact bucket (custom bootstrap qualifier) |\n| `S3SecureBucketType.CLOUDFRONT_ORIGIN_BUCKET` | CloudFront origin bucket |\n\n### Read-only: `accessLogBucketPolicyDependable`\n\n| Property | Type | When set | Description |\n| --- | --- | --- | --- |\n| `accessLogBucketPolicyDependable` | `IDependable \\| undefined` | `bucketType === ACCESS_LOG_BUCKET` | Depend on this from ALB/NLB so access-log configuration waits for the bucket policy resource. |\n\nSee [API.md](./API.md) for the full API reference.\n\n## Requirements\n\n- Node.js >= 20\n- Peer dependencies: `aws-cdk-lib` ^2.232.0, `constructs` ^10.5.1\n\n## License\n\nThis project is licensed under the Apache-2.0 License.\n"
|
|
8459
8459
|
},
|
|
8460
8460
|
"repository": {
|
|
8461
8461
|
"type": "git",
|
|
@@ -8472,32 +8472,46 @@
|
|
|
8472
8472
|
"assembly": "s3-secure-bucket",
|
|
8473
8473
|
"base": "aws-cdk-lib.aws_s3.Bucket",
|
|
8474
8474
|
"docs": {
|
|
8475
|
+
"custom": {
|
|
8476
|
+
"remarks": "- {@link S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET }: may attach a deploy-role policy when a non-default bootstrap qualifier is present.\n- {@link S3SecureBucketType.ACCESS_LOG_BUCKET }: adds log-writer principals; see {@link S3SecureBucketType.ACCESS_LOG_BUCKET } and {@link S3SecureBucket#accessLogBucketPolicyDependable }."
|
|
8477
|
+
},
|
|
8478
|
+
"remarks": "KMS-managed by default otherwise).",
|
|
8475
8479
|
"stability": "stable",
|
|
8476
|
-
"summary": "
|
|
8480
|
+
"summary": "S3 bucket with opinionated secure defaults: private ACLs, block public access, TLS-only access, and encryption (S3-managed for log/origin types;"
|
|
8477
8481
|
},
|
|
8478
8482
|
"fqn": "s3-secure-bucket.S3SecureBucket",
|
|
8479
8483
|
"initializer": {
|
|
8480
8484
|
"docs": {
|
|
8481
|
-
"stability": "stable"
|
|
8485
|
+
"stability": "stable",
|
|
8486
|
+
"summary": "Creates a secure S3 bucket according to `bucketType` and merged `props`."
|
|
8482
8487
|
},
|
|
8483
8488
|
"locationInModule": {
|
|
8484
8489
|
"filename": "src/index.ts",
|
|
8485
|
-
"line":
|
|
8490
|
+
"line": 84
|
|
8486
8491
|
},
|
|
8487
8492
|
"parameters": [
|
|
8488
8493
|
{
|
|
8494
|
+
"docs": {
|
|
8495
|
+
"summary": "- Parent construct, typically a {@link Stack}."
|
|
8496
|
+
},
|
|
8489
8497
|
"name": "scope",
|
|
8490
8498
|
"type": {
|
|
8491
8499
|
"fqn": "constructs.Construct"
|
|
8492
8500
|
}
|
|
8493
8501
|
},
|
|
8494
8502
|
{
|
|
8503
|
+
"docs": {
|
|
8504
|
+
"summary": "- Construct ID (stable logical ID segment)."
|
|
8505
|
+
},
|
|
8495
8506
|
"name": "id",
|
|
8496
8507
|
"type": {
|
|
8497
8508
|
"primitive": "string"
|
|
8498
8509
|
}
|
|
8499
8510
|
},
|
|
8500
8511
|
{
|
|
8512
|
+
"docs": {
|
|
8513
|
+
"summary": "- Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true)."
|
|
8514
|
+
},
|
|
8501
8515
|
"name": "props",
|
|
8502
8516
|
"optional": true,
|
|
8503
8517
|
"type": {
|
|
@@ -8509,18 +8523,38 @@
|
|
|
8509
8523
|
"kind": "class",
|
|
8510
8524
|
"locationInModule": {
|
|
8511
8525
|
"filename": "src/index.ts",
|
|
8512
|
-
"line":
|
|
8526
|
+
"line": 65
|
|
8513
8527
|
},
|
|
8514
8528
|
"name": "S3SecureBucket",
|
|
8529
|
+
"properties": [
|
|
8530
|
+
{
|
|
8531
|
+
"docs": {
|
|
8532
|
+
"default": "undefined when `bucketType` is not {@link S3SecureBucketType.ACCESS_LOG_BUCKET }.",
|
|
8533
|
+
"remarks": "Example: `loadBalancer.node.addDependency(bucket.accessLogBucketPolicyDependable!)`.",
|
|
8534
|
+
"stability": "stable",
|
|
8535
|
+
"summary": "Set only when {@link S3SecureBucketProps.bucketType} is {@link S3SecureBucketType.ACCESS_LOG_BUCKET}. Use as a dependency target so load balancer access-log enablement runs after the bucket policy exists (ELB performs an immediate validation `PutObject` that fails if the policy is not applied yet)."
|
|
8536
|
+
},
|
|
8537
|
+
"immutable": true,
|
|
8538
|
+
"locationInModule": {
|
|
8539
|
+
"filename": "src/index.ts",
|
|
8540
|
+
"line": 75
|
|
8541
|
+
},
|
|
8542
|
+
"name": "accessLogBucketPolicyDependable",
|
|
8543
|
+
"optional": true,
|
|
8544
|
+
"type": {
|
|
8545
|
+
"fqn": "constructs.IDependable"
|
|
8546
|
+
}
|
|
8547
|
+
}
|
|
8548
|
+
],
|
|
8515
8549
|
"symbolId": "src/index:S3SecureBucket"
|
|
8516
8550
|
},
|
|
8517
8551
|
"s3-secure-bucket.S3SecureBucketProps": {
|
|
8518
8552
|
"assembly": "s3-secure-bucket",
|
|
8519
8553
|
"datatype": true,
|
|
8520
8554
|
"docs": {
|
|
8521
|
-
"remarks": "Extends
|
|
8555
|
+
"remarks": "Extends {@link s3.BucketProps}; several fields receive secure defaults inside the construct.",
|
|
8522
8556
|
"stability": "stable",
|
|
8523
|
-
"summary": "
|
|
8557
|
+
"summary": "Construction properties for {@link S3SecureBucket}."
|
|
8524
8558
|
},
|
|
8525
8559
|
"fqn": "s3-secure-bucket.S3SecureBucketProps",
|
|
8526
8560
|
"interfaces": [
|
|
@@ -8529,22 +8563,21 @@
|
|
|
8529
8563
|
"kind": "interface",
|
|
8530
8564
|
"locationInModule": {
|
|
8531
8565
|
"filename": "src/index.ts",
|
|
8532
|
-
"line":
|
|
8566
|
+
"line": 47
|
|
8533
8567
|
},
|
|
8534
8568
|
"name": "S3SecureBucketProps",
|
|
8535
8569
|
"properties": [
|
|
8536
8570
|
{
|
|
8537
8571
|
"abstract": true,
|
|
8538
8572
|
"docs": {
|
|
8539
|
-
"default": "S3SecureBucketType.DEFAULT_BUCKET",
|
|
8540
|
-
"remarks": "Determines encryption and resource policy behavior.",
|
|
8573
|
+
"default": "{@link S3SecureBucketType.DEFAULT_BUCKET }",
|
|
8541
8574
|
"stability": "stable",
|
|
8542
|
-
"summary": "
|
|
8575
|
+
"summary": "Selects encryption defaults and optional resource-policy statements."
|
|
8543
8576
|
},
|
|
8544
8577
|
"immutable": true,
|
|
8545
8578
|
"locationInModule": {
|
|
8546
8579
|
"filename": "src/index.ts",
|
|
8547
|
-
"line":
|
|
8580
|
+
"line": 54
|
|
8548
8581
|
},
|
|
8549
8582
|
"name": "bucketType",
|
|
8550
8583
|
"optional": true,
|
|
@@ -8556,6 +8589,6 @@
|
|
|
8556
8589
|
"symbolId": "src/index:S3SecureBucketProps"
|
|
8557
8590
|
}
|
|
8558
8591
|
},
|
|
8559
|
-
"version": "0.1
|
|
8560
|
-
"fingerprint": "
|
|
8592
|
+
"version": "0.2.1",
|
|
8593
|
+
"fingerprint": "xlXsC0RrVqg4UJOgmJhEODMfux8HAPA3glSh/bLKJ3o="
|
|
8561
8594
|
}
|
package/API.md
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
### S3SecureBucket <a name="S3SecureBucket" id="s3-secure-bucket.S3SecureBucket"></a>
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
S3 bucket with opinionated secure defaults: private ACLs, block public access, TLS-only access, and encryption (S3-managed for log/origin types;
|
|
8
|
+
|
|
9
|
+
KMS-managed by default otherwise).
|
|
8
10
|
|
|
9
11
|
#### Initializers <a name="Initializers" id="s3-secure-bucket.S3SecureBucket.Initializer"></a>
|
|
10
12
|
|
|
@@ -16,9 +18,9 @@ new S3SecureBucket(scope: Construct, id: string, props?: S3SecureBucketProps)
|
|
|
16
18
|
|
|
17
19
|
| **Name** | **Type** | **Description** |
|
|
18
20
|
| --- | --- | --- |
|
|
19
|
-
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> |
|
|
20
|
-
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.id">id</a></code> | <code>string</code> |
|
|
21
|
-
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.props">props</a></code> | <code><a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a></code> |
|
|
21
|
+
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | - Parent construct, typically a {@link Stack}. |
|
|
22
|
+
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.id">id</a></code> | <code>string</code> | - Construct ID (stable logical ID segment). |
|
|
23
|
+
| <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.props">props</a></code> | <code><a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a></code> | - Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true). |
|
|
22
24
|
|
|
23
25
|
---
|
|
24
26
|
|
|
@@ -26,18 +28,24 @@ new S3SecureBucket(scope: Construct, id: string, props?: S3SecureBucketProps)
|
|
|
26
28
|
|
|
27
29
|
- *Type:* constructs.Construct
|
|
28
30
|
|
|
31
|
+
Parent construct, typically a {@link Stack}.
|
|
32
|
+
|
|
29
33
|
---
|
|
30
34
|
|
|
31
35
|
##### `id`<sup>Required</sup> <a name="id" id="s3-secure-bucket.S3SecureBucket.Initializer.parameter.id"></a>
|
|
32
36
|
|
|
33
37
|
- *Type:* string
|
|
34
38
|
|
|
39
|
+
Construct ID (stable logical ID segment).
|
|
40
|
+
|
|
35
41
|
---
|
|
36
42
|
|
|
37
43
|
##### `props`<sup>Optional</sup> <a name="props" id="s3-secure-bucket.S3SecureBucket.Initializer.parameter.props"></a>
|
|
38
44
|
|
|
39
45
|
- *Type:* <a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a>
|
|
40
46
|
|
|
47
|
+
Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true).
|
|
48
|
+
|
|
41
49
|
---
|
|
42
50
|
|
|
43
51
|
#### Methods <a name="Methods" id="Methods"></a>
|
|
@@ -1085,6 +1093,7 @@ allow legacy bucket naming style, default is false.
|
|
|
1085
1093
|
| <code><a href="#s3-secure-bucket.S3SecureBucket.property.disallowPublicAccess">disallowPublicAccess</a></code> | <code>boolean</code> | Whether to disallow public access. |
|
|
1086
1094
|
| <code><a href="#s3-secure-bucket.S3SecureBucket.property.policy">policy</a></code> | <code>aws-cdk-lib.aws_s3.BucketPolicy</code> | The resource policy associated with this bucket. |
|
|
1087
1095
|
| <code><a href="#s3-secure-bucket.S3SecureBucket.property.replicationRoleArn">replicationRoleArn</a></code> | <code>string</code> | Role used to set up permissions on this bucket for replication. |
|
|
1096
|
+
| <code><a href="#s3-secure-bucket.S3SecureBucket.property.accessLogBucketPolicyDependable">accessLogBucketPolicyDependable</a></code> | <code>constructs.IDependable</code> | Set only when {@link S3SecureBucketProps.bucketType} is {@link S3SecureBucketType.ACCESS_LOG_BUCKET}. Use as a dependency target so load balancer access-log enablement runs after the bucket policy exists (ELB performs an immediate validation `PutObject` that fails if the policy is not applied yet). |
|
|
1088
1097
|
|
|
1089
1098
|
---
|
|
1090
1099
|
|
|
@@ -1303,6 +1312,21 @@ Role used to set up permissions on this bucket for replication.
|
|
|
1303
1312
|
|
|
1304
1313
|
---
|
|
1305
1314
|
|
|
1315
|
+
##### `accessLogBucketPolicyDependable`<sup>Optional</sup> <a name="accessLogBucketPolicyDependable" id="s3-secure-bucket.S3SecureBucket.property.accessLogBucketPolicyDependable"></a>
|
|
1316
|
+
|
|
1317
|
+
```typescript
|
|
1318
|
+
public readonly accessLogBucketPolicyDependable: IDependable;
|
|
1319
|
+
```
|
|
1320
|
+
|
|
1321
|
+
- *Type:* constructs.IDependable
|
|
1322
|
+
- *Default:* undefined when `bucketType` is not {@link S3SecureBucketType.ACCESS_LOG_BUCKET }.
|
|
1323
|
+
|
|
1324
|
+
Set only when {@link S3SecureBucketProps.bucketType} is {@link S3SecureBucketType.ACCESS_LOG_BUCKET}. Use as a dependency target so load balancer access-log enablement runs after the bucket policy exists (ELB performs an immediate validation `PutObject` that fails if the policy is not applied yet).
|
|
1325
|
+
|
|
1326
|
+
Example: `loadBalancer.node.addDependency(bucket.accessLogBucketPolicyDependable!)`.
|
|
1327
|
+
|
|
1328
|
+
---
|
|
1329
|
+
|
|
1306
1330
|
#### Constants <a name="Constants" id="Constants"></a>
|
|
1307
1331
|
|
|
1308
1332
|
| **Name** | **Type** | **Description** |
|
|
@@ -1327,9 +1351,9 @@ Uniquely identifies this class.
|
|
|
1327
1351
|
|
|
1328
1352
|
### S3SecureBucketProps <a name="S3SecureBucketProps" id="s3-secure-bucket.S3SecureBucketProps"></a>
|
|
1329
1353
|
|
|
1330
|
-
|
|
1354
|
+
Construction properties for {@link S3SecureBucket}.
|
|
1331
1355
|
|
|
1332
|
-
Extends
|
|
1356
|
+
Extends {@link s3.BucketProps}; several fields receive secure defaults inside the construct.
|
|
1333
1357
|
|
|
1334
1358
|
#### Initializer <a name="Initializer" id="s3-secure-bucket.S3SecureBucketProps.Initializer"></a>
|
|
1335
1359
|
|
|
@@ -1377,7 +1401,7 @@ const s3SecureBucketProps: S3SecureBucketProps = { ... }
|
|
|
1377
1401
|
| <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.websiteIndexDocument">websiteIndexDocument</a></code> | <code>string</code> | The name of the index document (e.g. "index.html") for the website. Enables static website hosting for this bucket. |
|
|
1378
1402
|
| <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.websiteRedirect">websiteRedirect</a></code> | <code>aws-cdk-lib.aws_s3.RedirectTarget</code> | Specifies the redirect behavior of all requests to a website endpoint of a bucket. |
|
|
1379
1403
|
| <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.websiteRoutingRules">websiteRoutingRules</a></code> | <code>aws-cdk-lib.aws_s3.RoutingRule[]</code> | Rules that define when a redirect is applied and the redirect behavior. |
|
|
1380
|
-
| <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.bucketType">bucketType</a></code> | <code>string</code> |
|
|
1404
|
+
| <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.bucketType">bucketType</a></code> | <code>string</code> | Selects encryption defaults and optional resource-policy statements. |
|
|
1381
1405
|
|
|
1382
1406
|
---
|
|
1383
1407
|
|
|
@@ -1898,11 +1922,9 @@ public readonly bucketType: string;
|
|
|
1898
1922
|
```
|
|
1899
1923
|
|
|
1900
1924
|
- *Type:* string
|
|
1901
|
-
- *Default:* S3SecureBucketType.DEFAULT_BUCKET
|
|
1902
|
-
|
|
1903
|
-
The type of the bucket.
|
|
1925
|
+
- *Default:* {@link S3SecureBucketType.DEFAULT_BUCKET }
|
|
1904
1926
|
|
|
1905
|
-
|
|
1927
|
+
Selects encryption defaults and optional resource-policy statements.
|
|
1906
1928
|
|
|
1907
1929
|
---
|
|
1908
1930
|
|
package/README.md
CHANGED
|
@@ -6,19 +6,20 @@
|
|
|
6
6
|
[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/release.yml)
|
|
7
7
|
[](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/releases)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
AWS CDK v2 construct library: an [`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html) with security-focused defaults (private ACLs, block public access, TLS-only access, encryption, versioning, `BucketOwnerEnforced`, `RemovalPolicy.RETAIN`). Use `bucketType` for pipeline artifacts, CloudFront origins, and centralized access logs so encryption and bucket policies match each workload.
|
|
10
10
|
|
|
11
11
|
## Features
|
|
12
12
|
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
- `RemovalPolicy.RETAIN`
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
13
|
+
- Private access, block public access, and deny insecure transport (`enforceSSL`)
|
|
14
|
+
- **Default bucket**: KMS-managed encryption (`aws:kms`) unless overridden
|
|
15
|
+
- **Log / origin types**: S3-managed encryption (`AES256`) for `ACCESS_LOG_BUCKET` and `CLOUDFRONT_ORIGIN_BUCKET`
|
|
16
|
+
- Versioning on by default; object ownership `BucketOwnerEnforced` by default
|
|
17
|
+
- `RemovalPolicy.RETAIN` on the bucket
|
|
18
|
+
- **`bucketType` presets**
|
|
19
|
+
- **`DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET`**: optional `s3:*` grant for the CDK deploy role when using a **non-default** bootstrap qualifier
|
|
20
|
+
- **`CLOUDFRONT_ORIGIN_BUCKET`**: S3-managed encryption for typical origin use
|
|
21
|
+
- **`ACCESS_LOG_BUCKET`**: `s3:PutObject` on `AWSLogs/<account>/*` for ALB/NLB (`logdelivery.elasticloadbalancing.amazonaws.com` + regional **ELBv2 account** from `aws-cdk-lib/region-info` when known), CloudFront standard logging (`delivery.logs.amazonaws.com`), and S3 server access logging (`logging.s3.amazonaws.com`)
|
|
22
|
+
- **`accessLogBucketPolicyDependable`** (access-log buckets only): use with `loadBalancer.node.addDependency(...)` so ALB/NLB access-log enablement runs after the bucket policy exists (avoids validation `PutObject` failures)
|
|
22
23
|
|
|
23
24
|
## Installation
|
|
24
25
|
|
|
@@ -39,48 +40,69 @@ yarn add s3-secure-bucket
|
|
|
39
40
|
### Default secure bucket
|
|
40
41
|
|
|
41
42
|
```typescript
|
|
43
|
+
import { Stack } from 'aws-cdk-lib';
|
|
42
44
|
import { S3SecureBucket } from 's3-secure-bucket';
|
|
43
45
|
|
|
46
|
+
declare const stack: Stack;
|
|
47
|
+
|
|
44
48
|
const bucket = new S3SecureBucket(stack, 'S3SecureBucket', {
|
|
45
49
|
bucketName: 'example-secure-bucket',
|
|
46
50
|
});
|
|
47
51
|
```
|
|
48
52
|
|
|
49
|
-
### Centralized access log bucket (ALB / CloudFront / S3)
|
|
53
|
+
### Centralized access log bucket (ALB / NLB / CloudFront / S3)
|
|
54
|
+
|
|
55
|
+
For `ACCESS_LOG_BUCKET`, the stack **`env.region` must be a concrete region** at synthesis time (not a token) so the regional ELBv2 log-delivery account ID can be resolved.
|
|
50
56
|
|
|
51
57
|
```typescript
|
|
58
|
+
import { Stack } from 'aws-cdk-lib';
|
|
52
59
|
import { S3SecureBucket, S3SecureBucketType } from 's3-secure-bucket';
|
|
53
60
|
|
|
61
|
+
declare const stack: Stack;
|
|
62
|
+
|
|
54
63
|
const accessLogBucket = new S3SecureBucket(stack, 'AccessLogBucket', {
|
|
55
64
|
bucketType: S3SecureBucketType.ACCESS_LOG_BUCKET,
|
|
56
65
|
});
|
|
66
|
+
|
|
67
|
+
// After creating your load balancer (e.g. elbv2.ApplicationLoadBalancer), depend on the bucket policy
|
|
68
|
+
// so ELB's validation PutObject runs after the policy exists:
|
|
69
|
+
// loadBalancer.node.addDependency(accessLogBucket.accessLogBucketPolicyDependable!);
|
|
57
70
|
```
|
|
58
71
|
|
|
72
|
+
Wire logging on the load balancer using your normal approach (for example L1 attributes or another construct). This library only configures the **bucket** and its **resource policy**.
|
|
73
|
+
|
|
59
74
|
## Options
|
|
60
75
|
|
|
61
|
-
|
|
76
|
+
`S3SecureBucket` accepts `S3SecureBucketProps`, which extends [`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html). Standard options such as `bucketName`, `versioned`, `encryption`, and `lifecycleRules` work as usual alongside the secure defaults.
|
|
62
77
|
|
|
63
|
-
###
|
|
78
|
+
### Construct props (`S3SecureBucketProps`)
|
|
64
79
|
|
|
65
80
|
| Property | Type | Default | Description |
|
|
66
81
|
| --- | --- | --- | --- |
|
|
67
|
-
| `bucketType` | `S3SecureBucketType` | `
|
|
82
|
+
| `bucketType` | `S3SecureBucketType` | `DEFAULT_BUCKET` | Selects encryption defaults and optional resource-policy statements. |
|
|
83
|
+
| *(inherited)* | `s3.BucketProps` | — | All other `Bucket` properties are passed through (some receive overrides inside the construct). |
|
|
68
84
|
|
|
69
|
-
### S3SecureBucketType values
|
|
85
|
+
### `S3SecureBucketType` values
|
|
70
86
|
|
|
71
87
|
| Constant | Use case |
|
|
72
88
|
| --- | --- |
|
|
73
|
-
| `S3SecureBucketType.DEFAULT_BUCKET` |
|
|
74
|
-
| `S3SecureBucketType.ACCESS_LOG_BUCKET` | Centralized access
|
|
75
|
-
| `S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET` | CDK pipeline artifact bucket (
|
|
89
|
+
| `S3SecureBucketType.DEFAULT_BUCKET` | General-purpose secure bucket |
|
|
90
|
+
| `S3SecureBucketType.ACCESS_LOG_BUCKET` | Centralized access logs (`AWSLogs/<account>/*` writers only) |
|
|
91
|
+
| `S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET` | CDK pipeline artifact bucket (custom bootstrap qualifier) |
|
|
76
92
|
| `S3SecureBucketType.CLOUDFRONT_ORIGIN_BUCKET` | CloudFront origin bucket |
|
|
77
93
|
|
|
94
|
+
### Read-only: `accessLogBucketPolicyDependable`
|
|
95
|
+
|
|
96
|
+
| Property | Type | When set | Description |
|
|
97
|
+
| --- | --- | --- | --- |
|
|
98
|
+
| `accessLogBucketPolicyDependable` | `IDependable \| undefined` | `bucketType === ACCESS_LOG_BUCKET` | Depend on this from ALB/NLB so access-log configuration waits for the bucket policy resource. |
|
|
99
|
+
|
|
78
100
|
See [API.md](./API.md) for the full API reference.
|
|
79
101
|
|
|
80
102
|
## Requirements
|
|
81
103
|
|
|
82
104
|
- Node.js >= 20
|
|
83
|
-
-
|
|
105
|
+
- Peer dependencies: `aws-cdk-lib` ^2.232.0, `constructs` ^10.5.1
|
|
84
106
|
|
|
85
107
|
## License
|
|
86
108
|
|
package/lib/index.d.ts
CHANGED
|
@@ -1,43 +1,76 @@
|
|
|
1
1
|
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
2
|
-
import { Construct } from 'constructs';
|
|
2
|
+
import { Construct, IDependable } from 'constructs';
|
|
3
3
|
/**
|
|
4
|
-
* Bucket type
|
|
4
|
+
* Bucket type discriminator values for {@link S3SecureBucketProps.bucketType}.
|
|
5
|
+
*
|
|
6
|
+
* @see {@link S3SecureBucketProps.bucketType}
|
|
5
7
|
*/
|
|
6
8
|
export declare const S3SecureBucketType: {
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
9
|
-
* (single-
|
|
10
|
+
* Pipeline artifact bucket when using a custom CDK bootstrap qualifier
|
|
11
|
+
* (single- or multi-region deployments).
|
|
10
12
|
*/
|
|
11
13
|
readonly DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET: "DeploymentPipelineArtifactBucket";
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
15
|
+
* Origin bucket for CloudFront distributions.
|
|
14
16
|
*/
|
|
15
17
|
readonly CLOUDFRONT_ORIGIN_BUCKET: "CloudFrontOriginBucket";
|
|
16
18
|
/**
|
|
17
|
-
*
|
|
19
|
+
* General-purpose secure bucket (default qualifier / standard use).
|
|
18
20
|
*/
|
|
19
21
|
readonly DEFAULT_BUCKET: "DefaultBucket";
|
|
20
22
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
+
* Centralized access logs for producers such as ALB/NLB, CloudFront standard logging (v2),
|
|
24
|
+
* and S3 server access logging. Grants `s3:PutObject` on `AWSLogs/<account>/*` only (no read/list).
|
|
25
|
+
*
|
|
26
|
+
* For {@link S3SecureBucketType.ACCESS_LOG_BUCKET}, the regional ELBv2 log-delivery account ID
|
|
27
|
+
* (legacy path alongside the log delivery service principal) is resolved from `aws-cdk-lib/region-info`
|
|
28
|
+
* at synthesis time when {@link Stack#region} is known, or via a deploy-time mapping when it is a token.
|
|
23
29
|
*/
|
|
24
30
|
readonly ACCESS_LOG_BUCKET: "AccessLogBucket";
|
|
25
31
|
};
|
|
26
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Discriminated union of {@link S3SecureBucketType} string literals.
|
|
34
|
+
*/
|
|
27
35
|
export type S3SecureBucketType = typeof S3SecureBucketType[keyof typeof S3SecureBucketType];
|
|
28
36
|
/**
|
|
29
|
-
*
|
|
37
|
+
* Construction properties for {@link S3SecureBucket}.
|
|
38
|
+
*
|
|
39
|
+
* Extends {@link s3.BucketProps}; several fields receive secure defaults inside the construct.
|
|
30
40
|
*/
|
|
31
41
|
export interface S3SecureBucketProps extends s3.BucketProps {
|
|
32
42
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
43
|
+
* Selects encryption defaults and optional resource-policy statements.
|
|
44
|
+
*
|
|
45
|
+
* @default {@link S3SecureBucketType.DEFAULT_BUCKET}
|
|
35
46
|
*/
|
|
36
47
|
readonly bucketType?: S3SecureBucketType;
|
|
37
48
|
}
|
|
38
49
|
/**
|
|
39
|
-
*
|
|
50
|
+
* S3 bucket with opinionated secure defaults: private ACLs, block public access, TLS-only access,
|
|
51
|
+
* and encryption (S3-managed for log/origin types; KMS-managed by default otherwise).
|
|
52
|
+
*
|
|
53
|
+
* @remarks
|
|
54
|
+
* - {@link S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET}: may attach a deploy-role policy when a non-default bootstrap qualifier is present.
|
|
55
|
+
* - {@link S3SecureBucketType.ACCESS_LOG_BUCKET}: adds log-writer principals; see {@link S3SecureBucketType.ACCESS_LOG_BUCKET} and {@link S3SecureBucket#accessLogBucketPolicyDependable}.
|
|
40
56
|
*/
|
|
41
57
|
export declare class S3SecureBucket extends s3.Bucket {
|
|
58
|
+
/**
|
|
59
|
+
* Set only when {@link S3SecureBucketProps.bucketType} is {@link S3SecureBucketType.ACCESS_LOG_BUCKET}.
|
|
60
|
+
* Use as a dependency target so load balancer access-log enablement runs after the bucket policy
|
|
61
|
+
* exists (ELB performs an immediate validation `PutObject` that fails if the policy is not applied yet).
|
|
62
|
+
*
|
|
63
|
+
* Example: `loadBalancer.node.addDependency(bucket.accessLogBucketPolicyDependable!)`.
|
|
64
|
+
*
|
|
65
|
+
* @default undefined when `bucketType` is not {@link S3SecureBucketType.ACCESS_LOG_BUCKET}.
|
|
66
|
+
*/
|
|
67
|
+
readonly accessLogBucketPolicyDependable?: IDependable;
|
|
68
|
+
/**
|
|
69
|
+
* Creates a secure S3 bucket according to `bucketType` and merged `props`.
|
|
70
|
+
*
|
|
71
|
+
* @param scope - Parent construct, typically a {@link Stack}.
|
|
72
|
+
* @param id - Construct ID (stable logical ID segment).
|
|
73
|
+
* @param props - Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true).
|
|
74
|
+
*/
|
|
42
75
|
constructor(scope: Construct, id: string, props?: S3SecureBucketProps);
|
|
43
76
|
}
|
package/lib/index.js
CHANGED
|
@@ -6,33 +6,52 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
6
6
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
7
|
const iam = require("aws-cdk-lib/aws-iam");
|
|
8
8
|
const s3 = require("aws-cdk-lib/aws-s3");
|
|
9
|
+
const region_info_1 = require("aws-cdk-lib/region-info");
|
|
9
10
|
/**
|
|
10
|
-
* Bucket type
|
|
11
|
+
* Bucket type discriminator values for {@link S3SecureBucketProps.bucketType}.
|
|
12
|
+
*
|
|
13
|
+
* @see {@link S3SecureBucketProps.bucketType}
|
|
11
14
|
*/
|
|
12
15
|
exports.S3SecureBucketType = {
|
|
13
16
|
/**
|
|
14
|
-
*
|
|
15
|
-
* (single-
|
|
17
|
+
* Pipeline artifact bucket when using a custom CDK bootstrap qualifier
|
|
18
|
+
* (single- or multi-region deployments).
|
|
16
19
|
*/
|
|
17
20
|
DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET: 'DeploymentPipelineArtifactBucket',
|
|
18
21
|
/**
|
|
19
|
-
*
|
|
22
|
+
* Origin bucket for CloudFront distributions.
|
|
20
23
|
*/
|
|
21
24
|
CLOUDFRONT_ORIGIN_BUCKET: 'CloudFrontOriginBucket',
|
|
22
25
|
/**
|
|
23
|
-
*
|
|
26
|
+
* General-purpose secure bucket (default qualifier / standard use).
|
|
24
27
|
*/
|
|
25
28
|
DEFAULT_BUCKET: 'DefaultBucket',
|
|
26
29
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
30
|
+
* Centralized access logs for producers such as ALB/NLB, CloudFront standard logging (v2),
|
|
31
|
+
* and S3 server access logging. Grants `s3:PutObject` on `AWSLogs/<account>/*` only (no read/list).
|
|
32
|
+
*
|
|
33
|
+
* For {@link S3SecureBucketType.ACCESS_LOG_BUCKET}, the regional ELBv2 log-delivery account ID
|
|
34
|
+
* (legacy path alongside the log delivery service principal) is resolved from `aws-cdk-lib/region-info`
|
|
35
|
+
* at synthesis time when {@link Stack#region} is known, or via a deploy-time mapping when it is a token.
|
|
29
36
|
*/
|
|
30
37
|
ACCESS_LOG_BUCKET: 'AccessLogBucket',
|
|
31
38
|
};
|
|
32
39
|
/**
|
|
33
|
-
*
|
|
40
|
+
* S3 bucket with opinionated secure defaults: private ACLs, block public access, TLS-only access,
|
|
41
|
+
* and encryption (S3-managed for log/origin types; KMS-managed by default otherwise).
|
|
42
|
+
*
|
|
43
|
+
* @remarks
|
|
44
|
+
* - {@link S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET}: may attach a deploy-role policy when a non-default bootstrap qualifier is present.
|
|
45
|
+
* - {@link S3SecureBucketType.ACCESS_LOG_BUCKET}: adds log-writer principals; see {@link S3SecureBucketType.ACCESS_LOG_BUCKET} and {@link S3SecureBucket#accessLogBucketPolicyDependable}.
|
|
34
46
|
*/
|
|
35
47
|
class S3SecureBucket extends s3.Bucket {
|
|
48
|
+
/**
|
|
49
|
+
* Creates a secure S3 bucket according to `bucketType` and merged `props`.
|
|
50
|
+
*
|
|
51
|
+
* @param scope - Parent construct, typically a {@link Stack}.
|
|
52
|
+
* @param id - Construct ID (stable logical ID segment).
|
|
53
|
+
* @param props - Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true).
|
|
54
|
+
*/
|
|
36
55
|
constructor(scope, id, props) {
|
|
37
56
|
const bucketType = props?.bucketType || exports.S3SecureBucketType.DEFAULT_BUCKET;
|
|
38
57
|
super(scope, id, {
|
|
@@ -86,8 +105,9 @@ class S3SecureBucket extends s3.Bucket {
|
|
|
86
105
|
}
|
|
87
106
|
}
|
|
88
107
|
if (bucketType === exports.S3SecureBucketType.ACCESS_LOG_BUCKET) {
|
|
89
|
-
|
|
90
|
-
|
|
108
|
+
const awsLogsPrefixResource = `${this.bucketArn}/AWSLogs/${account}/*`;
|
|
109
|
+
// Allow ALB / NLB log delivery (modern service principal path; also required in opt-in regions).
|
|
110
|
+
const albLogDeliveryPolicyResult = this.addToResourcePolicy(new iam.PolicyStatement({
|
|
91
111
|
effect: iam.Effect.ALLOW,
|
|
92
112
|
principals: [
|
|
93
113
|
new iam.ServicePrincipal('logdelivery.elasticloadbalancing.amazonaws.com'),
|
|
@@ -96,9 +116,30 @@ class S3SecureBucket extends s3.Bucket {
|
|
|
96
116
|
's3:PutObject',
|
|
97
117
|
],
|
|
98
118
|
resources: [
|
|
99
|
-
|
|
119
|
+
awsLogsPrefixResource,
|
|
100
120
|
],
|
|
101
121
|
}));
|
|
122
|
+
// In non–opt-in regions (for example ap-northeast-1), access logs are often delivered using the
|
|
123
|
+
// regional ELBv2 account (root of that account) for s3:PutObject, not only the service principal above.
|
|
124
|
+
const stack = aws_cdk_lib_1.Stack.of(this);
|
|
125
|
+
const elbAccountId = aws_cdk_lib_1.Token.isUnresolved(stack.region)
|
|
126
|
+
? stack.regionalFact(region_info_1.FactName.ELBV2_ACCOUNT)
|
|
127
|
+
: region_info_1.RegionInfo.get(stack.region).elbv2Account;
|
|
128
|
+
if (elbAccountId) {
|
|
129
|
+
this.addToResourcePolicy(new iam.PolicyStatement({
|
|
130
|
+
effect: iam.Effect.ALLOW,
|
|
131
|
+
principals: [
|
|
132
|
+
new iam.AccountPrincipal(elbAccountId),
|
|
133
|
+
],
|
|
134
|
+
actions: [
|
|
135
|
+
's3:PutObject',
|
|
136
|
+
],
|
|
137
|
+
resources: [
|
|
138
|
+
awsLogsPrefixResource,
|
|
139
|
+
],
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
this.accessLogBucketPolicyDependable = albLogDeliveryPolicyResult.policyDependable ?? this;
|
|
102
143
|
// Allow CloudFront standard logging (v2) to write logs
|
|
103
144
|
this.addToResourcePolicy(new iam.PolicyStatement({
|
|
104
145
|
effect: iam.Effect.ALLOW,
|
|
@@ -109,7 +150,7 @@ class S3SecureBucket extends s3.Bucket {
|
|
|
109
150
|
's3:PutObject',
|
|
110
151
|
],
|
|
111
152
|
resources: [
|
|
112
|
-
|
|
153
|
+
awsLogsPrefixResource,
|
|
113
154
|
],
|
|
114
155
|
}));
|
|
115
156
|
// Allow S3 server access logging to write logs when required by configuration
|
|
@@ -122,7 +163,7 @@ class S3SecureBucket extends s3.Bucket {
|
|
|
122
163
|
's3:PutObject',
|
|
123
164
|
],
|
|
124
165
|
resources: [
|
|
125
|
-
|
|
166
|
+
awsLogsPrefixResource,
|
|
126
167
|
],
|
|
127
168
|
}));
|
|
128
169
|
}
|
|
@@ -130,5 +171,5 @@ class S3SecureBucket extends s3.Bucket {
|
|
|
130
171
|
}
|
|
131
172
|
exports.S3SecureBucket = S3SecureBucket;
|
|
132
173
|
_a = JSII_RTTI_SYMBOL_1;
|
|
133
|
-
S3SecureBucket[_a] = { fqn: "s3-secure-bucket.S3SecureBucket", version: "0.1
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEU7QUFDNUUsMkNBQTJDO0FBQzNDLHlDQUF5QztBQUd6Qzs7R0FFRztBQUNVLFFBQUEsa0JBQWtCLEdBQUc7SUFDaEM7OztPQUdHO0lBQ0gsbUNBQW1DLEVBQUUsa0NBQWtDO0lBQ3ZFOztPQUVHO0lBQ0gsd0JBQXdCLEVBQUUsd0JBQXdCO0lBQ2xEOztPQUVHO0lBQ0gsY0FBYyxFQUFFLGVBQWU7SUFDL0I7OztPQUdHO0lBQ0gsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQzVCLENBQUM7QUFpQlg7O0dBRUc7QUFDSCxNQUFhLGNBQWUsU0FBUSxFQUFFLENBQUMsTUFBTTtJQUMzQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksMEJBQWtCLENBQUMsY0FBYyxDQUFDO1FBQzFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsYUFBYSxFQUFFLDJCQUFhLENBQUMsTUFBTTtZQUNuQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksVUFBVSxLQUFLLDBCQUFrQixDQUFDLHdCQUF3QixJQUFJLFVBQVUsS0FBSywwQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN0SCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7Z0JBQ3hDLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7WUFDOUQsQ0FBQyxDQUFDLEVBQUU7WUFDSixhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7b0JBQzFCLE9BQU8s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QWdCLENBQUMsNkJBQTZCLENBQUM7aUJBQ3hEO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxjQUFjO2lCQUNmO2dCQUNELFNBQVMsRUFBRTtvQkFDVCxHQUFHLElBQUksQ0FBQyxTQUFTLFlBQVksT0FBTyxJQUFJO2lCQUN6QzthQUNGLENBQUMsQ0FBQyxDQUFDO1lBRUosOEVBQThFO1lBQzlFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7Z0JBQy9DLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQ3hCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQztpQkFDckQ7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLGNBQWM7aUJBQ2Y7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULEdBQUcsSUFBSSxDQUFDLFNBQVMsWUFBWSxPQUFPLElBQUk7aUJBQ3pDO2FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO0lBQ0gsQ0FBQzs7QUF0R0gsd0NBdUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmYXVsdFN0YWNrU3ludGhlc2l6ZXIsIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIEJ1Y2tldCB0eXBlIGNvbnN0YW50cy4gVXNlIHRoZXNlIHZhbHVlcyBmb3IgdGhlIHtAbGluayBTM1NlY3VyZUJ1Y2tldFByb3BzLmJ1Y2tldFR5cGV9IHByb3BlcnR5LlxuICovXG5leHBvcnQgY29uc3QgUzNTZWN1cmVCdWNrZXRUeXBlID0ge1xuICAvKipcbiAgICogU2VsZWN0IHdoZW4gdXNpbmcgdGhpcyBidWNrZXQgYXMgdGhlIENESyBwaXBlbGluZSBhcnRpZmFjdCBidWNrZXQgd2l0aCBhIGN1c3RvbSBRdWFsaWZpZXJcbiAgICogKHNpbmdsZS1yZWdpb24gb3IgbXVsdGktcmVnaW9uIGRlcGxveW1lbnQpLlxuICAgKi9cbiAgREVQTE9ZTUVOVF9QSVBFTElORV9BUlRJRkFDVF9CVUNLRVQ6ICdEZXBsb3ltZW50UGlwZWxpbmVBcnRpZmFjdEJ1Y2tldCcsXG4gIC8qKlxuICAgKiBTZWxlY3Qgd2hlbiB1c2luZyB0aGlzIGJ1Y2tldCBhcyB0aGUgQ2xvdWRGcm9udCBvcmlnaW4uXG4gICAqL1xuICBDTE9VREZST05UX09SSUdJTl9CVUNLRVQ6ICdDbG91ZEZyb250T3JpZ2luQnVja2V0JyxcbiAgLyoqXG4gICAqIFNlbGVjdCBmb3IgdGhlIGRlZmF1bHQgYnVja2V0IHdoZW4gbm90IHVzaW5nIGEgY3VzdG9tIFF1YWxpZmllci5cbiAgICovXG4gIERFRkFVTFRfQlVDS0VUOiAnRGVmYXVsdEJ1Y2tldCcsXG4gIC8qKlxuICAgKiBTZWxlY3Qgd2hlbiB1c2luZyB0aGlzIGJ1Y2tldCBhcyBhIGNlbnRyYWxpemVkIGFjY2VzcyBsb2cgYnVja2V0XG4gICAqIGZvciBBTEIsIENsb3VkRnJvbnQsIFMzIHNlcnZlciBhY2Nlc3MgbG9nZ2luZywgYW5kIHNpbWlsYXIgcHJvZHVjZXJzLlxuICAgKi9cbiAgQUNDRVNTX0xPR19CVUNLRVQ6ICdBY2Nlc3NMb2dCdWNrZXQnLFxufSBhcyBjb25zdDtcblxuLyoqIEJ1Y2tldCB0eXBlOiBvbmUgb2YgdGhlIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGV9IGNvbnN0YW50IHZhbHVlcy4gKi9cbmV4cG9ydCB0eXBlIFMzU2VjdXJlQnVja2V0VHlwZSA9IHR5cGVvZiBTM1NlY3VyZUJ1Y2tldFR5cGVba2V5b2YgdHlwZW9mIFMzU2VjdXJlQnVja2V0VHlwZV07XG5cbi8qKlxuICogUHJvcHMgZm9yIHtAbGluayBTM1NlY3VyZUJ1Y2tldH0uIEV4dGVuZHMgYHMzLkJ1Y2tldFByb3BzYCB3aXRoIGEgYnVja2V0IHR5cGUgZm9yIHNlY3VyZSBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM1NlY3VyZUJ1Y2tldFByb3BzIGV4dGVuZHMgczMuQnVja2V0UHJvcHMge1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgYnVja2V0LiBEZXRlcm1pbmVzIGVuY3J5cHRpb24gYW5kIHJlc291cmNlIHBvbGljeSBiZWhhdmlvci5cbiAgICogQGRlZmF1bHQgUzNTZWN1cmVCdWNrZXRUeXBlLkRFRkFVTFRfQlVDS0VUXG4gICAqL1xuICByZWFkb25seSBidWNrZXRUeXBlPzogUzNTZWN1cmVCdWNrZXRUeXBlO1xufVxuXG4vKipcbiAqIEFuIFMzIGJ1Y2tldCB3aXRoIHNlY3VyZSBkZWZhdWx0czogcHJpdmF0ZSBhY2Nlc3MsIFNTTCBlbmZvcmNlZCwgcHVibGljIGFjY2VzcyBibG9ja2VkLCBhbmQgZW5jcnlwdGlvbiByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzU2VjdXJlQnVja2V0IGV4dGVuZHMgczMuQnVja2V0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBTM1NlY3VyZUJ1Y2tldFByb3BzKSB7XG4gICAgY29uc3QgYnVja2V0VHlwZSA9IHByb3BzPy5idWNrZXRUeXBlIHx8IFMzU2VjdXJlQnVja2V0VHlwZS5ERUZBVUxUX0JVQ0tFVDtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBlbmNyeXB0aW9uOiAoKCkgPT4ge1xuICAgICAgICBpZiAoYnVja2V0VHlwZSA9PT0gUzNTZWN1cmVCdWNrZXRUeXBlLkNMT1VERlJPTlRfT1JJR0lOX0JVQ0tFVCB8fCBidWNrZXRUeXBlID09PSBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVQpIHtcbiAgICAgICAgICByZXR1cm4gczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcz8uZW5jcnlwdGlvbiB8fCBzMy5CdWNrZXRFbmNyeXB0aW9uLktNU19NQU5BR0VEO1xuICAgICAgfSkoKSxcbiAgICAgIGFjY2Vzc0NvbnRyb2w6ICgoKSA9PiB7XG4gICAgICAgIGlmICghcHJvcHM/LmFjY2Vzc0NvbnRyb2wpIHtcbiAgICAgICAgICByZXR1cm4gczMuQnVja2V0QWNjZXNzQ29udHJvbC5QUklWQVRFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5hY2Nlc3NDb250cm9sO1xuICAgICAgfSkoKSxcbiAgICAgIGV2ZW50QnJpZGdlRW5hYmxlZDogdW5kZWZpbmVkLFxuICAgICAgcHVibGljUmVhZEFjY2VzczogZmFsc2UsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgIHZlcnNpb25lZDogcHJvcHM/LnZlcnNpb25lZCAhPT0gdW5kZWZpbmVkID8gcHJvcHMudmVyc2lvbmVkIDogdHJ1ZSxcbiAgICAgIG9iamVjdE93bmVyc2hpcDogKCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzPy5vYmplY3RPd25lcnNoaXApIHtcbiAgICAgICAgICByZXR1cm4gcHJvcHMub2JqZWN0T3duZXJzaGlwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzMy5PYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX0VORk9SQ0VEO1xuICAgICAgfSkoKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNmbkJ1Y2tldCA9IHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgYXMgczMuQ2ZuQnVja2V0O1xuICAgIGlmIChwcm9wcz8uZXZlbnRCcmlkZ2VFbmFibGVkID09PSB0cnVlKSB7XG4gICAgICBjZm5CdWNrZXQuYWRkUHJvcGVydHlPdmVycmlkZSgnTm90aWZpY2F0aW9uQ29uZmlndXJhdGlvbi5FdmVudEJyaWRnZUNvbmZpZ3VyYXRpb24uRXZlbnRCcmlkZ2VFbmFibGVkJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgY29uc3QgcmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuXG4gICAgaWYgKGJ1Y2tldFR5cGUgPT09IFMzU2VjdXJlQnVja2V0VHlwZS5ERVBMT1lNRU5UX1BJUEVMSU5FX0FSVElGQUNUX0JVQ0tFVCkge1xuXG4gICAgICBjb25zdCBxdWFsaWZpZXIgPSBTdGFjay5vZih0aGlzKS5zeW50aGVzaXplci5ib290c3RyYXBRdWFsaWZpZXI7XG5cbiAgICAgIGlmIChxdWFsaWZpZXIgJiYgKHF1YWxpZmllciAhPSBEZWZhdWx0U3RhY2tTeW50aGVzaXplci5ERUZBVUxUX1FVQUxJRklFUikpIHtcbiAgICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAnczM6KicsXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgIGAke3RoaXMuYnVja2V0QXJufWAsXG4gICAgICAgICAgICBgJHt0aGlzLmJ1Y2tldEFybn0vKmAsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChgYXJuOmF3czppYW06OiR7YWNjb3VudH06cm9sZS9jZGstJHtxdWFsaWZpZXJ9LWRlcGxveS1yb2xlLSR7YWNjb3VudH0tJHtyZWdpb259YCksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChidWNrZXRUeXBlID09PSBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVQpIHtcbiAgICAgIC8vIEFsbG93IEFMQiAvIE5MQiBsb2cgZGVsaXZlcnkgdG8gcHV0IG9iamVjdHMgKG5vIHJlYWQgb3IgbGlzdClcbiAgICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbG9nZGVsaXZlcnkuZWxhc3RpY2xvYWRiYWxhbmNpbmcuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBdLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOlB1dE9iamVjdCcsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGAke3RoaXMuYnVja2V0QXJufS9BV1NMb2dzLyR7YWNjb3VudH0vKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIEFsbG93IENsb3VkRnJvbnQgc3RhbmRhcmQgbG9nZ2luZyAodjIpIHRvIHdyaXRlIGxvZ3NcbiAgICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZGVsaXZlcnkubG9ncy5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgYCR7dGhpcy5idWNrZXRBcm59L0FXU0xvZ3MvJHthY2NvdW50fS8qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gQWxsb3cgUzMgc2VydmVyIGFjY2VzcyBsb2dnaW5nIHRvIHdyaXRlIGxvZ3Mgd2hlbiByZXF1aXJlZCBieSBjb25maWd1cmF0aW9uXG4gICAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xvZ2dpbmcuczMuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBdLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOlB1dE9iamVjdCcsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGAke3RoaXMuYnVja2V0QXJufS9BV1NMb2dzLyR7YWNjb3VudH0vKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
174
|
+
S3SecureBucket[_a] = { fqn: "s3-secure-bucket.S3SecureBucket", version: "0.2.1" };
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBbUY7QUFDbkYsMkNBQTJDO0FBQzNDLHlDQUF5QztBQUN6Qyx5REFBK0Q7QUFHL0Q7Ozs7R0FJRztBQUNVLFFBQUEsa0JBQWtCLEdBQUc7SUFDaEM7OztPQUdHO0lBQ0gsbUNBQW1DLEVBQUUsa0NBQWtDO0lBQ3ZFOztPQUVHO0lBQ0gsd0JBQXdCLEVBQUUsd0JBQXdCO0lBQ2xEOztPQUVHO0lBQ0gsY0FBYyxFQUFFLGVBQWU7SUFDL0I7Ozs7Ozs7T0FPRztJQUNILGlCQUFpQixFQUFFLGlCQUFpQjtDQUM1QixDQUFDO0FBc0JYOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLGNBQWUsU0FBUSxFQUFFLENBQUMsTUFBTTtJQVkzQzs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksMEJBQWtCLENBQUMsY0FBYyxDQUFDO1FBQzFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsYUFBYSxFQUFFLDJCQUFhLENBQUMsTUFBTTtZQUNuQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksVUFBVSxLQUFLLDBCQUFrQixDQUFDLHdCQUF3QixJQUFJLFVBQVUsS0FBSywwQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN0SCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7Z0JBQ3hDLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7WUFDOUQsQ0FBQyxDQUFDLEVBQUU7WUFDSixhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ25CLElBQUksQ0FB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QkFDL0MsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDeEIsVUFBVSxFQUFFO29CQUNWLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDO2lCQUNyRDtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsY0FBYztpQkFDZjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QscUJBQXFCO2lCQUN0QjthQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztJQUNILENBQUM7O0FBakpILHdDQWtKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlZmF1bHRTdGFja1N5bnRoZXNpemVyLCBSZW1vdmFsUG9saWN5LCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgRmFjdE5hbWUsIFJlZ2lvbkluZm8gfSBmcm9tICdhd3MtY2RrLWxpYi9yZWdpb24taW5mbyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElEZXBlbmRhYmxlIH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogQnVja2V0IHR5cGUgZGlzY3JpbWluYXRvciB2YWx1ZXMgZm9yIHtAbGluayBTM1NlY3VyZUJ1Y2tldFByb3BzLmJ1Y2tldFR5cGV9LlxuICpcbiAqIEBzZWUge0BsaW5rIFMzU2VjdXJlQnVja2V0UHJvcHMuYnVja2V0VHlwZX1cbiAqL1xuZXhwb3J0IGNvbnN0IFMzU2VjdXJlQnVja2V0VHlwZSA9IHtcbiAgLyoqXG4gICAqIFBpcGVsaW5lIGFydGlmYWN0IGJ1Y2tldCB3aGVuIHVzaW5nIGEgY3VzdG9tIENESyBib290c3RyYXAgcXVhbGlmaWVyXG4gICAqIChzaW5nbGUtIG9yIG11bHRpLXJlZ2lvbiBkZXBsb3ltZW50cykuXG4gICAqL1xuICBERVBMT1lNRU5UX1BJUEVMSU5FX0FSVElGQUNUX0JVQ0tFVDogJ0RlcGxveW1lbnRQaXBlbGluZUFydGlmYWN0QnVja2V0JyxcbiAgLyoqXG4gICAqIE9yaWdpbiBidWNrZXQgZm9yIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9ucy5cbiAgICovXG4gIENMT1VERlJPTlRfT1JJR0lOX0JVQ0tFVDogJ0Nsb3VkRnJvbnRPcmlnaW5CdWNrZXQnLFxuICAvKipcbiAgICogR2VuZXJhbC1wdXJwb3NlIHNlY3VyZSBidWNrZXQgKGRlZmF1bHQgcXVhbGlmaWVyIC8gc3RhbmRhcmQgdXNlKS5cbiAgICovXG4gIERFRkFVTFRfQlVDS0VUOiAnRGVmYXVsdEJ1Y2tldCcsXG4gIC8qKlxuICAgKiBDZW50cmFsaXplZCBhY2Nlc3MgbG9ncyBmb3IgcHJvZHVjZXJzIHN1Y2ggYXMgQUxCL05MQiwgQ2xvdWRGcm9udCBzdGFuZGFyZCBsb2dnaW5nICh2MiksXG4gICAqIGFuZCBTMyBzZXJ2ZXIgYWNjZXNzIGxvZ2dpbmcuIEdyYW50cyBgczM6UHV0T2JqZWN0YCBvbiBgQVdTTG9ncy88YWNjb3VudD4vKmAgb25seSAobm8gcmVhZC9saXN0KS5cbiAgICpcbiAgICogRm9yIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVR9LCB0aGUgcmVnaW9uYWwgRUxCdjIgbG9nLWRlbGl2ZXJ5IGFjY291bnQgSURcbiAgICogKGxlZ2FjeSBwYXRoIGFsb25nc2lkZSB0aGUgbG9nIGRlbGl2ZXJ5IHNlcnZpY2UgcHJpbmNpcGFsKSBpcyByZXNvbHZlZCBmcm9tIGBhd3MtY2RrLWxpYi9yZWdpb24taW5mb2BcbiAgICogYXQgc3ludGhlc2lzIHRpbWUgd2hlbiB7QGxpbmsgU3RhY2sjcmVnaW9ufSBpcyBrbm93biwgb3IgdmlhIGEgZGVwbG95LXRpbWUgbWFwcGluZyB3aGVuIGl0IGlzIGEgdG9rZW4uXG4gICAqL1xuICBBQ0NFU1NfTE9HX0JVQ0tFVDogJ0FjY2Vzc0xvZ0J1Y2tldCcsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24gb2Yge0BsaW5rIFMzU2VjdXJlQnVja2V0VHlwZX0gc3RyaW5nIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdHlwZSBTM1NlY3VyZUJ1Y2tldFR5cGUgPSB0eXBlb2YgUzNTZWN1cmVCdWNrZXRUeXBlW2tleW9mIHR5cGVvZiBTM1NlY3VyZUJ1Y2tldFR5cGVdO1xuXG4vKipcbiAqIENvbnN0cnVjdGlvbiBwcm9wZXJ0aWVzIGZvciB7QGxpbmsgUzNTZWN1cmVCdWNrZXR9LlxuICpcbiAqIEV4dGVuZHMge0BsaW5rIHMzLkJ1Y2tldFByb3BzfTsgc2V2ZXJhbCBmaWVsZHMgcmVjZWl2ZSBzZWN1cmUgZGVmYXVsdHMgaW5zaWRlIHRoZSBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUzNTZWN1cmVCdWNrZXRQcm9wcyBleHRlbmRzIHMzLkJ1Y2tldFByb3BzIHtcblxuICAvKipcbiAgICogU2VsZWN0cyBlbmNyeXB0aW9uIGRlZmF1bHRzIGFuZCBvcHRpb25hbCByZXNvdXJjZS1wb2xpY3kgc3RhdGVtZW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFMzU2VjdXJlQnVja2V0VHlwZS5ERUZBVUxUX0JVQ0tFVH1cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldFR5cGU/OiBTM1NlY3VyZUJ1Y2tldFR5cGU7XG59XG5cbi8qKlxuICogUzMgYnVja2V0IHdpdGggb3BpbmlvbmF0ZWQgc2VjdXJlIGRlZmF1bHRzOiBwcml2YXRlIEFDTHMsIGJsb2NrIHB1YmxpYyBhY2Nlc3MsIFRMUy1vbmx5IGFjY2VzcyxcbiAqIGFuZCBlbmNyeXB0aW9uIChTMy1tYW5hZ2VkIGZvciBsb2cvb3JpZ2luIHR5cGVzOyBLTVMtbWFuYWdlZCBieSBkZWZhdWx0IG90aGVyd2lzZSkuXG4gKlxuICogQHJlbWFya3NcbiAqIC0ge0BsaW5rIFMzU2VjdXJlQnVja2V0VHlwZS5ERVBMT1lNRU5UX1BJUEVMSU5FX0FSVElGQUNUX0JVQ0tFVH06IG1heSBhdHRhY2ggYSBkZXBsb3ktcm9sZSBwb2xpY3kgd2hlbiBhIG5vbi1kZWZhdWx0IGJvb3RzdHJhcCBxdWFsaWZpZXIgaXMgcHJlc2VudC5cbiAqIC0ge0BsaW5rIFMzU2VjdXJlQnVja2V0VHlwZS5BQ0NFU1NfTE9HX0JVQ0tFVH06IGFkZHMgbG9nLXdyaXRlciBwcmluY2lwYWxzOyBzZWUge0BsaW5rIFMzU2VjdXJlQnVja2V0VHlwZS5BQ0NFU1NfTE9HX0JVQ0tFVH0gYW5kIHtAbGluayBTM1NlY3VyZUJ1Y2tldCNhY2Nlc3NMb2dCdWNrZXRQb2xpY3lEZXBlbmRhYmxlfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzU2VjdXJlQnVja2V0IGV4dGVuZHMgczMuQnVja2V0IHtcbiAgLyoqXG4gICAqIFNldCBvbmx5IHdoZW4ge0BsaW5rIFMzU2VjdXJlQnVja2V0UHJvcHMuYnVja2V0VHlwZX0gaXMge0BsaW5rIFMzU2VjdXJlQnVja2V0VHlwZS5BQ0NFU1NfTE9HX0JVQ0tFVH0uXG4gICAqIFVzZSBhcyBhIGRlcGVuZGVuY3kgdGFyZ2V0IHNvIGxvYWQgYmFsYW5jZXIgYWNjZXNzLWxvZyBlbmFibGVtZW50IHJ1bnMgYWZ0ZXIgdGhlIGJ1Y2tldCBwb2xpY3lcbiAgICogZXhpc3RzIChFTEIgcGVyZm9ybXMgYW4gaW1tZWRpYXRlIHZhbGlkYXRpb24gYFB1dE9iamVjdGAgdGhhdCBmYWlscyBpZiB0aGUgcG9saWN5IGlzIG5vdCBhcHBsaWVkIHlldCkuXG4gICAqXG4gICAqIEV4YW1wbGU6IGBsb2FkQmFsYW5jZXIubm9kZS5hZGREZXBlbmRlbmN5KGJ1Y2tldC5hY2Nlc3NMb2dCdWNrZXRQb2xpY3lEZXBlbmRhYmxlISlgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgd2hlbiBgYnVja2V0VHlwZWAgaXMgbm90IHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVR9LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFjY2Vzc0xvZ0J1Y2tldFBvbGljeURlcGVuZGFibGU/OiBJRGVwZW5kYWJsZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNlY3VyZSBTMyBidWNrZXQgYWNjb3JkaW5nIHRvIGBidWNrZXRUeXBlYCBhbmQgbWVyZ2VkIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFBhcmVudCBjb25zdHJ1Y3QsIHR5cGljYWxseSBhIHtAbGluayBTdGFja30uXG4gICAqIEBwYXJhbSBpZCAtIENvbnN0cnVjdCBJRCAoc3RhYmxlIGxvZ2ljYWwgSUQgc2VnbWVudCkuXG4gICAqIEBwYXJhbSBwcm9wcyAtIE9wdGlvbmFsIHtAbGluayBzMy5CdWNrZXRQcm9wc30gcGx1cyB7QGxpbmsgUzNTZWN1cmVCdWNrZXRQcm9wcy5idWNrZXRUeXBlfSBhbmQgYGV2ZW50QnJpZGdlRW5hYmxlZGAgKGFwcGxpZWQgdmlhIEwxIG92ZXJyaWRlIHdoZW4gdHJ1ZSkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFMzU2VjdXJlQnVja2V0UHJvcHMpIHtcbiAgICBjb25zdCBidWNrZXRUeXBlID0gcHJvcHM/LmJ1Y2tldFR5cGUgfHwgUzNTZWN1cmVCdWNrZXRUeXBlLkRFRkFVTFRfQlVDS0VUO1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgIGVuY3J5cHRpb246ICgoKSA9PiB7XG4gICAgICAgIGlmIChidWNrZXRUeXBlID09PSBTM1NlY3VyZUJ1Y2tldFR5cGUuQ0xPVURGUk9OVF9PUklHSU5fQlVDS0VUIHx8IGJ1Y2tldFR5cGUgPT09IFMzU2VjdXJlQnVja2V0VHlwZS5BQ0NFU1NfTE9HX0JVQ0tFVCkge1xuICAgICAgICAgIHJldHVybiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BzPy5lbmNyeXB0aW9uIHx8IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TX01BTkFHRUQ7XG4gICAgICB9KSgpLFxuICAgICAgYWNjZXNzQ29udHJvbDogKCgpID0+IHtcbiAgICAgICAgaWYgKCFwcm9wcz8uYWNjZXNzQ29udHJvbCkge1xuICAgICAgICAgIHJldHVybiBzMy5CdWNrZXRBY2Nlc3NDb250cm9sLlBSSVZBVEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BzLmFjY2Vzc0NvbnRyb2w7XG4gICAgICB9KSgpLFxuICAgICAgZXZlbnRCcmlkZ2VFbmFibGVkOiB1bmRlZmluZWQsXG4gICAgICBwdWJsaWNSZWFkQWNjZXNzOiBmYWxzZSxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBzMy5CbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcz8udmVyc2lvbmVkICE9PSB1bmRlZmluZWQgPyBwcm9wcy52ZXJzaW9uZWQgOiB0cnVlLFxuICAgICAgb2JqZWN0T3duZXJzaGlwOiAoKCkgPT4ge1xuICAgICAgICBpZiAocHJvcHM/Lm9iamVjdE93bmVyc2hpcCkge1xuICAgICAgICAgIHJldHVybiBwcm9wcy5vYmplY3RPd25lcnNoaXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHMzLk9iamVjdE93bmVyc2hpcC5CVUNLRVRfT1dORVJfRU5GT1JDRUQ7XG4gICAgICB9KSgpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgY2ZuQnVja2V0ID0gdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzMy5DZm5CdWNrZXQ7XG4gICAgaWYgKHByb3BzPy5ldmVudEJyaWRnZUVuYWJsZWQgPT09IHRydWUpIHtcbiAgICAgIGNmbkJ1Y2tldC5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdOb3RpZmljYXRpb25Db25maWd1cmF0aW9uLkV2ZW50QnJpZGdlQ29uZmlndXJhdGlvbi5FdmVudEJyaWRnZUVuYWJsZWQnLCB0cnVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NvdW50ID0gU3RhY2sub2YodGhpcykuYWNjb3VudDtcbiAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG5cbiAgICBpZiAoYnVja2V0VHlwZSA9PT0gUzNTZWN1cmVCdWNrZXRUeXBlLkRFUExPWU1FTlRfUElQRUxJTkVfQVJUSUZBQ1RfQlVDS0VUKSB7XG5cbiAgICAgIGNvbnN0IHF1YWxpZmllciA9IFN0YWNrLm9mKHRoaXMpLnN5bnRoZXNpemVyLmJvb3RzdHJhcFF1YWxpZmllcjtcblxuICAgICAgaWYgKHF1YWxpZmllciAmJiAocXVhbGlmaWVyICE9IERlZmF1bHRTdGFja1N5bnRoZXNpemVyLkRFRkFVTFRfUVVBTElGSUVSKSkge1xuICAgICAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdzMzoqJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgYCR7dGhpcy5idWNrZXRBcm59YCxcbiAgICAgICAgICAgIGAke3RoaXMuYnVja2V0QXJufS8qYCxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgICAgIG5ldyBpYW0uQXJuUHJpbmNpcGFsKGBhcm46YXdzOmlhbTo6JHthY2NvdW50fTpyb2xlL2Nkay0ke3F1YWxpZmllcn0tZGVwbG95LXJvbGUtJHthY2NvdW50fS0ke3JlZ2lvbn1gKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJ1Y2tldFR5cGUgPT09IFMzU2VjdXJlQnVja2V0VHlwZS5BQ0NFU1NfTE9HX0JVQ0tFVCkge1xuICAgICAgY29uc3QgYXdzTG9nc1ByZWZpeFJlc291cmNlID0gYCR7dGhpcy5idWNrZXRBcm59L0FXU0xvZ3MvJHthY2NvdW50fS8qYDtcblxuICAgICAgLy8gQWxsb3cgQUxCIC8gTkxCIGxvZyBkZWxpdmVyeSAobW9kZXJuIHNlcnZpY2UgcHJpbmNpcGFsIHBhdGg7IGFsc28gcmVxdWlyZWQgaW4gb3B0LWluIHJlZ2lvbnMpLlxuICAgICAgY29uc3QgYWxiTG9nRGVsaXZlcnlQb2xpY3lSZXN1bHQgPSB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xvZ2RlbGl2ZXJ5LmVsYXN0aWNsb2FkYmFsYW5jaW5nLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgXSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdzMzpQdXRPYmplY3QnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBhd3NMb2dzUHJlZml4UmVzb3VyY2UsXG4gICAgICAgIF0sXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIEluIG5vbuKAk29wdC1pbiByZWdpb25zIChmb3IgZXhhbXBsZSBhcC1ub3J0aGVhc3QtMSksIGFjY2VzcyBsb2dzIGFyZSBvZnRlbiBkZWxpdmVyZWQgdXNpbmcgdGhlXG4gICAgICAvLyByZWdpb25hbCBFTEJ2MiBhY2NvdW50IChyb290IG9mIHRoYXQgYWNjb3VudCkgZm9yIHMzOlB1dE9iamVjdCwgbm90IG9ubHkgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGFib3ZlLlxuICAgICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcbiAgICAgIGNvbnN0IGVsYkFjY291bnRJZCA9IFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5yZWdpb24pXG4gICAgICAgID8gc3RhY2sucmVnaW9uYWxGYWN0KEZhY3ROYW1lLkVMQlYyX0FDQ09VTlQpXG4gICAgICAgIDogUmVnaW9uSW5mby5nZXQoc3RhY2sucmVnaW9uKS5lbGJ2MkFjY291bnQ7XG4gICAgICBpZiAoZWxiQWNjb3VudElkKSB7XG4gICAgICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgICAgIG5ldyBpYW0uQWNjb3VudFByaW5jaXBhbChlbGJBY2NvdW50SWQpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgJ3MzOlB1dE9iamVjdCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgIGF3c0xvZ3NQcmVmaXhSZXNvdXJjZSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWNjZXNzTG9nQnVja2V0UG9saWN5RGVwZW5kYWJsZSA9IGFsYkxvZ0RlbGl2ZXJ5UG9saWN5UmVzdWx0LnBvbGljeURlcGVuZGFibGUgPz8gdGhpcztcblxuICAgICAgLy8gQWxsb3cgQ2xvdWRGcm9udCBzdGFuZGFyZCBsb2dnaW5nICh2MikgdG8gd3JpdGUgbG9nc1xuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdkZWxpdmVyeS5sb2dzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgXSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdzMzpQdXRPYmplY3QnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBhd3NMb2dzUHJlZml4UmVzb3VyY2UsXG4gICAgICAgIF0sXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIEFsbG93IFMzIHNlcnZlciBhY2Nlc3MgbG9nZ2luZyB0byB3cml0ZSBsb2dzIHdoZW4gcmVxdWlyZWQgYnkgY29uZmlndXJhdGlvblxuICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsb2dnaW5nLnMzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgXSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdzMzpQdXRPYmplY3QnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBhd3NMb2dzUHJlZml4UmVzb3VyY2UsXG4gICAgICAgIF0sXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|