cdk-rds-sql 7.2.3 → 7.3.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/.claude/hooks/lint +37 -0
- package/.claude/settings.json +1 -1
- package/.jsii +8 -8
- package/.pre-commit-config.yaml +8 -0
- package/AGENTS.md +5 -6
- package/CLAUDE.md +5 -6
- package/lambda/engine.abstract.ts +10 -14
- package/lambda/engine.dsql.ts +128 -78
- package/lambda/engine.mysql.test.ts +2 -2
- package/lambda/engine.mysql.ts +7 -14
- package/lambda/engine.postgresql.ts +7 -14
- package/lambda/handler.ts +11 -13
- package/lambda/types.ts +3 -2
- package/lib/database.js +1 -1
- package/lib/handler/handler.js +112 -78
- package/lib/iam-grant.d.ts +1 -0
- package/lib/iam-grant.js +14 -3
- package/lib/provider.js +1 -1
- package/lib/role.js +1 -1
- package/lib/schema.js +1 -1
- package/lib/sql.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -o errexit -o pipefail -o nounset
|
|
4
|
+
|
|
5
|
+
# Script claude should use for linting.
|
|
6
|
+
|
|
7
|
+
# Make sure we're in the root
|
|
8
|
+
if [ ! -z "${CLAUDE_PROJECT_DIR:-}" ]
|
|
9
|
+
then
|
|
10
|
+
cd $CLAUDE_PROJECT_DIR
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
# No file edited, leave
|
|
14
|
+
if [ ! -e ".claude/hooks/.edited" ]
|
|
15
|
+
then
|
|
16
|
+
exit 0
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# Read hook input from stdin and check for stop_hook_active flag
|
|
20
|
+
if command -v jq >/dev/null 2>&1; then
|
|
21
|
+
input=$(cat)
|
|
22
|
+
stop_hook_active=$(echo "$input" | jq -r '.stop_hook_active // false')
|
|
23
|
+
if [ "$stop_hook_active" = "true" ]; then
|
|
24
|
+
exit 0
|
|
25
|
+
fi
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
format=$(npx projen eslint)
|
|
29
|
+
|
|
30
|
+
# Capture stdout and check exit code for the main linting command
|
|
31
|
+
if ! output=$(npx projen typecheck 2>&1); then
|
|
32
|
+
echo "$output" >&2
|
|
33
|
+
exit 2
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# We're done, remove .edited
|
|
37
|
+
rm .claude/hooks/.edited
|
package/.claude/settings.json
CHANGED
package/.jsii
CHANGED
|
@@ -4447,7 +4447,7 @@
|
|
|
4447
4447
|
},
|
|
4448
4448
|
"locationInModule": {
|
|
4449
4449
|
"filename": "src/iam-grant.ts",
|
|
4450
|
-
"line":
|
|
4450
|
+
"line": 34
|
|
4451
4451
|
},
|
|
4452
4452
|
"parameters": [
|
|
4453
4453
|
{
|
|
@@ -4473,7 +4473,7 @@
|
|
|
4473
4473
|
"kind": "class",
|
|
4474
4474
|
"locationInModule": {
|
|
4475
4475
|
"filename": "src/iam-grant.ts",
|
|
4476
|
-
"line":
|
|
4476
|
+
"line": 24
|
|
4477
4477
|
},
|
|
4478
4478
|
"name": "IamGrant",
|
|
4479
4479
|
"symbolId": "src/iam-grant:IamGrant"
|
|
@@ -4488,7 +4488,7 @@
|
|
|
4488
4488
|
"kind": "interface",
|
|
4489
4489
|
"locationInModule": {
|
|
4490
4490
|
"filename": "src/iam-grant.ts",
|
|
4491
|
-
"line":
|
|
4491
|
+
"line": 7
|
|
4492
4492
|
},
|
|
4493
4493
|
"name": "IamGrantProps",
|
|
4494
4494
|
"properties": [
|
|
@@ -4501,7 +4501,7 @@
|
|
|
4501
4501
|
"immutable": true,
|
|
4502
4502
|
"locationInModule": {
|
|
4503
4503
|
"filename": "src/iam-grant.ts",
|
|
4504
|
-
"line":
|
|
4504
|
+
"line": 11
|
|
4505
4505
|
},
|
|
4506
4506
|
"name": "provider",
|
|
4507
4507
|
"type": {
|
|
@@ -4517,7 +4517,7 @@
|
|
|
4517
4517
|
"immutable": true,
|
|
4518
4518
|
"locationInModule": {
|
|
4519
4519
|
"filename": "src/iam-grant.ts",
|
|
4520
|
-
"line":
|
|
4520
|
+
"line": 21
|
|
4521
4521
|
},
|
|
4522
4522
|
"name": "resourceArn",
|
|
4523
4523
|
"type": {
|
|
@@ -4533,7 +4533,7 @@
|
|
|
4533
4533
|
"immutable": true,
|
|
4534
4534
|
"locationInModule": {
|
|
4535
4535
|
"filename": "src/iam-grant.ts",
|
|
4536
|
-
"line":
|
|
4536
|
+
"line": 16
|
|
4537
4537
|
},
|
|
4538
4538
|
"name": "roleName",
|
|
4539
4539
|
"type": {
|
|
@@ -5594,6 +5594,6 @@
|
|
|
5594
5594
|
"symbolId": "src/sql:SqlProps"
|
|
5595
5595
|
}
|
|
5596
5596
|
},
|
|
5597
|
-
"version": "7.
|
|
5598
|
-
"fingerprint": "
|
|
5597
|
+
"version": "7.3.1",
|
|
5598
|
+
"fingerprint": "Mc3PNE6TVDDeFZIrlQTTfKYL82JgisTUWw7OGZDbhFo="
|
|
5599
5599
|
}
|
package/.pre-commit-config.yaml
CHANGED
|
@@ -27,6 +27,14 @@ repos:
|
|
|
27
27
|
exclude: (.mergify.yml|.projen/|.github|tsconfig.dev.json|.gitignore|LICENSE|.gitattributes|.eslintrc.json)
|
|
28
28
|
stages:
|
|
29
29
|
- pre-commit
|
|
30
|
+
- repo: local
|
|
31
|
+
hooks:
|
|
32
|
+
- id: projen
|
|
33
|
+
name: run-projen
|
|
34
|
+
language: system
|
|
35
|
+
entry: sh -c 'npx projen'
|
|
36
|
+
files: \.ts$
|
|
37
|
+
pass_filenames: false
|
|
30
38
|
- repo: local
|
|
31
39
|
hooks:
|
|
32
40
|
- id: build-typescript
|
package/AGENTS.md
CHANGED
|
@@ -42,6 +42,9 @@ npx projen test
|
|
|
42
42
|
# Run tests in watch mode
|
|
43
43
|
npx projen test:watch
|
|
44
44
|
|
|
45
|
+
# Run typecheck (instead of npx tsc --noEmit)
|
|
46
|
+
npx projen typecheck
|
|
47
|
+
|
|
45
48
|
# Run linting
|
|
46
49
|
npx projen eslint
|
|
47
50
|
|
|
@@ -108,10 +111,6 @@ Projen tasks:
|
|
|
108
111
|
- Global RDS certificate bundle is automatically downloaded during build
|
|
109
112
|
- Can be disabled via `ssl: false` in Provider props
|
|
110
113
|
|
|
111
|
-
##
|
|
114
|
+
## Code style
|
|
112
115
|
|
|
113
|
-
-
|
|
114
|
-
- **Node.js**: >= 22.14
|
|
115
|
-
- **TypeScript**: ~5.8
|
|
116
|
-
- **Database Drivers**: pg (PostgreSQL), mysql2 (MySQL)
|
|
117
|
-
- **AWS SDKs**: secrets-manager, ssm clients
|
|
116
|
+
- Avoid any.
|
package/CLAUDE.md
CHANGED
|
@@ -42,6 +42,9 @@ npx projen test
|
|
|
42
42
|
# Run tests in watch mode
|
|
43
43
|
npx projen test:watch
|
|
44
44
|
|
|
45
|
+
# Run typecheck (instead of npx tsc --noEmit)
|
|
46
|
+
npx projen typecheck
|
|
47
|
+
|
|
45
48
|
# Run linting
|
|
46
49
|
npx projen eslint
|
|
47
50
|
|
|
@@ -108,10 +111,6 @@ Projen tasks:
|
|
|
108
111
|
- Global RDS certificate bundle is automatically downloaded during build
|
|
109
112
|
- Can be disabled via `ssl: false` in Provider props
|
|
110
113
|
|
|
111
|
-
##
|
|
114
|
+
## Code style
|
|
112
115
|
|
|
113
|
-
-
|
|
114
|
-
- **Node.js**: >= 22.14
|
|
115
|
-
- **TypeScript**: ~5.8
|
|
116
|
-
- **Database Drivers**: pg (PostgreSQL), mysql2 (MySQL)
|
|
117
|
-
- **AWS SDKs**: secrets-manager, ssm clients
|
|
116
|
+
- Avoid any.
|
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
EngineRoleProperties,
|
|
9
9
|
EngineSchemaProperties,
|
|
10
10
|
EngineSqlProperties,
|
|
11
|
-
EngineIamGrantProperties,
|
|
12
11
|
} from "./types"
|
|
13
12
|
|
|
14
13
|
export interface EngineConnectionConfig {
|
|
@@ -51,7 +50,10 @@ export abstract class AbstractEngine {
|
|
|
51
50
|
props: EngineRoleProperties,
|
|
52
51
|
oldProps: EngineRoleProperties
|
|
53
52
|
): Promise<string | string[]>
|
|
54
|
-
abstract deleteRole(
|
|
53
|
+
abstract deleteRole(
|
|
54
|
+
resourceId: string,
|
|
55
|
+
props: EngineRoleProperties
|
|
56
|
+
): Promise<string | string[]>
|
|
55
57
|
|
|
56
58
|
abstract createSchema(
|
|
57
59
|
resourceId: string,
|
|
@@ -75,20 +77,14 @@ export abstract class AbstractEngine {
|
|
|
75
77
|
): string | string[]
|
|
76
78
|
abstract deleteSql(resourceId: string, props: EngineSqlProperties): string | string[]
|
|
77
79
|
|
|
78
|
-
abstract createIamGrant(
|
|
79
|
-
resourceId: string,
|
|
80
|
-
props: EngineIamGrantProperties
|
|
81
|
-
): string | string[]
|
|
80
|
+
abstract createIamGrant(roleName: string, iamArn: string): string | string[]
|
|
82
81
|
abstract updateIamGrant(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
): string | string[]
|
|
88
|
-
abstract deleteIamGrant(
|
|
89
|
-
resourceId: string,
|
|
90
|
-
props: EngineIamGrantProperties
|
|
82
|
+
roleName: string,
|
|
83
|
+
oldRoleName: string,
|
|
84
|
+
iamArn: string,
|
|
85
|
+
oldIamArn: string
|
|
91
86
|
): string | string[]
|
|
87
|
+
abstract deleteIamGrant(roleName: string, iamArn: string): string | string[]
|
|
92
88
|
|
|
93
89
|
abstract executeSQL(
|
|
94
90
|
sql: string | string[],
|
package/lambda/engine.dsql.ts
CHANGED
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
EngineRoleProperties,
|
|
8
8
|
EngineSchemaProperties,
|
|
9
9
|
EngineSqlProperties,
|
|
10
|
-
EngineIamGrantProperties,
|
|
11
10
|
} from "./types"
|
|
12
11
|
|
|
13
12
|
export class DsqlEngine extends AbstractEngine {
|
|
@@ -37,19 +36,7 @@ export class DsqlEngine extends AbstractEngine {
|
|
|
37
36
|
}
|
|
38
37
|
|
|
39
38
|
async createRole(resourceId: string, props: EngineRoleProperties): Promise<string[]> {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// DSQL always uses IAM authentication, no passwords
|
|
43
|
-
sql.push(pgFormat("CREATE ROLE %I WITH LOGIN", resourceId))
|
|
44
|
-
|
|
45
|
-
if (props?.DatabaseName) {
|
|
46
|
-
sql.push(
|
|
47
|
-
pgFormat("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
|
|
48
|
-
)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
sql.push("COMMIT")
|
|
52
|
-
return sql
|
|
39
|
+
return this.generateCreateRoleSql(resourceId, props?.DatabaseName)
|
|
53
40
|
}
|
|
54
41
|
|
|
55
42
|
async updateRole(
|
|
@@ -61,31 +48,26 @@ export class DsqlEngine extends AbstractEngine {
|
|
|
61
48
|
const sql: string[] = []
|
|
62
49
|
|
|
63
50
|
if (oldResourceId !== resourceId) {
|
|
64
|
-
// DSQL doesn't support RENAME, so we
|
|
65
|
-
//
|
|
51
|
+
// DSQL doesn't support RENAME, so we create new role and drop old one
|
|
52
|
+
// Create new role with old database permissions first
|
|
53
|
+
sql.push(...this.generateCreateRoleSql(resourceId, oldProps?.DatabaseName))
|
|
66
54
|
|
|
67
|
-
//
|
|
68
|
-
sql.push(
|
|
69
|
-
sql.push(pgFormat("CREATE ROLE %I WITH LOGIN", resourceId))
|
|
55
|
+
// Add special marker for IAM grant revocation
|
|
56
|
+
sql.push(`-- REVOKE_IAM_GRANTS_FOR_ROLE: ${oldResourceId}`)
|
|
70
57
|
|
|
71
|
-
//
|
|
72
|
-
|
|
58
|
+
// Drop old role
|
|
59
|
+
sql.push(...this.generateDropRoleSql(oldResourceId))
|
|
60
|
+
|
|
61
|
+
// If database changed as well, grant new database permissions
|
|
62
|
+
if (props?.DatabaseName && props.DatabaseName !== oldProps?.DatabaseName) {
|
|
63
|
+
sql.push("BEGIN")
|
|
73
64
|
sql.push(
|
|
74
|
-
pgFormat(
|
|
75
|
-
"GRANT CONNECT ON DATABASE %I TO %I",
|
|
76
|
-
oldProps.DatabaseName,
|
|
77
|
-
resourceId
|
|
78
|
-
)
|
|
65
|
+
pgFormat("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
|
|
79
66
|
)
|
|
67
|
+
sql.push("COMMIT")
|
|
80
68
|
}
|
|
81
|
-
sql.push("COMMIT")
|
|
82
|
-
|
|
83
|
-
// Second transaction: Drop the old role
|
|
84
|
-
sql.push("BEGIN")
|
|
85
|
-
sql.push(pgFormat("DROP ROLE IF EXISTS %I", oldResourceId))
|
|
86
|
-
sql.push("COMMIT")
|
|
87
69
|
} else {
|
|
88
|
-
//
|
|
70
|
+
// Only permissions are changing (no rename)
|
|
89
71
|
sql.push("BEGIN")
|
|
90
72
|
|
|
91
73
|
// Handle database permission changes
|
|
@@ -124,37 +106,21 @@ export class DsqlEngine extends AbstractEngine {
|
|
|
124
106
|
sql.push("COMMIT")
|
|
125
107
|
}
|
|
126
108
|
|
|
127
|
-
// Handle case where role was renamed AND database changed to a different one
|
|
128
|
-
if (
|
|
129
|
-
oldResourceId !== resourceId &&
|
|
130
|
-
props?.DatabaseName &&
|
|
131
|
-
props.DatabaseName !== oldProps?.DatabaseName
|
|
132
|
-
) {
|
|
133
|
-
sql.push("BEGIN")
|
|
134
|
-
sql.push(
|
|
135
|
-
pgFormat("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
|
|
136
|
-
)
|
|
137
|
-
sql.push("COMMIT")
|
|
138
|
-
}
|
|
139
|
-
|
|
140
109
|
return sql
|
|
141
110
|
}
|
|
142
111
|
|
|
143
|
-
deleteRole(
|
|
144
|
-
|
|
112
|
+
async deleteRole(
|
|
113
|
+
resourceId: string,
|
|
114
|
+
props: EngineRoleProperties
|
|
115
|
+
): Promise<string | string[]> {
|
|
116
|
+
const sql: string[] = []
|
|
145
117
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
resourceId
|
|
152
|
-
)
|
|
153
|
-
)
|
|
154
|
-
}
|
|
118
|
+
// Add special marker for IAM grant revocation
|
|
119
|
+
sql.push(`-- REVOKE_IAM_GRANTS_FOR_ROLE: ${resourceId}`)
|
|
120
|
+
|
|
121
|
+
// Add the regular drop role SQL
|
|
122
|
+
sql.push(...this.generateDropRoleSql(resourceId, props?.DatabaseName))
|
|
155
123
|
|
|
156
|
-
sql.push(pgFormat("DROP ROLE IF EXISTS %I", resourceId))
|
|
157
|
-
sql.push("COMMIT")
|
|
158
124
|
return sql
|
|
159
125
|
}
|
|
160
126
|
|
|
@@ -226,41 +192,47 @@ export class DsqlEngine extends AbstractEngine {
|
|
|
226
192
|
return []
|
|
227
193
|
}
|
|
228
194
|
|
|
229
|
-
createIamGrant(
|
|
230
|
-
if (!
|
|
195
|
+
createIamGrant(roleName: string, iamArn: string): string | string[] {
|
|
196
|
+
if (!iamArn) {
|
|
231
197
|
throw new Error("ResourceArn is required for IAM grant")
|
|
232
198
|
}
|
|
233
|
-
return pgFormat("AWS IAM GRANT %I TO %L",
|
|
199
|
+
return pgFormat("AWS IAM GRANT %I TO %L", roleName, iamArn)
|
|
234
200
|
}
|
|
235
201
|
|
|
236
202
|
updateIamGrant(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
203
|
+
roleName: string,
|
|
204
|
+
oldRoleName: string,
|
|
205
|
+
iamArn: string,
|
|
206
|
+
oldIamArn: string
|
|
241
207
|
): string | string[] {
|
|
242
208
|
const statements: string[] = []
|
|
243
209
|
|
|
210
|
+
// Only update if role name or IAM role ARN changed
|
|
211
|
+
const roleNameChanged = oldRoleName !== roleName
|
|
212
|
+
const arnChanged = oldIamArn !== iamArn
|
|
213
|
+
|
|
214
|
+
if (!roleNameChanged && !arnChanged) {
|
|
215
|
+
return statements // No changes needed
|
|
216
|
+
}
|
|
217
|
+
|
|
244
218
|
// Revoke old grant if resource ARN or role name changed
|
|
245
|
-
if (
|
|
246
|
-
statements.push(
|
|
247
|
-
pgFormat("AWS IAM REVOKE %I FROM %L", oldResourceId, oldProps.ResourceArn)
|
|
248
|
-
)
|
|
219
|
+
if (oldIamArn) {
|
|
220
|
+
statements.push(pgFormat("AWS IAM REVOKE %I FROM %L", oldRoleName, oldIamArn))
|
|
249
221
|
}
|
|
250
222
|
|
|
251
223
|
// Grant new permissions
|
|
252
|
-
if (
|
|
253
|
-
statements.push(pgFormat("AWS IAM GRANT %I TO %L",
|
|
224
|
+
if (iamArn) {
|
|
225
|
+
statements.push(pgFormat("AWS IAM GRANT %I TO %L", roleName, iamArn))
|
|
254
226
|
}
|
|
255
227
|
|
|
256
228
|
return statements
|
|
257
229
|
}
|
|
258
230
|
|
|
259
|
-
deleteIamGrant(
|
|
260
|
-
if (!
|
|
231
|
+
deleteIamGrant(roleName: string, iamArn: string): string | string[] {
|
|
232
|
+
if (!iamArn) {
|
|
261
233
|
throw new Error("ResourceArn is required for IAM grant deletion")
|
|
262
234
|
}
|
|
263
|
-
return pgFormat("AWS IAM REVOKE %I FROM %L",
|
|
235
|
+
return pgFormat("AWS IAM REVOKE %I FROM %L", roleName, iamArn)
|
|
264
236
|
}
|
|
265
237
|
|
|
266
238
|
async executeSQL(sql: string | string[], config: EngineConnectionConfig): Promise<any> {
|
|
@@ -304,9 +276,31 @@ export class DsqlEngine extends AbstractEngine {
|
|
|
304
276
|
|
|
305
277
|
for (const statement of statements) {
|
|
306
278
|
if (statement.trim()) {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
279
|
+
// Handle special IAM grant revocation marker
|
|
280
|
+
if (statement.startsWith("-- REVOKE_IAM_GRANTS_FOR_ROLE:")) {
|
|
281
|
+
const roleName = statement
|
|
282
|
+
.replace("-- REVOKE_IAM_GRANTS_FOR_ROLE:", "")
|
|
283
|
+
.trim()
|
|
284
|
+
await this.revokeIamGrantsForRole(client, roleName)
|
|
285
|
+
} else if (statement.includes("AWS IAM REVOKE")) {
|
|
286
|
+
this.log(`Executing SQL: ${statement}`)
|
|
287
|
+
try {
|
|
288
|
+
const result = await client.query(statement)
|
|
289
|
+
results.push(result)
|
|
290
|
+
} catch (error: any) {
|
|
291
|
+
if (error.message && error.message.includes("does not exist")) {
|
|
292
|
+
this.log(
|
|
293
|
+
`Ignoring error for IAM REVOKE (role doesn't exist): ${error.message}`
|
|
294
|
+
)
|
|
295
|
+
} else {
|
|
296
|
+
throw error
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
} else {
|
|
300
|
+
this.log(`Executing SQL: ${statement}`)
|
|
301
|
+
const result = await client.query(statement)
|
|
302
|
+
results.push(result)
|
|
303
|
+
}
|
|
310
304
|
}
|
|
311
305
|
}
|
|
312
306
|
|
|
@@ -338,4 +332,60 @@ export class DsqlEngine extends AbstractEngine {
|
|
|
338
332
|
pgFormat("REVOKE ALL ON SCHEMA %I FROM %I", schema, roleName),
|
|
339
333
|
]
|
|
340
334
|
}
|
|
335
|
+
|
|
336
|
+
private generateCreateRoleSql(roleName: string, databaseName?: string): string[] {
|
|
337
|
+
const sql = ["BEGIN"]
|
|
338
|
+
sql.push(pgFormat("CREATE ROLE %I WITH LOGIN", roleName))
|
|
339
|
+
|
|
340
|
+
if (databaseName) {
|
|
341
|
+
sql.push(pgFormat("GRANT CONNECT ON DATABASE %I TO %I", databaseName, roleName))
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
sql.push("COMMIT")
|
|
345
|
+
return sql
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
private generateDropRoleSql(roleName: string, databaseName?: string): string[] {
|
|
349
|
+
const sql = ["BEGIN"]
|
|
350
|
+
|
|
351
|
+
if (databaseName) {
|
|
352
|
+
sql.push(
|
|
353
|
+
pgFormat("REVOKE ALL PRIVILEGES ON DATABASE %I FROM %I", databaseName, roleName)
|
|
354
|
+
)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
sql.push(pgFormat("DROP ROLE IF EXISTS %I", roleName))
|
|
358
|
+
sql.push("COMMIT")
|
|
359
|
+
return sql
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
private async revokeIamGrantsForRole(client: Client, roleName: string): Promise<void> {
|
|
363
|
+
try {
|
|
364
|
+
this.log(`Querying IAM grants for role: ${roleName}`)
|
|
365
|
+
|
|
366
|
+
// Query the IAM role mappings for this role
|
|
367
|
+
const result = await client.query(
|
|
368
|
+
pgFormat(
|
|
369
|
+
"SELECT arn FROM sys.iam_pg_role_mappings WHERE pg_role_name = %L",
|
|
370
|
+
roleName
|
|
371
|
+
)
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
if (result.rows && result.rows.length > 0) {
|
|
375
|
+
this.log(`Found ${result.rows.length} IAM grants to revoke for role: ${roleName}`)
|
|
376
|
+
|
|
377
|
+
// Revoke each IAM grant
|
|
378
|
+
for (const row of result.rows) {
|
|
379
|
+
const revokeStatement = pgFormat("AWS IAM REVOKE %I FROM %L", roleName, row.arn)
|
|
380
|
+
this.log(`Executing IAM revoke: ${revokeStatement}`)
|
|
381
|
+
await client.query(revokeStatement)
|
|
382
|
+
}
|
|
383
|
+
} else {
|
|
384
|
+
this.log(`No IAM grants found for role: ${roleName}`)
|
|
385
|
+
}
|
|
386
|
+
} catch (error) {
|
|
387
|
+
this.log(`Error revoking IAM grants for role ${roleName}: ${error}`)
|
|
388
|
+
// Don't throw here - the role might not have any IAM grants, which is fine
|
|
389
|
+
}
|
|
390
|
+
}
|
|
341
391
|
}
|
|
@@ -54,8 +54,8 @@ describe("MySQL Engine", () => {
|
|
|
54
54
|
expect(sql[2]).toContain("FLUSH PRIVILEGES")
|
|
55
55
|
})
|
|
56
56
|
|
|
57
|
-
it("should generate correct SQL for deleting a role", () => {
|
|
58
|
-
const sql = engine.deleteRole("testrole", { DatabaseName: "testdb" })
|
|
57
|
+
it("should generate correct SQL for deleting a role", async () => {
|
|
58
|
+
const sql = await engine.deleteRole("testrole", { DatabaseName: "testdb" })
|
|
59
59
|
expect(Array.isArray(sql)).toBe(true)
|
|
60
60
|
expect(sql[0]).toContain("REVOKE ALL PRIVILEGES")
|
|
61
61
|
expect(sql[1]).toContain("DROP USER IF EXISTS")
|
package/lambda/engine.mysql.ts
CHANGED
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
EngineRoleProperties,
|
|
6
6
|
EngineSchemaProperties,
|
|
7
7
|
EngineSqlProperties,
|
|
8
|
-
EngineIamGrantProperties,
|
|
9
8
|
} from "./types"
|
|
10
9
|
|
|
11
10
|
export class MysqlEngine extends AbstractEngine {
|
|
@@ -137,7 +136,7 @@ export class MysqlEngine extends AbstractEngine {
|
|
|
137
136
|
return sql
|
|
138
137
|
}
|
|
139
138
|
|
|
140
|
-
deleteRole(resourceId: string, props: EngineRoleProperties): string[] {
|
|
139
|
+
async deleteRole(resourceId: string, props: EngineRoleProperties): Promise<string[]> {
|
|
141
140
|
const sql: string[] = []
|
|
142
141
|
|
|
143
142
|
if (props?.DatabaseName) {
|
|
@@ -184,26 +183,20 @@ export class MysqlEngine extends AbstractEngine {
|
|
|
184
183
|
return props?.Rollback || ""
|
|
185
184
|
}
|
|
186
185
|
|
|
187
|
-
createIamGrant(
|
|
188
|
-
_resourceId: string,
|
|
189
|
-
_props: EngineIamGrantProperties
|
|
190
|
-
): string | string[] {
|
|
186
|
+
createIamGrant(_roleName: string, _iamArn: string): string | string[] {
|
|
191
187
|
throw new Error("IAM grants are only supported with DSQL clusters")
|
|
192
188
|
}
|
|
193
189
|
|
|
194
190
|
updateIamGrant(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
191
|
+
_roleName: string,
|
|
192
|
+
_oldRoleName: string,
|
|
193
|
+
_iamArn: string,
|
|
194
|
+
_oldIamArn: string
|
|
199
195
|
): string | string[] {
|
|
200
196
|
throw new Error("IAM grants are only supported with DSQL clusters")
|
|
201
197
|
}
|
|
202
198
|
|
|
203
|
-
deleteIamGrant(
|
|
204
|
-
_resourceId: string,
|
|
205
|
-
_props: EngineIamGrantProperties
|
|
206
|
-
): string | string[] {
|
|
199
|
+
deleteIamGrant(_roleName: string, _iamArn: string): string | string[] {
|
|
207
200
|
throw new Error("IAM grants are only supported with DSQL clusters")
|
|
208
201
|
}
|
|
209
202
|
|
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
EngineRoleProperties,
|
|
9
9
|
EngineSchemaProperties,
|
|
10
10
|
EngineSqlProperties,
|
|
11
|
-
EngineIamGrantProperties,
|
|
12
11
|
} from "./types"
|
|
13
12
|
|
|
14
13
|
export class PostgresqlEngine extends AbstractEngine {
|
|
@@ -177,7 +176,7 @@ END$$;`,
|
|
|
177
176
|
return sql
|
|
178
177
|
}
|
|
179
178
|
|
|
180
|
-
deleteRole(resourceId: string, props: EngineRoleProperties): string[] {
|
|
179
|
+
async deleteRole(resourceId: string, props: EngineRoleProperties): Promise<string[]> {
|
|
181
180
|
return [
|
|
182
181
|
"start transaction",
|
|
183
182
|
pgFormat(
|
|
@@ -268,26 +267,20 @@ END$$;`,
|
|
|
268
267
|
]
|
|
269
268
|
}
|
|
270
269
|
|
|
271
|
-
createIamGrant(
|
|
272
|
-
_resourceId: string,
|
|
273
|
-
_props: EngineIamGrantProperties
|
|
274
|
-
): string | string[] {
|
|
270
|
+
createIamGrant(_roleName: string, _iamArn: string): string | string[] {
|
|
275
271
|
throw new Error("IAM grants are only supported with DSQL clusters")
|
|
276
272
|
}
|
|
277
273
|
|
|
278
274
|
updateIamGrant(
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
275
|
+
_roleName: string,
|
|
276
|
+
_oldRoleName: string,
|
|
277
|
+
_iamArn: string,
|
|
278
|
+
_oldIamArn: string
|
|
283
279
|
): string | string[] {
|
|
284
280
|
throw new Error("IAM grants are only supported with DSQL clusters")
|
|
285
281
|
}
|
|
286
282
|
|
|
287
|
-
deleteIamGrant(
|
|
288
|
-
_resourceId: string,
|
|
289
|
-
_props: EngineIamGrantProperties
|
|
290
|
-
): string | string[] {
|
|
283
|
+
deleteIamGrant(_roleName: string, _iamArn: string): string | string[] {
|
|
291
284
|
throw new Error("IAM grants are only supported with DSQL clusters")
|
|
292
285
|
}
|
|
293
286
|
|
package/lambda/handler.ts
CHANGED
|
@@ -176,10 +176,8 @@ export const handler = async (
|
|
|
176
176
|
sql = dbEngine.createSql(resourceId, toSqlEngineProps(event.ResourceProperties))
|
|
177
177
|
break
|
|
178
178
|
case RdsSqlResource.IAM_GRANT:
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
toIamGrantEngineProps(event.ResourceProperties)
|
|
182
|
-
)
|
|
179
|
+
const createIam = toIamGrantEngineProps(event.ResourceProperties)
|
|
180
|
+
sql = dbEngine.createIamGrant(createIam.RoleName, createIam.ResourceArn)
|
|
183
181
|
break
|
|
184
182
|
case RdsSqlResource.PARAMETER_PASSWORD:
|
|
185
183
|
await handleParameterPassword(event.ResourceProperties)
|
|
@@ -225,11 +223,13 @@ export const handler = async (
|
|
|
225
223
|
case RdsSqlResource.IAM_GRANT:
|
|
226
224
|
const iamUpdateEvent =
|
|
227
225
|
event as CloudFormationCustomResourceUpdateEvent<ResourceProperties>
|
|
226
|
+
const newIam = toIamGrantEngineProps(event.ResourceProperties)
|
|
227
|
+
const oldIam = toIamGrantEngineProps(iamUpdateEvent.OldResourceProperties)
|
|
228
228
|
sql = dbEngine.updateIamGrant(
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
229
|
+
newIam.RoleName,
|
|
230
|
+
oldIam.RoleName,
|
|
231
|
+
newIam.ResourceArn,
|
|
232
|
+
oldIam.ResourceArn
|
|
233
233
|
)
|
|
234
234
|
break
|
|
235
235
|
case RdsSqlResource.PARAMETER_PASSWORD:
|
|
@@ -245,7 +245,7 @@ export const handler = async (
|
|
|
245
245
|
sql = dbEngine.deleteDatabase(resourceId, secretValues.username)
|
|
246
246
|
break
|
|
247
247
|
case RdsSqlResource.ROLE:
|
|
248
|
-
sql = dbEngine.deleteRole(
|
|
248
|
+
sql = await dbEngine.deleteRole(
|
|
249
249
|
resourceId,
|
|
250
250
|
toRoleEngineProps(event.ResourceProperties)
|
|
251
251
|
)
|
|
@@ -260,10 +260,8 @@ export const handler = async (
|
|
|
260
260
|
sql = dbEngine.deleteSql(resourceId, toSqlEngineProps(event.ResourceProperties))
|
|
261
261
|
break
|
|
262
262
|
case RdsSqlResource.IAM_GRANT:
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
toIamGrantEngineProps(event.ResourceProperties)
|
|
266
|
-
)
|
|
263
|
+
const delIam = toIamGrantEngineProps(event.ResourceProperties)
|
|
264
|
+
sql = dbEngine.deleteIamGrant(delIam.RoleName, delIam.ResourceArn)
|
|
267
265
|
break
|
|
268
266
|
case RdsSqlResource.PARAMETER_PASSWORD:
|
|
269
267
|
await deleteParameterPassword(event.ResourceProperties)
|
package/lambda/types.ts
CHANGED
|
@@ -25,7 +25,8 @@ export interface EngineSqlProperties {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export interface EngineIamGrantProperties {
|
|
28
|
-
readonly
|
|
28
|
+
readonly RoleName: string
|
|
29
|
+
readonly ResourceArn: string
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
// Common CloudFormation properties shared by all resources
|
|
@@ -33,7 +34,7 @@ export interface CommonProperties
|
|
|
33
34
|
extends CloudFormationCustomResourceResourcePropertiesCommon {
|
|
34
35
|
readonly Resource: RdsSqlResource
|
|
35
36
|
readonly ResourceId: string
|
|
36
|
-
readonly SecretArn
|
|
37
|
+
readonly SecretArn?: string // SecretArn is not set for DSQL
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
// CloudFormation-specific properties (engine properties + CloudFormation metadata)
|
package/lib/database.js
CHANGED
|
@@ -45,5 +45,5 @@ class Database extends aws_cdk_lib_1.CustomResource {
|
|
|
45
45
|
}
|
|
46
46
|
exports.Database = Database;
|
|
47
47
|
_a = JSII_RTTI_SYMBOL_1;
|
|
48
|
-
Database[_a] = { fqn: "cdk-rds-sql.Database", version: "7.
|
|
48
|
+
Database[_a] = { fqn: "cdk-rds-sql.Database", version: "7.3.1" };
|
|
49
49
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEM7QUFDNUMsMkNBQXNDO0FBQ3RDLGlDQUF1QztBQUN2Qyx5Q0FBc0Q7QUEwQnRELE1BQU0sZ0JBQWlCLFNBQVEsc0JBQVM7SUFHdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQTtJQUN4QyxDQUFDO0NBQ0Y7QUFFRCxNQUFhLFFBQVMsU0FBUSw0QkFBYztJQUMxQzs7T0FFRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxZQUFvQjtRQUN4RSxPQUFPLElBQUksZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNyQyxZQUFZLEVBQUUsWUFBWTtTQUMzQixDQUFDLENBQUE7SUFDSixDQUFDO0lBSUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUM1RCw0REFBNEQ7UUFDNUQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyx5QkFBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxLQUFLLENBQ2IscUZBQXFGLENBQ3RGLENBQUE7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFVBQVUsRUFBRTtnQkFDVixRQUFRLEVBQUUscUJBQWMsQ0FBQyxRQUFRO2dCQUNqQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFlBQVk7Z0JBQzlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUTthQUM3QjtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUE7UUFDdEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3RDLENBQUM7SUFDSCxDQUFDOztBQWxDSCw0QkFtQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyLCBEYXRhYmFzZUVuZ2luZSB9IGZyb20gXCIuL3Byb3ZpZGVyXCJcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi9yb2xlXCJcblxuaW50ZXJmYWNlIERhdGFiYXNlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIGRhdGFiYXNlIHRvIGNyZWF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIG93bmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgb3duZXI/OiBSb2xlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VQcm9wcyBleHRlbmRzIERhdGFiYXNlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBQcm92aWRlci5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBJUHJvdmlkZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0YWJhc2Uge1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xufVxuXG5jbGFzcyBJbXBvcnRlZERhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSURhdGFiYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFiYXNlQXR0cmlidXRlcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZSBleHRlbmRzIEN1c3RvbVJlc291cmNlIGltcGxlbWVudHMgSURhdGFiYXNlIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIERhdGFiYXNlIGJhc2VkIHVwb24gbmFtZSBvbmx5LiBVc2UgZm9yIGltcG9ydGluZyBleGlzdGluZyBkYXRhYmFzZXMuXG4gICAqL1xuICBzdGF0aWMgZnJvbURhdGFiYXNlTmFtZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBkYXRhYmFzZU5hbWU6IHN0cmluZyk6IElEYXRhYmFzZSB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZERhdGFiYXNlKHNjb3BlLCBpZCwge1xuICAgICAgZGF0YWJhc2VOYW1lOiBkYXRhYmFzZU5hbWUsXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhYmFzZVByb3BzKSB7XG4gICAgLy8gQ2hlY2sgaWYgdXNpbmcgRFNRTCBwcm92aWRlciBhbmQgZm9yYmlkIGRhdGFiYXNlIGNyZWF0aW9uXG4gICAgaWYgKHByb3BzLnByb3ZpZGVyLmVuZ2luZSA9PT0gRGF0YWJhc2VFbmdpbmUuRFNRTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkRhdGFiYXNlIGNyZWF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBEU1FMLiBEU1FMIGFsd2F5cyB1c2VzICdwb3N0Z3JlcycgZGF0YWJhc2UuXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvcHMucHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBSZXNvdXJjZTogUmRzU3FsUmVzb3VyY2UuREFUQUJBU0UsXG4gICAgICAgIFJlc291cmNlSWQ6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgLi4uKHByb3BzLnByb3ZpZGVyLnNlY3JldCA/IHsgU2VjcmV0QXJuOiBwcm9wcy5wcm92aWRlci5zZWNyZXQuc2VjcmV0QXJuIH0gOiB7fSksXG4gICAgICAgIE93bmVyOiBwcm9wcy5vd25lcj8ucm9sZU5hbWUsXG4gICAgICB9LFxuICAgIH0pXG4gICAgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucHJvdmlkZXIpXG4gICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBwcm9wcy5kYXRhYmFzZU5hbWVcbiAgICBpZiAocHJvcHMub3duZXIpIHtcbiAgICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLm93bmVyKVxuICAgIH1cbiAgfVxufVxuIl19
|
package/lib/handler/handler.js
CHANGED
|
@@ -25452,34 +25452,21 @@ var DsqlEngine = class extends AbstractEngine {
|
|
|
25452
25452
|
);
|
|
25453
25453
|
}
|
|
25454
25454
|
async createRole(resourceId, props) {
|
|
25455
|
-
|
|
25456
|
-
sql.push((0, import_node_pg_format.format)("CREATE ROLE %I WITH LOGIN", resourceId));
|
|
25457
|
-
if (props?.DatabaseName) {
|
|
25458
|
-
sql.push(
|
|
25459
|
-
(0, import_node_pg_format.format)("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
|
|
25460
|
-
);
|
|
25461
|
-
}
|
|
25462
|
-
sql.push("COMMIT");
|
|
25463
|
-
return sql;
|
|
25455
|
+
return this.generateCreateRoleSql(resourceId, props?.DatabaseName);
|
|
25464
25456
|
}
|
|
25465
25457
|
async updateRole(resourceId, oldResourceId, props, oldProps) {
|
|
25466
25458
|
const sql = [];
|
|
25467
25459
|
if (oldResourceId !== resourceId) {
|
|
25468
|
-
sql.push(
|
|
25469
|
-
sql.push(
|
|
25470
|
-
|
|
25460
|
+
sql.push(...this.generateCreateRoleSql(resourceId, oldProps?.DatabaseName));
|
|
25461
|
+
sql.push(`-- REVOKE_IAM_GRANTS_FOR_ROLE: ${oldResourceId}`);
|
|
25462
|
+
sql.push(...this.generateDropRoleSql(oldResourceId));
|
|
25463
|
+
if (props?.DatabaseName && props.DatabaseName !== oldProps?.DatabaseName) {
|
|
25464
|
+
sql.push("BEGIN");
|
|
25471
25465
|
sql.push(
|
|
25472
|
-
(0, import_node_pg_format.format)(
|
|
25473
|
-
"GRANT CONNECT ON DATABASE %I TO %I",
|
|
25474
|
-
oldProps.DatabaseName,
|
|
25475
|
-
resourceId
|
|
25476
|
-
)
|
|
25466
|
+
(0, import_node_pg_format.format)("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
|
|
25477
25467
|
);
|
|
25468
|
+
sql.push("COMMIT");
|
|
25478
25469
|
}
|
|
25479
|
-
sql.push("COMMIT");
|
|
25480
|
-
sql.push("BEGIN");
|
|
25481
|
-
sql.push((0, import_node_pg_format.format)("DROP ROLE IF EXISTS %I", oldResourceId));
|
|
25482
|
-
sql.push("COMMIT");
|
|
25483
25470
|
} else {
|
|
25484
25471
|
sql.push("BEGIN");
|
|
25485
25472
|
if (oldProps?.DatabaseName && props?.DatabaseName && oldProps.DatabaseName !== props.DatabaseName) {
|
|
@@ -25508,28 +25495,12 @@ var DsqlEngine = class extends AbstractEngine {
|
|
|
25508
25495
|
}
|
|
25509
25496
|
sql.push("COMMIT");
|
|
25510
25497
|
}
|
|
25511
|
-
if (oldResourceId !== resourceId && props?.DatabaseName && props.DatabaseName !== oldProps?.DatabaseName) {
|
|
25512
|
-
sql.push("BEGIN");
|
|
25513
|
-
sql.push(
|
|
25514
|
-
(0, import_node_pg_format.format)("GRANT CONNECT ON DATABASE %I TO %I", props.DatabaseName, resourceId)
|
|
25515
|
-
);
|
|
25516
|
-
sql.push("COMMIT");
|
|
25517
|
-
}
|
|
25518
25498
|
return sql;
|
|
25519
25499
|
}
|
|
25520
|
-
deleteRole(resourceId, props) {
|
|
25521
|
-
const sql = [
|
|
25522
|
-
|
|
25523
|
-
|
|
25524
|
-
(0, import_node_pg_format.format)(
|
|
25525
|
-
"REVOKE ALL PRIVILEGES ON DATABASE %I FROM %I",
|
|
25526
|
-
props.DatabaseName,
|
|
25527
|
-
resourceId
|
|
25528
|
-
)
|
|
25529
|
-
);
|
|
25530
|
-
}
|
|
25531
|
-
sql.push((0, import_node_pg_format.format)("DROP ROLE IF EXISTS %I", resourceId));
|
|
25532
|
-
sql.push("COMMIT");
|
|
25500
|
+
async deleteRole(resourceId, props) {
|
|
25501
|
+
const sql = [];
|
|
25502
|
+
sql.push(`-- REVOKE_IAM_GRANTS_FOR_ROLE: ${resourceId}`);
|
|
25503
|
+
sql.push(...this.generateDropRoleSql(resourceId, props?.DatabaseName));
|
|
25533
25504
|
return sql;
|
|
25534
25505
|
}
|
|
25535
25506
|
createSchema(resourceId, props) {
|
|
@@ -25586,29 +25557,32 @@ var DsqlEngine = class extends AbstractEngine {
|
|
|
25586
25557
|
}
|
|
25587
25558
|
return [];
|
|
25588
25559
|
}
|
|
25589
|
-
createIamGrant(
|
|
25590
|
-
if (!
|
|
25560
|
+
createIamGrant(roleName, iamArn) {
|
|
25561
|
+
if (!iamArn) {
|
|
25591
25562
|
throw new Error("ResourceArn is required for IAM grant");
|
|
25592
25563
|
}
|
|
25593
|
-
return (0, import_node_pg_format.format)("AWS IAM GRANT %I TO %L",
|
|
25564
|
+
return (0, import_node_pg_format.format)("AWS IAM GRANT %I TO %L", roleName, iamArn);
|
|
25594
25565
|
}
|
|
25595
|
-
updateIamGrant(
|
|
25566
|
+
updateIamGrant(roleName, oldRoleName, iamArn, oldIamArn) {
|
|
25596
25567
|
const statements = [];
|
|
25597
|
-
|
|
25598
|
-
|
|
25599
|
-
|
|
25600
|
-
|
|
25568
|
+
const roleNameChanged = oldRoleName !== roleName;
|
|
25569
|
+
const arnChanged = oldIamArn !== iamArn;
|
|
25570
|
+
if (!roleNameChanged && !arnChanged) {
|
|
25571
|
+
return statements;
|
|
25572
|
+
}
|
|
25573
|
+
if (oldIamArn) {
|
|
25574
|
+
statements.push((0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L", oldRoleName, oldIamArn));
|
|
25601
25575
|
}
|
|
25602
|
-
if (
|
|
25603
|
-
statements.push((0, import_node_pg_format.format)("AWS IAM GRANT %I TO %L",
|
|
25576
|
+
if (iamArn) {
|
|
25577
|
+
statements.push((0, import_node_pg_format.format)("AWS IAM GRANT %I TO %L", roleName, iamArn));
|
|
25604
25578
|
}
|
|
25605
25579
|
return statements;
|
|
25606
25580
|
}
|
|
25607
|
-
deleteIamGrant(
|
|
25608
|
-
if (!
|
|
25581
|
+
deleteIamGrant(roleName, iamArn) {
|
|
25582
|
+
if (!iamArn) {
|
|
25609
25583
|
throw new Error("ResourceArn is required for IAM grant deletion");
|
|
25610
25584
|
}
|
|
25611
|
-
return (0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L",
|
|
25585
|
+
return (0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L", roleName, iamArn);
|
|
25612
25586
|
}
|
|
25613
25587
|
async executeSQL(sql, config) {
|
|
25614
25588
|
this.log("Connecting to DSQL cluster...");
|
|
@@ -25646,9 +25620,28 @@ var DsqlEngine = class extends AbstractEngine {
|
|
|
25646
25620
|
const results = [];
|
|
25647
25621
|
for (const statement of statements) {
|
|
25648
25622
|
if (statement.trim()) {
|
|
25649
|
-
|
|
25650
|
-
|
|
25651
|
-
|
|
25623
|
+
if (statement.startsWith("-- REVOKE_IAM_GRANTS_FOR_ROLE:")) {
|
|
25624
|
+
const roleName = statement.replace("-- REVOKE_IAM_GRANTS_FOR_ROLE:", "").trim();
|
|
25625
|
+
await this.revokeIamGrantsForRole(client, roleName);
|
|
25626
|
+
} else if (statement.includes("AWS IAM REVOKE")) {
|
|
25627
|
+
this.log(`Executing SQL: ${statement}`);
|
|
25628
|
+
try {
|
|
25629
|
+
const result = await client.query(statement);
|
|
25630
|
+
results.push(result);
|
|
25631
|
+
} catch (error) {
|
|
25632
|
+
if (error.message && error.message.includes("does not exist")) {
|
|
25633
|
+
this.log(
|
|
25634
|
+
`Ignoring error for IAM REVOKE (role doesn't exist): ${error.message}`
|
|
25635
|
+
);
|
|
25636
|
+
} else {
|
|
25637
|
+
throw error;
|
|
25638
|
+
}
|
|
25639
|
+
}
|
|
25640
|
+
} else {
|
|
25641
|
+
this.log(`Executing SQL: ${statement}`);
|
|
25642
|
+
const result = await client.query(statement);
|
|
25643
|
+
results.push(result);
|
|
25644
|
+
}
|
|
25652
25645
|
}
|
|
25653
25646
|
}
|
|
25654
25647
|
this.log("SQL execution completed");
|
|
@@ -25677,6 +25670,49 @@ var DsqlEngine = class extends AbstractEngine {
|
|
|
25677
25670
|
(0, import_node_pg_format.format)("REVOKE ALL ON SCHEMA %I FROM %I", schema, roleName)
|
|
25678
25671
|
];
|
|
25679
25672
|
}
|
|
25673
|
+
generateCreateRoleSql(roleName, databaseName) {
|
|
25674
|
+
const sql = ["BEGIN"];
|
|
25675
|
+
sql.push((0, import_node_pg_format.format)("CREATE ROLE %I WITH LOGIN", roleName));
|
|
25676
|
+
if (databaseName) {
|
|
25677
|
+
sql.push((0, import_node_pg_format.format)("GRANT CONNECT ON DATABASE %I TO %I", databaseName, roleName));
|
|
25678
|
+
}
|
|
25679
|
+
sql.push("COMMIT");
|
|
25680
|
+
return sql;
|
|
25681
|
+
}
|
|
25682
|
+
generateDropRoleSql(roleName, databaseName) {
|
|
25683
|
+
const sql = ["BEGIN"];
|
|
25684
|
+
if (databaseName) {
|
|
25685
|
+
sql.push(
|
|
25686
|
+
(0, import_node_pg_format.format)("REVOKE ALL PRIVILEGES ON DATABASE %I FROM %I", databaseName, roleName)
|
|
25687
|
+
);
|
|
25688
|
+
}
|
|
25689
|
+
sql.push((0, import_node_pg_format.format)("DROP ROLE IF EXISTS %I", roleName));
|
|
25690
|
+
sql.push("COMMIT");
|
|
25691
|
+
return sql;
|
|
25692
|
+
}
|
|
25693
|
+
async revokeIamGrantsForRole(client, roleName) {
|
|
25694
|
+
try {
|
|
25695
|
+
this.log(`Querying IAM grants for role: ${roleName}`);
|
|
25696
|
+
const result = await client.query(
|
|
25697
|
+
(0, import_node_pg_format.format)(
|
|
25698
|
+
"SELECT arn FROM sys.iam_pg_role_mappings WHERE pg_role_name = %L",
|
|
25699
|
+
roleName
|
|
25700
|
+
)
|
|
25701
|
+
);
|
|
25702
|
+
if (result.rows && result.rows.length > 0) {
|
|
25703
|
+
this.log(`Found ${result.rows.length} IAM grants to revoke for role: ${roleName}`);
|
|
25704
|
+
for (const row of result.rows) {
|
|
25705
|
+
const revokeStatement = (0, import_node_pg_format.format)("AWS IAM REVOKE %I FROM %L", roleName, row.arn);
|
|
25706
|
+
this.log(`Executing IAM revoke: ${revokeStatement}`);
|
|
25707
|
+
await client.query(revokeStatement);
|
|
25708
|
+
}
|
|
25709
|
+
} else {
|
|
25710
|
+
this.log(`No IAM grants found for role: ${roleName}`);
|
|
25711
|
+
}
|
|
25712
|
+
} catch (error) {
|
|
25713
|
+
this.log(`Error revoking IAM grants for role ${roleName}: ${error}`);
|
|
25714
|
+
}
|
|
25715
|
+
}
|
|
25680
25716
|
};
|
|
25681
25717
|
|
|
25682
25718
|
// lambda/engine.mysql.ts
|
|
@@ -25770,7 +25806,7 @@ var MysqlEngine = class extends AbstractEngine {
|
|
|
25770
25806
|
}
|
|
25771
25807
|
return sql;
|
|
25772
25808
|
}
|
|
25773
|
-
deleteRole(resourceId, props) {
|
|
25809
|
+
async deleteRole(resourceId, props) {
|
|
25774
25810
|
const sql = [];
|
|
25775
25811
|
if (props?.DatabaseName) {
|
|
25776
25812
|
sql.push(
|
|
@@ -25799,13 +25835,13 @@ var MysqlEngine = class extends AbstractEngine {
|
|
|
25799
25835
|
deleteSql(_resourceId, props) {
|
|
25800
25836
|
return props?.Rollback || "";
|
|
25801
25837
|
}
|
|
25802
|
-
createIamGrant(
|
|
25838
|
+
createIamGrant(_roleName, _iamArn) {
|
|
25803
25839
|
throw new Error("IAM grants are only supported with DSQL clusters");
|
|
25804
25840
|
}
|
|
25805
|
-
updateIamGrant(
|
|
25841
|
+
updateIamGrant(_roleName, _oldRoleName, _iamArn, _oldIamArn) {
|
|
25806
25842
|
throw new Error("IAM grants are only supported with DSQL clusters");
|
|
25807
25843
|
}
|
|
25808
|
-
deleteIamGrant(
|
|
25844
|
+
deleteIamGrant(_roleName, _iamArn) {
|
|
25809
25845
|
throw new Error("IAM grants are only supported with DSQL clusters");
|
|
25810
25846
|
}
|
|
25811
25847
|
async executeSQL(sql, config) {
|
|
@@ -25979,7 +26015,7 @@ END$$;`,
|
|
|
25979
26015
|
sql.push("commit");
|
|
25980
26016
|
return sql;
|
|
25981
26017
|
}
|
|
25982
|
-
deleteRole(resourceId, props) {
|
|
26018
|
+
async deleteRole(resourceId, props) {
|
|
25983
26019
|
return [
|
|
25984
26020
|
"start transaction",
|
|
25985
26021
|
(0, import_node_pg_format2.format)(
|
|
@@ -26053,13 +26089,13 @@ END$$;`,
|
|
|
26053
26089
|
(0, import_node_pg_format2.format)("REVOKE ALL ON SCHEMA %I FROM %I", schema, roleName)
|
|
26054
26090
|
];
|
|
26055
26091
|
}
|
|
26056
|
-
createIamGrant(
|
|
26092
|
+
createIamGrant(_roleName, _iamArn) {
|
|
26057
26093
|
throw new Error("IAM grants are only supported with DSQL clusters");
|
|
26058
26094
|
}
|
|
26059
|
-
updateIamGrant(
|
|
26095
|
+
updateIamGrant(_roleName, _oldRoleName, _iamArn, _oldIamArn) {
|
|
26060
26096
|
throw new Error("IAM grants are only supported with DSQL clusters");
|
|
26061
26097
|
}
|
|
26062
|
-
deleteIamGrant(
|
|
26098
|
+
deleteIamGrant(_roleName, _iamArn) {
|
|
26063
26099
|
throw new Error("IAM grants are only supported with DSQL clusters");
|
|
26064
26100
|
}
|
|
26065
26101
|
async executeSQL(sql, config) {
|
|
@@ -26248,10 +26284,8 @@ var handler = async (event) => {
|
|
|
26248
26284
|
sql = dbEngine.createSql(resourceId, toSqlEngineProps(event.ResourceProperties));
|
|
26249
26285
|
break;
|
|
26250
26286
|
case "iam_grant" /* IAM_GRANT */:
|
|
26251
|
-
|
|
26252
|
-
|
|
26253
|
-
toIamGrantEngineProps(event.ResourceProperties)
|
|
26254
|
-
);
|
|
26287
|
+
const createIam = toIamGrantEngineProps(event.ResourceProperties);
|
|
26288
|
+
sql = dbEngine.createIamGrant(createIam.RoleName, createIam.ResourceArn);
|
|
26255
26289
|
break;
|
|
26256
26290
|
case "parameter_password" /* PARAMETER_PASSWORD */:
|
|
26257
26291
|
await handleParameterPassword(event.ResourceProperties);
|
|
@@ -26294,11 +26328,13 @@ var handler = async (event) => {
|
|
|
26294
26328
|
break;
|
|
26295
26329
|
case "iam_grant" /* IAM_GRANT */:
|
|
26296
26330
|
const iamUpdateEvent = event;
|
|
26331
|
+
const newIam = toIamGrantEngineProps(event.ResourceProperties);
|
|
26332
|
+
const oldIam = toIamGrantEngineProps(iamUpdateEvent.OldResourceProperties);
|
|
26297
26333
|
sql = dbEngine.updateIamGrant(
|
|
26298
|
-
|
|
26299
|
-
|
|
26300
|
-
|
|
26301
|
-
|
|
26334
|
+
newIam.RoleName,
|
|
26335
|
+
oldIam.RoleName,
|
|
26336
|
+
newIam.ResourceArn,
|
|
26337
|
+
oldIam.ResourceArn
|
|
26302
26338
|
);
|
|
26303
26339
|
break;
|
|
26304
26340
|
case "parameter_password" /* PARAMETER_PASSWORD */:
|
|
@@ -26314,7 +26350,7 @@ var handler = async (event) => {
|
|
|
26314
26350
|
sql = dbEngine.deleteDatabase(resourceId, secretValues.username);
|
|
26315
26351
|
break;
|
|
26316
26352
|
case "role" /* ROLE */:
|
|
26317
|
-
sql = dbEngine.deleteRole(
|
|
26353
|
+
sql = await dbEngine.deleteRole(
|
|
26318
26354
|
resourceId,
|
|
26319
26355
|
toRoleEngineProps(event.ResourceProperties)
|
|
26320
26356
|
);
|
|
@@ -26329,10 +26365,8 @@ var handler = async (event) => {
|
|
|
26329
26365
|
sql = dbEngine.deleteSql(resourceId, toSqlEngineProps(event.ResourceProperties));
|
|
26330
26366
|
break;
|
|
26331
26367
|
case "iam_grant" /* IAM_GRANT */:
|
|
26332
|
-
|
|
26333
|
-
|
|
26334
|
-
toIamGrantEngineProps(event.ResourceProperties)
|
|
26335
|
-
);
|
|
26368
|
+
const delIam = toIamGrantEngineProps(event.ResourceProperties);
|
|
26369
|
+
sql = dbEngine.deleteIamGrant(delIam.RoleName, delIam.ResourceArn);
|
|
26336
26370
|
break;
|
|
26337
26371
|
case "parameter_password" /* PARAMETER_PASSWORD */:
|
|
26338
26372
|
await deleteParameterPassword(event.ResourceProperties);
|
package/lib/iam-grant.d.ts
CHANGED
package/lib/iam-grant.js
CHANGED
|
@@ -3,10 +3,19 @@ var _a;
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.IamGrant = void 0;
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const crypto = require("crypto");
|
|
6
7
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
8
|
const enum_1 = require("./enum");
|
|
8
9
|
const provider_1 = require("./provider");
|
|
9
10
|
class IamGrant extends aws_cdk_lib_1.CustomResource {
|
|
11
|
+
static createUniqueResourceId(roleName, resourceArn) {
|
|
12
|
+
const hash = crypto
|
|
13
|
+
.createHash("sha256")
|
|
14
|
+
.update(resourceArn)
|
|
15
|
+
.digest("hex")
|
|
16
|
+
.substring(0, 8);
|
|
17
|
+
return `${roleName}:${hash}`;
|
|
18
|
+
}
|
|
10
19
|
constructor(scope, id, props) {
|
|
11
20
|
// IAM grants are only supported on DSQL
|
|
12
21
|
if (props.provider.engine !== provider_1.DatabaseEngine.DSQL) {
|
|
@@ -14,9 +23,11 @@ class IamGrant extends aws_cdk_lib_1.CustomResource {
|
|
|
14
23
|
}
|
|
15
24
|
super(scope, id, {
|
|
16
25
|
serviceToken: props.provider.serviceToken,
|
|
26
|
+
resourceType: "Custom::DsqlIamGrant",
|
|
17
27
|
properties: {
|
|
18
28
|
Resource: enum_1.RdsSqlResource.IAM_GRANT,
|
|
19
|
-
ResourceId: props.roleName,
|
|
29
|
+
ResourceId: IamGrant.createUniqueResourceId(props.roleName, props.resourceArn),
|
|
30
|
+
RoleName: props.roleName,
|
|
20
31
|
ResourceArn: props.resourceArn,
|
|
21
32
|
},
|
|
22
33
|
});
|
|
@@ -25,5 +36,5 @@ class IamGrant extends aws_cdk_lib_1.CustomResource {
|
|
|
25
36
|
}
|
|
26
37
|
exports.IamGrant = IamGrant;
|
|
27
38
|
_a = JSII_RTTI_SYMBOL_1;
|
|
28
|
-
IamGrant[_a] = { fqn: "cdk-rds-sql.IamGrant", version: "7.
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
IamGrant[_a] = { fqn: "cdk-rds-sql.IamGrant", version: "7.3.1" };
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWdyYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2lhbS1ncmFudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlDQUFnQztBQUNoQyw2Q0FBNEM7QUFFNUMsaUNBQXVDO0FBQ3ZDLHlDQUFzRDtBQW1CdEQsTUFBYSxRQUFTLFNBQVEsNEJBQWM7SUFDbEMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFFBQWdCLEVBQUUsV0FBbUI7UUFDekUsTUFBTSxJQUFJLEdBQUcsTUFBTTthQUNoQixVQUFVLENBQUMsUUFBUSxDQUFDO2FBQ3BCLE1BQU0sQ0FBQyxXQUFXLENBQUM7YUFDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDbEIsT0FBTyxHQUFHLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUM5QixDQUFDO0lBRUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUM1RCx3Q0FBd0M7UUFDeEMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyx5QkFBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0hBQWdILENBQ2pILENBQUE7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFlBQVksRUFBRSxzQkFBc0I7WUFDcEMsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBYyxDQUFDLFNBQVM7Z0JBQ2xDLFVBQVUsRUFBRSxRQUFRLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDO2dCQUM5RSxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVzthQUMvQjtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN6QyxDQUFDOztBQTdCSCw0QkE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiXG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyLCBEYXRhYmFzZUVuZ2luZSB9IGZyb20gXCIuL3Byb3ZpZGVyXCJcblxuZXhwb3J0IGludGVyZmFjZSBJYW1HcmFudFByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IElQcm92aWRlclxuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSByb2xlIG5hbWUgdG8gZ3JhbnQgSUFNIGFjY2VzcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogSUFNIHJlc291cmNlIEFSTiAocm9sZSwgdXNlciwgb3Igb3RoZXIgSUFNIHByaW5jaXBhbCkuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUFybjogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBJYW1HcmFudCBleHRlbmRzIEN1c3RvbVJlc291cmNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlVW5pcXVlUmVzb3VyY2VJZChyb2xlTmFtZTogc3RyaW5nLCByZXNvdXJjZUFybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShyZXNvdXJjZUFybilcbiAgICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAgIC5zdWJzdHJpbmcoMCwgOClcbiAgICByZXR1cm4gYCR7cm9sZU5hbWV9OiR7aGFzaH1gXG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSWFtR3JhbnRQcm9wcykge1xuICAgIC8vIElBTSBncmFudHMgYXJlIG9ubHkgc3VwcG9ydGVkIG9uIERTUUxcbiAgICBpZiAocHJvcHMucHJvdmlkZXIuZW5naW5lICE9PSBEYXRhYmFzZUVuZ2luZS5EU1FMKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSUFNIGdyYW50cyBhcmUgb25seSBzdXBwb3J0ZWQgd2l0aCBEU1FMIGNsdXN0ZXJzLiBVc2UgcmVndWxhciBkYXRhYmFzZSBhdXRoZW50aWNhdGlvbiBmb3IgUkRTL0F1cm9yYSBjbHVzdGVycy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpEc3FsSWFtR3JhbnRcIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLklBTV9HUkFOVCxcbiAgICAgICAgUmVzb3VyY2VJZDogSWFtR3JhbnQuY3JlYXRlVW5pcXVlUmVzb3VyY2VJZChwcm9wcy5yb2xlTmFtZSwgcHJvcHMucmVzb3VyY2VBcm4pLFxuICAgICAgICBSb2xlTmFtZTogcHJvcHMucm9sZU5hbWUsXG4gICAgICAgIFJlc291cmNlQXJuOiBwcm9wcy5yZXNvdXJjZUFybixcbiAgICAgIH0sXG4gICAgfSlcbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcbiAgfVxufVxuIl19
|
package/lib/provider.js
CHANGED
|
@@ -209,7 +209,7 @@ class Provider extends constructs_1.Construct {
|
|
|
209
209
|
}
|
|
210
210
|
exports.Provider = Provider;
|
|
211
211
|
_a = JSII_RTTI_SYMBOL_1;
|
|
212
|
-
Provider[_a] = { fqn: "cdk-rds-sql.Provider", version: "7.
|
|
212
|
+
Provider[_a] = { fqn: "cdk-rds-sql.Provider", version: "7.3.1" };
|
|
213
213
|
class ImportedProvider extends constructs_1.Construct {
|
|
214
214
|
constructor(scope, id, attrs) {
|
|
215
215
|
super(scope, id);
|
package/lib/role.js
CHANGED
|
@@ -146,5 +146,5 @@ class Role extends constructs_1.Construct {
|
|
|
146
146
|
}
|
|
147
147
|
exports.Role = Role;
|
|
148
148
|
_a = JSII_RTTI_SYMBOL_1;
|
|
149
|
-
Role[_a] = { fqn: "cdk-rds-sql.Role", version: "7.
|
|
149
|
+
Role[_a] = { fqn: "cdk-rds-sql.Role", version: "7.3.1" };
|
|
150
150
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWtFO0FBQ2xFLDJDQUEwQztBQUcxQyx1RUFBZ0U7QUFDaEUsMkNBQTBDO0FBQzFDLDJDQUFzQztBQUV0QyxpQ0FBdUM7QUFDdkMseUNBQXNEO0FBQ3RELGlFQUFtRTtBQStFbkUsOENBQThDO0FBQzlDLE1BQU0sVUFBVyxTQUFRLHNCQUFTO0lBQ2hDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBT0M7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLDRDQUE0QztRQUM1QyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3ZELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN4QixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQUU7b0JBQ2hELGFBQWEsRUFBRSxHQUFHLEtBQUssQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFO29CQUMvQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtpQkFDOUIsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsNkRBQTZEO1FBQzdELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxLQUFLLENBQUMsZUFBZSxVQUFVLENBQUE7UUFDaEUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ3ZFLFlBQVksRUFBRSxLQUFLLENBQUMsb0JBQW9CO1lBQ3hDLFVBQVUsRUFBRTtnQkFDVixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLFFBQVEsRUFBRSxxQkFB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Q0FBQyxZQUFZO1lBQ2hDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLHlCQUFjLENBQUMsSUFBSTtTQUNwRixDQUFDLENBQUE7UUFFRixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzlCLGdEQUFnRDtnQkFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDaEUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUE7SUFDaEMsQ0FBQzs7QUE1SEgsb0JBNkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBrbXMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1rbXNcIlxuaW1wb3J0IHsgSURhdGFiYXNlQ2x1c3RlciwgSURhdGFiYXNlSW5zdGFuY2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgeyBJU2VjcmV0LCBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIHNzbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBJRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyLCBEYXRhYmFzZUVuZ2luZSB9IGZyb20gXCIuL3Byb3ZpZGVyXCJcbmltcG9ydCB7IFJvbGUgYXMgQ3VzdG9tUmVzb3VyY2VSb2xlIH0gZnJvbSBcIi4vcm9sZS5jdXN0b20tcmVzb3VyY2VcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVQcm9wcyB7XG4gIC8qKlxuICAgKiBQcm92aWRlci5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBJUHJvdmlkZXJcblxuICAvKipcbiAgICogU1FMLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZSB0aGlzIHVzZXIgaXMgZXhwZWN0ZWQgdG8gdXNlLlxuICAgKlxuICAgKiBJZiB0aGUgZGF0YWJhc2UgZXhpc3RzLCBjb25uZWN0IHByaXZpbGVnZXMgYXJlIGdyYW50ZWQuXG4gICAqXG4gICAqIFNwZWNpZnkgb25lIG9mIGBkYXRhYmFzZWAgb3IgYGRhdGFiYXNlTmFtZWAuIFRoaXMgaXMgdGhlIG5hbWVcbiAgICogdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcm9sZSdzIHNlY3JldCBhcyB0aGUgZGF0YWJhc2UgbmFtZSB0b1xuICAgKiB1c2UuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZT86IElEYXRhYmFzZVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZSBuYW1lIHRoaXMgdXNlciBpcyBleHBlY3RlZCB0byB1c2UuXG4gICAqXG4gICAqIElmIHRoZSBkYXRhYmFzZSBleGlzdHMsIGNvbm5lY3QgcHJpdmlsZWdlcyBhcmUgZ3JhbnRlZC5cbiAgICpcbiAgICogU3BlY2lmeSBvbmUgb2YgYGRhdGFiYXNlYCBvciBgZGF0YWJhc2VOYW1lYC4gVGhpcyBpcyB0aGUgbmFtZVxuICAgKiB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSByb2xlJ3Mgc2VjcmV0IGFzIHRoZSBkYXRhYmFzZSBuYW1lIHRvXG4gICAqIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzZWNyZXQgaXMgY3JlYXRlZCBmb3IgdGhpcyB1c2VyLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IGVuY3J5cHQgaXQgd2l0aCB0aGUgZ2l2ZW4ga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNlY3JldCBpcyBjcmVhdGVkIGZvciB0aGlzIHVzZXIuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgYWRkIHNlY3JldCBuYW1lIHRvIHRoZSBzZWNyZXQuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXROYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFByZWZpeCBmb3IgU1NNIHBhcmFtZXRlcnMgdG8gc3RvcmUgY3JlZGVudGlhbHMgaW4gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBXaGVuIGRlZmluZWQsIGNyZWRlbnRpYWxzIHdpbGwgYWxzbyBiZSBzdG9yZWQgYXMgcGFyYW1ldGVycy5cbiAgICpcbiAgICogVGhlIHBhcmFtZXRlciBuYW1lcyBzdWNoIGFzIFwicGFzc3dvcmRcIiBpcyBzaW1wbHkgYXBwZW5kZWQgdG9cbiAgICogYHBhcmFtZXRlclByZWZpeGAsIHNvIG1ha2Ugc3VyZSB0aGUgcHJlZml4IGVuZHMgd2l0aCBhIHNsYXNoIGlmXG4gICAqICB5b3UgaGF2ZSB5b3VyIHBhcmFtZXRlciBuYW1lcyBzbGFzaCBzZXBhcmF0ZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgc2VjcmV0IGlzIGNvcGllZCBqdXN0IG9uY2UsIHRoZXlcbiAgICogYXJlIG5vdCBrZXB0IGluIHN5bmMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY3JlZGVudGlhbHMgYXJlIG9ubHkgc3RvcmVkIGluIFNlY3JldHMgTWFuYWdlclxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyUHJlZml4Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBJQU0gYXV0aGVudGljYXRpb24gZm9yIHRoaXMgcm9sZS5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCB0aGUgcm9sZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhIHBhc3N3b3JkIGFuZFxuICAgKiBjb25maWd1cmVkIGZvciBBV1MgSUFNIGRhdGFiYXNlIGF1dGhlbnRpY2F0aW9uLiBUaGUgc2VjcmV0XG4gICAqIHdpbGwgbm90IGNvbnRhaW4gYSBwYXNzd29yZCBmaWVsZC5cbiAgICpcbiAgICogTm90ZTogRm9yIERTUUwgY2x1c3RlcnMsIHRoaXMgcHJvcGVydHkgaXMgaWdub3JlZCBhcyBEU1FMIGFsd2F5c1xuICAgKiB1c2VzIElBTSBhdXRoZW50aWNhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSB1c2UgcGFzc3dvcmQgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUlhbUF1dGg/OiBib29sZWFuXG59XG5cbi8vIFByaXZhdGUgUGFyYW1ldGVycyBjb25zdHJ1Y3QgKG5vdCBleHBvcnRlZClcbmNsYXNzIFBhcmFtZXRlcnMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IHtcbiAgICAgIHByb3ZpZGVyOiBJUHJvdmlkZXJcbiAgICAgIHNlY3JldEFybjogc3RyaW5nXG4gICAgICBwYXJhbWV0ZXJQcmVmaXg6IHN0cmluZ1xuICAgICAgcGFzc3dvcmRBcm46IHN0cmluZ1xuICAgICAgcHJvdmlkZXJTZXJ2aWNlVG9rZW46IHN0cmluZ1xuICAgICAgcGFyYW1EYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgfVxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICAvLyBDcmVhdGUgcGFyYW1ldGVycyBmb3IgZWFjaCBrZXktdmFsdWUgcGFpclxuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzLnBhcmFtRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCBgUGFyYW1ldGVyLSR7a2V5fWAsIHtcbiAgICAgICAgICBwYXJhbWV0ZXJOYW1lOiBgJHtwcm9wcy5wYXJhbWV0ZXJQcmVmaXh9JHtrZXl9YCxcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gRm9yIHBhc3N3b3JkLCB1c2UgdGhlIGV4aXN0aW5nIHByb3ZpZGVyIHRvIHN0b3JlIGl0IGluIFNTTVxuICAgIGNvbnN0IHBhc3N3b3JkUGFyYW1ldGVyTmFtZSA9IGAke3Byb3BzLnBhcmFtZXRlclByZWZpeH1wYXNzd29yZGBcbiAgICBjb25zdCBwYXNzd29yZF9wYXJhbWV0ZXIgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJQYXNzd29yZFBhcmFtZXRlclwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyU2VydmljZVRva2VuLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBTZWNyZXRBcm46IHByb3BzLnNlY3JldEFybixcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLlBBUkFNRVRFUl9QQVNTV09SRCxcbiAgICAgICAgUGFzc3dvcmRBcm46IHByb3BzLnBhc3N3b3JkQXJuLFxuICAgICAgICBQYXJhbWV0ZXJOYW1lOiBwYXNzd29yZFBhcmFtZXRlck5hbWUsXG4gICAgICB9LFxuICAgIH0pXG4gICAgcGFzc3dvcmRfcGFyYW1ldGVyLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcblxuICAgIGNvbnN0IHBhcmFtQXJuID0gYGFybjphd3M6c3NtOiR7U3RhY2sub2YodGhpcykucmVnaW9ufToke1xuICAgICAgU3RhY2sub2YodGhpcykuYWNjb3VudFxuICAgIH06cGFyYW1ldGVyJHtcbiAgICAgIHBhc3N3b3JkUGFyYW1ldGVyTmFtZS5zdGFydHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIlxuICAgIH0ke3Bhc3N3b3JkUGFyYW1ldGVyTmFtZX1gXG5cbiAgICBwcm9wcy5wcm92aWRlci5oYW5kbGVyLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3NtOlB1dFBhcmFtZXRlclwiLCBcInNzbTpBZGRUYWdzVG9SZXNvdXJjZVwiLCBcInNzbTpHZXRQYXJhbWV0ZXJzXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtwYXJhbUFybl0sXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm9sZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIGdlbmVyYXRlZCBzZWNyZXQuXG4gICAqIE9ubHkgYXZhaWxhYmxlIGZvciBub24tRFNRTCBjbHVzdGVycyBhcyBEU1FMIHVzZXMgSUFNIGF1dGhlbnRpY2F0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY3JldD86IElTZWNyZXRcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUm9sZVByb3BzKSB7XG4gICAgaWYgKHByb3BzLnByb3ZpZGVyLmVuZ2luZSAhPT0gRGF0YWJhc2VFbmdpbmUuRFNRTCkge1xuICAgICAgaWYgKHByb3BzLmRhdGFiYXNlICYmIHByb3BzLmRhdGFiYXNlTmFtZSkge1xuICAgICAgICB0aHJvdyBcIlNwZWNpZnkgZWl0aGVyIGRhdGFiYXNlIG9yIGRhdGFiYXNlTmFtZVwiXG4gICAgICB9XG4gICAgICBpZiAoIXByb3BzLmRhdGFiYXNlICYmICFwcm9wcy5kYXRhYmFzZU5hbWUpIHtcbiAgICAgICAgLy8gSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHdlIG1pZ2h0IG5lZWQgYSBkZWZhdWx0IG9yIHRocm93IGFuIGVycm9yIGRlcGVuZGluZyBvbiBkZXNpcmVkIGJlaGF2aW9yLlxuICAgICAgICAvLyBGb3Igbm93LCBsZXQncyBhc3N1bWUgaXQncyBhbGxvd2VkIGJ1dCB0aGUgc2VjcmV0IHdvbid0IGhhdmUgYSBkYm5hbWUuXG4gICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSByZXF1aXJlZCwgdW5jb21tZW50IHRoZSBsaW5lIGJlbG93OlxuICAgICAgICB0aHJvdyBcIlNwZWNpZnkgZWl0aGVyIGRhdGFiYXNlIG9yIGRhdGFiYXNlTmFtZVwiXG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8vIERTUUwgZG9lc24ndCB1c2Ugc2VjcmV0cyAtIGl0IGFsd2F5cyB1c2VzIElBTSBhdXRoZW50aWNhdGlvblxuICAgIGlmIChwcm9wcy5wcm92aWRlci5lbmdpbmUgIT09IERhdGFiYXNlRW5naW5lLkRTUUwpIHtcbiAgICAgIC8vIEZvciBpbXBvcnRlZCBwcm92aWRlcnMgd2l0aG91dCBjbHVzdGVyIGRldGFpbHMsIHByb3ZpZGUgaGVscGZ1bCBlcnJvciBtZXNzYWdlXG4gICAgICBpZiAoIXByb3BzLnByb3ZpZGVyLmNsdXN0ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiUm9sZSBjcmVhdGlvbiByZXF1aXJlcyBjbHVzdGVyIGluZm9ybWF0aW9uLiBXaGVuIGltcG9ydGluZyBhIHByb3ZpZGVyIHdpdGggXCIgK1xuICAgICAgICAgICAgXCJQcm92aWRlci5mcm9tUHJvdmlkZXJBdHRyaWJ1dGVzKCksIGluY2x1ZGUgdGhlICdjbHVzdGVyJyBwcm9wZXJ0eSBpZiB5b3UgcGxhbiBcIiArXG4gICAgICAgICAgICBcInRvIGNyZWF0ZSBuZXcgcm9sZXMuIEFsdGVybmF0aXZlbHksIHVzZSBleGlzdGluZyByb2xlcyBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHByb3ZpZGVyLlwiXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFJEUy9BdXJvcmEgY2x1c3RlcnMgYW5kIGluc3RhbmNlcywgZ2V0IGVuZHBvaW50IGRldGFpbHNcbiAgICAgIGNvbnN0IGhvc3QgPSAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVyRW5kcG9pbnRcbiAgICAgICAgPyAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVyRW5kcG9pbnQuaG9zdG5hbWVcbiAgICAgICAgOiAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VJbnN0YW5jZSkuaW5zdGFuY2VFbmRwb2ludC5ob3N0bmFtZVxuXG4gICAgICBjb25zdCBwb3J0ID0gKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuY2x1c3RlckVuZHBvaW50XG4gICAgICAgID8gKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuY2x1c3RlckVuZHBvaW50LnBvcnRcbiAgICAgICAgOiAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VJbnN0YW5jZSkuaW5zdGFuY2VFbmRwb2ludC5wb3J0XG5cbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVySWRlbnRpZmllclxuICAgICAgICA/IChwcm9wcy5wcm92aWRlci5jbHVzdGVyIGFzIElEYXRhYmFzZUNsdXN0ZXIpLmNsdXN0ZXJJZGVudGlmaWVyXG4gICAgICAgIDogKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlSW5zdGFuY2UpLmluc3RhbmNlSWRlbnRpZmllclxuXG4gICAgICBjb25zdCBzZWNyZXRUZW1wbGF0ZSA9IHtcbiAgICAgICAgZGJDbHVzdGVySWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgZW5naW5lOiBwcm9wcy5wcm92aWRlci5lbmdpbmUsXG4gICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgIHBvcnQ6IHBvcnQsXG4gICAgICAgIHVzZXJuYW1lOiBwcm9wcy5yb2xlTmFtZSxcbiAgICAgICAgZGJuYW1lOiBwcm9wcy5kYXRhYmFzZSA/IHByb3BzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSA6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWNyZXQgPSBuZXcgU2VjcmV0KHRoaXMsIFwiU2VjcmV0XCIsIHtcbiAgICAgICAgc2VjcmV0TmFtZTogcHJvcHMuc2VjcmV0TmFtZSxcbiAgICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgZGVzY3JpcHRpb246IGBHZW5lcmF0ZWQgc2VjcmV0IGZvciAke3Byb3BzLnByb3ZpZGVyLmVuZ2luZX0gcm9sZSAke3Byb3BzLnJvbGVOYW1lfWAsXG4gICAgICAgIC4uLihwcm9wcy5lbmFibGVJYW1BdXRoXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC8vIEZvciBJQU0gYXV0aCwgY3JlYXRlIHNlY3JldCB3aXRob3V0IHBhc3N3b3JkIGdlbmVyYXRpb25cbiAgICAgICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHNlY3JldFRlbXBsYXRlKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgLy8gRm9yIHBhc3N3b3JkIGF1dGgsIGdlbmVyYXRlIHBhc3N3b3JkXG4gICAgICAgICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgICAgICAgcGFzc3dvcmRMZW5ndGg6IDMwLCAvLyBPcmFjbGUgcGFzc3dvcmQgY2Fubm90IGhhdmUgbW9yZSB0aGFuIDMwIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoc2VjcmV0VGVtcGxhdGUpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgZXhjbHVkZUNoYXJhY3RlcnM6IFwiICUrfmAjJCYqKCl8W117fTo7PD4/IScvQFxcXCJcXFxcXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgfSlcblxuICAgICAgLy8gQ3JlYXRlIFBhcmFtZXRlcnMgaWYgcGFyYW1ldGVyUHJlZml4IGlzIHByb3ZpZGVkXG4gICAgICBpZiAocHJvcHMucGFyYW1ldGVyUHJlZml4KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtRGF0YSA9IHtcbiAgICAgICAgICBkYkNsdXN0ZXJJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICAgIGVuZ2luZTogcHJvcHMucHJvdmlkZXIuZW5naW5lLFxuICAgICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgICAgcG9ydDogcG9ydCxcbiAgICAgICAgICB1c2VybmFtZTogcHJvcHMucm9sZU5hbWUsXG4gICAgICAgICAgZGJuYW1lOiBwcm9wcy5kYXRhYmFzZSA/IHByb3BzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSA6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgfVxuXG4gICAgICAgIG5ldyBQYXJhbWV0ZXJzKHRoaXMsIFwiUGFyYW1ldGVyc1wiLCB7XG4gICAgICAgICAgc2VjcmV0QXJuOiBwcm9wcy5wcm92aWRlci5zZWNyZXQ/LnNlY3JldEFybiB8fCBcIlwiLFxuICAgICAgICAgIHBhcmFtZXRlclByZWZpeDogcHJvcHMucGFyYW1ldGVyUHJlZml4LFxuICAgICAgICAgIHBhc3N3b3JkQXJuOiBwcm9wcy5lbmFibGVJYW1BdXRoID8gXCJcIiA6IHRoaXMuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgICBwcm92aWRlclNlcnZpY2VUb2tlbjogcHJvcHMucHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgICAgIHByb3ZpZGVyOiBwcm9wcy5wcm92aWRlcixcbiAgICAgICAgICBwYXJhbURhdGEsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgcm9sZSA9IG5ldyBDdXN0b21SZXNvdXJjZVJvbGUodGhpcywgXCJQb3N0Z3Jlc1JvbGVcIiwge1xuICAgICAgcHJvdmlkZXI6IHByb3BzLnByb3ZpZGVyLFxuICAgICAgcm9sZU5hbWU6IHByb3BzLnJvbGVOYW1lLFxuICAgICAgcGFzc3dvcmRBcm46XG4gICAgICAgIHByb3BzLmVuYWJsZUlhbUF1dGggfHwgcHJvcHMucHJvdmlkZXIuZW5naW5lID09PSBEYXRhYmFzZUVuZ2luZS5EU1FMXG4gICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgOiB0aGlzLnNlY3JldCEuc2VjcmV0QXJuLFxuICAgICAgZGF0YWJhc2U6IHByb3BzLmRhdGFiYXNlLFxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBlbmFibGVJYW1BdXRoOiBwcm9wcy5lbmFibGVJYW1BdXRoIHx8IHByb3BzLnByb3ZpZGVyLmVuZ2luZSA9PT0gRGF0YWJhc2VFbmdpbmUuRFNRTCxcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuc2VjcmV0KSB7XG4gICAgICByb2xlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnNlY3JldClcbiAgICAgIHRoaXMuc2VjcmV0LmdyYW50UmVhZChwcm9wcy5wcm92aWRlci5oYW5kbGVyKVxuICAgICAgaWYgKHRoaXMuc2VjcmV0LmVuY3J5cHRpb25LZXkpIHtcbiAgICAgICAgLy8gSXQgc2VlbXMgd2UgbmVlZCB0byBncmFudCBleHBsaWNpdCBwZXJtaXNzaW9uXG4gICAgICAgIHRoaXMuc2VjcmV0LmVuY3J5cHRpb25LZXkuZ3JhbnREZWNyeXB0KHByb3BzLnByb3ZpZGVyLmhhbmRsZXIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yb2xlTmFtZSA9IHByb3BzLnJvbGVOYW1lXG4gIH1cbn1cbiJdfQ==
|
package/lib/schema.js
CHANGED
|
@@ -27,5 +27,5 @@ class Schema extends aws_cdk_lib_1.CustomResource {
|
|
|
27
27
|
}
|
|
28
28
|
exports.Schema = Schema;
|
|
29
29
|
_a = JSII_RTTI_SYMBOL_1;
|
|
30
|
-
Schema[_a] = { fqn: "cdk-rds-sql.Schema", version: "7.
|
|
30
|
+
Schema[_a] = { fqn: "cdk-rds-sql.Schema", version: "7.3.1" };
|
|
31
31
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUc1QyxpQ0FBdUM7QUE4QnZDLE1BQWEsTUFBTyxTQUFRLDRCQUFjO0lBR3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7UUFDMUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFVBQVUsRUFBRTtnQkFDVixRQUFRLEVBQUUscUJBQWMsQ0FBQyxNQUFNO2dCQUMvQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUN0RSxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDdkQ7U0FDRixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFBO1FBQ2xDLElBQUksS0FBSyxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0QsSUFBSSxLQUFLLENBQUMsSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyRCxDQUFDOztBQWxCSCx3QkFtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBJRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXJcIlxuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL3JvbGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYVByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IElQcm92aWRlclxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZGVmYXVsdCBkYXRhYmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U/OiBJRGF0YWJhc2VcblxuICAvKipcbiAgICogU2NoZW1hIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzY2hlbWFOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogT3B0aW9uYWwgcm9sZSB3aGljaCB3aWxsIGJlIGdyYW50ZWQgdXNhZ2UgYW5kIGNyZWF0ZSBwZXJtaXNzaW9uc1xuICAgKiB0byB0aGlzIHNjaGVtYS4gVGhpcyB3YXkgdGhlIHJvbGUgY2FuIHJlYWQgaXRzIG93biB0YWJsZXMsIGJ1dFxuICAgKiBjYW5ub3Qgc2VlIG9yIGFjY2VzcyB0YWJsZXMgY3JlYXRlZCBieSBvdGhlcnMuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogUm9sZVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hIGV4dGVuZHMgQ3VzdG9tUmVzb3VyY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNjaGVtYVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLlNDSEVNQSxcbiAgICAgICAgUmVzb3VyY2VJZDogcHJvcHMuc2NoZW1hTmFtZSxcbiAgICAgICAgLi4uKHByb3BzLnByb3ZpZGVyLnNlY3JldCA/IHsgU2VjcmV0QXJuOiBwcm9wcy5wcm92aWRlci5zZWNyZXQuc2VjcmV0QXJuIH0gOiB7fSksXG4gICAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2UgPyBwcm9wcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUgOiB1bmRlZmluZWQsXG4gICAgICAgIFJvbGVOYW1lOiBwcm9wcy5yb2xlID8gcHJvcHMucm9sZS5yb2xlTmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSlcbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcbiAgICB0aGlzLnNjaGVtYU5hbWUgPSBwcm9wcy5zY2hlbWFOYW1lXG4gICAgaWYgKHByb3BzLmRhdGFiYXNlKSB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5kYXRhYmFzZSlcbiAgICBpZiAocHJvcHMucm9sZSkgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucm9sZSlcbiAgfVxufVxuIl19
|
package/lib/sql.js
CHANGED
|
@@ -24,5 +24,5 @@ class Sql extends aws_cdk_lib_1.CustomResource {
|
|
|
24
24
|
}
|
|
25
25
|
exports.Sql = Sql;
|
|
26
26
|
_a = JSII_RTTI_SYMBOL_1;
|
|
27
|
-
Sql[_a] = { fqn: "cdk-rds-sql.Sql", version: "7.
|
|
27
|
+
Sql[_a] = { fqn: "cdk-rds-sql.Sql", version: "7.3.1" };
|
|
28
28
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUc1QyxpQ0FBdUM7QUEyQnZDLE1BQWEsR0FBSSxTQUFRLDRCQUFjO0lBQ3JDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZTtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDekMsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBYyxDQUFDLEdBQUc7Z0JBQzVCLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUN0RSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTthQUN6QjtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxJQUFJLEtBQUssQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzdELENBQUM7O0FBZEgsa0JBZUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBJRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNxbFByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IElQcm92aWRlclxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZGVmYXVsdCBkYXRhYmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U/OiBJRGF0YWJhc2VcblxuICAvKipcbiAgICogU1FMLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVtZW50Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHN0YXRtZW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHJlc291cmNlIGlzIGRlbGV0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBTcWwgZXh0ZW5kcyBDdXN0b21SZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTcWxQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFJlc291cmNlOiBSZHNTcWxSZXNvdXJjZS5TUUwsXG4gICAgICAgIC4uLihwcm9wcy5wcm92aWRlci5zZWNyZXQgPyB7IFNlY3JldEFybjogcHJvcHMucHJvdmlkZXIuc2VjcmV0LnNlY3JldEFybiB9IDoge30pLFxuICAgICAgICBEYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlID8gcHJvcHMuZGF0YWJhc2UuZGF0YWJhc2VOYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICBTdGF0ZW1lbnQ6IHByb3BzLnN0YXRlbWVudCxcbiAgICAgICAgUm9sbGJhY2s6IHByb3BzLnJvbGxiYWNrLFxuICAgICAgfSxcbiAgICB9KVxuICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLnByb3ZpZGVyKVxuICAgIGlmIChwcm9wcy5kYXRhYmFzZSkgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMuZGF0YWJhc2UpXG4gIH1cbn1cbiJdfQ==
|