@cloud-copilot/iam-policy 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +75 -7
  2. package/dist/cjs/index.d.ts +1 -0
  3. package/dist/cjs/index.d.ts.map +1 -1
  4. package/dist/cjs/index.js +3 -1
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/validate/validate.d.ts +6 -0
  7. package/dist/cjs/validate/validate.d.ts.map +1 -0
  8. package/dist/cjs/validate/validate.js +147 -0
  9. package/dist/cjs/validate/validate.js.map +1 -0
  10. package/dist/esm/index.d.ts +1 -0
  11. package/dist/esm/index.d.ts.map +1 -1
  12. package/dist/esm/index.js +1 -0
  13. package/dist/esm/index.js.map +1 -1
  14. package/dist/esm/validate/validate.d.ts +6 -0
  15. package/dist/esm/validate/validate.d.ts.map +1 -0
  16. package/dist/esm/validate/validate.js +144 -0
  17. package/dist/esm/validate/validate.js.map +1 -0
  18. package/package.json +1 -1
  19. package/dist/actions/action.d.ts +0 -51
  20. package/dist/actions/action.d.ts.map +0 -1
  21. package/dist/actions/action.js +0 -33
  22. package/dist/actions/action.js.map +0 -1
  23. package/dist/actions/actions.test.d.ts +0 -2
  24. package/dist/actions/actions.test.d.ts.map +0 -1
  25. package/dist/actions/actions.test.js +0 -91
  26. package/dist/actions/actions.test.js.map +0 -1
  27. package/dist/cjs/conditions/conditions.d.ts +0 -15
  28. package/dist/cjs/conditions/conditions.d.ts.map +0 -1
  29. package/dist/cjs/conditions/conditions.js +0 -24
  30. package/dist/cjs/conditions/conditions.js.map +0 -1
  31. package/dist/cjs/principals/principals.d.ts +0 -21
  32. package/dist/cjs/principals/principals.d.ts.map +0 -1
  33. package/dist/cjs/principals/principals.js +0 -35
  34. package/dist/cjs/principals/principals.js.map +0 -1
  35. package/dist/conditions/condition.d.ts +0 -16
  36. package/dist/conditions/condition.d.ts.map +0 -1
  37. package/dist/conditions/condition.js +0 -25
  38. package/dist/conditions/condition.js.map +0 -1
  39. package/dist/conditions/conditionOperation.d.ts +0 -31
  40. package/dist/conditions/conditionOperation.d.ts.map +0 -1
  41. package/dist/conditions/conditionOperation.js +0 -31
  42. package/dist/conditions/conditionOperation.js.map +0 -1
  43. package/dist/index.d.ts +0 -9
  44. package/dist/index.d.ts.map +0 -1
  45. package/dist/index.js +0 -6
  46. package/dist/index.js.map +0 -1
  47. package/dist/parser.d.ts +0 -9
  48. package/dist/parser.d.ts.map +0 -1
  49. package/dist/parser.js +0 -14
  50. package/dist/parser.js.map +0 -1
  51. package/dist/policies/policy.d.ts +0 -14
  52. package/dist/policies/policy.d.ts.map +0 -1
  53. package/dist/policies/policy.js +0 -21
  54. package/dist/policies/policy.js.map +0 -1
  55. package/dist/policies/policy.test.d.ts +0 -2
  56. package/dist/policies/policy.test.d.ts.map +0 -1
  57. package/dist/policies/policy.test.js +0 -74
  58. package/dist/policies/policy.test.js.map +0 -1
  59. package/dist/principals/principal.d.ts +0 -21
  60. package/dist/principals/principal.d.ts.map +0 -1
  61. package/dist/principals/principal.js +0 -35
  62. package/dist/principals/principal.js.map +0 -1
  63. package/dist/resources/resource.d.ts +0 -20
  64. package/dist/resources/resource.d.ts.map +0 -1
  65. package/dist/resources/resource.js +0 -18
  66. package/dist/resources/resource.js.map +0 -1
  67. package/dist/resources/resource.test.d.ts +0 -2
  68. package/dist/resources/resource.test.d.ts.map +0 -1
  69. package/dist/resources/resource.test.js +0 -35
  70. package/dist/resources/resource.test.js.map +0 -1
  71. package/dist/statements/statement.d.ts +0 -146
  72. package/dist/statements/statement.d.ts.map +0 -1
  73. package/dist/statements/statement.js +0 -121
  74. package/dist/statements/statement.js.map +0 -1
  75. package/dist/statements/statement.test.d.ts +0 -2
  76. package/dist/statements/statement.test.d.ts.map +0 -1
  77. package/dist/statements/statement.test.js +0 -479
  78. package/dist/statements/statement.test.js.map +0 -1
  79. package/dist/utils.d.ts +0 -8
  80. package/dist/utils.d.ts.map +0 -1
  81. package/dist/utils.js +0 -13
  82. package/dist/utils.js.map +0 -1
