@cloud-copilot/iam-expand 0.1.3 → 0.1.5
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/README.md +84 -20
- package/dist/cjs/cli.js +17 -9
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/cli_utils.d.ts +4 -1
- package/dist/cjs/cli_utils.d.ts.map +1 -1
- package/dist/cjs/cli_utils.js +10 -4
- package/dist/cjs/cli_utils.js.map +1 -1
- package/dist/cjs/expand.d.ts +3 -3
- package/dist/cjs/expand.d.ts.map +1 -1
- package/dist/cjs/expand.js +26 -15
- package/dist/cjs/expand.js.map +1 -1
- package/dist/cjs/expand_file.d.ts +11 -0
- package/dist/cjs/expand_file.d.ts.map +1 -0
- package/dist/cjs/expand_file.js +39 -0
- package/dist/cjs/expand_file.js.map +1 -0
- package/dist/esm/cli.js +18 -10
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/cli_utils.d.ts +4 -1
- package/dist/esm/cli_utils.d.ts.map +1 -1
- package/dist/esm/cli_utils.js +9 -3
- package/dist/esm/cli_utils.js.map +1 -1
- package/dist/esm/expand.d.ts +3 -3
- package/dist/esm/expand.d.ts.map +1 -1
- package/dist/esm/expand.js +26 -15
- package/dist/esm/expand.js.map +1 -1
- package/dist/esm/expand_file.d.ts +11 -0
- package/dist/esm/expand_file.d.ts.map +1 -0
- package/dist/esm/expand_file.js +36 -0
- package/dist/esm/expand_file.js.map +1 -0
- package/package.json +5 -3
- package/src/cli.ts +17 -10
- package/src/cli_utils.test.ts +26 -11
- package/src/cli_utils.ts +10 -4
- package/src/expand.test.ts +112 -106
- package/src/expand.ts +30 -19
- package/src/expand_file.test.ts +107 -0
- package/src/expand_file.ts +39 -0
package/README.md
CHANGED
|
@@ -49,7 +49,7 @@ expandIamActions(['s3:Get*Tagging', 's3:Put*Tagging'])
|
|
|
49
49
|
## Options
|
|
50
50
|
`expandIamActions` an optional second argument that is an object with the following options:
|
|
51
51
|
|
|
52
|
-
### `
|
|
52
|
+
### `expandAsterisk`
|
|
53
53
|
By default, a single `*` not be expanded. We assume that if you want a list of all IAM actions there are other sources you will check, such as [@cloud-copilot/iam-data](https://github.com/cloud-copilot/iam-data). If you want to expand a single `*` you can set this option to `true`.
|
|
54
54
|
|
|
55
55
|
```typescript
|
|
@@ -60,12 +60,12 @@ expandIamActions('*')
|
|
|
60
60
|
['*']
|
|
61
61
|
|
|
62
62
|
//Returns the expanded value
|
|
63
|
-
expandIamActions('*', {
|
|
63
|
+
expandIamActions('*', { expandAsterisk: true })
|
|
64
64
|
[
|
|
65
65
|
//Many many strings. 🫢
|
|
66
66
|
]
|
|
67
67
|
```
|
|
68
|
-
### `
|
|
68
|
+
### `expandServiceAsterisk`
|
|
69
69
|
By default, a service name followed by a `*` (such as `s3:*` or `lambda:*`) will not be expanded. If you want to expand these you can set this option to `true`.
|
|
70
70
|
|
|
71
71
|
```typescript
|
|
@@ -76,7 +76,7 @@ expandIamActions('s3:*')
|
|
|
76
76
|
['s3:*']
|
|
77
77
|
|
|
78
78
|
//Returns the expanded value
|
|
79
|
-
expandIamActions('s3:*', {
|
|
79
|
+
expandIamActions('s3:*', { expandServiceAsterisk: true })
|
|
80
80
|
[
|
|
81
81
|
//All the s3 actions. 🫢
|
|
82
82
|
]
|
|
@@ -221,7 +221,7 @@ You can pass in all options available through the api as dash separated flags.
|
|
|
221
221
|
|
|
222
222
|
_Prints all matching actions for s3:Get*Tagging, s3:*Tag*, and ec2:* in alphabetical order with duplicates removed:_
|
|
223
223
|
```bash
|
|
224
|
-
iam-expand s3:Get*Tagging s3:*Tag* ec2:* --expand-service-
|
|
224
|
+
iam-expand s3:Get*Tagging s3:*Tag* ec2:* --expand-service-asterisk --distinct --sort
|
|
225
225
|
```
|
|
226
226
|
|
|
227
227
|
### Help
|
|
@@ -231,10 +231,85 @@ iam-expand
|
|
|
231
231
|
```
|
|
232
232
|
|
|
233
233
|
### Read from stdin
|
|
234
|
-
The CLI is able to read from stdin, and this is really meant to be abused. It essentialy greps the content for anything resembling and action and expands it. Throw anything at it and it will find all the actions it can and expand them.
|
|
235
|
-
|
|
236
234
|
If no actions are passed as arguments, the CLI will read from stdin.
|
|
237
235
|
|
|
236
|
+
#### Expanding JSON input
|
|
237
|
+
If the input is a valid json document, the CLI will find every instance of `Action` that is a string
|
|
238
|
+
or an array of strings and expand them. This is useful for finding all the actions in a policy document or set of documents.
|
|
239
|
+
|
|
240
|
+
Given `policy.json`
|
|
241
|
+
```json
|
|
242
|
+
|
|
243
|
+
{
|
|
244
|
+
"Version": "2012-10-17",
|
|
245
|
+
"Statement": [
|
|
246
|
+
{
|
|
247
|
+
"Effect": "Allow",
|
|
248
|
+
"Action": "s3:Get*Tagging",
|
|
249
|
+
"Resource": "*"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"Effect": "Allow",
|
|
253
|
+
"Action": ["s3:Get*Tagging", "s3:Put*Tagging"],
|
|
254
|
+
"Resource": "*"
|
|
255
|
+
}
|
|
256
|
+
]
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
cat policy.json | iam-expand > expanded-policy.json
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Gives this file in `expanded-policy.json`
|
|
265
|
+
```json
|
|
266
|
+
{
|
|
267
|
+
"Version": "2012-10-17",
|
|
268
|
+
"Statement": [
|
|
269
|
+
{
|
|
270
|
+
"Effect": "Allow",
|
|
271
|
+
// Was "s3:Get*Tagging"
|
|
272
|
+
"Action": [
|
|
273
|
+
"s3:GetBucketTagging",
|
|
274
|
+
"s3:GetJobTagging",
|
|
275
|
+
"s3:GetObjectTagging",
|
|
276
|
+
"s3:GetObjectVersionTagging",
|
|
277
|
+
"s3:GetStorageLensConfigurationTagging"
|
|
278
|
+
],
|
|
279
|
+
"Resource": "*"
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"Effect": "Allow",
|
|
283
|
+
// Was ["s3:Get*Tagging", "s3:Put*Tagging"]
|
|
284
|
+
"Action": [
|
|
285
|
+
"s3:GetBucketTagging",
|
|
286
|
+
"s3:GetJobTagging",
|
|
287
|
+
"s3:GetObjectTagging",
|
|
288
|
+
"s3:GetObjectVersionTagging",
|
|
289
|
+
"s3:GetStorageLensConfigurationTagging",
|
|
290
|
+
"s3:PutBucketTagging",
|
|
291
|
+
"s3:PutJobTagging",
|
|
292
|
+
"s3:PutObjectTagging",
|
|
293
|
+
"s3:PutObjectVersionTagging",
|
|
294
|
+
"s3:PutStorageLensConfigurationTagging"
|
|
295
|
+
],
|
|
296
|
+
"Resource": "*"
|
|
297
|
+
}
|
|
298
|
+
]
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
You can also use this to expand the actions from the output of commands.
|
|
303
|
+
```bash
|
|
304
|
+
aws iam get-account-authorization-details --output json | iam-expand --expand-service-asterisk --read-wait-time=20_000 > expanded-inline-policies.json
|
|
305
|
+
# Now you can search the output for actions you are interested in
|
|
306
|
+
grep "kms:DisableKey" expanded-inline-policies.json
|
|
307
|
+
```
|
|
308
|
+
_--expand-service-asterisk makes sure kms:* is expaneded out so you can find the DisableKey action. --read-wait-time=20_000 gives the cli command more time to return it's first byte of output_
|
|
309
|
+
|
|
310
|
+
#### Expanding arbitrary input
|
|
311
|
+
If the input from stdin is not json, the content is searched for actions that are then expanded. This is really meant to be abused. It essentialy greps the content for anything resembling and action and expands it. Throw anything at it and it will find all the actions it can and expand them.
|
|
312
|
+
|
|
238
313
|
You can echo some content:
|
|
239
314
|
```bash
|
|
240
315
|
echo "s3:Get*Tagging" | iam-expand
|
|
@@ -245,11 +320,6 @@ You can pull out part of a json file and pipe it in:
|
|
|
245
320
|
cat policy.json | jq '.Statement[].Action' | iam-expand
|
|
246
321
|
```
|
|
247
322
|
|
|
248
|
-
Or just send in the whole file:
|
|
249
|
-
```bash
|
|
250
|
-
cat policy.json | iam-expand
|
|
251
|
-
```
|
|
252
|
-
|
|
253
323
|
Or some Terraform:
|
|
254
324
|
```bash
|
|
255
325
|
cat main.tf | iam-expand
|
|
@@ -265,14 +335,8 @@ Or even some HTML:
|
|
|
265
335
|
curl "https://docs.aws.amazon.com/aws-managed-policy/latest/reference/SecurityAudit.html" | iam-expand
|
|
266
336
|
```
|
|
267
337
|
|
|
268
|
-
Or the output of
|
|
269
|
-
|
|
270
|
-
This will search for all inline policies that have have
|
|
271
|
-
```bash
|
|
272
|
-
aws iam get-account-authorization-details --output json | iam-expand --expand-service-asterik --read-wait-time=20_000 | grep kms:DisableKey
|
|
273
|
-
```
|
|
274
|
-
_--expand-service-asterik makes sure kms:* is expaneded out so you can find the DisableKey action. --read-wait-time=20_000 gives the cli command more time to return it's first byte of output_
|
|
338
|
+
Or the output of any command.
|
|
275
339
|
|
|
276
|
-
Because of the likelyhood of finding an aseterik `*` in the input
|
|
340
|
+
Because of the likelyhood of finding an aseterik `*` in the input; if the value to stdin is not a valid json document the stdin option will not find or expand a single `*` even if `--expand-asterisk` is passed.
|
|
277
341
|
|
|
278
342
|
Please give this anything you can think of and open an issue if you see an opportunity for improvement.
|
package/dist/cjs/cli.js
CHANGED
|
@@ -5,9 +5,9 @@ const iam_data_1 = require("@cloud-copilot/iam-data");
|
|
|
5
5
|
const cli_utils_js_1 = require("./cli_utils.js");
|
|
6
6
|
const expand_js_1 = require("./expand.js");
|
|
7
7
|
const commandName = 'iam-expand';
|
|
8
|
-
function expandAndPrint(actionStrings, options) {
|
|
8
|
+
async function expandAndPrint(actionStrings, options) {
|
|
9
9
|
try {
|
|
10
|
-
const result = (0, expand_js_1.expandIamActions)(actionStrings, options);
|
|
10
|
+
const result = await (0, expand_js_1.expandIamActions)(actionStrings, options);
|
|
11
11
|
for (const action of result) {
|
|
12
12
|
console.log(action);
|
|
13
13
|
}
|
|
@@ -25,8 +25,8 @@ function printUsage() {
|
|
|
25
25
|
console.log('Action Expanding Options:');
|
|
26
26
|
console.log(' --distinct: Remove duplicate actions');
|
|
27
27
|
console.log(' --sort: Sort the actions');
|
|
28
|
-
console.log(' --expand-
|
|
29
|
-
console.log(' --expand-service-
|
|
28
|
+
console.log(' --expand-asterisk: Expand the * action to all actions');
|
|
29
|
+
console.log(' --expand-service-asterisk: Expand service:* to all actions for that service');
|
|
30
30
|
console.log(' --error-on-missing-service: Throw an error if a service is not found');
|
|
31
31
|
console.log(' --error-on-invalid-format: Throw an error if the action string is not in the correct format');
|
|
32
32
|
console.log(' --invalid-action-behavior: What to do when an invalid action is encountered:');
|
|
@@ -57,14 +57,22 @@ async function run() {
|
|
|
57
57
|
return;
|
|
58
58
|
}
|
|
59
59
|
if (actionStrings.length === 0) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
//If no actions are provided, read from stdin
|
|
61
|
+
const stdInResult = await (0, cli_utils_js_1.parseStdIn)(options);
|
|
62
|
+
if (stdInResult.object) {
|
|
63
|
+
console.log(JSON.stringify(stdInResult.object, null, 2));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
else if (stdInResult.strings) {
|
|
67
|
+
const otherActions = stdInResult.strings;
|
|
68
|
+
if (otherActions.length > 0 && options.expandAsterisk) {
|
|
69
|
+
console.warn('Notice: --expand-asterisk is not supported when reading from stdin, ignoring.');
|
|
70
|
+
}
|
|
71
|
+
actionStrings.push(...otherActions);
|
|
63
72
|
}
|
|
64
|
-
actionStrings.push(...otherActions);
|
|
65
73
|
}
|
|
66
74
|
if (actionStrings.length > 0) {
|
|
67
|
-
expandAndPrint(actionStrings, options);
|
|
75
|
+
await expandAndPrint(actionStrings, options);
|
|
68
76
|
return;
|
|
69
77
|
}
|
|
70
78
|
printUsage();
|
package/dist/cjs/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";;;AAEA,sDAAyD;AACzD,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/cli_utils.d.ts
CHANGED
|
@@ -22,6 +22,9 @@ export declare function extractActionsFromLineOfInput(line: string): string[];
|
|
|
22
22
|
*
|
|
23
23
|
* @returns an array of strings from stdin
|
|
24
24
|
*/
|
|
25
|
-
export declare function
|
|
25
|
+
export declare function parseStdIn(options: Partial<CliOptions>): Promise<{
|
|
26
|
+
strings?: string[];
|
|
27
|
+
object?: any;
|
|
28
|
+
}>;
|
|
26
29
|
export {};
|
|
27
30
|
//# sourceMappingURL=cli_utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli_utils.d.ts","sourceRoot":"","sources":["../../src/cli_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAyB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli_utils.d.ts","sourceRoot":"","sources":["../../src/cli_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAyB,MAAM,aAAa,CAAC;AAI7E,UAAU,UAAW,SAAQ,uBAAuB;IAClD,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAyBxE;AAGD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMpE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,CAAA;CAAC,CAAC,CAgB1G"}
|
package/dist/cjs/cli_utils.js
CHANGED
|
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.dashToCamelCase = dashToCamelCase;
|
|
4
4
|
exports.convertOptions = convertOptions;
|
|
5
5
|
exports.extractActionsFromLineOfInput = extractActionsFromLineOfInput;
|
|
6
|
-
exports.
|
|
6
|
+
exports.parseStdIn = parseStdIn;
|
|
7
7
|
const expand_js_1 = require("./expand.js");
|
|
8
|
+
const expand_file_js_1 = require("./expand_file.js");
|
|
8
9
|
const stdin_js_1 = require("./stdin.js");
|
|
9
10
|
/**
|
|
10
11
|
* Convert a dash-case string to camelCase
|
|
@@ -56,14 +57,19 @@ function extractActionsFromLineOfInput(line) {
|
|
|
56
57
|
*
|
|
57
58
|
* @returns an array of strings from stdin
|
|
58
59
|
*/
|
|
59
|
-
async function
|
|
60
|
+
async function parseStdIn(options) {
|
|
60
61
|
const delay = options.readWaitTime ? parseInt(options.readWaitTime.replaceAll(/\D/g, '')) : undefined;
|
|
61
62
|
const data = await (0, stdin_js_1.readStdin)(delay);
|
|
62
63
|
if (data.length === 0) {
|
|
63
|
-
return
|
|
64
|
+
return {};
|
|
64
65
|
}
|
|
66
|
+
try {
|
|
67
|
+
const object = await (0, expand_file_js_1.expandJsonDocument)(options, JSON.parse(data));
|
|
68
|
+
return { object };
|
|
69
|
+
}
|
|
70
|
+
catch (err) { }
|
|
65
71
|
const lines = data.split('\n');
|
|
66
72
|
const actions = lines.flatMap(line => extractActionsFromLineOfInput(line));
|
|
67
|
-
return actions;
|
|
73
|
+
return { strings: actions };
|
|
68
74
|
}
|
|
69
75
|
//# sourceMappingURL=cli_utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli_utils.js","sourceRoot":"","sources":["../../src/cli_utils.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"cli_utils.js","sourceRoot":"","sources":["../../src/cli_utils.ts"],"names":[],"mappings":";;AAeA,0CAGC;AAQD,wCAyBC;AAGD,sEAMC;AAOD,gCAgBC;AAlFD,2CAA6E;AAC7E,qDAAsD;AACtD,yCAAuC;AAOvC;;;;GAIG;AACH,SAAgB,eAAe,CAAC,GAAW;IACzC,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACtB,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,UAAoB;IACjD,MAAM,OAAO,GAAqC,EAAE,CAAE;IAEtD,KAAI,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,GAAG,GAAW,MAAM,CAAA;QACxB,IAAI,KAAK,GAAqB,IAAI,CAAA;QAClC,IAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,CAAC,GAAG,EAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACjC,CAAC;QAED,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;IACvC,CAAC;IAED,IAAG,OAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,cAAc,GAAG,OAAO,CAAC,qBAA+B,CAAA;QAC9D,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACpG,MAAM,QAAQ,GAAG,iCAAqB,CAAC,YAAkD,CAAC,CAAC;QAC3F,IAAG,QAAQ,EAAE,CAAC;YACZ,OAAO,CAAC,qBAAqB,GAAG,QAAQ,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAC,uBAAuB,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,aAAa,GAAG,mCAAmC,CAAC;AAC1D,SAAgB,6BAA6B,CAAC,IAAY;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IAE5C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;SACb,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvC,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAAC,OAA4B;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACrG,MAAM,IAAI,GAAG,MAAM,IAAA,oBAAS,EAAC,KAAK,CAAC,CAAA;IACnC,IAAG,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAkB,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAClE,OAAO,EAAC,MAAM,EAAC,CAAA;IACjB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC,CAAA,CAAC;IAGrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1E,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,CAAA;AAC3B,CAAC"}
|
package/dist/cjs/expand.d.ts
CHANGED
|
@@ -13,13 +13,13 @@ export interface ExpandIamActionsOptions {
|
|
|
13
13
|
* If false, a single `*` will be returned as is
|
|
14
14
|
* Default: false
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
expandAsterisk: boolean;
|
|
17
17
|
/**
|
|
18
18
|
* If true, `service:*` will be expanded to all actions for that service
|
|
19
19
|
* If false, `service:*` will be returned as is
|
|
20
20
|
* Default: false
|
|
21
21
|
*/
|
|
22
|
-
|
|
22
|
+
expandServiceAsterisk: boolean;
|
|
23
23
|
/**
|
|
24
24
|
* If true, an error will be thrown if the action string is not in the correct format
|
|
25
25
|
* If false, an empty array will be returned
|
|
@@ -65,5 +65,5 @@ export interface ExpandIamActionsOptions {
|
|
|
65
65
|
* @param overrideOptions Options to override the default behavior
|
|
66
66
|
* @returns An array of expanded action strings flattend to a single array
|
|
67
67
|
*/
|
|
68
|
-
export declare function expandIamActions(actionStringOrStrings: string | string[], overrideOptions?: Partial<ExpandIamActionsOptions>): string[]
|
|
68
|
+
export declare function expandIamActions(actionStringOrStrings: string | string[], overrideOptions?: Partial<ExpandIamActionsOptions>): Promise<string[]>;
|
|
69
69
|
//# sourceMappingURL=expand.d.ts.map
|
package/dist/cjs/expand.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/expand.ts"],"names":[],"mappings":"AAEA,oBAAY,qBAAqB;IAC/B,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/expand.ts"],"names":[],"mappings":"AAEA,oBAAY,qBAAqB;IAC/B,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAA;IAEvB;;;;OAIG;IACH,qBAAqB,EAAE,OAAO,CAAA;IAE9B;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAA;IAE7B;;;;OAIG;IACH,qBAAqB,EAAE,OAAO,CAAA;IAE9B;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAA;IAGjB;;;;;;;OAOG;IACH,qBAAqB,EAAE,qBAAqB,CAAA;IAE5C;;;;OAIG;IACH,IAAI,EAAE,OAAO,CAAA;CACd;AAcD;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,qBAAqB,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0GtJ"}
|
package/dist/cjs/expand.js
CHANGED
|
@@ -10,15 +10,15 @@ var InvalidActionBehavior;
|
|
|
10
10
|
InvalidActionBehavior["Include"] = "Include";
|
|
11
11
|
})(InvalidActionBehavior || (exports.InvalidActionBehavior = InvalidActionBehavior = {}));
|
|
12
12
|
const defaultOptions = {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
expandAsterisk: false,
|
|
14
|
+
expandServiceAsterisk: false,
|
|
15
15
|
errorOnInvalidFormat: false,
|
|
16
16
|
errorOnMissingService: false,
|
|
17
17
|
invalidActionBehavior: InvalidActionBehavior.Remove,
|
|
18
18
|
distinct: false,
|
|
19
19
|
sort: false
|
|
20
20
|
};
|
|
21
|
-
const
|
|
21
|
+
const allAsterisksPattern = /^\*+$/i;
|
|
22
22
|
/**
|
|
23
23
|
* Expands an IAM action string that contains wildcards.
|
|
24
24
|
* If the action string contains no wildcards, it is returned as is.
|
|
@@ -30,14 +30,17 @@ const allAsteriksPattern = /^\*+$/i;
|
|
|
30
30
|
* @param overrideOptions Options to override the default behavior
|
|
31
31
|
* @returns An array of expanded action strings flattend to a single array
|
|
32
32
|
*/
|
|
33
|
-
function expandIamActions(actionStringOrStrings, overrideOptions) {
|
|
33
|
+
async function expandIamActions(actionStringOrStrings, overrideOptions) {
|
|
34
34
|
const options = { ...defaultOptions, ...overrideOptions };
|
|
35
35
|
if (!actionStringOrStrings) {
|
|
36
36
|
//Just in case the user passes in null or undefined
|
|
37
37
|
return [];
|
|
38
38
|
}
|
|
39
39
|
if (Array.isArray(actionStringOrStrings)) {
|
|
40
|
-
|
|
40
|
+
const actionLists = await Promise.all(actionStringOrStrings.map(async (actionString) => {
|
|
41
|
+
return expandIamActions(actionString, options);
|
|
42
|
+
}));
|
|
43
|
+
let allMatches = actionLists.flat();
|
|
41
44
|
if (options.distinct) {
|
|
42
45
|
const aSet = new Set();
|
|
43
46
|
allMatches = allMatches.filter((value) => {
|
|
@@ -54,10 +57,16 @@ function expandIamActions(actionStringOrStrings, overrideOptions) {
|
|
|
54
57
|
return allMatches;
|
|
55
58
|
}
|
|
56
59
|
const actionString = actionStringOrStrings.trim();
|
|
57
|
-
if (actionString.match(
|
|
58
|
-
if (options.
|
|
60
|
+
if (actionString.match(allAsterisksPattern)) {
|
|
61
|
+
if (options.expandAsterisk) {
|
|
59
62
|
//If that's really what you want...
|
|
60
|
-
|
|
63
|
+
const allActions = [];
|
|
64
|
+
const serviceKeys = await (0, iam_data_1.iamServiceKeys)();
|
|
65
|
+
for await (const service of serviceKeys) {
|
|
66
|
+
const serviceActions = await (0, iam_data_1.iamActionsForService)(service);
|
|
67
|
+
allActions.push(...serviceActions.map(action => `${service}:${action}`));
|
|
68
|
+
}
|
|
69
|
+
return allActions;
|
|
61
70
|
}
|
|
62
71
|
return ['*'];
|
|
63
72
|
}
|
|
@@ -75,22 +84,24 @@ function expandIamActions(actionStringOrStrings, overrideOptions) {
|
|
|
75
84
|
return [];
|
|
76
85
|
}
|
|
77
86
|
const [service, wildcardActions] = parts.map(part => part.toLowerCase());
|
|
78
|
-
if (!(0, iam_data_1.iamServiceExists)(service)) {
|
|
87
|
+
if (!await (0, iam_data_1.iamServiceExists)(service)) {
|
|
79
88
|
if (options.errorOnMissingService) {
|
|
80
89
|
throw new Error(`Service not found: ${service}`);
|
|
81
90
|
}
|
|
82
91
|
return [];
|
|
83
92
|
}
|
|
84
|
-
if (wildcardActions.match(
|
|
85
|
-
if (options.
|
|
86
|
-
|
|
93
|
+
if (wildcardActions.match(allAsterisksPattern)) {
|
|
94
|
+
if (options.expandServiceAsterisk) {
|
|
95
|
+
const actionsForService = await (0, iam_data_1.iamActionsForService)(service);
|
|
96
|
+
return actionsForService.map(action => `${service}:${action}`);
|
|
87
97
|
}
|
|
88
98
|
return [`${service}:*`];
|
|
89
99
|
}
|
|
90
100
|
if (!actionString.includes('*')) {
|
|
91
|
-
const actionExists = (0, iam_data_1.iamActionExists)(service, wildcardActions);
|
|
101
|
+
const actionExists = await (0, iam_data_1.iamActionExists)(service, wildcardActions);
|
|
92
102
|
if (actionExists) {
|
|
93
|
-
|
|
103
|
+
const details = await (0, iam_data_1.iamActionDetails)(service, wildcardActions);
|
|
104
|
+
return [service + ":" + details.name];
|
|
94
105
|
}
|
|
95
106
|
if (options.invalidActionBehavior === InvalidActionBehavior.Remove) {
|
|
96
107
|
return [];
|
|
@@ -106,7 +117,7 @@ function expandIamActions(actionStringOrStrings, overrideOptions) {
|
|
|
106
117
|
throw new Error(`Invalid invalidActionBehavior: ${options.invalidActionBehavior}`);
|
|
107
118
|
}
|
|
108
119
|
}
|
|
109
|
-
const allActions = (0, iam_data_1.iamActionsForService)(service);
|
|
120
|
+
const allActions = await (0, iam_data_1.iamActionsForService)(service);
|
|
110
121
|
const pattern = "^" + wildcardActions.replace(/\*/g, '.*?') + "$";
|
|
111
122
|
const regex = new RegExp(pattern, 'i');
|
|
112
123
|
const matchingActions = allActions.filter(action => regex.test(action)).map(action => `${service}:${action}`);
|
package/dist/cjs/expand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../../src/expand.ts"],"names":[],"mappings":";;;AA0FA,
|
|
1
|
+
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../../src/expand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ExpandIamActionsOptions } from "./expand.js";
|
|
2
|
+
/**
|
|
3
|
+
* Takes any JSON document and expands any Action found in the document
|
|
4
|
+
*
|
|
5
|
+
* @param options the options to use when expanding the actions
|
|
6
|
+
* @param document the JSON document to expand
|
|
7
|
+
* @param key the key of the current node in the document
|
|
8
|
+
* @returns the expanded JSON document
|
|
9
|
+
*/
|
|
10
|
+
export declare function expandJsonDocument(options: Partial<ExpandIamActionsOptions>, document: any, key?: string): Promise<any>;
|
|
11
|
+
//# sourceMappingURL=expand_file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand_file.d.ts","sourceRoot":"","sources":["../../src/expand_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAEvE;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,uBAAuB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CA4B7H"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.expandJsonDocument = expandJsonDocument;
|
|
4
|
+
const expand_js_1 = require("./expand.js");
|
|
5
|
+
/**
|
|
6
|
+
* Takes any JSON document and expands any Action found in the document
|
|
7
|
+
*
|
|
8
|
+
* @param options the options to use when expanding the actions
|
|
9
|
+
* @param document the JSON document to expand
|
|
10
|
+
* @param key the key of the current node in the document
|
|
11
|
+
* @returns the expanded JSON document
|
|
12
|
+
*/
|
|
13
|
+
async function expandJsonDocument(options, document, key) {
|
|
14
|
+
if (key === 'Action') {
|
|
15
|
+
if (typeof document === 'string') {
|
|
16
|
+
return await (0, expand_js_1.expandIamActions)(document, options);
|
|
17
|
+
}
|
|
18
|
+
if (Array.isArray(document) && document.length > 0 && typeof document[0] === 'string') {
|
|
19
|
+
const value = await (0, expand_js_1.expandIamActions)(document, { ...options, distinct: true });
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (Array.isArray(document)) {
|
|
24
|
+
return Promise.all(document.map(async (item) => {
|
|
25
|
+
return expandJsonDocument(options, item);
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
if (typeof document === 'object') {
|
|
29
|
+
const keys = Object.keys(document);
|
|
30
|
+
const newObject = {};
|
|
31
|
+
for (const key of keys) {
|
|
32
|
+
const value = document[key];
|
|
33
|
+
newObject[key] = await expandJsonDocument(options, value, key);
|
|
34
|
+
}
|
|
35
|
+
return newObject;
|
|
36
|
+
}
|
|
37
|
+
return document;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=expand_file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand_file.js","sourceRoot":"","sources":["../../src/expand_file.ts"],"names":[],"mappings":";;AAUA,gDA4BC;AAtCD,2CAAuE;AAEvE;;;;;;;GAOG;AACI,KAAK,UAAU,kBAAkB,CAAC,OAAyC,EAAE,QAAa,EAAE,GAAY;IAC7G,IAAG,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpB,IAAG,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,MAAM,IAAA,4BAAgB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAClD,CAAC;QACD,IAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACrF,MAAM,KAAK,GAAI,MAAM,IAAA,4BAAgB,EAAC,QAAQ,EAAE,EAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAA;YAC7E,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7C,OAAO,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;IAED,IAAG,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClC,MAAM,SAAS,GAAQ,EAAE,CAAA;QACzB,KAAI,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;YAC3B,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QAChE,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
package/dist/esm/cli.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { iamDataVersion } from "@cloud-copilot/iam-data";
|
|
3
|
-
import { convertOptions,
|
|
3
|
+
import { convertOptions, parseStdIn } from "./cli_utils.js";
|
|
4
4
|
import { expandIamActions } from "./expand.js";
|
|
5
5
|
const commandName = 'iam-expand';
|
|
6
|
-
function expandAndPrint(actionStrings, options) {
|
|
6
|
+
async function expandAndPrint(actionStrings, options) {
|
|
7
7
|
try {
|
|
8
|
-
const result = expandIamActions(actionStrings, options);
|
|
8
|
+
const result = await expandIamActions(actionStrings, options);
|
|
9
9
|
for (const action of result) {
|
|
10
10
|
console.log(action);
|
|
11
11
|
}
|
|
@@ -23,8 +23,8 @@ function printUsage() {
|
|
|
23
23
|
console.log('Action Expanding Options:');
|
|
24
24
|
console.log(' --distinct: Remove duplicate actions');
|
|
25
25
|
console.log(' --sort: Sort the actions');
|
|
26
|
-
console.log(' --expand-
|
|
27
|
-
console.log(' --expand-service-
|
|
26
|
+
console.log(' --expand-asterisk: Expand the * action to all actions');
|
|
27
|
+
console.log(' --expand-service-asterisk: Expand service:* to all actions for that service');
|
|
28
28
|
console.log(' --error-on-missing-service: Throw an error if a service is not found');
|
|
29
29
|
console.log(' --error-on-invalid-format: Throw an error if the action string is not in the correct format');
|
|
30
30
|
console.log(' --invalid-action-behavior: What to do when an invalid action is encountered:');
|
|
@@ -55,14 +55,22 @@ async function run() {
|
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
if (actionStrings.length === 0) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
//If no actions are provided, read from stdin
|
|
59
|
+
const stdInResult = await parseStdIn(options);
|
|
60
|
+
if (stdInResult.object) {
|
|
61
|
+
console.log(JSON.stringify(stdInResult.object, null, 2));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
else if (stdInResult.strings) {
|
|
65
|
+
const otherActions = stdInResult.strings;
|
|
66
|
+
if (otherActions.length > 0 && options.expandAsterisk) {
|
|
67
|
+
console.warn('Notice: --expand-asterisk is not supported when reading from stdin, ignoring.');
|
|
68
|
+
}
|
|
69
|
+
actionStrings.push(...otherActions);
|
|
61
70
|
}
|
|
62
|
-
actionStrings.push(...otherActions);
|
|
63
71
|
}
|
|
64
72
|
if (actionStrings.length > 0) {
|
|
65
|
-
expandAndPrint(actionStrings, options);
|
|
73
|
+
await expandAndPrint(actionStrings, options);
|
|
66
74
|
return;
|
|
67
75
|
}
|
|
68
76
|
printUsage();
|
package/dist/esm/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/cli_utils.d.ts
CHANGED
|
@@ -22,6 +22,9 @@ export declare function extractActionsFromLineOfInput(line: string): string[];
|
|
|
22
22
|
*
|
|
23
23
|
* @returns an array of strings from stdin
|
|
24
24
|
*/
|
|
25
|
-
export declare function
|
|
25
|
+
export declare function parseStdIn(options: Partial<CliOptions>): Promise<{
|
|
26
|
+
strings?: string[];
|
|
27
|
+
object?: any;
|
|
28
|
+
}>;
|
|
26
29
|
export {};
|
|
27
30
|
//# sourceMappingURL=cli_utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli_utils.d.ts","sourceRoot":"","sources":["../../src/cli_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAyB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli_utils.d.ts","sourceRoot":"","sources":["../../src/cli_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAyB,MAAM,aAAa,CAAC;AAI7E,UAAU,UAAW,SAAQ,uBAAuB;IAClD,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAyBxE;AAGD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMpE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,CAAA;CAAC,CAAC,CAgB1G"}
|
package/dist/esm/cli_utils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { InvalidActionBehavior } from "./expand.js";
|
|
2
|
+
import { expandJsonDocument } from "./expand_file.js";
|
|
2
3
|
import { readStdin } from "./stdin.js";
|
|
3
4
|
/**
|
|
4
5
|
* Convert a dash-case string to camelCase
|
|
@@ -50,14 +51,19 @@ export function extractActionsFromLineOfInput(line) {
|
|
|
50
51
|
*
|
|
51
52
|
* @returns an array of strings from stdin
|
|
52
53
|
*/
|
|
53
|
-
export async function
|
|
54
|
+
export async function parseStdIn(options) {
|
|
54
55
|
const delay = options.readWaitTime ? parseInt(options.readWaitTime.replaceAll(/\D/g, '')) : undefined;
|
|
55
56
|
const data = await readStdin(delay);
|
|
56
57
|
if (data.length === 0) {
|
|
57
|
-
return
|
|
58
|
+
return {};
|
|
58
59
|
}
|
|
60
|
+
try {
|
|
61
|
+
const object = await expandJsonDocument(options, JSON.parse(data));
|
|
62
|
+
return { object };
|
|
63
|
+
}
|
|
64
|
+
catch (err) { }
|
|
59
65
|
const lines = data.split('\n');
|
|
60
66
|
const actions = lines.flatMap(line => extractActionsFromLineOfInput(line));
|
|
61
|
-
return actions;
|
|
67
|
+
return { strings: actions };
|
|
62
68
|
}
|
|
63
69
|
//# sourceMappingURL=cli_utils.js.map
|