@cloud-copilot/iam-simulate 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +661 -0
- package/README.md +5 -0
- package/dist/cjs/StatementAnalysis.d.ts +27 -0
- package/dist/cjs/StatementAnalysis.d.ts.map +1 -0
- package/dist/cjs/StatementAnalysis.js +3 -0
- package/dist/cjs/StatementAnalysis.js.map +1 -0
- package/dist/cjs/action/action.d.ts +27 -0
- package/dist/cjs/action/action.d.ts.map +1 -0
- package/dist/cjs/action/action.js +72 -0
- package/dist/cjs/action/action.js.map +1 -0
- package/dist/cjs/action.d.ts +4 -0
- package/dist/cjs/action.d.ts.map +1 -0
- package/dist/cjs/action.js +21 -0
- package/dist/cjs/action.js.map +1 -0
- package/dist/cjs/condition/BaseConditionOperator.d.ts +8 -0
- package/dist/cjs/condition/BaseConditionOperator.d.ts.map +1 -0
- package/dist/cjs/condition/BaseConditionOperator.js +3 -0
- package/dist/cjs/condition/BaseConditionOperator.js.map +1 -0
- package/dist/cjs/condition/arn/ArnEquals.d.ts +3 -0
- package/dist/cjs/condition/arn/ArnEquals.d.ts.map +1 -0
- package/dist/cjs/condition/arn/ArnEquals.js +11 -0
- package/dist/cjs/condition/arn/ArnEquals.js.map +1 -0
- package/dist/cjs/condition/arn/ArnLike.d.ts +3 -0
- package/dist/cjs/condition/arn/ArnLike.d.ts.map +1 -0
- package/dist/cjs/condition/arn/ArnLike.js +50 -0
- package/dist/cjs/condition/arn/ArnLike.js.map +1 -0
- package/dist/cjs/condition/arn/ArnNotEquals.d.ts +3 -0
- package/dist/cjs/condition/arn/ArnNotEquals.d.ts.map +1 -0
- package/dist/cjs/condition/arn/ArnNotEquals.js +11 -0
- package/dist/cjs/condition/arn/ArnNotEquals.js.map +1 -0
- package/dist/cjs/condition/arn/ArnNotLike.d.ts +3 -0
- package/dist/cjs/condition/arn/ArnNotLike.d.ts.map +1 -0
- package/dist/cjs/condition/arn/ArnNotLike.js +13 -0
- package/dist/cjs/condition/arn/ArnNotLike.js.map +1 -0
- package/dist/cjs/condition/baseConditionperatorTests.d.ts +12 -0
- package/dist/cjs/condition/baseConditionperatorTests.d.ts.map +1 -0
- package/dist/cjs/condition/baseConditionperatorTests.js +21 -0
- package/dist/cjs/condition/baseConditionperatorTests.js.map +1 -0
- package/dist/cjs/condition/binary/BinaryEquals.d.ts +7 -0
- package/dist/cjs/condition/binary/BinaryEquals.d.ts.map +1 -0
- package/dist/cjs/condition/binary/BinaryEquals.js +16 -0
- package/dist/cjs/condition/binary/BinaryEquals.js.map +1 -0
- package/dist/cjs/condition/boolean/Bool.d.ts +3 -0
- package/dist/cjs/condition/boolean/Bool.d.ts.map +1 -0
- package/dist/cjs/condition/boolean/Bool.js +20 -0
- package/dist/cjs/condition/boolean/Bool.js.map +1 -0
- package/dist/cjs/condition/condition.d.ts +6 -0
- package/dist/cjs/condition/condition.d.ts.map +1 -0
- package/dist/cjs/condition/condition.js +123 -0
- package/dist/cjs/condition/condition.js.map +1 -0
- package/dist/cjs/condition/date/DateEquals.d.ts +3 -0
- package/dist/cjs/condition/date/DateEquals.d.ts.map +1 -0
- package/dist/cjs/condition/date/DateEquals.js +17 -0
- package/dist/cjs/condition/date/DateEquals.js.map +1 -0
- package/dist/cjs/condition/date/DateGreaterThan.d.ts +3 -0
- package/dist/cjs/condition/date/DateGreaterThan.d.ts.map +1 -0
- package/dist/cjs/condition/date/DateGreaterThan.js +17 -0
- package/dist/cjs/condition/date/DateGreaterThan.js.map +1 -0
- package/dist/cjs/condition/date/DateGreaterThanEquals.d.ts +3 -0
- package/dist/cjs/condition/date/DateGreaterThanEquals.d.ts.map +1 -0
- package/dist/cjs/condition/date/DateGreaterThanEquals.js +17 -0
- package/dist/cjs/condition/date/DateGreaterThanEquals.js.map +1 -0
- package/dist/cjs/condition/date/DateLessThan.d.ts +3 -0
- package/dist/cjs/condition/date/DateLessThan.d.ts.map +1 -0
- package/dist/cjs/condition/date/DateLessThan.js +17 -0
- package/dist/cjs/condition/date/DateLessThan.js.map +1 -0
- package/dist/cjs/condition/date/DateLessThanEquals.d.ts +3 -0
- package/dist/cjs/condition/date/DateLessThanEquals.d.ts.map +1 -0
- package/dist/cjs/condition/date/DateLessThanEquals.js +17 -0
- package/dist/cjs/condition/date/DateLessThanEquals.js.map +1 -0
- package/dist/cjs/condition/date/DateNotEquals.d.ts +3 -0
- package/dist/cjs/condition/date/DateNotEquals.d.ts.map +1 -0
- package/dist/cjs/condition/date/DateNotEquals.js +29 -0
- package/dist/cjs/condition/date/DateNotEquals.js.map +1 -0
- package/dist/cjs/condition/date/date.d.ts +17 -0
- package/dist/cjs/condition/date/date.d.ts.map +1 -0
- package/dist/cjs/condition/date/date.js +42 -0
- package/dist/cjs/condition/date/date.js.map +1 -0
- package/dist/cjs/condition/ipaddress/IpAddress.d.ts +3 -0
- package/dist/cjs/condition/ipaddress/IpAddress.d.ts.map +1 -0
- package/dist/cjs/condition/ipaddress/IpAddress.js +27 -0
- package/dist/cjs/condition/ipaddress/IpAddress.js.map +1 -0
- package/dist/cjs/condition/ipaddress/NotIpAddress.d.ts +3 -0
- package/dist/cjs/condition/ipaddress/NotIpAddress.d.ts.map +1 -0
- package/dist/cjs/condition/ipaddress/NotIpAddress.js +31 -0
- package/dist/cjs/condition/ipaddress/NotIpAddress.js.map +1 -0
- package/dist/cjs/condition/ipaddress/ipv4.d.ts +24 -0
- package/dist/cjs/condition/ipaddress/ipv4.d.ts.map +1 -0
- package/dist/cjs/condition/ipaddress/ipv4.js +59 -0
- package/dist/cjs/condition/ipaddress/ipv4.js.map +1 -0
- package/dist/cjs/condition/ipaddress/ipv6.d.ts +24 -0
- package/dist/cjs/condition/ipaddress/ipv6.d.ts.map +1 -0
- package/dist/cjs/condition/ipaddress/ipv6.js +111 -0
- package/dist/cjs/condition/ipaddress/ipv6.js.map +1 -0
- package/dist/cjs/condition/numeric/NumericEquals.d.ts +3 -0
- package/dist/cjs/condition/numeric/NumericEquals.d.ts.map +1 -0
- package/dist/cjs/condition/numeric/NumericEquals.js +17 -0
- package/dist/cjs/condition/numeric/NumericEquals.js.map +1 -0
- package/dist/cjs/condition/numeric/NumericGreaterThan.d.ts +3 -0
- package/dist/cjs/condition/numeric/NumericGreaterThan.d.ts.map +1 -0
- package/dist/cjs/condition/numeric/NumericGreaterThan.js +17 -0
- package/dist/cjs/condition/numeric/NumericGreaterThan.js.map +1 -0
- package/dist/cjs/condition/numeric/NumericGreaterThanEquals.d.ts +3 -0
- package/dist/cjs/condition/numeric/NumericGreaterThanEquals.d.ts.map +1 -0
- package/dist/cjs/condition/numeric/NumericGreaterThanEquals.js +17 -0
- package/dist/cjs/condition/numeric/NumericGreaterThanEquals.js.map +1 -0
- package/dist/cjs/condition/numeric/NumericLessThan.d.ts +3 -0
- package/dist/cjs/condition/numeric/NumericLessThan.d.ts.map +1 -0
- package/dist/cjs/condition/numeric/NumericLessThan.js +17 -0
- package/dist/cjs/condition/numeric/NumericLessThan.js.map +1 -0
- package/dist/cjs/condition/numeric/NumericLessThanEquals.d.ts +3 -0
- package/dist/cjs/condition/numeric/NumericLessThanEquals.d.ts.map +1 -0
- package/dist/cjs/condition/numeric/NumericLessThanEquals.js +17 -0
- package/dist/cjs/condition/numeric/NumericLessThanEquals.js.map +1 -0
- package/dist/cjs/condition/numeric/NumericNotEquals.d.ts +3 -0
- package/dist/cjs/condition/numeric/NumericNotEquals.d.ts.map +1 -0
- package/dist/cjs/condition/numeric/NumericNotEquals.js +29 -0
- package/dist/cjs/condition/numeric/NumericNotEquals.js.map +1 -0
- package/dist/cjs/condition/numeric/numeric.d.ts +17 -0
- package/dist/cjs/condition/numeric/numeric.d.ts.map +1 -0
- package/dist/cjs/condition/numeric/numeric.js +41 -0
- package/dist/cjs/condition/numeric/numeric.js.map +1 -0
- package/dist/cjs/condition/string/StringEquals.d.ts +3 -0
- package/dist/cjs/condition/string/StringEquals.d.ts.map +1 -0
- package/dist/cjs/condition/string/StringEquals.js +14 -0
- package/dist/cjs/condition/string/StringEquals.js.map +1 -0
- package/dist/cjs/condition/string/StringEqualsIgnoreCase.d.ts +3 -0
- package/dist/cjs/condition/string/StringEqualsIgnoreCase.d.ts.map +1 -0
- package/dist/cjs/condition/string/StringEqualsIgnoreCase.js +17 -0
- package/dist/cjs/condition/string/StringEqualsIgnoreCase.js.map +1 -0
- package/dist/cjs/condition/string/StringLike.d.ts +3 -0
- package/dist/cjs/condition/string/StringLike.d.ts.map +1 -0
- package/dist/cjs/condition/string/StringLike.js +14 -0
- package/dist/cjs/condition/string/StringLike.js.map +1 -0
- package/dist/cjs/condition/string/StringNotEquals.d.ts +3 -0
- package/dist/cjs/condition/string/StringNotEquals.d.ts.map +1 -0
- package/dist/cjs/condition/string/StringNotEquals.js +14 -0
- package/dist/cjs/condition/string/StringNotEquals.js.map +1 -0
- package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.d.ts +3 -0
- package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.d.ts.map +1 -0
- package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.js +13 -0
- package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.js.map +1 -0
- package/dist/cjs/condition/string/StringNotLike.d.ts +3 -0
- package/dist/cjs/condition/string/StringNotLike.d.ts.map +1 -0
- package/dist/cjs/condition/string/StringNotLike.js +13 -0
- package/dist/cjs/condition/string/StringNotLike.js.map +1 -0
- package/dist/cjs/condition/strings/StringEquals.d.ts +3 -0
- package/dist/cjs/condition/strings/StringEquals.d.ts.map +1 -0
- package/dist/cjs/condition/strings/StringEquals.js +14 -0
- package/dist/cjs/condition/strings/StringEquals.js.map +1 -0
- package/dist/cjs/core_engine/coreSimulatorEngine.d.ts +44 -0
- package/dist/cjs/core_engine/coreSimulatorEngine.d.ts.map +1 -0
- package/dist/cjs/core_engine/coreSimulatorEngine.js +60 -0
- package/dist/cjs/core_engine/coreSimulatorEngine.js.map +1 -0
- package/dist/cjs/evaluate.d.ts +2 -0
- package/dist/cjs/evaluate.d.ts.map +1 -0
- package/dist/cjs/evaluate.js +3 -0
- package/dist/cjs/evaluate.js.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/principal/principal.d.ts +30 -0
- package/dist/cjs/principal/principal.d.ts.map +1 -0
- package/dist/cjs/principal/principal.js +107 -0
- package/dist/cjs/principal/principal.js.map +1 -0
- package/dist/cjs/request/request.d.ts +50 -0
- package/dist/cjs/request/request.d.ts.map +1 -0
- package/dist/cjs/request/request.js +41 -0
- package/dist/cjs/request/request.js.map +1 -0
- package/dist/cjs/request/requestAction.d.ts +27 -0
- package/dist/cjs/request/requestAction.d.ts.map +1 -0
- package/dist/cjs/request/requestAction.js +20 -0
- package/dist/cjs/request/requestAction.js.map +1 -0
- package/dist/cjs/request/requestPrincipal.d.ts +20 -0
- package/dist/cjs/request/requestPrincipal.d.ts.map +1 -0
- package/dist/cjs/request/requestPrincipal.js +17 -0
- package/dist/cjs/request/requestPrincipal.js.map +1 -0
- package/dist/cjs/request/requestResource.d.ts +37 -0
- package/dist/cjs/request/requestResource.d.ts.map +1 -0
- package/dist/cjs/request/requestResource.js +29 -0
- package/dist/cjs/request/requestResource.js.map +1 -0
- package/dist/cjs/request/requestSupplementalData.d.ts +19 -0
- package/dist/cjs/request/requestSupplementalData.d.ts.map +1 -0
- package/dist/cjs/request/requestSupplementalData.js +37 -0
- package/dist/cjs/request/requestSupplementalData.js.map +1 -0
- package/dist/cjs/request.d.ts +15 -0
- package/dist/cjs/request.d.ts.map +1 -0
- package/dist/cjs/request.js +17 -0
- package/dist/cjs/request.js.map +1 -0
- package/dist/cjs/requestContext.d.ts +63 -0
- package/dist/cjs/requestContext.d.ts.map +1 -0
- package/dist/cjs/requestContext.js +46 -0
- package/dist/cjs/requestContext.js.map +1 -0
- package/dist/cjs/resource/resource.d.ts +27 -0
- package/dist/cjs/resource/resource.d.ts.map +1 -0
- package/dist/cjs/resource/resource.js +100 -0
- package/dist/cjs/resource/resource.js.map +1 -0
- package/dist/cjs/services/DefaultServiceAuthorizer.d.ts +12 -0
- package/dist/cjs/services/DefaultServiceAuthorizer.d.ts.map +1 -0
- package/dist/cjs/services/DefaultServiceAuthorizer.js +79 -0
- package/dist/cjs/services/DefaultServiceAuthorizer.js.map +1 -0
- package/dist/cjs/services/ServiceAuthorizer.d.ts +11 -0
- package/dist/cjs/services/ServiceAuthorizer.d.ts.map +1 -0
- package/dist/cjs/services/ServiceAuthorizer.js +3 -0
- package/dist/cjs/services/ServiceAuthorizer.js.map +1 -0
- package/dist/cjs/util.d.ts +47 -0
- package/dist/cjs/util.d.ts.map +1 -0
- package/dist/cjs/util.js +180 -0
- package/dist/cjs/util.js.map +1 -0
- package/dist/esm/action/action.d.ts +19 -0
- package/dist/esm/action/action.d.ts.map +1 -0
- package/dist/esm/action/action.js +51 -0
- package/dist/esm/action/action.js.map +1 -0
- package/dist/esm/action.d.ts +4 -0
- package/dist/esm/action.d.ts.map +1 -0
- package/dist/esm/action.js +18 -0
- package/dist/esm/action.js.map +1 -0
- package/dist/esm/condition/BaseConditionOperator.d.ts +8 -0
- package/dist/esm/condition/BaseConditionOperator.d.ts.map +1 -0
- package/dist/esm/condition/BaseConditionOperator.js +2 -0
- package/dist/esm/condition/BaseConditionOperator.js.map +1 -0
- package/dist/esm/condition/condition.d.ts +5 -0
- package/dist/esm/condition/condition.d.ts.map +1 -0
- package/dist/esm/condition/condition.js +70 -0
- package/dist/esm/condition/condition.js.map +1 -0
- package/dist/esm/condition/strings/StringEquals.d.ts +3 -0
- package/dist/esm/condition/strings/StringEquals.d.ts.map +1 -0
- package/dist/esm/condition/strings/StringEquals.js +11 -0
- package/dist/esm/condition/strings/StringEquals.js.map +1 -0
- package/dist/esm/evaluate.d.ts +2 -0
- package/dist/esm/evaluate.d.ts.map +1 -0
- package/dist/esm/evaluate.js +2 -0
- package/dist/esm/evaluate.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/principal/principal.d.ts +31 -0
- package/dist/esm/principal/principal.d.ts.map +1 -0
- package/dist/esm/principal/principal.js +100 -0
- package/dist/esm/principal/principal.js.map +1 -0
- package/dist/esm/request/request.d.ts +52 -0
- package/dist/esm/request/request.d.ts.map +1 -0
- package/dist/esm/request/request.js +34 -0
- package/dist/esm/request/request.js.map +1 -0
- package/dist/esm/request/requestAction.d.ts +27 -0
- package/dist/esm/request/requestAction.d.ts.map +1 -0
- package/dist/esm/request/requestAction.js +15 -0
- package/dist/esm/request/requestAction.js.map +1 -0
- package/dist/esm/request/requestPrincipal.d.ts +20 -0
- package/dist/esm/request/requestPrincipal.d.ts.map +1 -0
- package/dist/esm/request/requestPrincipal.js +12 -0
- package/dist/esm/request/requestPrincipal.js.map +1 -0
- package/dist/esm/request/requestResource.d.ts +37 -0
- package/dist/esm/request/requestResource.d.ts.map +1 -0
- package/dist/esm/request/requestResource.js +24 -0
- package/dist/esm/request/requestResource.js.map +1 -0
- package/dist/esm/request/requestSupplementalData.d.ts +19 -0
- package/dist/esm/request/requestSupplementalData.d.ts.map +1 -0
- package/dist/esm/request/requestSupplementalData.js +30 -0
- package/dist/esm/request/requestSupplementalData.js.map +1 -0
- package/dist/esm/request.d.ts +15 -0
- package/dist/esm/request.d.ts.map +1 -0
- package/dist/esm/request.js +9 -0
- package/dist/esm/request.js.map +1 -0
- package/dist/esm/requestContext.d.ts +63 -0
- package/dist/esm/requestContext.d.ts.map +1 -0
- package/dist/esm/requestContext.js +39 -0
- package/dist/esm/requestContext.js.map +1 -0
- package/dist/esm/resource/resource.d.ts +12 -0
- package/dist/esm/resource/resource.d.ts.map +1 -0
- package/dist/esm/resource/resource.js +97 -0
- package/dist/esm/resource/resource.js.map +1 -0
- package/dist/esm/util.d.ts +15 -0
- package/dist/esm/util.d.ts.map +1 -0
- package/dist/esm/util.js +97 -0
- package/dist/esm/util.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class RequestSupplementalDataImpl {
|
|
2
|
+
constructor(contextKeysForAction, contextKeysForResource, contextKeysForPrincipal) {
|
|
3
|
+
this.contextKeysForAction = contextKeysForAction;
|
|
4
|
+
this.contextKeysForResource = contextKeysForResource;
|
|
5
|
+
this.contextKeysForPrincipal = contextKeysForPrincipal;
|
|
6
|
+
this.allActions = new Set();
|
|
7
|
+
for (const action of contextKeysForAction) {
|
|
8
|
+
this.allActions.add(action);
|
|
9
|
+
}
|
|
10
|
+
for (const resource of contextKeysForResource) {
|
|
11
|
+
this.allActions.add(resource);
|
|
12
|
+
}
|
|
13
|
+
for (const principal of contextKeysForPrincipal) {
|
|
14
|
+
this.allActions.add(...[principal]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
contextKeyValidForRequest(key) {
|
|
18
|
+
/*
|
|
19
|
+
Todo: Add a way to check if the key has a slash in it such as aws:RequestKeys or aws:ResourceTagKeys
|
|
20
|
+
*/
|
|
21
|
+
return this.allActions.has(key);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export const MockRequestSupplementalData = {
|
|
25
|
+
contextKeysForAction: [],
|
|
26
|
+
contextKeysForResource: [],
|
|
27
|
+
contextKeysForPrincipal: [],
|
|
28
|
+
contextKeyValidForRequest: (key) => true
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=requestSupplementalData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestSupplementalData.js","sourceRoot":"","sources":["../../../src/request/requestSupplementalData.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,2BAA2B;IAItC,YAA4B,oBAA8B,EAC9B,sBAAgC,EAChC,uBAAiC;QAFjC,yBAAoB,GAApB,oBAAoB,CAAU;QAC9B,2BAAsB,GAAtB,sBAAsB,CAAU;QAChC,4BAAuB,GAAvB,uBAAuB,CAAU;QAJrD,eAAU,GAAgB,IAAI,GAAG,EAAE,CAAC;QAK1C,KAAI,MAAM,MAAM,IAAI,oBAAoB,EAAE,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;QACD,KAAI,MAAM,QAAQ,IAAI,sBAAsB,EAAE,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC/B,CAAC;QACD,KAAI,MAAM,SAAS,IAAI,uBAAuB,EAAE,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,yBAAyB,CAAC,GAAW;QACnC;;UAEE;QACF,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA4B;IAClE,oBAAoB,EAAE,EAAE;IACxB,sBAAsB,EAAE,EAAE;IAC1B,uBAAuB,EAAE,EAAE;IAC3B,yBAAyB,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI;CACjD,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RequestContext } from "./requestContext.js";
|
|
2
|
+
export interface Request {
|
|
3
|
+
principal: string;
|
|
4
|
+
action: string;
|
|
5
|
+
resource: string;
|
|
6
|
+
context: RequestContext;
|
|
7
|
+
}
|
|
8
|
+
export declare class RequestImpl implements Request {
|
|
9
|
+
readonly principal: string;
|
|
10
|
+
readonly resource: string;
|
|
11
|
+
readonly action: string;
|
|
12
|
+
readonly context: RequestContext;
|
|
13
|
+
constructor(principal: string, resource: string, action: string, context: RequestContext);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,qBAAa,WAAY,YAAW,OAAO;aAEb,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM;aACd,OAAO,EAAE,cAAc;gBAHvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc;CAGpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,WAAW;IAEtB,YAA4B,SAAiB,EACjB,QAAgB,EAChB,MAAc,EACd,OAAuB;QAHvB,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAgB;IAEnD,CAAC;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The context metadata available in a request
|
|
3
|
+
*/
|
|
4
|
+
export interface RequestContext {
|
|
5
|
+
/**
|
|
6
|
+
* Check if a context key exists in a request
|
|
7
|
+
* @param name the name of the context key to check for, case insensitive
|
|
8
|
+
* @returns true if the context key exists, false otherwise
|
|
9
|
+
*/
|
|
10
|
+
contextKeyExists: (name: string) => boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Get the value of a context key in a request
|
|
13
|
+
*
|
|
14
|
+
* @param name the name of the context key to get the value of, case insensitive
|
|
15
|
+
* @returns the value of the context key
|
|
16
|
+
*/
|
|
17
|
+
contextKeyValue: (name: string) => ContextKey;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A context key in a request
|
|
21
|
+
*/
|
|
22
|
+
export interface ContextKey {
|
|
23
|
+
/**
|
|
24
|
+
* The name of the context key
|
|
25
|
+
*/
|
|
26
|
+
name: string;
|
|
27
|
+
/**
|
|
28
|
+
* Check if the context key is a string value
|
|
29
|
+
*/
|
|
30
|
+
isStringValue(): this is StringContextKey;
|
|
31
|
+
/**
|
|
32
|
+
* Check if the context key is an array value
|
|
33
|
+
*/
|
|
34
|
+
isArrayValue(): this is ArrayContextKey;
|
|
35
|
+
}
|
|
36
|
+
export interface StringContextKey extends ContextKey {
|
|
37
|
+
/**
|
|
38
|
+
* The value of the context key if it is a string
|
|
39
|
+
*/
|
|
40
|
+
value: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ArrayContextKey extends ContextKey {
|
|
43
|
+
/**
|
|
44
|
+
* The array of values of the context key if it is an array
|
|
45
|
+
*/
|
|
46
|
+
values: string[];
|
|
47
|
+
}
|
|
48
|
+
export declare class RequestContextImpl implements RequestContext {
|
|
49
|
+
private context;
|
|
50
|
+
constructor(values: Record<string, string | string[]>);
|
|
51
|
+
contextKeyExists(name: string): boolean;
|
|
52
|
+
contextKeyValue(name: string): ContextKey;
|
|
53
|
+
}
|
|
54
|
+
export declare class ContextKeyImpl implements ContextKey, StringContextKey, ArrayContextKey {
|
|
55
|
+
name: string;
|
|
56
|
+
private _val;
|
|
57
|
+
constructor(name: string, _val: string | string[]);
|
|
58
|
+
isStringValue(): this is StringContextKey;
|
|
59
|
+
isArrayValue(): this is ArrayContextKey;
|
|
60
|
+
get values(): string[];
|
|
61
|
+
get value(): string;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=requestContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestContext.d.ts","sourceRoot":"","sources":["../../src/requestContext.ts"],"names":[],"mappings":"AACA;;GAEG;AACH,MAAM,WAAW,cAAc;IAE7B;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAE5C;;;;;OAKG;IACH,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,aAAa,IAAI,IAAI,IAAI,gBAAgB,CAAC;IAE1C;;OAEG;IACH,YAAY,IAAI,IAAI,IAAI,eAAe,CAAC;CACzC;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAElD;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAgB,SAAQ,UAAU;IAEjD;;OAEG;IAEH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,OAAO,CAAsC;gBAEzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAO9C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIvC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;CAIjD;AAED,qBAAa,cAAe,YAAW,UAAU,EAAE,gBAAgB,EAAE,eAAe;IAC/D,IAAI,EAAE,MAAM;IAAE,OAAO,CAAC,IAAI;gBAA1B,IAAI,EAAE,MAAM,EAAU,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAEhE,aAAa,IAAI,IAAI,IAAI,gBAAgB;IAGzC,YAAY,IAAI,IAAI,IAAI,eAAe;IAIvC,IAAI,MAAM,IAAI,MAAM,EAAE,CAKrB;IAED,IAAI,KAAK,IAAI,MAAM,CAKlB;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export class RequestContextImpl {
|
|
2
|
+
constructor(values) {
|
|
3
|
+
this.context = new Map();
|
|
4
|
+
for (const key in values) {
|
|
5
|
+
this.context.set(key.toLowerCase(), new ContextKeyImpl(key, values[key]));
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
contextKeyExists(name) {
|
|
9
|
+
return this.context.has(name.toLowerCase());
|
|
10
|
+
}
|
|
11
|
+
contextKeyValue(name) {
|
|
12
|
+
return this.context.get(name.toLowerCase());
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class ContextKeyImpl {
|
|
16
|
+
constructor(name, _val) {
|
|
17
|
+
this.name = name;
|
|
18
|
+
this._val = _val;
|
|
19
|
+
}
|
|
20
|
+
isStringValue() {
|
|
21
|
+
return typeof this._val === 'string';
|
|
22
|
+
}
|
|
23
|
+
isArrayValue() {
|
|
24
|
+
return Array.isArray(this._val);
|
|
25
|
+
}
|
|
26
|
+
get values() {
|
|
27
|
+
if (Array.isArray(this._val)) {
|
|
28
|
+
return this._val;
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`ContextKey ${this.name} is not an array`);
|
|
31
|
+
}
|
|
32
|
+
get value() {
|
|
33
|
+
if (typeof this._val === 'string') {
|
|
34
|
+
return this._val;
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`ContextKey ${this.name} is not a string`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=requestContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestContext.js","sourceRoot":"","sources":["../../src/requestContext.ts"],"names":[],"mappings":"AA2DA,MAAM,OAAO,kBAAkB;IAG7B,YAAY,MAAyC;QAF7C,YAAO,GAA4B,IAAI,GAAG,EAAE,CAAC;QAGnD,KAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAGM,gBAAgB,CAAC,IAAY;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9C,CAAC;IAEM,eAAe,CAAC,IAAY;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAe,CAAC;IAE5D,CAAC;CACF;AAED,MAAM,OAAO,cAAc;IACzB,YAAmB,IAAY,EAAU,IAAuB;QAA7C,SAAI,GAAJ,IAAI,CAAQ;QAAU,SAAI,GAAJ,IAAI,CAAmB;IAAG,CAAC;IAEpE,aAAa;QACX,OAAO,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;IACvC,CAAC;IACD,YAAY;QACV,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,MAAM;QACR,IAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,KAAK;QACP,IAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC;IAC7D,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Resource } from "@cloud-copilot/iam-policy";
|
|
2
|
+
import { AwsRequest } from "../request/request.js";
|
|
3
|
+
/**
|
|
4
|
+
* Check if a request matches a set of resources.
|
|
5
|
+
*
|
|
6
|
+
* @param request the request to check
|
|
7
|
+
* @param policyResources the resources to check against
|
|
8
|
+
* @returns true if the request matches any of the resources, false otherwise
|
|
9
|
+
*/
|
|
10
|
+
export declare function requestMatchesResources(request: AwsRequest, policyResources: Resource[]): boolean;
|
|
11
|
+
export declare function requestMatchesNotResources(request: AwsRequest, policyResources: Resource[]): boolean;
|
|
12
|
+
//# sourceMappingURL=resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../src/resource/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAmBnD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,OAAO,CAEjG;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,OAAO,CAEpG"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { convertIamStringToRegex } from "../util.js";
|
|
2
|
+
//TODO: Make a check to see if the action is a wildcard only action. This will have to happen outside of these functions.
|
|
3
|
+
/**
|
|
4
|
+
* Convert a resource segment to a regular expression. This is without variables.
|
|
5
|
+
*
|
|
6
|
+
* @param segment the segment to convert to a regular expression
|
|
7
|
+
* @returns a regular that replaces any wildcards in the segment with the appropriate regular expression.
|
|
8
|
+
*/
|
|
9
|
+
function convertResourceSegmentToRegex(segment) {
|
|
10
|
+
if (segment.indexOf(':') != -1) {
|
|
11
|
+
throw new Error('Segment should not contain a colon');
|
|
12
|
+
}
|
|
13
|
+
const pattern = "^" + segment.replace(/\?/g, '.').replace(/\*/g, '.*?') + "$";
|
|
14
|
+
return new RegExp(pattern, 'i');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if a request matches a set of resources.
|
|
18
|
+
*
|
|
19
|
+
* @param request the request to check
|
|
20
|
+
* @param policyResources the resources to check against
|
|
21
|
+
* @returns true if the request matches any of the resources, false otherwise
|
|
22
|
+
*/
|
|
23
|
+
export function requestMatchesResources(request, policyResources) {
|
|
24
|
+
return policyResources.some(policyResource => singleResourceMatchesRequest(request, policyResource));
|
|
25
|
+
}
|
|
26
|
+
export function requestMatchesNotResources(request, policyResources) {
|
|
27
|
+
return !requestMatchesResources(request, policyResources);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a single resource matches a request.
|
|
31
|
+
*
|
|
32
|
+
* @param request the request to check against
|
|
33
|
+
* @param policyResource the resource to check against
|
|
34
|
+
* @returns true if the request matches the resource, false otherwise
|
|
35
|
+
*/
|
|
36
|
+
function singleResourceMatchesRequest(request, policyResource) {
|
|
37
|
+
if (policyResource.isAllResources()) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
else if (policyResource.isArnResource()) {
|
|
41
|
+
if (!request.resource) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const resource = request.resource;
|
|
45
|
+
if (!convertResourceSegmentToRegex(policyResource.partition()).test(resource.partition())) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if (!convertResourceSegmentToRegex(policyResource.service()).test(resource.service())) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
if (!convertResourceSegmentToRegex(policyResource.region()).test(resource.region())) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (!convertResourceSegmentToRegex(policyResource.account()).test(resource.account())) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
//Wildcards and variables are not allowed in the product segment https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html "Incorrect wildcard usage"
|
|
58
|
+
const [policyProduct, policyResourceId] = getResourceSegments(policyResource.resource());
|
|
59
|
+
if (!resource.resource().startsWith(policyProduct)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const requestResourceId = resource.resource().slice(policyProduct.length);
|
|
63
|
+
if (!convertIamStringToRegex(policyResourceId, request).test(requestResourceId)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw new Error('Unknown resource type');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Splits a resource into two segments. The first segment is the product segment and the second segment is the resource id segment.
|
|
74
|
+
* This could be split by a colon or a slash, so it checks for both.
|
|
75
|
+
*
|
|
76
|
+
* @param resource The resource to split
|
|
77
|
+
* @returns a tuple with the first segment being the product segment (including the separator) and the second segment being the resource id.
|
|
78
|
+
*/
|
|
79
|
+
function getResourceSegments(resource) {
|
|
80
|
+
const slashIndex = resource.indexOf('/');
|
|
81
|
+
const colonIndex = resource.indexOf(':');
|
|
82
|
+
let splitIndex = slashIndex;
|
|
83
|
+
if (slashIndex != -1 && colonIndex != -1) {
|
|
84
|
+
splitIndex = Math.min(slashIndex, colonIndex) + 1;
|
|
85
|
+
}
|
|
86
|
+
else if (colonIndex == -1) {
|
|
87
|
+
splitIndex = slashIndex + 1;
|
|
88
|
+
}
|
|
89
|
+
else if (slashIndex == -1) {
|
|
90
|
+
splitIndex = colonIndex + 1;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
throw new Error(`Unable to split resource ${resource}`);
|
|
94
|
+
}
|
|
95
|
+
return [resource.slice(0, splitIndex), resource.slice(splitIndex)];
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../src/resource/resource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AwsRequest } from './request/request.js';
|
|
2
|
+
interface StringReplaceOptions {
|
|
3
|
+
replaceWildcards: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* This will convert a string to a regex that can be used to match against a string.
|
|
7
|
+
* This will replace any variables in the string with the value of the variable in the request context.
|
|
8
|
+
*
|
|
9
|
+
* @param value the string to convert to a regex
|
|
10
|
+
* @param requestContext the request context to get the variable values from
|
|
11
|
+
* @returns a regex that can be used to match against a string
|
|
12
|
+
*/
|
|
13
|
+
export declare function convertIamStringToRegex(value: string, request: AwsRequest, replaceOptions?: Partial<StringReplaceOptions>): RegExp;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAIjD,UAAU,oBAAoB;IAC5B,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAMD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,MAAM,CA2DlI"}
|
package/dist/esm/util.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
const matchesNothing = new RegExp('a^');
|
|
2
|
+
const defaultStringReplaceOptions = {
|
|
3
|
+
replaceWildcards: true
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* This will convert a string to a regex that can be used to match against a string.
|
|
7
|
+
* This will replace any variables in the string with the value of the variable in the request context.
|
|
8
|
+
*
|
|
9
|
+
* @param value the string to convert to a regex
|
|
10
|
+
* @param requestContext the request context to get the variable values from
|
|
11
|
+
* @returns a regex that can be used to match against a string
|
|
12
|
+
*/
|
|
13
|
+
export function convertIamStringToRegex(value, request, replaceOptions) {
|
|
14
|
+
const options = { ...defaultStringReplaceOptions, ...replaceOptions };
|
|
15
|
+
let invalidVariableFound = false;
|
|
16
|
+
const newValue = value.replaceAll(/(\$\{.*?\})|(\*)|(\?)/ig, (match, args) => {
|
|
17
|
+
if (match == "?") {
|
|
18
|
+
return replacementValue('\\?', '.', options.replaceWildcards);
|
|
19
|
+
// return '.'
|
|
20
|
+
}
|
|
21
|
+
else if (match == "*") {
|
|
22
|
+
return replacementValue('\\*', ".*?", options.replaceWildcards);
|
|
23
|
+
// return ".*?"
|
|
24
|
+
}
|
|
25
|
+
else if (match == "${*}") {
|
|
26
|
+
return replacementValue("\\$\\{\\*\\}", "\\*", options.replaceWildcards);
|
|
27
|
+
// return "\\*"
|
|
28
|
+
}
|
|
29
|
+
else if (match == "${?}") {
|
|
30
|
+
return replacementValue("\\$\\{\\?\\}", "\\?", options.replaceWildcards);
|
|
31
|
+
// return "\\?"
|
|
32
|
+
}
|
|
33
|
+
else if (match == "${$}") {
|
|
34
|
+
return replacementValue("\\$\\{\\$\\}", "\\$", options.replaceWildcards);
|
|
35
|
+
// return "\\$"
|
|
36
|
+
}
|
|
37
|
+
//
|
|
38
|
+
//This means it'a a variable
|
|
39
|
+
const inTheBrackets = match.slice(2, -1);
|
|
40
|
+
let defaultValue = undefined;
|
|
41
|
+
const defaultParts = inTheBrackets.split(', ');
|
|
42
|
+
if (defaultParts.length == 2) {
|
|
43
|
+
const segmentAfterComma = defaultParts.at(1);
|
|
44
|
+
if (segmentAfterComma?.startsWith("'") && segmentAfterComma.endsWith("'")) {
|
|
45
|
+
defaultValue = segmentAfterComma.slice(1, -1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const variableName = defaultParts.at(0).trim();
|
|
49
|
+
const requestValue = getContextSingleValue(request, variableName);
|
|
50
|
+
if (requestValue) {
|
|
51
|
+
return requestValue;
|
|
52
|
+
}
|
|
53
|
+
else if (defaultValue) {
|
|
54
|
+
/*
|
|
55
|
+
TODO: What happens in a request if a multi value context key is used in a string and there
|
|
56
|
+
is a default value? Will it use the default value or will it fail the condition test?
|
|
57
|
+
*/
|
|
58
|
+
return defaultValue;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
invalidVariableFound = true;
|
|
62
|
+
/*
|
|
63
|
+
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-no-value
|
|
64
|
+
*/
|
|
65
|
+
return "--undefined---";
|
|
66
|
+
}
|
|
67
|
+
throw new Error('This should never happen');
|
|
68
|
+
});
|
|
69
|
+
if (invalidVariableFound) {
|
|
70
|
+
return matchesNothing;
|
|
71
|
+
}
|
|
72
|
+
return new RegExp('^' + newValue + '$');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get the string value of a context key only if it is a single value key
|
|
76
|
+
*
|
|
77
|
+
* @param requestContext the request context to get the value from
|
|
78
|
+
* @param contextKeyName the name of the context key to get the value of
|
|
79
|
+
* @returns the value of the context key if it is a single value key, undefined otherwise
|
|
80
|
+
*/
|
|
81
|
+
function getContextSingleValue(request, contextKeyName) {
|
|
82
|
+
if (!request.contextKeyExists(contextKeyName)) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
const keyValue = request.getContextKeyValue(contextKeyName);
|
|
86
|
+
if (keyValue.isStringValue()) {
|
|
87
|
+
return keyValue.value;
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
function replacementValue(rawString, wildcard, replaceWildcards) {
|
|
92
|
+
if (replaceWildcards) {
|
|
93
|
+
return wildcard;
|
|
94
|
+
}
|
|
95
|
+
return rawString;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cloud-copilot/iam-simulate",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Simulate evaluation of AWS IAM policies",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/cloud-copilot/iam-simulate.git"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/esm/index.js",
|
|
12
|
+
"require": "./dist/cjs/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/**/*"
|
|
17
|
+
],
|
|
18
|
+
"types": "dist/cjs/index.d.ts",
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "npx tsc -p tsconfig.cjs.json && npx tsc -p tsconfig.esm.json && ./postbuild.sh",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"test": "npx vitest --run --coverage",
|
|
23
|
+
"release": "npm run clean && npm run build && npm run test && npm publish"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"AWS",
|
|
27
|
+
"IAM"
|
|
28
|
+
],
|
|
29
|
+
"author": "David Kerber <dave@cloudcopilot.io>",
|
|
30
|
+
"license": "AGPL-3.0-or-later",
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/cloud-copilot/iam-simulate/issues"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/cloud-copilot/iam-simulate#readme",
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^22.5.0",
|
|
37
|
+
"@vitest/coverage-v8": "^2.0.5",
|
|
38
|
+
"typescript": "^5.5.4",
|
|
39
|
+
"vitest": "^2.0.5"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@cloud-copilot/iam-data": ">=0.8.0 <1.0.0",
|
|
43
|
+
"@cloud-copilot/iam-policy": "0.0.9"
|
|
44
|
+
}
|
|
45
|
+
}
|