@actsecurity/iam-policy 0.1.109

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 (125) hide show
  1. package/LICENSE.txt +661 -0
  2. package/README.md +244 -0
  3. package/dist/cjs/actions/action.d.ts +68 -0
  4. package/dist/cjs/actions/action.d.ts.map +1 -0
  5. package/dist/cjs/actions/action.js +41 -0
  6. package/dist/cjs/actions/action.js.map +1 -0
  7. package/dist/cjs/conditions/condition.d.ts +62 -0
  8. package/dist/cjs/conditions/condition.d.ts.map +1 -0
  9. package/dist/cjs/conditions/condition.js +43 -0
  10. package/dist/cjs/conditions/condition.js.map +1 -0
  11. package/dist/cjs/conditions/conditionOperation.d.ts +31 -0
  12. package/dist/cjs/conditions/conditionOperation.d.ts.map +1 -0
  13. package/dist/cjs/conditions/conditionOperation.js +39 -0
  14. package/dist/cjs/conditions/conditionOperation.js.map +1 -0
  15. package/dist/cjs/index.d.ts +13 -0
  16. package/dist/cjs/index.d.ts.map +1 -0
  17. package/dist/cjs/index.js +22 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/lint/lint.d.ts +41 -0
  20. package/dist/cjs/lint/lint.d.ts.map +1 -0
  21. package/dist/cjs/lint/lint.js +190 -0
  22. package/dist/cjs/lint/lint.js.map +1 -0
  23. package/dist/cjs/package.json +3 -0
  24. package/dist/cjs/parser.d.ts +13 -0
  25. package/dist/cjs/parser.d.ts.map +1 -0
  26. package/dist/cjs/parser.js +22 -0
  27. package/dist/cjs/parser.js.map +1 -0
  28. package/dist/cjs/policies/policy.d.ts +41 -0
  29. package/dist/cjs/policies/policy.d.ts.map +1 -0
  30. package/dist/cjs/policies/policy.js +40 -0
  31. package/dist/cjs/policies/policy.js.map +1 -0
  32. package/dist/cjs/principals/principal.d.ts +122 -0
  33. package/dist/cjs/principals/principal.d.ts.map +1 -0
  34. package/dist/cjs/principals/principal.js +101 -0
  35. package/dist/cjs/principals/principal.js.map +1 -0
  36. package/dist/cjs/resources/resource.d.ts +60 -0
  37. package/dist/cjs/resources/resource.d.ts.map +1 -0
  38. package/dist/cjs/resources/resource.js +56 -0
  39. package/dist/cjs/resources/resource.js.map +1 -0
  40. package/dist/cjs/statements/statement.d.ts +227 -0
  41. package/dist/cjs/statements/statement.d.ts.map +1 -0
  42. package/dist/cjs/statements/statement.js +236 -0
  43. package/dist/cjs/statements/statement.js.map +1 -0
  44. package/dist/cjs/utils.d.ts +55 -0
  45. package/dist/cjs/utils.d.ts.map +1 -0
  46. package/dist/cjs/utils.js +100 -0
  47. package/dist/cjs/utils.js.map +1 -0
  48. package/dist/cjs/validate/testutil.d.ts +3 -0
  49. package/dist/cjs/validate/testutil.d.ts.map +1 -0
  50. package/dist/cjs/validate/testutil.js +21 -0
  51. package/dist/cjs/validate/testutil.js.map +1 -0
  52. package/dist/cjs/validate/validate.d.ts +16 -0
  53. package/dist/cjs/validate/validate.d.ts.map +1 -0
  54. package/dist/cjs/validate/validate.js +361 -0
  55. package/dist/cjs/validate/validate.js.map +1 -0
  56. package/dist/cjs/validate/validateTypes.d.ts +53 -0
  57. package/dist/cjs/validate/validateTypes.d.ts.map +1 -0
  58. package/dist/cjs/validate/validateTypes.js +224 -0
  59. package/dist/cjs/validate/validateTypes.js.map +1 -0
  60. package/dist/cjs/validatedPolicy.d.ts +40 -0
  61. package/dist/cjs/validatedPolicy.d.ts.map +1 -0
  62. package/dist/cjs/validatedPolicy.js +30 -0
  63. package/dist/cjs/validatedPolicy.js.map +1 -0
  64. package/dist/esm/actions/action.d.ts +68 -0
  65. package/dist/esm/actions/action.d.ts.map +1 -0
  66. package/dist/esm/actions/action.js +35 -0
  67. package/dist/esm/actions/action.js.map +1 -0
  68. package/dist/esm/conditions/condition.d.ts +62 -0
  69. package/dist/esm/conditions/condition.d.ts.map +1 -0
  70. package/dist/esm/conditions/condition.js +35 -0
  71. package/dist/esm/conditions/condition.js.map +1 -0
  72. package/dist/esm/conditions/conditionOperation.d.ts +31 -0
  73. package/dist/esm/conditions/conditionOperation.d.ts.map +1 -0
  74. package/dist/esm/conditions/conditionOperation.js +34 -0
  75. package/dist/esm/conditions/conditionOperation.js.map +1 -0
  76. package/dist/esm/index.d.ts +13 -0
  77. package/dist/esm/index.d.ts.map +1 -0
  78. package/dist/esm/index.js +6 -0
  79. package/dist/esm/index.js.map +1 -0
  80. package/dist/esm/lint/lint.d.ts +41 -0
  81. package/dist/esm/lint/lint.d.ts.map +1 -0
  82. package/dist/esm/lint/lint.js +184 -0
  83. package/dist/esm/lint/lint.js.map +1 -0
  84. package/dist/esm/package.json +3 -0
  85. package/dist/esm/parser.d.ts +13 -0
  86. package/dist/esm/parser.d.ts.map +1 -0
  87. package/dist/esm/parser.js +19 -0
  88. package/dist/esm/parser.js.map +1 -0
  89. package/dist/esm/policies/policy.d.ts +41 -0
  90. package/dist/esm/policies/policy.d.ts.map +1 -0
  91. package/dist/esm/policies/policy.js +34 -0
  92. package/dist/esm/policies/policy.js.map +1 -0
  93. package/dist/esm/principals/principal.d.ts +122 -0
  94. package/dist/esm/principals/principal.d.ts.map +1 -0
  95. package/dist/esm/principals/principal.js +95 -0
  96. package/dist/esm/principals/principal.js.map +1 -0
  97. package/dist/esm/resources/resource.d.ts +60 -0
  98. package/dist/esm/resources/resource.d.ts.map +1 -0
  99. package/dist/esm/resources/resource.js +50 -0
  100. package/dist/esm/resources/resource.js.map +1 -0
  101. package/dist/esm/statements/statement.d.ts +227 -0
  102. package/dist/esm/statements/statement.d.ts.map +1 -0
  103. package/dist/esm/statements/statement.js +229 -0
  104. package/dist/esm/statements/statement.js.map +1 -0
  105. package/dist/esm/utils.d.ts +55 -0
  106. package/dist/esm/utils.d.ts.map +1 -0
  107. package/dist/esm/utils.js +92 -0
  108. package/dist/esm/utils.js.map +1 -0
  109. package/dist/esm/validate/testutil.d.ts +3 -0
  110. package/dist/esm/validate/testutil.d.ts.map +1 -0
  111. package/dist/esm/validate/testutil.js +19 -0
  112. package/dist/esm/validate/testutil.js.map +1 -0
  113. package/dist/esm/validate/validate.d.ts +16 -0
  114. package/dist/esm/validate/validate.d.ts.map +1 -0
  115. package/dist/esm/validate/validate.js +358 -0
  116. package/dist/esm/validate/validate.js.map +1 -0
  117. package/dist/esm/validate/validateTypes.d.ts +53 -0
  118. package/dist/esm/validate/validateTypes.d.ts.map +1 -0
  119. package/dist/esm/validate/validateTypes.js +215 -0
  120. package/dist/esm/validate/validateTypes.js.map +1 -0
  121. package/dist/esm/validatedPolicy.d.ts +40 -0
  122. package/dist/esm/validatedPolicy.d.ts.map +1 -0
  123. package/dist/esm/validatedPolicy.js +26 -0
  124. package/dist/esm/validatedPolicy.js.map +1 -0
  125. package/package.json +114 -0
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Checks if a string is all wildcards(*)
3
+ *
4
+ * @param value The value to check if it is a wildcard
5
+ * @returns True if the value is all wildcards, false otherwise
6
+ */
7
+ export function isAllWildcards(value) {
8
+ return value.match(/^\*+$/) !== null;
9
+ }
10
+ /**
11
+ * Returns the segment at the requested zero-based index without allocating an
12
+ * array for every segment in the value.
13
+ *
14
+ * @param value - the delimited string to read from
15
+ * @param delimiter - the delimiter that separates segments
16
+ * @param segmentIndex - the zero-based segment index to return
17
+ * @returns the requested segment, or undefined when the index is not present
18
+ */
19
+ export function delimitedSegmentAt(value, delimiter, segmentIndex) {
20
+ let segmentStart = 0;
21
+ for (let currentIndex = 0; currentIndex < segmentIndex; currentIndex++) {
22
+ const delimiterIndex = value.indexOf(delimiter, segmentStart);
23
+ if (delimiterIndex === -1) {
24
+ return undefined;
25
+ }
26
+ segmentStart = delimiterIndex + delimiter.length;
27
+ }
28
+ const segmentEnd = value.indexOf(delimiter, segmentStart);
29
+ if (segmentEnd === -1) {
30
+ return value.slice(segmentStart);
31
+ }
32
+ return value.slice(segmentStart, segmentEnd);
33
+ }
34
+ /**
35
+ * Returns the last segment of a delimited string without allocating an array for
36
+ * all preceding segments.
37
+ *
38
+ * @param value - the delimited string to read from
39
+ * @param delimiter - the delimiter that separates segments
40
+ * @returns the final segment after the last delimiter, or the whole value if no delimiter exists
41
+ */
42
+ export function lastDelimitedSegment(value, delimiter) {
43
+ const delimiterIndex = value.lastIndexOf(delimiter);
44
+ if (delimiterIndex === -1) {
45
+ return value;
46
+ }
47
+ return value.slice(delimiterIndex + delimiter.length);
48
+ }
49
+ /**
50
+ * Returns the remainder of a delimited string starting at the requested
51
+ * zero-based segment index.
52
+ *
53
+ * @param value - the delimited string to read from
54
+ * @param delimiter - the delimiter that separates segments
55
+ * @param segmentIndex - the zero-based segment index where the remainder starts
56
+ * @returns the substring starting at the requested segment, or undefined when the segment is not present
57
+ */
58
+ export function delimitedSegmentRemainder(value, delimiter, segmentIndex) {
59
+ let segmentStart = 0;
60
+ for (let currentIndex = 0; currentIndex < segmentIndex; currentIndex++) {
61
+ const delimiterIndex = value.indexOf(delimiter, segmentStart);
62
+ if (delimiterIndex === -1) {
63
+ return undefined;
64
+ }
65
+ segmentStart = delimiterIndex + delimiter.length;
66
+ }
67
+ return value.slice(segmentStart);
68
+ }
69
+ const caseInsensitiveCompareOptions = { sensitivity: 'accent' };
70
+ /**
71
+ * Compares two strings without case sensitivity and without lowercasing either
72
+ * value first.
73
+ *
74
+ * @param first - the first string to compare
75
+ * @param second - the second string to compare
76
+ * @returns true when both strings match case-insensitively
77
+ */
78
+ export function caseInsensitiveEquals(first, second) {
79
+ return first.localeCompare(second, undefined, caseInsensitiveCompareOptions) === 0;
80
+ }
81
+ /**
82
+ * Checks whether a value ends with a suffix without case sensitivity and
83
+ * without lowercasing the value first.
84
+ *
85
+ * @param value - the value to check
86
+ * @param suffix - the suffix to compare against the end of the value
87
+ * @returns true when the value ends with the suffix case-insensitively
88
+ */
89
+ export function caseInsensitiveEndsWith(value, suffix) {
90
+ return caseInsensitiveEquals(value.slice(suffix.length * -1), suffix);
91
+ }
92
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;AACtC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,SAAiB,EACjB,YAAoB;IAEpB,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC;QACvE,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QAC7D,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC,MAAM,CAAA;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IACzD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,SAAiB;IACnE,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IACnD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;AACvD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,SAAiB,EACjB,YAAoB;IAEpB,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC;QACvE,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QAC7D,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC,MAAM,CAAA;IAClD,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,6BAA6B,GAAyB,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA;AAErF;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,MAAc;IACjE,OAAO,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,6BAA6B,CAAC,KAAK,CAAC,CAAA;AACpF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,MAAc;IACnE,OAAO,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AACvE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ValidationError } from './validate.js';
2
+ export declare function sortErrors(errors: ValidationError[]): ValidationError[];
3
+ //# sourceMappingURL=testutil.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testutil.d.ts","sourceRoot":"","sources":["../../../src/validate/testutil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAcvE"}
@@ -0,0 +1,19 @@
1
+ import {} from './validate.js';
2
+ export function sortErrors(errors) {
3
+ return errors.sort((a, b) => {
4
+ if (a.path < b.path) {
5
+ return -1;
6
+ }
7
+ else if (a.path > b.path) {
8
+ return 1;
9
+ }
10
+ else if (a.message < b.message) {
11
+ return -1;
12
+ }
13
+ else if (a.message > b.message) {
14
+ return 1;
15
+ }
16
+ return 0;
17
+ });
18
+ }
19
+ //# sourceMappingURL=testutil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testutil.js","sourceRoot":"","sources":["../../../src/validate/testutil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,MAAM,eAAe,CAAA;AAEpD,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,CAAA;QACX,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,CAAA;QACV,CAAC;aAAM,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,CAAC,CAAA;QACX,CAAC;aAAM,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,CAAA;QACV,CAAC;QAED,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ValidationError {
2
+ message: string;
3
+ path: string;
4
+ }
5
+ export interface ValidationCallbacks {
6
+ validateVersion?: (version: any, path: string) => ValidationError[];
7
+ validateStatement?: (statement: any, path: string) => ValidationError[];
8
+ validateAction?: (action: string, path: string) => ValidationError[];
9
+ validateNotAction?: (notAction: string, path: string) => ValidationError[];
10
+ validatePrincipal?: (principal: any, path: string) => ValidationError[];
11
+ validateNotPrincipal?: (notPrincipal: any, path: string) => ValidationError[];
12
+ validateResource?: (resource: string, path: string) => ValidationError[];
13
+ validateNotResource?: (notResource: string, path: string) => ValidationError[];
14
+ }
15
+ export declare function validatePolicySyntax(policyDocument: any, validationCallbacks?: ValidationCallbacks): ValidationError[];
16
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/validate/validate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAsCD,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,eAAe,EAAE,CAAA;IACnE,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,eAAe,EAAE,CAAA;IACvE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,eAAe,EAAE,CAAA;IACpE,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,eAAe,EAAE,CAAA;IAC1E,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,eAAe,EAAE,CAAA;IACvE,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,eAAe,EAAE,CAAA;IAC7E,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,eAAe,EAAE,CAAA;IACxE,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,eAAe,EAAE,CAAA;CAC/E;AAED,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,GAAG,EACnB,mBAAmB,GAAE,mBAAwB,GAC5C,eAAe,EAAE,CAuCnB"}
@@ -0,0 +1,358 @@
1
+ import { caseInsensitiveEquals, delimitedSegmentAt } from '../utils.js';
2
+ const serviceRegex = /^[a-zA-Z0-9-]+$/;
3
+ const actionRegex = /^[a-zA-Z0-9*\?, \-]+$/;
4
+ const allowedPolicyKeys = new Set(['Version', 'Statement', 'Id']);
5
+ const allowedStatementKeys = new Set([
6
+ 'Sid',
7
+ 'Effect',
8
+ 'Action',
9
+ 'NotAction',
10
+ 'Resource',
11
+ 'NotResource',
12
+ 'Principal',
13
+ 'NotPrincipal',
14
+ 'Condition'
15
+ ]);
16
+ const allowedPrincipalKeys = new Set(['AWS', 'Service', 'Federated', 'CanonicalUser']);
17
+ const validConditionOperatorPattern = /^[a-zA-Z0-9:]+$/;
18
+ const allowedSetOperators = ['ForAllValues', 'ForAnyValue'];
19
+ /**
20
+ * Checks whether a condition set operator is one of the IAM set operator names,
21
+ * ignoring case without normalizing the candidate string first.
22
+ *
23
+ * @param setOperator - the condition set operator to check
24
+ * @returns true when the set operator is allowed
25
+ */
26
+ function isAllowedSetOperator(setOperator) {
27
+ for (const allowedSetOperator of allowedSetOperators) {
28
+ if (caseInsensitiveEquals(setOperator, allowedSetOperator)) {
29
+ return true;
30
+ }
31
+ }
32
+ return false;
33
+ }
34
+ export function validatePolicySyntax(policyDocument, validationCallbacks = {}) {
35
+ const allErrors = [];
36
+ if (typeof policyDocument !== 'object') {
37
+ return [
38
+ { path: '', message: `Policy must be an object, received type ${typeof policyDocument}` }
39
+ ];
40
+ }
41
+ else if (Array.isArray(policyDocument)) {
42
+ return [{ path: '', message: 'Policy must be an object, received an array' }];
43
+ }
44
+ allErrors.push(...validateKeys(policyDocument, allowedPolicyKeys, ''));
45
+ if (validationCallbacks.validateVersion) {
46
+ allErrors.push(...validationCallbacks.validateVersion(policyDocument.Version, ''));
47
+ }
48
+ else {
49
+ allErrors.push(...validatePolicyVersion(policyDocument.Version));
50
+ }
51
+ allErrors.push(...validateDataTypeIfExists(policyDocument.Id, 'Id', 'string'));
52
+ if (!policyDocument.Statement) {
53
+ allErrors.push({
54
+ path: '',
55
+ message: 'Statement is required'
56
+ });
57
+ }
58
+ allErrors.push(...validateTypeOrArrayOfTypeIfExists(policyDocument.Statement, 'Statement', ['object']));
59
+ if (typeof policyDocument.Statement === 'object' && !Array.isArray(policyDocument.Statement)) {
60
+ allErrors.push(...validateStatement(policyDocument.Statement, 'Statement', validationCallbacks));
61
+ }
62
+ else if (Array.isArray(policyDocument.Statement)) {
63
+ for (let i = 0; i < policyDocument.Statement.length; i++) {
64
+ allErrors.push(...validateStatement(policyDocument.Statement[i], `Statement[${i}]`, validationCallbacks));
65
+ }
66
+ }
67
+ return allErrors;
68
+ }
69
+ function validatePolicyVersion(version) {
70
+ if (version === undefined || version === null) {
71
+ return [];
72
+ }
73
+ if (typeof version !== 'string') {
74
+ return [
75
+ {
76
+ path: 'Version',
77
+ message: `Version must be a string if present`
78
+ }
79
+ ];
80
+ }
81
+ if (version === '2012-10-17' || version === '2008-10-17') {
82
+ return [];
83
+ }
84
+ return [
85
+ {
86
+ path: 'Version',
87
+ message: `Version must be either "2012-10-17" or "2008-10-17"`
88
+ }
89
+ ];
90
+ }
91
+ function validateStatement(statement, path, validationCallbacks) {
92
+ const statementErrors = [];
93
+ statementErrors.push(...validateKeys(statement, allowedStatementKeys, path));
94
+ statementErrors.push(...validateDataTypeIfExists(statement.Sid, `${path}.Sid`, 'string'));
95
+ if (!statement.Effect) {
96
+ statementErrors.push({
97
+ path: `${path}`,
98
+ message: `Effect must be present and exactly "Allow" or "Deny"`
99
+ });
100
+ }
101
+ else if (statement.Effect !== 'Allow' && statement.Effect !== 'Deny') {
102
+ statementErrors.push({
103
+ path: `${path}.Effect`,
104
+ message: `Effect must be present and exactly "Allow" or "Deny"`
105
+ });
106
+ }
107
+ statementErrors.push(...(validationCallbacks.validateStatement?.(statement, path) || []));
108
+ statementErrors.push(...validateOnlyOneOf(statement, path, 'Action', 'NotAction'));
109
+ statementErrors.push(...validateOnlyOneOf(statement, path, 'Resource', 'NotResource'));
110
+ statementErrors.push(...validateOnlyOneOf(statement, path, 'Principal', 'NotPrincipal'));
111
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.Action, `${path}.Action`, 'string'));
112
+ statementErrors.push(...validateTypeOrArrayOfTypeIfExists(statement.NotAction, `${path}.NotAction`, 'string'));
113
+ statementErrors.push(...validateActionIfPresent(statement.Action, `${path}.Action`));
114
+ statementErrors.push(...validateActionIfPresent(statement.NotAction, `${path}.NotAction`));
115
+ statementErrors.push(...validateStringOrArrayStringCallback(statement, 'Action', path, validationCallbacks.validateAction));
116
+ statementErrors.push(...validateStringOrArrayStringCallback(statement, 'NotAction', path, validationCallbacks.validateNotAction));
117
+ statementErrors.push(...validateResource(statement.Resource, `${path}.Resource`));
118
+ statementErrors.push(...validateResource(statement.NotResource, `${path}.NotResource`));
119
+ statementErrors.push(...validateDataTypeIfExists(statement.Principal, `${path}.Principal`, ['string', 'object']));
120
+ statementErrors.push(...validateDataTypeIfExists(statement.NotPrincipal, `${path}.NotPrincipal`, [
121
+ 'string',
122
+ 'object'
123
+ ]));
124
+ statementErrors.push(...validatePrincipal(statement.Principal, `${path}.Principal`));
125
+ statementErrors.push(...validatePrincipal(statement.NotPrincipal, `${path}.NotPrincipal`));
126
+ //TODO: If the condition key exists but there is no value, it is an error
127
+ statementErrors.push(...validateCondition(statement.Condition, `${path}.Condition`));
128
+ return statementErrors;
129
+ }
130
+ function validatePrincipal(principal, path) {
131
+ const principalErrors = [];
132
+ if (principal === undefined || typeof principal === 'string') {
133
+ return [];
134
+ }
135
+ if (typeof principal === 'object') {
136
+ principalErrors.push(...validateKeys(principal, allowedPrincipalKeys, path));
137
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.AWS, `${path}.AWS`, 'string'));
138
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.Service, `${path}.Service`, 'string'));
139
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.Federated, `${path}.Federated`, 'string'));
140
+ principalErrors.push(...validateTypeOrArrayOfTypeIfExists(principal.CanonicalUser, `${path}.CanonicalUser`, 'string'));
141
+ }
142
+ return principalErrors;
143
+ }
144
+ function validateResource(resource, path) {
145
+ if (resource === undefined) {
146
+ return [];
147
+ }
148
+ if (typeof resource === 'string') {
149
+ return [];
150
+ }
151
+ else if (Array.isArray(resource)) {
152
+ const validationErrors = [];
153
+ for (let i = 0; i < resource.length; i++) {
154
+ if (typeof resource[i] !== 'string') {
155
+ validationErrors.push({
156
+ message: `Resource must be a string or array of strings, found type ${typeof resource[i]}`,
157
+ path: `${path}[${i}]`
158
+ });
159
+ }
160
+ }
161
+ return validationErrors;
162
+ }
163
+ return [
164
+ {
165
+ path,
166
+ message: `Must be a string or array of strings`
167
+ }
168
+ ];
169
+ }
170
+ function validateActionIfPresent(action, path) {
171
+ if (action === undefined || action === null) {
172
+ return [];
173
+ }
174
+ //Type errors are caught elsewhere
175
+ if (typeof action === 'string') {
176
+ return validateActionString(action, path);
177
+ }
178
+ else if (Array.isArray(action)) {
179
+ const actionErrors = [];
180
+ for (let i = 0; i < action.length; i++) {
181
+ const value = action[i];
182
+ if (typeof value === 'string') {
183
+ actionErrors.push(...validateActionString(action[i], `${path}[${i}]`));
184
+ }
185
+ }
186
+ return actionErrors;
187
+ }
188
+ return [];
189
+ }
190
+ function validateActionString(string, path) {
191
+ if (string === '*') {
192
+ return [];
193
+ }
194
+ const trimmedString = string.trim();
195
+ const firstColonIndex = trimmedString.indexOf(':');
196
+ if (firstColonIndex === -1 || trimmedString.indexOf(':', firstColonIndex + 1) !== -1) {
197
+ return [
198
+ {
199
+ path,
200
+ message: `Action must be a wildcard (*) or have 2 segments`
201
+ }
202
+ ];
203
+ }
204
+ const service = trimmedString.slice(0, firstColonIndex);
205
+ const action = trimmedString.slice(firstColonIndex + 1);
206
+ const errors = [];
207
+ if (!serviceRegex.test(service)) {
208
+ errors.push({
209
+ path,
210
+ message: `Service can only contain letters, numbers, and hyphens`
211
+ });
212
+ }
213
+ if (action.length > 0 && !actionRegex.test(action)) {
214
+ errors.push({
215
+ path,
216
+ message: `Action can only contain letters, numbers, asterisks, question marks, commas, hyphens, and spaces`
217
+ });
218
+ }
219
+ return errors;
220
+ }
221
+ function validateCondition(condition, path) {
222
+ const conditionErrors = [];
223
+ if (condition === undefined || condition === null) {
224
+ return [];
225
+ }
226
+ conditionErrors.push(...validateDataTypeIfExists(condition, path, 'object'));
227
+ if (typeof condition !== 'object') {
228
+ return conditionErrors;
229
+ }
230
+ else if (Array.isArray(condition)) {
231
+ conditionErrors.push({
232
+ message: 'Condition must be an object, found an array',
233
+ path
234
+ });
235
+ return conditionErrors;
236
+ }
237
+ const conditionOperators = Object.keys(condition);
238
+ for (const operator of conditionOperators) {
239
+ //If not valid pattern
240
+ if (!validConditionOperatorPattern.test(operator)) {
241
+ conditionErrors.push({
242
+ path: `${path}.#${operator}`,
243
+ message: `Condition operator is invalid`
244
+ });
245
+ }
246
+ const firstColonIndex = operator.indexOf(':');
247
+ if (firstColonIndex !== -1 && operator.indexOf(':', firstColonIndex + 1) !== -1) {
248
+ conditionErrors.push({
249
+ path: `${path}.#${operator}`,
250
+ message: `Condition operator is invalid`
251
+ });
252
+ }
253
+ else if (firstColonIndex !== -1) {
254
+ const setOperator = delimitedSegmentAt(operator, ':', 0);
255
+ if (!isAllowedSetOperator(setOperator)) {
256
+ conditionErrors.push({
257
+ path: `${path}.#${operator}`,
258
+ message: `Condition set operator must be either ForAllValues or ForAnyValue`
259
+ });
260
+ }
261
+ }
262
+ conditionErrors.push(...validateDataTypeIfExists(condition[operator], `${path}.${operator}`, 'object'));
263
+ if (Array.isArray(condition[operator])) {
264
+ conditionErrors.push({
265
+ message: 'Condition operator must be an object, found an array',
266
+ path: `${path}.${operator}`
267
+ });
268
+ }
269
+ if (typeof condition[operator] === 'object' && !Array.isArray(condition[operator])) {
270
+ const conditionKeys = Object.keys(condition[operator]);
271
+ for (const key of conditionKeys) {
272
+ conditionErrors.push(...validateTypeOrArrayOfTypeIfExists(condition[operator][key], `${path}.${operator}.${key}`, ['string', 'boolean', 'number']));
273
+ }
274
+ }
275
+ }
276
+ return conditionErrors;
277
+ }
278
+ function validateKeys(object, allowedKeys, path) {
279
+ const keyErrors = [];
280
+ for (const key of Object.keys(object)) {
281
+ if (!allowedKeys.has(key)) {
282
+ keyErrors.push({
283
+ message: `Invalid key ${key}`,
284
+ path: `${path}.#${key}`
285
+ });
286
+ }
287
+ else if (object[key] === undefined || object[key] === null) {
288
+ keyErrors.push({
289
+ message: `If present, ${key} cannot be null or undefined`,
290
+ path: `${path}.${key}`
291
+ });
292
+ }
293
+ }
294
+ return keyErrors;
295
+ }
296
+ function validateTypeOrArrayOfTypeIfExists(value, path, allowedTypes) {
297
+ if (value === undefined) {
298
+ return [];
299
+ }
300
+ allowedTypes = Array.isArray(allowedTypes) ? allowedTypes : [allowedTypes];
301
+ const arrayOfTypeErrors = [];
302
+ if (!Array.isArray(value)) {
303
+ return validateDataTypeIfExists(value, path, allowedTypes);
304
+ }
305
+ else {
306
+ for (let i = 0; i < value.length; i++) {
307
+ arrayOfTypeErrors.push(...validateDataTypeIfExists(value[i], `${path}[${i}]`, allowedTypes));
308
+ }
309
+ }
310
+ return arrayOfTypeErrors;
311
+ }
312
+ function validateDataTypeIfExists(value, path, allowedDataTypes) {
313
+ if (value === undefined) {
314
+ return [];
315
+ }
316
+ allowedDataTypes = Array.isArray(allowedDataTypes) ? allowedDataTypes : [allowedDataTypes];
317
+ const errors = [];
318
+ const foundDataType = typeof value;
319
+ if (!allowedDataTypes.includes(foundDataType)) {
320
+ errors.push({
321
+ message: `Found data type ${foundDataType} allowed type(s) are ${allowedDataTypes.join(', ')}`,
322
+ path
323
+ });
324
+ }
325
+ return errors;
326
+ }
327
+ function validateOnlyOneOf(value, path, firstKey, secondKey) {
328
+ const keys = Object.keys(value);
329
+ if (keys.includes(firstKey) && keys.includes(secondKey)) {
330
+ return [
331
+ {
332
+ message: `Only one of ${firstKey} or ${secondKey} is allowed, found both`,
333
+ path
334
+ }
335
+ ];
336
+ }
337
+ return [];
338
+ }
339
+ function validateStringOrArrayStringCallback(statement, fieldName, path, callback) {
340
+ if (statement === undefined || !statement[fieldName] || !callback) {
341
+ return [];
342
+ }
343
+ const value = statement[fieldName];
344
+ path = `${path}.${fieldName}`;
345
+ if (typeof value === 'string') {
346
+ return callback(value, path);
347
+ }
348
+ else if (Array.isArray(value)) {
349
+ const errors = [];
350
+ for (let i = 0; i < value.length; i++) {
351
+ errors.push(...callback(value[i], `${path}[${i}]`));
352
+ }
353
+ return errors;
354
+ }
355
+ //If it's not a string or string array that is caught elsewhere
356
+ return [];
357
+ }
358
+ //# 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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"}
@@ -0,0 +1,53 @@
1
+ import { type ValidationError } from './validate.js';
2
+ /**
3
+ * Validates an Identity Policy attached to an IAM role or user, or managed policy
4
+ *
5
+ * @param policy the policy to validate
6
+ * @returns an array of validation errors
7
+ */
8
+ export declare function validateIdentityPolicy(policy: any): ValidationError[];
9
+ /**
10
+ * Validates a Service Control Policy (SCP)
11
+ *
12
+ * @param policy the policy to validate
13
+ * @returns an array of validation errors
14
+ */
15
+ export declare function validateServiceControlPolicy(policy: any): ValidationError[];
16
+ /**
17
+ * Validates a Resource Policy attached to an S3 bucket, SQS queue, or other resource. \
18
+ *
19
+ * This is very generic and will not be able to validate all resource policies.
20
+ *
21
+ * @param policy the policy to validate
22
+ * @returns an array of validation errors
23
+ */
24
+ export declare function validateResourcePolicy(policy: any): ValidationError[];
25
+ /**
26
+ * Validates a Resource Control Policy (RCP)
27
+ *
28
+ * @param policy the policy to validate
29
+ * @returns an array of validation errors
30
+ */
31
+ export declare function validateResourceControlPolicy(policy: any): ValidationError[];
32
+ /**
33
+ * Validates a Trust Policy attached to a role
34
+ *
35
+ * @param policy the policy to validate
36
+ * @returns an array of validation errors
37
+ */
38
+ export declare function validateTrustPolicy(policy: any): ValidationError[];
39
+ /**
40
+ * Validates an VPC Endpoint Policy
41
+ *
42
+ * @param policy the policy to validate
43
+ * @returns an array of validation errors
44
+ */
45
+ export declare function validateEndpointPolicy(policy: any): ValidationError[];
46
+ /**
47
+ * Validates a session policy
48
+ *
49
+ * @param policy the policy to validate
50
+ * @returns an array of validation errors
51
+ */
52
+ export declare function validateSessionPolicy(policy: any): ValidationError[];
53
+ //# sourceMappingURL=validateTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateTypes.d.ts","sourceRoot":"","sources":["../../../src/validate/validateTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAE1E;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,eAAe,EAAE,CAarE;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,GAAG,GAAG,eAAe,EAAE,CAe3E;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,eAAe,EAAE,CASrE;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,GAAG,GAAG,eAAe,EAAE,CAoD5E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,eAAe,EAAE,CAelE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,eAAe,EAAE,CAkBrE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,eAAe,EAAE,CAapE"}