package/README.md CHANGED
@@ -1,14 +1,82 @@
1
- # IAM Policy Parser
1
+ # IAM Policy Syntax Validator and Parser
2
2
 
3
- This is a simple IAM policy library that allows you parse and navigate IAM policies without worring about the more difficult details of parsing policies.
3
+ This is a simple IAM policy library that allows you to safely parse and navigate IAM policies without worring about the more difficult details of parsing policies or validating syntax.
4
4
 
5
5
  This may be updated in the future to allow modifying policies, right now it's read-only.
6
6
 
7
- _**This does not validate policies**_, it only parses them. If you pass in totally invalid JSON it will fail in glorious and unpredictable ways.
7
+ ## Validate Policy Syntax with `validatePolicySyntax`
8
+ `validatePolicySyntax` is a syntax linter and will not validate the the policy is logical, secure, or correct.
8
9
 
9
- Here are some ways it helps:
10
+ This will take any object and return back an array of findings. If the array is empty then the policy is valid.
11
+ ```typescript
12
+ import { validatePolicySyntax } from '@cloud-copilot/iam-policy'
13
+
14
+ validatePolicySyntax({
15
+ "Version": "2012-10-17",
16
+ "Statement": [
17
+ {
18
+ "Sid": "VisualEditor0",
19
+ "Effect": "Allow",
20
+ "Action": "s3:GetObject",
21
+ "Resource": "arn:aws:s3:::mybucket/*"
22
+ }
23
+ ]
24
+ }); // []
25
+
26
+ validatePolicySyntax({
27
+ "Version": "2012-10-17",
28
+ "Statement": [
29
+ {
30
+ "Sid": 7,
31
+ "Effect": "Allow",
32
+ "Action": "s3:GetObject",
33
+ "Resource": "arn:aws:s3:::mybucket/*"
34
+ }
35
+ ]
36
+ }); // [{ message: 'Found data type number allowed type(s) are string', path: 'Statement[0].Sid'}]
37
+
38
+
39
+ /* It will attempt to find as many issues as possible in one pass */
40
+ validatePolicySyntax({
41
+ "Version": "2012-10-17",
42
+ "Comment": "Jacob is kewl",
43
+ "Statement": [
44
+ {
45
+ "Sid": "SomeStatement",
46
+ "Effect": 7,
47
+ "Action": "s3:GetObject",
48
+ "Resource": "arn:aws:s3:::mybucket/*"
49
+ }, {
50
+ "Sid": "SomeStatement",
51
+ "Effect": ["Allow"],
52
+ "Action": "s3:GetObject",
53
+ "Resource": "arn:aws:s3:::mybucket/*",
54
+ "Condition": {
55
+ "NumericLessThan": {
56
+ "s3:max-keys": 7,
57
+ },
58
+ "StringLike": {
59
+ "s3:authType": new RegExp(/REST.*/),
60
+ "aws:TagKeys/Foo": ["Bar*", "Baz*"]
61
+ }
62
+ }
63
+ }
64
+ ]
65
+ }); /*
66
+ [
67
+ { message: 'Invalid key Comment', path: 'Comment' },
68
+ { message: 'Effect must be present and exactly "Allow" or "Deny"', path: 'Statement[0].Effect' },
69
+ { message: 'Effect must be present and exactly "Allow" or "Deny"', path: 'Statement[1].Effect' },
70
+ { message: 'Found data type number allowed type(s) are string', path: 'Statement[1].Condition.NumericLessThan s3:max-keys' },
71
+ { message: 'Found data type object allowed type(s) are string', path: 'Statement[1].Condition.StringLike.s3:authType' }
72
+ ]
73
+ */
74
+ ```
75
+
76
+ ## IAM Policy Parsing and Processing with `loadPolicy`
77
+ `loadPolicy` _**does not validate policies**_, if you want validation ahead of time use `validatePolicySyntax`.
10
78
 
