@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,41 @@
1
+ import { type ValidationCallbacks, type ValidationError } from '../validate/validate.js';
2
+ /**
3
+ * Lints an IAM policy document by running all syntax validation checks from
4
+ * {@link validatePolicySyntax} plus additional best-practice checks that AWS
5
+ * technically allows but that may indicate authoring mistakes.
6
+ *
7
+ * @param policyDocument - the raw policy document object to lint
8
+ * @param validationCallbacks - optional callbacks to customize validation behavior per policy type
9
+ * @returns an array of validation errors including both syntax errors and lint warnings
10
+ */
11
+ export declare function lintPolicy(policyDocument: any, validationCallbacks?: ValidationCallbacks): ValidationError[];
12
+ /**
13
+ * Lints a resource policy document. Runs the resource-policy syntax validation
14
+ * plus the generic lint rules and the resource-policy-specific check for
15
+ * statements missing both `Principal` and `NotPrincipal`. AWS accepts such
16
+ * statements syntactically, but they can never match a request.
17
+ *
18
+ * @param policyDocument - the raw resource policy document to lint
19
+ * @returns an array of validation errors including syntax errors and lint warnings
20
+ */
21
+ export declare function lintResourcePolicy(policyDocument: any): ValidationError[];
22
+ /**
23
+ * Finds actions in a policy document that have the format "service:" — a
24
+ * service prefix followed by a colon but no action name. AWS allows this
25
+ * but it likely indicates an authoring mistake.
26
+ *
27
+ * @param policyDocument - the raw policy document object to check
28
+ * @returns an array of validation errors, one for each action that has an empty action part
29
+ */
30
+ export declare function findEmptyActions(policyDocument: any): ValidationError[];
31
+ /**
32
+ * Finds duplicate Statement Ids (Sid) within a policy document.
33
+ *
34
+ * AWS allows duplicate Sids in resource policies, but they can indicate
35
+ * copy-paste mistakes or authoring errors.
36
+ *
37
+ * @param policyDocument - the raw policy document object to check
38
+ * @returns an array of validation errors, one for each statement that shares a duplicate Sid
39
+ */
40
+ export declare function findDuplicateSids(policyDocument: any): ValidationError[];
41
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../../src/lint/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAA;AAGhC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,cAAc,EAAE,GAAG,EACnB,mBAAmB,GAAE,mBAAwB,GAC5C,eAAe,EAAE,CAKnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,GAAG,GAAG,eAAe,EAAE,CAMzE;AAiFD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,GAAG,GAAG,eAAe,EAAE,CAoCvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,GAAG,GAAG,eAAe,EAAE,CA8BxE"}
@@ -0,0 +1,184 @@
1
+ import { validatePolicySyntax } from '../validate/validate.js';
2
+ import { validateResourcePolicy } from '../validate/validateTypes.js';
3
+ /**
4
+ * Lints an IAM policy document by running all syntax validation checks from
5
+ * {@link validatePolicySyntax} plus additional best-practice checks that AWS
6
+ * technically allows but that may indicate authoring mistakes.
7
+ *
8
+ * @param policyDocument - the raw policy document object to lint
9
+ * @param validationCallbacks - optional callbacks to customize validation behavior per policy type
10
+ * @returns an array of validation errors including both syntax errors and lint warnings
11
+ */
12
+ export function lintPolicy(policyDocument, validationCallbacks = {}) {
13
+ const allErrors = validatePolicySyntax(policyDocument, validationCallbacks);
14
+ allErrors.push(...findDuplicateSids(policyDocument));
15
+ allErrors.push(...findEmptyActions(policyDocument));
16
+ return allErrors;
17
+ }
18
+ /**
19
+ * Lints a resource policy document. Runs the resource-policy syntax validation
20
+ * plus the generic lint rules and the resource-policy-specific check for
21
+ * statements missing both `Principal` and `NotPrincipal`. AWS accepts such
22
+ * statements syntactically, but they can never match a request.
23
+ *
24
+ * @param policyDocument - the raw resource policy document to lint
25
+ * @returns an array of validation errors including syntax errors and lint warnings
26
+ */
27
+ export function lintResourcePolicy(policyDocument) {
28
+ const errors = validateResourcePolicy(policyDocument);
29
+ errors.push(...findDuplicateSids(policyDocument));
30
+ errors.push(...findEmptyActions(policyDocument));
31
+ errors.push(...findStatementsWithoutPrincipal(policyDocument));
32
+ return errors;
33
+ }
34
+ /**
35
+ * Finds statements in a resource policy that have neither a `Principal` nor a
36
+ * `NotPrincipal` element. AWS accepts these syntactically but they can never
37
+ * match a request, which is almost always an authoring mistake.
38
+ *
39
+ * @param policyDocument - the raw resource policy document to check
40
+ * @returns an array of validation errors, one for each statement missing both Principal and NotPrincipal
41
+ */
42
+ function findStatementsWithoutPrincipal(policyDocument) {
43
+ if (typeof policyDocument !== 'object' || policyDocument === null) {
44
+ return [];
45
+ }
46
+ const rawStatements = policyDocument.Statement;
47
+ if (rawStatements === undefined) {
48
+ return [];
49
+ }
50
+ const statements = Array.isArray(rawStatements) ? rawStatements : [rawStatements];
51
+ const isArray = Array.isArray(rawStatements);
52
+ const errors = [];
53
+ for (let i = 0; i < statements.length; i++) {
54
+ const statement = statements[i];
55
+ if (typeof statement !== 'object' || statement === null) {
56
+ continue;
57
+ }
58
+ if (statement.Principal === undefined && statement.NotPrincipal === undefined) {
59
+ errors.push({
60
+ path: isArray ? `Statement[${i}]` : 'Statement',
61
+ message: 'One of Principal or NotPrincipal is required in a resource policy'
62
+ });
63
+ }
64
+ }
65
+ return errors;
66
+ }
67
+ /**
68
+ * Checks a single action string for issues with the action part after the
69
+ * colon. Flags two cases:
70
+ * - Empty or whitespace-only action (e.g. "s3:" or "s3: ")
71
+ * - Action containing whitespace (e.g. "s3:GetObject " or "s3: GetObject")
72
+ *
73
+ * AWS technically allows these, but they almost always indicate authoring
74
+ * mistakes.
75
+ *
76
+ * @param action - the raw action string value
77
+ * @param path - the JSON-path location of this action in the policy document
78
+ * @returns an array of validation errors for any issues found
79
+ */
80
+ function lintActionString(action, path) {
81
+ if (typeof action !== 'string') {
82
+ return [];
83
+ }
84
+ const colonIndex = action.indexOf(':');
85
+ if (colonIndex === -1 || action.indexOf(':', colonIndex + 1) !== -1) {
86
+ return [];
87
+ }
88
+ const actionName = action.slice(colonIndex + 1);
89
+ if (actionName.trim().length === 0) {
90
+ return [
91
+ {
92
+ path,
93
+ message: 'Action is empty for the service'
94
+ }
95
+ ];
96
+ }
97
+ if (actionName !== actionName.trim()) {
98
+ return [
99
+ {
100
+ path,
101
+ message: 'Action contains whitespace'
102
+ }
103
+ ];
104
+ }
105
+ return [];
106
+ }
107
+ /**
108
+ * Finds actions in a policy document that have the format "service:" — a
109
+ * service prefix followed by a colon but no action name. AWS allows this
110
+ * but it likely indicates an authoring mistake.
111
+ *
112
+ * @param policyDocument - the raw policy document object to check
113
+ * @returns an array of validation errors, one for each action that has an empty action part
114
+ */
115
+ export function findEmptyActions(policyDocument) {
116
+ if (typeof policyDocument !== 'object' || policyDocument === null) {
117
+ return [];
118
+ }
119
+ const statements = Array.isArray(policyDocument.Statement)
120
+ ? policyDocument.Statement
121
+ : policyDocument.Statement !== undefined
122
+ ? [policyDocument.Statement]
123
+ : [];
124
+ const errors = [];
125
+ for (let i = 0; i < statements.length; i++) {
126
+ const statement = statements[i];
127
+ if (typeof statement !== 'object' || statement === null) {
128
+ continue;
129
+ }
130
+ const basePath = Array.isArray(policyDocument.Statement) ? `Statement[${i}]` : 'Statement';
131
+ for (const field of ['Action', 'NotAction']) {
132
+ const value = statement[field];
133
+ if (value === undefined) {
134
+ continue;
135
+ }
136
+ const fieldPath = `${basePath}.${field}`;
137
+ if (typeof value === 'string') {
138
+ errors.push(...lintActionString(value, fieldPath));
139
+ }
140
+ else if (Array.isArray(value)) {
141
+ for (let j = 0; j < value.length; j++) {
142
+ errors.push(...lintActionString(value[j], `${fieldPath}[${j}]`));
143
+ }
144
+ }
145
+ }
146
+ }
147
+ return errors;
148
+ }
149
+ /**
150
+ * Finds duplicate Statement Ids (Sid) within a policy document.
151
+ *
152
+ * AWS allows duplicate Sids in resource policies, but they can indicate
153
+ * copy-paste mistakes or authoring errors.
154
+ *
155
+ * @param policyDocument - the raw policy document object to check
156
+ * @returns an array of validation errors, one for each statement that shares a duplicate Sid
157
+ */
158
+ export function findDuplicateSids(policyDocument) {
159
+ if (typeof policyDocument !== 'object' || !Array.isArray(policyDocument?.Statement)) {
160
+ return [];
161
+ }
162
+ const statementIdCounts = policyDocument.Statement.reduce((acc, statement, index) => {
163
+ if (statement.Sid) {
164
+ if (!acc[statement.Sid]) {
165
+ acc[statement.Sid] = [];
166
+ }
167
+ acc[statement.Sid].push(`Statement[${index}].Sid`);
168
+ }
169
+ return acc;
170
+ }, {});
171
+ const errors = [];
172
+ for (const [, paths] of Object.entries(statementIdCounts)) {
173
+ if (paths.length > 1) {
174
+ for (const path of paths) {
175
+ errors.push({
176
+ path,
177
+ message: `Statement Ids (Sid) must be unique`
178
+ });
179
+ }
180
+ }
181
+ }
182
+ return errors;
183
+ }
184
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/lint/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,13 @@
1
+ import { type Policy } from './policies/policy.js';
2
+ /**
3
+ * Load a Policy from a policy document. If a {@link ValidatedPolicy} is passed,
4
+ * the raw document and metadata are extracted from it automatically. When both
5
+ * the ValidatedPolicy carries metadata and the caller supplies explicit metadata,
6
+ * the explicit metadata takes precedence.
7
+ *
8
+ * @param policyDocument the policy document JSON object, or a ValidatedPolicy
9
+ * @param metadata optional metadata to attach to the loaded Policy
10
+ * @returns the Policy object for the backing policy document
11
+ */
12
+ export declare function loadPolicy<T = undefined>(policyDocument: any, metadata?: T): Policy<T>;
13
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,sBAAsB,CAAA;AAG9D;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAKtF"}
@@ -0,0 +1,19 @@
1
+ import { PolicyImpl } from './policies/policy.js';
2
+ import { isValidatedPolicy } from './validatedPolicy.js';
3
+ /**
4
+ * Load a Policy from a policy document. If a {@link ValidatedPolicy} is passed,
5
+ * the raw document and metadata are extracted from it automatically. When both
6
+ * the ValidatedPolicy carries metadata and the caller supplies explicit metadata,
7
+ * the explicit metadata takes precedence.
8
+ *
9
+ * @param policyDocument the policy document JSON object, or a ValidatedPolicy
10
+ * @param metadata optional metadata to attach to the loaded Policy
11
+ * @returns the Policy object for the backing policy document
12
+ */
13
+ export function loadPolicy(policyDocument, metadata) {
14
+ if (isValidatedPolicy(policyDocument)) {
15
+ return new PolicyImpl(policyDocument.policyDocument, metadata ?? policyDocument.metadata);
16
+ }
17
+ return new PolicyImpl(policyDocument, metadata);
18
+ }
19
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAgB,cAAmB,EAAE,QAAY;IACzE,IAAI,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,UAAU,CAAC,cAAc,CAAC,cAAc,EAAE,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAA;IAC3F,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;AACjD,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type Statement } from '../statements/statement.js';
2
+ export interface Policy<T = undefined> {
3
+ /**
4
+ * The version of the policy
5
+ */
6
+ version(): string | undefined;
7
+ /**
8
+ * The ID of the policy
9
+ */
10
+ id(): string | undefined;
11
+ /**
12
+ * The statements in the policy
13
+ */
14
+ statements(): Statement[];
15
+ /**
16
+ * Whether the statement is an array
17
+ */
18
+ statementIsArray(): boolean;
19
+ /**
20
+ * The raw policy object as JSON
21
+ */
22
+ toJSON(): any;
23
+ /**
24
+ * Metadata is any object to store additional information about the policy.
25
+ * Up to you as a user to define the type of the metadata and is optional.
26
+ */
27
+ metadata(): T;
28
+ }
29
+ export declare class PolicyImpl<T = undefined> implements Policy<T> {
30
+ private readonly policyObject;
31
+ private readonly theMetadata?;
32
+ constructor(policyObject: any, theMetadata?: T | undefined);
33
+ version(): string | undefined;
34
+ id(): string | undefined;
35
+ statements(): Statement[];
36
+ private newStatements;
37
+ statementIsArray(): boolean;
38
+ toJSON(): any;
39
+ metadata(): T;
40
+ }
41
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/policies/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,4BAA4B,CAAA;AAE1E,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,SAAS;IACnC;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,SAAS,CAAA;IAE7B;;OAEG;IACH,EAAE,IAAI,MAAM,GAAG,SAAS,CAAA;IAExB;;OAEG;IACH,UAAU,IAAI,SAAS,EAAE,CAAA;IAEzB;;OAEG;IACH,gBAAgB,IAAI,OAAO,CAAA;IAE3B;;OAEG;IACH,MAAM,IAAI,GAAG,CAAA;IAEb;;;OAGG;IACH,QAAQ,IAAI,CAAC,CAAA;CACd;AAED,qBAAa,UAAU,CAAC,CAAC,GAAG,SAAS,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAEvD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBADZ,YAAY,EAAE,GAAG,EACjB,WAAW,CAAC,EAAE,CAAC,YAAA;IAG3B,OAAO,IAAI,MAAM,GAAG,SAAS;IAI7B,EAAE,IAAI,MAAM,GAAG,SAAS;IAIxB,UAAU,IAAI,SAAS,EAAE;IAIhC,OAAO,CAAC,aAAa;IASd,gBAAgB,IAAI,OAAO;IAI3B,MAAM,IAAI,GAAG;IAIb,QAAQ,IAAI,CAAC;CAGrB"}
@@ -0,0 +1,34 @@
1
+ import { StatementImpl } from '../statements/statement.js';
2
+ export class PolicyImpl {
3
+ constructor(policyObject, theMetadata) {
4
+ this.policyObject = policyObject;
5
+ this.theMetadata = theMetadata;
6
+ }
7
+ version() {
8
+ return this.policyObject.Version;
9
+ }
10
+ id() {
11
+ return this.policyObject.Id;
12
+ }
13
+ statements() {
14
+ return this.newStatements();
15
+ }
16
+ newStatements() {
17
+ if (!this.statementIsArray()) {
18
+ return [new StatementImpl(this.policyObject.Statement, 1, { path: 'Statement' })];
19
+ }
20
+ return [this.policyObject.Statement].flat().map((statement, index) => {
21
+ return new StatementImpl(statement, index + 1, { path: `Statement[${index}]` });
22
+ });
23
+ }
24
+ statementIsArray() {
25
+ return Array.isArray(this.policyObject.Statement);
26
+ }
27
+ toJSON() {
28
+ return this.policyObject;
29
+ }
30
+ metadata() {
31
+ return this.theMetadata;
32
+ }
33
+ }
34
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/policies/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAmC1E,MAAM,OAAO,UAAU;IACrB,YACmB,YAAiB,EACjB,WAAe;QADf,iBAAY,GAAZ,YAAY,CAAK;QACjB,gBAAW,GAAX,WAAW,CAAI;IAC/B,CAAC;IAEG,OAAO;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAA;IAClC,CAAC;IAEM,EAAE;QACP,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,CAAA;IAC7B,CAAC;IAEM,UAAU;QACf,OAAO,IAAI,CAAC,aAAa,EAAE,CAAA;IAC7B,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QACnF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,KAAK,EAAE,EAAE;YACxE,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,KAAK,GAAG,EAAE,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,gBAAgB;QACrB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAEM,MAAM;QACX,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,WAAgB,CAAA;IAC9B,CAAC;CACF"}
@@ -0,0 +1,122 @@
1
+ export type PrincipalType = 'AWS' | 'Service' | 'Federated' | 'CanonicalUser';
2
+ /**
3
+ * A Principal in a policy statement
4
+ */
5
+ export interface Principal {
6
+ /**
7
+ * The type of principal, such as "AWS", "Service", "Federated", "CanonicalUser"
8
+ */
9
+ type(): PrincipalType;
10
+ /**
11
+ * The raw string of the principal
12
+ */
13
+ value(): string;
14
+ /**
15
+ * Whether the principal is a wildcard principal: `"*"`
16
+ */
17
+ isWildcardPrincipal(): this is WildcardPrincipal;
18
+ /**
19
+ * Whether the principal is an AWS principal
20
+ */
21
+ isServicePrincipal(): this is ServicePrincipal;
22
+ /**
23
+ * Whether the principal is an AWS principal that is not an account or wildcard principal
24
+ */
25
+ isAwsPrincipal(): this is AwsPrincipal;
26
+ /**
27
+ * Whether the principal is a unique id principal
28
+ */
29
+ isUniqueIdPrincipal(): this is UniqueIdPrincipal;
30
+ /**
31
+ * Whether the principal is a federated principal
32
+ */
33
+ isFederatedPrincipal(): this is FederatedPrincipal;
34
+ /**
35
+ * Whether the principal is a canonical user principal
36
+ */
37
+ isCanonicalUserPrincipal(): this is CanonicalUserPrincipal;
38
+ /**
39
+ * Whether the principal is an account principal
40
+ */
41
+ isAccountPrincipal(): this is AccountPrincipal;
42
+ }
43
+ /**
44
+ * A wildcard principal: `"*"`
45
+ */
46
+ export interface WildcardPrincipal extends Principal {
47
+ /**
48
+ * The wildcard character `"*"`, this exists to differentiate between this interface and the Principal interface
49
+ */
50
+ wildcard(): '*';
51
+ }
52
+ /**
53
+ * An AWS principal: `"arn:aws:iam::account-id:root"` or a 12 digit account id
54
+ */
55
+ export interface AccountPrincipal extends Principal {
56
+ /**
57
+ * The 12 digit account id of the principal
58
+ */
59
+ accountId(): string;
60
+ }
61
+ /**
62
+ * An AWS principal this is an ARN that is not an account or wildcard principal
63
+ */
64
+ export interface AwsPrincipal extends Principal {
65
+ arn(): string;
66
+ }
67
+ /**
68
+ * An AWS principal that is a unique Id
69
+ * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids
70
+ */
71
+ export interface UniqueIdPrincipal extends Principal {
72
+ uniqueId(): string;
73
+ }
74
+ /**
75
+ * An AWS principal that is a service principal: `"service"`
76
+ */
77
+ export interface ServicePrincipal extends Principal {
78
+ /**
79
+ * The service the principal represents
80
+ */
81
+ service(): string;
82
+ }
83
+ /**
84
+ * A federated principal
85
+ */
86
+ export interface FederatedPrincipal extends Principal {
87
+ /**
88
+ * The id of the federated principal
89
+ */
90
+ federated(): string;
91
+ }
92
+ /**
93
+ * A canonical user principal
94
+ */
95
+ export interface CanonicalUserPrincipal extends Principal {
96
+ /**
97
+ * The canonical user id of the principal
98
+ */
99
+ canonicalUser(): string;
100
+ }
101
+ export declare class PrincipalImpl implements Principal, WildcardPrincipal, AccountPrincipal, UniqueIdPrincipal, AwsPrincipal, ServicePrincipal, FederatedPrincipal, CanonicalUserPrincipal {
102
+ private readonly principalType;
103
+ private readonly principalId;
104
+ constructor(principalType: PrincipalType, principalId: string);
105
+ value(): string;
106
+ type(): PrincipalType;
107
+ isWildcardPrincipal(): this is WildcardPrincipal;
108
+ isAccountPrincipal(): this is AccountPrincipal;
109
+ isUniqueIdPrincipal(): this is UniqueIdPrincipal;
110
+ isAwsPrincipal(): this is AwsPrincipal;
111
+ isServicePrincipal(): this is ServicePrincipal;
112
+ isFederatedPrincipal(): this is FederatedPrincipal;
113
+ isCanonicalUserPrincipal(): this is CanonicalUserPrincipal;
114
+ wildcard(): '*';
115
+ accountId(): string;
116
+ uniqueId(): string;
117
+ arn(): string;
118
+ service(): string;
119
+ federated(): string;
120
+ canonicalUser(): string;
121
+ }
122
+ //# sourceMappingURL=principal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"principal.d.ts","sourceRoot":"","sources":["../../../src/principals/principal.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,CAAA;AAE7E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,IAAI,IAAI,aAAa,CAAA;IAErB;;OAEG;IACH,KAAK,IAAI,MAAM,CAAA;IAEf;;OAEG;IACH,mBAAmB,IAAI,IAAI,IAAI,iBAAiB,CAAA;IAEhD;;OAEG;IACH,kBAAkB,IAAI,IAAI,IAAI,gBAAgB,CAAA;IAE9C;;OAEG;IACH,cAAc,IAAI,IAAI,IAAI,YAAY,CAAA;IAEtC;;OAEG;IACH,mBAAmB,IAAI,IAAI,IAAI,iBAAiB,CAAA;IAEhD;;OAEG;IACH,oBAAoB,IAAI,IAAI,IAAI,kBAAkB,CAAA;IAElD;;OAEG;IACH,wBAAwB,IAAI,IAAI,IAAI,sBAAsB,CAAA;IAE1D;;OAEG;IACH,kBAAkB,IAAI,IAAI,IAAI,gBAAgB,CAAA;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD;;OAEG;IACH,QAAQ,IAAI,GAAG,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD;;OAEG;IACH,SAAS,IAAI,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,GAAG,IAAI,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,QAAQ,IAAI,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD;;OAEG;IACH,OAAO,IAAI,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD;;OAEG;IACH,SAAS,IAAI,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,SAAS;IACvD;;OAEG;IACH,aAAa,IAAI,MAAM,CAAA;CACxB;AAMD,qBAAa,aACX,YACE,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB;IAGtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,MAAM;IAG/B,KAAK,IAAI,MAAM;IAIf,IAAI,IAAI,aAAa;IAIrB,mBAAmB,IAAI,IAAI,IAAI,iBAAiB;IAIhD,kBAAkB,IAAI,IAAI,IAAI,gBAAgB;IAO9C,mBAAmB,IAAI,IAAI,IAAI,iBAAiB;IAOhD,cAAc,IAAI,IAAI,IAAI,YAAY;IAYtC,kBAAkB,IAAI,IAAI,IAAI,gBAAgB;IAI9C,oBAAoB,IAAI,IAAI,IAAI,kBAAkB;IAIlD,wBAAwB,IAAI,IAAI,IAAI,sBAAsB;IAI1D,QAAQ,IAAI,GAAG;IASf,SAAS,IAAI,MAAM;IAYnB,QAAQ,IAAI,MAAM;IASlB,GAAG,IAAI,MAAM;IASb,OAAO,IAAI,MAAM;IASjB,SAAS,IAAI,MAAM;IASnB,aAAa,IAAI,MAAM;CAQ/B"}
@@ -0,0 +1,95 @@
1
+ import { delimitedSegmentAt, isAllWildcards } from '../utils.js';
2
+ const accountIdRegex = /^[0-9]{12}$/;
3
+ const accountArnRegex = /^arn:.*?:iam::[0-9]{12}:root$/;
4
+ const uniqueIdRegex = /^A[0-9A-Z]+$/;
5
+ export class PrincipalImpl {
6
+ constructor(principalType, principalId) {
7
+ this.principalType = principalType;
8
+ this.principalId = principalId;
9
+ }
10
+ value() {
11
+ return this.principalId;
12
+ }
13
+ type() {
14
+ return this.principalType;
15
+ }
16
+ isWildcardPrincipal() {
17
+ return this.principalType === 'AWS' && isAllWildcards(this.principalId);
18
+ }
19
+ isAccountPrincipal() {
20
+ if (this.principalType !== 'AWS') {
21
+ return false;
22
+ }
23
+ return accountIdRegex.test(this.principalId) || accountArnRegex.test(this.principalId);
24
+ }
25
+ isUniqueIdPrincipal() {
26
+ if (this.principalType !== 'AWS') {
27
+ return false;
28
+ }
29
+ return uniqueIdRegex.test(this.principalId);
30
+ }
31
+ isAwsPrincipal() {
32
+ if (this.principalType !== 'AWS') {
33
+ return false;
34
+ }
35
+ const anyThis = this;
36
+ return (!isAllWildcards(anyThis.principalId) &&
37
+ !anyThis.isAccountPrincipal() &&
38
+ !anyThis.isUniqueIdPrincipal());
39
+ }
40
+ isServicePrincipal() {
41
+ return this.principalType === 'Service';
42
+ }
43
+ isFederatedPrincipal() {
44
+ return this.principalType === 'Federated';
45
+ }
46
+ isCanonicalUserPrincipal() {
47
+ return this.principalType === 'CanonicalUser';
48
+ }
49
+ wildcard() {
50
+ if (!this.isWildcardPrincipal()) {
51
+ throw new Error('Principal is not a wildcard principal, call isWildcardPrincipal() before calling wildcard()');
52
+ }
53
+ return '*';
54
+ }
55
+ accountId() {
56
+ if (!this.isAccountPrincipal()) {
57
+ throw new Error('Principal is not an account principal, call isAccountPrincipal() before calling accountId()');
58
+ }
59
+ if (accountArnRegex.test(this.principalId)) {
60
+ return delimitedSegmentAt(this.principalId, ':', 4);
61
+ }
62
+ return this.principalId;
63
+ }
64
+ uniqueId() {
65
+ if (!this.isUniqueIdPrincipal()) {
66
+ throw new Error('Principal is not a unique id principal, call isUniqueIdPrincipal() before calling uniqueId()');
67
+ }
68
+ return this.principalId;
69
+ }
70
+ arn() {
71
+ if (!this.isAwsPrincipal()) {
72
+ throw new Error('Principal is not an AWS principal, call isAwsPrincipal() before calling arn()');
73
+ }
74
+ return this.principalId;
75
+ }
76
+ service() {
77
+ if (!this.isServicePrincipal()) {
78
+ throw new Error('Principal is not a service principal, call isServicePrincipal() before calling service()');
79
+ }
80
+ return this.principalId;
81
+ }
82
+ federated() {
83
+ if (this.principalType !== 'Federated') {
84
+ throw new Error('Principal is not a federated principal, call isFederatedPrincipal() before calling federated()');
85
+ }
86
+ return this.principalId;
87
+ }
88
+ canonicalUser() {
89
+ if (this.principalType !== 'CanonicalUser') {
90
+ throw new Error('Principal is not a canonical user principal, call isCanonicalUserPrincipal() before calling canonicalUser()');
91
+ }
92
+ return this.principalId;
93
+ }
94
+ }
95
+ //# sourceMappingURL=principal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"principal.js","sourceRoot":"","sources":["../../../src/principals/principal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * A resource string in an IAM policy
3
+ */
4
+ export interface Resource {
5
+ /**
6
+ * The raw string of the resource
7
+ */
8
+ value(): string;
9
+ /**
10
+ * Whether the resource is all resources: `"*"`
11
+ */
12
+ isAllResources(): boolean;
13
+ /**
14
+ * Whether the resource is an ARN resource
15
+ */
16
+ isArnResource(): this is ArnResource;
17
+ /**
18
+ * The path to the resource in the policy document
19
+ */
20
+ path(): string;
21
+ }
22
+ export interface ArnResource extends Resource {
23
+ /**
24
+ * The partition of the ARN
25
+ */
26
+ partition(): string;
27
+ /**
28
+ * The service of the ARN
29
+ */
30
+ service(): string;
31
+ /**
32
+ * The region of the ARN
33
+ */
34
+ region(): string;
35
+ /**
36
+ * The account of the ARN
37
+ */
38
+ account(): string;
39
+ /**
40
+ * The resource of the ARN
41
+ */
42
+ resource(): string;
43
+ }
44
+ export declare class ResourceImpl implements Resource, ArnResource {
45
+ private readonly rawValue;
46
+ private readonly otherProps;
47
+ constructor(rawValue: string, otherProps: {
48
+ path: string;
49
+ });
50
+ path(): string;
51
+ partition(): string;
52
+ service(): string;
53
+ region(): string;
54
+ account(): string;
55
+ resource(): string;
56
+ value(): string;
57
+ isAllResources(): boolean;
58
+ isArnResource(): this is ArnResource;
59
+ }
60
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../src/resources/resource.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,KAAK,IAAI,MAAM,CAAA;IAEf;;OAEG;IACH,cAAc,IAAI,OAAO,CAAA;IAEzB;;OAEG;IACH,aAAa,IAAI,IAAI,IAAI,WAAW,CAAA;IAEpC;;OAEG;IACH,IAAI,IAAI,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C;;OAEG;IACH,SAAS,IAAI,MAAM,CAAA;IAEnB;;OAEG;IACH,OAAO,IAAI,MAAM,CAAA;IAEjB;;OAEG;IACH,MAAM,IAAI,MAAM,CAAA;IAEhB;;OAEG;IACH,OAAO,IAAI,MAAM,CAAA;IAEjB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAA;CACnB;AAED,qBAAa,YAAa,YAAW,QAAQ,EAAE,WAAW;IAEtD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAA;KACb;IAGH,IAAI,IAAI,MAAM;IAId,SAAS,IAAI,MAAM;IASnB,OAAO,IAAI,MAAM;IASjB,MAAM,IAAI,MAAM;IAShB,OAAO,IAAI,MAAM;IASjB,QAAQ,IAAI,MAAM;IASlB,KAAK,IAAI,MAAM;IAIf,cAAc,IAAI,OAAO;IAIzB,aAAa,IAAI,IAAI,IAAI,WAAW;CAGrC"}