11
- ## Normalizing Policy Elements that are Objects/Array of Objects or String/Array of Strings
79
+ ### Normalizes Policy Elements that are Objects/Array of Objects or String/Array of Strings
12
80
  ```typescript
13
81
  import{ loadPolicy } from '@cloud-copilot/iam-policy'
14
82
 
@@ -49,7 +117,7 @@ console.log(p2.statements()[0].sid()); //ObjectStatement
49
117
 
50
118
  There is similar support for condition values, principals, and resources.
51
119
 
52
- ## Mutually Exclusive or Optional Policy Elements
120
+ ### Mutually Exclusive or Optional Policy Elements
53
121
 
54
122
  In IAM policies there are some elements that are mutually exclusive. For example, you can't have a `Principal` and a `NotPrincipal` in the same statement. Some elements are completely optional. We leverage the Typescript type system to make sure you only access data that is confirmed to exist in the policy.
55
123
 
@@ -86,7 +154,7 @@ if(statement.isNotActionStatement()) {
86
154
 
87
155
  There is similar support for `Action`, `NotAction`, `Principal`, `NotPrincipal`, `Resource`, and `NotResource` elements.
88
156
 
89
- ## Flatten Complex Structures
157
+ ### Flatten Complex Structures
90
158
 
91
159
  Simplifies complex elements by flattening them into an array of homogenous objects. For example the Principal value can be a string or an object; the object values can be strings or arrays of strings. We flatten those into an array of objects similar to what you would define in a terraform policy.
92
160
 
@@ -6,4 +6,5 @@ export type { Policy } from './policies/policy.js';
6
6
  export type { Principal, PrincipalType } from './principals/principal.js';
7
7
  export type { Resource } from './resources/resource.js';
8
8
  export type { ActionStatement, NotActionStatement, NotPrincipalStatement, NotResourceStatement, PrincipalStatement, ResourceStatement, Statement } from './statements/statement.js';
9
+ export { validatePolicySyntax, type ValidationError } from './validate/validate.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC5F,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzE,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC5F,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzE,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACnL,OAAO,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAA"}
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadPolicy = void 0;
3
+ exports.validatePolicySyntax = exports.loadPolicy = void 0;
4
4
  var parser_js_1 = require("./parser.js");
5
5
  Object.defineProperty(exports, "loadPolicy", { enumerable: true, get: function () { return parser_js_1.loadPolicy; } });
6
+ var validate_js_1 = require("./validate/validate.js");
7
+ Object.defineProperty(exports, "validatePolicySyntax", { enumerable: true, get: function () { return validate_js_1.validatePolicySyntax; } });
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAGA,yCAAwC;AAA/B,uGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAGA,yCAAwC;AAA/B,uGAAA,UAAU,OAAA;AAKnB,sDAAmF;AAA1E,mHAAA,oBAAoB,OAAA"}
@@ -0,0 +1,6 @@
1
+ export interface ValidationError {
2
+ message: string;
3
+ path: string;
4
+ }
5
+ export declare function validatePolicySyntax(policyDocument: any): ValidationError[];
6
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAOD,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,GAAG,GAAG,eAAe,EAAE,CA4B3E"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePolicySyntax = validatePolicySyntax;
4
+ const allowedPolicyKeys = new Set(['Version', 'Statement', 'Id']);
5
+ const allowedStatementKeys = new Set(['Sid', 'Effect', 'Action', 'NotAction', 'Resource', 'NotResource', 'Principal', 'NotPrincipal', 'Condition']);
6
+ const allowedPrincipalKeys = new Set(['AWS', 'Service', 'Federated', 'CanonicalUser']);
7
+ function validatePolicySyntax(policyDocument) {
8
+ const allErrors = [];
9
+ if (typeof policyDocument !== 'object') {
10
+ return [{ path: '', message: `Policy must be an object, received type ${typeof policyDocument}` }];
11
+ }
12
+ else if (Array.isArray(policyDocument)) {
13
+ return [{ path: '', message: 'Policy must be an object, received an array' }];
14
+ }
15
+ allErrors.push(...validateKeys(policyDocument, allowedPolicyKeys, ''));
16
+ allErrors.push(...validateDataTypeIfExists(policyDocument.Version, 'Version', 'string'));
17
+ allErrors.push(...validateDataTypeIfExists(policyDocument.Id, 'Id', 'string'));
18
+ if (!policyDocument.Statement) {
19
+ allErrors.push({
20
+ path: 'Statement',
21
+ message: 'Statement is required',
22
+ });
23
+ }
24
+ allErrors.push(...validateTypeOrArrayOfTypeIfExists(policyDocument.Statement, 'Statement', ['object']));
25
+ if (typeof policyDocument.Statement === 'object' && !Array.isArray(policyDocument.Statement)) {
26
+ allErrors.push(...validateStatement(policyDocument.Statement, 'Statement'));
27
+ }
28
+ else if (Array.isArray(policyDocument.Statement)) {
29
+ for (let i = 0; i < policyDocument.Statement.length; i++) {
30
+ allErrors.push(...validateStatement(policyDocument.Statement[i], `Statement[${i}]`));
31
+ }
32
+ }
33
+ return allErrors;
34
+ }
35
+ function validateStatement(statement, path) {
36
+ const statementErrors = [];
37
+ statementErrors.push(...validateKeys(statement, allowedStatementKeys, path));
38
+ statementErrors.push(...validateDataTypeIfExists(statement.Sid, `${path}.Sid`, 'string'));
39
+ if (statement.Effect !== 'Allow' && statement.Effect !== 'Deny') {
40
+ statementErrors.push({ path: `${path}.Effect`, message: `Effect must be present and exactly "Allow" or "Deny"` });
41
+ }
42
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.Action, `${path}.Action`, 'string'));
43
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.NotAction, `${path}.NotAction`, 'string'));
44
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.Resource, `${path}.Resource`, 'string'));
45
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.NotResource, `${path}.NotResource`, 'string'));
46
+ statementErrors.push(...validateDataTypeIfExists(statement.Principal, `${path}.Principal`, ['string', 'object']));
47
+ statementErrors.push(...validateDataTypeIfExists(statement.NotPrincipal, `${path}.NotPrincipal`, ['string', 'object']));
48
+ statementErrors.push(...validatePrincipal(statement.Principal, `${path}.Principal`));
49
+ statementErrors.push(...validatePrincipal(statement.NotPrincipal, `${path}.NotPrincipal`));
50
+ statementErrors.push(...validateCondition(statement.Condition, `${path}.Condition`));
51
+ return statementErrors;
52
+ }
53
+ function validatePrincipal(principal, path) {
54
+ const principalErrors = [];
55
+ if (principal === undefined || typeof principal === 'string') {
56
+ return [];
57
+ }
58
+ if (typeof principal === 'object') {
59
+ principalErrors.push(...validateKeys(principal, allowedPrincipalKeys, path));
60
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.AWS, `${path}.AWS`, 'string'));
61
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.Service, `${path}.Service`, 'string'));
62
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.Federated, `${path}.Federated`, 'string'));
63
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.CanonicalUser, `${path}.CanonicalUser`, 'string'));
64
+ }
65
+ return principalErrors;
66
+ }
67
+ function validateCondition(condition, path) {
68
+ const conditionErrors = [];
69
+ if (condition === undefined) {
70
+ return [];
71
+ }
72
+ conditionErrors.push(...validateDataTypeIfExists(condition, path, 'object'));
73
+ if (typeof condition !== 'object') {
74
+ return conditionErrors;
75
+ }
76
+ else if (Array.isArray(condition)) {
77
+ conditionErrors.push({
78
+ message: 'Condition must be an object, found an array',
79
+ path
80
+ });
81
+ return conditionErrors;
82
+ }
83
+ const conditionOperators = Object.keys(condition);
84
+ for (const operator of conditionOperators) {
85
+ conditionErrors.push(...validateDataTypeIfExists(condition[operator], `${path}.${operator}`, 'object'));
86
+ if (Array.isArray(condition[operator])) {
87
+ conditionErrors.push({
88
+ message: 'Condition operator must be an object, found an array',
89
+ path: `${path}.${operator}`
90
+ });
91
+ }
92
+ if (typeof condition[operator] === 'object' && !Array.isArray(condition[operator])) {
93
+ const conditionKeys = Object.keys(condition[operator]);
94
+ for (const key of conditionKeys) {
95
+ conditionErrors.push(...validateTypeOrArrayOfTypeIfExists(condition[operator][key], `${path}.${operator}.${key}`, 'string'));
96
+ }
97
+ }
98
+ }
99
+ return conditionErrors;
100
+ }
101
+ function validateKeys(object, allowedKeys, path) {
102
+ const keyErrors = [];
103
+ if (path != '') {
104
+ path = `${path}.`;
105
+ }
106
+ for (const key of Object.keys(object)) {
107
+ if (!allowedKeys.has(key)) {
108
+ keyErrors.push({
109
+ message: `Invalid key ${key}`,
110
+ path: `${path}${key}`
111
+ });
112
+ }
113
+ }
114
+ return keyErrors;
115
+ }
116
+ function validateTypeOrArrayOfTypeIfExists(value, path, allowedTypes) {
117
+ if (value === undefined) {
118
+ return [];
119
+ }
120
+ allowedTypes = Array.isArray(allowedTypes) ? allowedTypes : [allowedTypes];
121
+ const arrayOfTypeErrors = [];
122
+ if (!Array.isArray(value)) {
123
+ return validateDataTypeIfExists(value, path, allowedTypes);
124
+ }
125
+ else {
126
+ for (let i = 0; i < value.length; i++) {
127
+ arrayOfTypeErrors.push(...validateDataTypeIfExists(value[i], `${path}[${i}]`, allowedTypes));
128
+ }
129
+ }
130
+ return arrayOfTypeErrors;
131
+ }
132
+ function validateDataTypeIfExists(value, path, allowedDataTypes) {
133
+ if (value === undefined) {
134
+ return [];
135
+ }
136
+ allowedDataTypes = Array.isArray(allowedDataTypes) ? allowedDataTypes : [allowedDataTypes];
137
+ const errors = [];
138
+ const foundDataType = typeof value;
139
+ if (!allowedDataTypes.includes(foundDataType)) {
140
+ errors.push({
141
+ message: `Found data type ${foundDataType} allowed type(s) are ${allowedDataTypes.join(', ')}`,
142
+ path
143
+ });
144
+ }
145
+ return errors;
146
+ }
147
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,5 @@ export type { Policy } from './policies/policy.js';
6
6
  export type { Principal, PrincipalType } from './principals/principal.js';
7
7
  export type { Resource } from './resources/resource.js';
8
8
  export type { ActionStatement, NotActionStatement, NotPrincipalStatement, NotResourceStatement, PrincipalStatement, ResourceStatement, Statement } from './statements/statement.js';
9
+ export { validatePolicySyntax, type ValidationError } from './validate/validate.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC5F,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzE,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC5F,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzE,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACnL,OAAO,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAA"}
package/dist/esm/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { loadPolicy } from './parser.js';
2
+ export { validatePolicySyntax } from './validate/validate.js';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAKxC,OAAO,EAAE,oBAAoB,EAAwB,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,6 @@
1
+ export interface ValidationError {
2
+ message: string;
3
+ path: string;
4
+ }
5
+ export declare function validatePolicySyntax(policyDocument: any): ValidationError[];
6
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAOD,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,GAAG,GAAG,eAAe,EAAE,CA4B3E"}
@@ -0,0 +1,144 @@
1
+ const allowedPolicyKeys = new Set(['Version', 'Statement', 'Id']);
2
+ const allowedStatementKeys = new Set(['Sid', 'Effect', 'Action', 'NotAction', 'Resource', 'NotResource', 'Principal', 'NotPrincipal', 'Condition']);
3
+ const allowedPrincipalKeys = new Set(['AWS', 'Service', 'Federated', 'CanonicalUser']);
4
+ export function validatePolicySyntax(policyDocument) {
5
+ const allErrors = [];
6
+ if (typeof policyDocument !== 'object') {
7
+ return [{ path: '', message: `Policy must be an object, received type ${typeof policyDocument}` }];
8
+ }
9
+ else if (Array.isArray(policyDocument)) {
10
+ return [{ path: '', message: 'Policy must be an object, received an array' }];
11
+ }
12
+ allErrors.push(...validateKeys(policyDocument, allowedPolicyKeys, ''));
13
+ allErrors.push(...validateDataTypeIfExists(policyDocument.Version, 'Version', 'string'));
14
+ allErrors.push(...validateDataTypeIfExists(policyDocument.Id, 'Id', 'string'));
15
+ if (!policyDocument.Statement) {
16
+ allErrors.push({
17
+ path: 'Statement',
18
+ message: 'Statement is required',
19
+ });
20
+ }
21
+ allErrors.push(...validateTypeOrArrayOfTypeIfExists(policyDocument.Statement, 'Statement', ['object']));
22
+ if (typeof policyDocument.Statement === 'object' && !Array.isArray(policyDocument.Statement)) {
23
+ allErrors.push(...validateStatement(policyDocument.Statement, 'Statement'));
24
+ }
25
+ else if (Array.isArray(policyDocument.Statement)) {
26
+ for (let i = 0; i < policyDocument.Statement.length; i++) {
27
+ allErrors.push(...validateStatement(policyDocument.Statement[i], `Statement[${i}]`));
28
+ }
29
+ }
30
+ return allErrors;
31
+ }
32
+ function validateStatement(statement, path) {
33
+ const statementErrors = [];
34
+ statementErrors.push(...validateKeys(statement, allowedStatementKeys, path));
35
+ statementErrors.push(...validateDataTypeIfExists(statement.Sid, `${path}.Sid`, 'string'));
36
+ if (statement.Effect !== 'Allow' && statement.Effect !== 'Deny') {
37
+ statementErrors.push({ path: `${path}.Effect`, message: `Effect must be present and exactly "Allow" or "Deny"` });
38
+ }
39
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.Action, `${path}.Action`, 'string'));
40
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.NotAction, `${path}.NotAction`, 'string'));
41
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.Resource, `${path}.Resource`, 'string'));
42
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.NotResource, `${path}.NotResource`, 'string'));
43
+ statementErrors.push(...validateDataTypeIfExists(statement.Principal, `${path}.Principal`, ['string', 'object']));
44
+ statementErrors.push(...validateDataTypeIfExists(statement.NotPrincipal, `${path}.NotPrincipal`, ['string', 'object']));
45
+ statementErrors.push(...validatePrincipal(statement.Principal, `${path}.Principal`));
46
+ statementErrors.push(...validatePrincipal(statement.NotPrincipal, `${path}.NotPrincipal`));
47
+ statementErrors.push(...validateCondition(statement.Condition, `${path}.Condition`));
48
+ return statementErrors;
49
+ }
50
+ function validatePrincipal(principal, path) {
51
+ const principalErrors = [];
52
+ if (principal === undefined || typeof principal === 'string') {
53
+ return [];
54
+ }
55
+ if (typeof principal === 'object') {
56
+ principalErrors.push(...validateKeys(principal, allowedPrincipalKeys, path));
57
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.AWS, `${path}.AWS`, 'string'));
58
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.Service, `${path}.Service`, 'string'));
59
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.Federated, `${path}.Federated`, 'string'));
60
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.CanonicalUser, `${path}.CanonicalUser`, 'string'));
61
+ }
62
+ return principalErrors;
63
+ }
64
+ function validateCondition(condition, path) {
65
+ const conditionErrors = [];
66
+ if (condition === undefined) {
67
+ return [];
68
+ }
69
+ conditionErrors.push(...validateDataTypeIfExists(condition, path, 'object'));
70
+ if (typeof condition !== 'object') {
71
+ return conditionErrors;
72
+ }
73
+ else if (Array.isArray(condition)) {
74
+ conditionErrors.push({
75
+ message: 'Condition must be an object, found an array',
76
+ path
77
+ });
78
+ return conditionErrors;
79
+ }
80
+ const conditionOperators = Object.keys(condition);
81
+ for (const operator of conditionOperators) {
82
+ conditionErrors.push(...validateDataTypeIfExists(condition[operator], `${path}.${operator}`, 'object'));
83
+ if (Array.isArray(condition[operator])) {
84
+ conditionErrors.push({
85
+ message: 'Condition operator must be an object, found an array',
86
+ path: `${path}.${operator}`
87
+ });
88
+ }
89
+ if (typeof condition[operator] === 'object' && !Array.isArray(condition[operator])) {
90
+ const conditionKeys = Object.keys(condition[operator]);
91
+ for (const key of conditionKeys) {
92
+ conditionErrors.push(...validateTypeOrArrayOfTypeIfExists(condition[operator][key], `${path}.${operator}.${key}`, 'string'));
93
+ }
94
+ }
95
+ }
96
+ return conditionErrors;
97
+ }
98
+ function validateKeys(object, allowedKeys, path) {
99
+ const keyErrors = [];
100
+ if (path != '') {
101
+ path = `${path}.`;
102
+ }
103
+ for (const key of Object.keys(object)) {
104
+ if (!allowedKeys.has(key)) {
105
+ keyErrors.push({
106
+ message: `Invalid key ${key}`,
107
+ path: `${path}${key}`
108
+ });
109
+ }
110
+ }
111
+ return keyErrors;
112
+ }
113
+ function validateTypeOrArrayOfTypeIfExists(value, path, allowedTypes) {
114
+ if (value === undefined) {
115
+ return [];
116
+ }
117
+ allowedTypes = Array.isArray(allowedTypes) ? allowedTypes : [allowedTypes];
118
+ const arrayOfTypeErrors = [];
119
+ if (!Array.isArray(value)) {
120
+ return validateDataTypeIfExists(value, path, allowedTypes);
121
+ }
122
+ else {
123
+ for (let i = 0; i < value.length; i++) {
124
+ arrayOfTypeErrors.push(...validateDataTypeIfExists(value[i], `${path}[${i}]`, allowedTypes));
125
+ }
126
+ }
127
+ return arrayOfTypeErrors;
128
+ }
129
+ function validateDataTypeIfExists(value, path, allowedDataTypes) {
130
+ if (value === undefined) {
131
+ return [];
132
+ }
133
+ allowedDataTypes = Array.isArray(allowedDataTypes) ? allowedDataTypes : [allowedDataTypes];
134
+ const errors = [];
135
+ const foundDataType = typeof value;
136
+ if (!allowedDataTypes.includes(foundDataType)) {
137
+ errors.push({
138
+ message: `Found data type ${foundDataType} allowed type(s) are ${allowedDataTypes.join(', ')}`,
139
+ path
140
+ });
141
+ }
142
+ return errors;
143
+ }
144
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloud-copilot/iam-policy",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "An ORM for AWS IAM policies",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,51 +0,0 @@
1
- export type ActionType = 'service' | 'wildcard';
2
- /**
3
- * An Action string in an IAM policy
4
- */
5
- export interface Action {
6
- /**
7
- * The type of actions
8
- */
9
- type(): ActionType;
10
- /**
11
- * The raw string of the action
12
- */
13
- value(): string;
14
- /**
15
- * Whether the action is a wildcard action: `"*"`
16
- */
17
- isWildcardAction(): boolean;
18
- /**
19
- * Whether the action is a service action: `"service:Action"`
20
- */
21
- isServiceAction(): boolean;
22
- }
23
- /**
24
- * A wildcard action: `"*"`
25
- */
26
- export interface WildcardAction extends Action {
27
- }
28
- /**
29
- * A service action: `"service:Action"`
30
- */
31
- export interface ServiceAction extends Action {
32
- /**
33
- * The service of the action
34
- */
35
- service(): string;
36
- /**
37
- * The action within the service
38
- */
39
- action(): string;
40
- }
41
- export declare class ActionImpl implements Action, WildcardAction, ServiceAction {
42
- private readonly rawValue;
43
- constructor(rawValue: string);
44
- type(): ActionType;
45
- value(): string;
46
- isWildcardAction(): this is WildcardAction;
47
- isServiceAction(): this is ServiceAction;
48
- service(): string;
49
- action(): string;
50
- }
51
- //# sourceMappingURL=action.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/actions/action.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;AAE/C;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,IAAI,IAAI,UAAU,CAAA;IAElB;;OAEG;IACH,KAAK,IAAI,MAAM,CAAA;IAEf;;OAEG;IACH,gBAAgB,IAAI,OAAO,CAAA;IAE3B;;OAEG;IACH,eAAe,IAAI,OAAO,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,MAAM;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,MAAM;IAC3C;;OAEG;IACH,OAAO,IAAI,MAAM,CAAA;IAEjB;;OAEG;IACH,MAAM,IAAI,MAAM,CAAA;CACjB;AAED,qBAAa,UAAW,YAAW,MAAM,EAAG,cAAc,EAAE,aAAa;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAEtC,IAAI,IAAI,UAAU;IAOlB,KAAK,IAAI,MAAM;IAIf,gBAAgB,IAAI,IAAI,IAAI,cAAc;IAI1C,eAAe,IAAI,IAAI,IAAI,aAAa;IAIxC,OAAO,IAAI,MAAM;IAIjB,MAAM,IAAI,MAAM;CAGxB"}
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ActionImpl = void 0;
4
- const utils_js_1 = require("../utils.js");
5
- class ActionImpl {
6
- rawValue;
7
- constructor(rawValue) {
8
- this.rawValue = rawValue;
9
- }
10
- type() {
11
- if ((0, utils_js_1.isAllWildcards)(this.rawValue)) {
12
- return 'wildcard';
13
- }
14
- return 'service';
15
- }
16
- value() {
17
- return this.rawValue;
18
- }
19
- isWildcardAction() {
20
- return this.type() === 'wildcard';
21
- }
22
- isServiceAction() {
23
- return this.type() === 'service';
24
- }
25
- service() {
26
- return this.rawValue.split(':')[0];
27
- }
28
- action() {
29
- return this.rawValue.split(':')[1];
30
- }
31
- }
32
- exports.ActionImpl = ActionImpl;
33
- //# sourceMappingURL=action.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/actions/action.ts"],"names":[],"mappings":";;;AAAA,0CAA4C;AAkD5C,MAAa,UAAU;IACQ;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAE1C,IAAI;QACT,IAAG,IAAA,yBAAc,EAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAO,UAAU,CAAA;QACnB,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAEM,KAAK;QACV,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAEM,gBAAgB;QACrB,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,CAAA;IACnC,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,CAAA;IAClC,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;IAEM,MAAM;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;CACF;AA7BD,gCA6BC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=actions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"actions.test.d.ts","sourceRoot":"","sources":["../../src/actions/actions.test.ts"],"names":[],"mappings":""}