@actsecurity/iam-lens 0.1.156
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 +203 -0
- package/dist/cjs/cli.d.ts +3 -0
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/cli.js +206 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/collect/client.d.ts +550 -0
- package/dist/cjs/collect/client.d.ts.map +1 -0
- package/dist/cjs/collect/client.js +1119 -0
- package/dist/cjs/collect/client.js.map +1 -0
- package/dist/cjs/collect/collect.d.ts +44 -0
- package/dist/cjs/collect/collect.d.ts.map +1 -0
- package/dist/cjs/collect/collect.js +55 -0
- package/dist/cjs/collect/collect.js.map +1 -0
- package/dist/cjs/collect/inMemoryClient.d.ts +6 -0
- package/dist/cjs/collect/inMemoryClient.d.ts.map +1 -0
- package/dist/cjs/collect/inMemoryClient.js +11 -0
- package/dist/cjs/collect/inMemoryClient.js.map +1 -0
- package/dist/cjs/index.d.ts +13 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +28 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/principalCan/permission.d.ts +125 -0
- package/dist/cjs/principalCan/permission.d.ts.map +1 -0
- package/dist/cjs/principalCan/permission.js +1229 -0
- package/dist/cjs/principalCan/permission.js.map +1 -0
- package/dist/cjs/principalCan/permissionSet.d.ts +140 -0
- package/dist/cjs/principalCan/permissionSet.d.ts.map +1 -0
- package/dist/cjs/principalCan/permissionSet.js +437 -0
- package/dist/cjs/principalCan/permissionSet.js.map +1 -0
- package/dist/cjs/principalCan/principalCan.d.ts +26 -0
- package/dist/cjs/principalCan/principalCan.d.ts.map +1 -0
- package/dist/cjs/principalCan/principalCan.js +195 -0
- package/dist/cjs/principalCan/principalCan.js.map +1 -0
- package/dist/cjs/principalCan/principalConstraints.d.ts +147 -0
- package/dist/cjs/principalCan/principalConstraints.d.ts.map +1 -0
- package/dist/cjs/principalCan/principalConstraints.js +472 -0
- package/dist/cjs/principalCan/principalConstraints.js.map +1 -0
- package/dist/cjs/principalCan/resources/actions.d.ts +9 -0
- package/dist/cjs/principalCan/resources/actions.d.ts.map +1 -0
- package/dist/cjs/principalCan/resources/actions.js +27 -0
- package/dist/cjs/principalCan/resources/actions.js.map +1 -0
- package/dist/cjs/principalCan/resources/resourceTypes/iamRoles.d.ts +31 -0
- package/dist/cjs/principalCan/resources/resourceTypes/iamRoles.d.ts.map +1 -0
- package/dist/cjs/principalCan/resources/resourceTypes/iamRoles.js +114 -0
- package/dist/cjs/principalCan/resources/resourceTypes/iamRoles.js.map +1 -0
- package/dist/cjs/principalCan/resources/resourceTypes/kmsKeys.d.ts +30 -0
- package/dist/cjs/principalCan/resources/resourceTypes/kmsKeys.d.ts.map +1 -0
- package/dist/cjs/principalCan/resources/resourceTypes/kmsKeys.js +110 -0
- package/dist/cjs/principalCan/resources/resourceTypes/kmsKeys.js.map +1 -0
- package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.d.ts +18 -0
- package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.d.ts.map +1 -0
- package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.js +123 -0
- package/dist/cjs/principalCan/resources/resourceTypes/s3Buckets.js.map +1 -0
- package/dist/cjs/principalCan/resources/statements.d.ts +27 -0
- package/dist/cjs/principalCan/resources/statements.d.ts.map +1 -0
- package/dist/cjs/principalCan/resources/statements.js +119 -0
- package/dist/cjs/principalCan/resources/statements.js.map +1 -0
- package/dist/cjs/principalIndex/makePrincipalIndex.d.ts +8 -0
- package/dist/cjs/principalIndex/makePrincipalIndex.d.ts.map +1 -0
- package/dist/cjs/principalIndex/makePrincipalIndex.js +105 -0
- package/dist/cjs/principalIndex/makePrincipalIndex.js.map +1 -0
- package/dist/cjs/principals.d.ts +54 -0
- package/dist/cjs/principals.d.ts.map +1 -0
- package/dist/cjs/principals.js +143 -0
- package/dist/cjs/principals.js.map +1 -0
- package/dist/cjs/resources.d.ts +32 -0
- package/dist/cjs/resources.d.ts.map +1 -0
- package/dist/cjs/resources.js +71 -0
- package/dist/cjs/resources.js.map +1 -0
- package/dist/cjs/simulate/contextKeys.d.ts +68 -0
- package/dist/cjs/simulate/contextKeys.d.ts.map +1 -0
- package/dist/cjs/simulate/contextKeys.js +293 -0
- package/dist/cjs/simulate/contextKeys.js.map +1 -0
- package/dist/cjs/simulate/simulate.d.ts +72 -0
- package/dist/cjs/simulate/simulate.d.ts.map +1 -0
- package/dist/cjs/simulate/simulate.js +296 -0
- package/dist/cjs/simulate/simulate.js.map +1 -0
- package/dist/cjs/test-datasets/testClient.d.ts +17 -0
- package/dist/cjs/test-datasets/testClient.d.ts.map +1 -0
- package/dist/cjs/test-datasets/testClient.js +58 -0
- package/dist/cjs/test-datasets/testClient.js.map +1 -0
- package/dist/cjs/utils/arn.d.ts +22 -0
- package/dist/cjs/utils/arn.d.ts.map +1 -0
- package/dist/cjs/utils/arn.js +49 -0
- package/dist/cjs/utils/arn.js.map +1 -0
- package/dist/cjs/utils/bitset.d.ts +45 -0
- package/dist/cjs/utils/bitset.d.ts.map +1 -0
- package/dist/cjs/utils/bitset.js +149 -0
- package/dist/cjs/utils/bitset.js.map +1 -0
- package/dist/cjs/utils/dynamicImport.d.ts +31 -0
- package/dist/cjs/utils/dynamicImport.d.ts.map +1 -0
- package/dist/cjs/utils/dynamicImport.js +64 -0
- package/dist/cjs/utils/dynamicImport.js.map +1 -0
- package/dist/cjs/utils/packageVersion.d.ts +5 -0
- package/dist/cjs/utils/packageVersion.d.ts.map +1 -0
- package/dist/cjs/utils/packageVersion.js +25 -0
- package/dist/cjs/utils/packageVersion.js.map +1 -0
- package/dist/cjs/utils/readPackageFile.d.ts +3 -0
- package/dist/cjs/utils/readPackageFile.d.ts.map +1 -0
- package/dist/cjs/utils/readPackageFile.js +16 -0
- package/dist/cjs/utils/readPackageFile.js.map +1 -0
- package/dist/cjs/utils/s3Abac.d.ts +3 -0
- package/dist/cjs/utils/s3Abac.d.ts.map +1 -0
- package/dist/cjs/utils/s3Abac.js +5 -0
- package/dist/cjs/utils/s3Abac.js.map +1 -0
- package/dist/cjs/utils/stringOrFileArgument.d.ts +9 -0
- package/dist/cjs/utils/stringOrFileArgument.d.ts.map +1 -0
- package/dist/cjs/utils/stringOrFileArgument.js +25 -0
- package/dist/cjs/utils/stringOrFileArgument.js.map +1 -0
- package/dist/cjs/utils/sts.d.ts +2 -0
- package/dist/cjs/utils/sts.d.ts.map +1 -0
- package/dist/cjs/utils/sts.js +9 -0
- package/dist/cjs/utils/sts.js.map +1 -0
- package/dist/cjs/utils/testUtils.d.ts +56 -0
- package/dist/cjs/utils/testUtils.d.ts.map +1 -0
- package/dist/cjs/utils/testUtils.js +95 -0
- package/dist/cjs/utils/testUtils.js.map +1 -0
- package/dist/cjs/utils/workerScript.d.ts +8 -0
- package/dist/cjs/utils/workerScript.d.ts.map +1 -0
- package/dist/cjs/utils/workerScript.js +23 -0
- package/dist/cjs/utils/workerScript.js.map +1 -0
- package/dist/cjs/whoCan/WhoCanMainThreadWorker.d.ts +73 -0
- package/dist/cjs/whoCan/WhoCanMainThreadWorker.d.ts.map +1 -0
- package/dist/cjs/whoCan/WhoCanMainThreadWorker.js +80 -0
- package/dist/cjs/whoCan/WhoCanMainThreadWorker.js.map +1 -0
- package/dist/cjs/whoCan/WhoCanProcessor.d.ts +400 -0
- package/dist/cjs/whoCan/WhoCanProcessor.d.ts.map +1 -0
- package/dist/cjs/whoCan/WhoCanProcessor.js +1088 -0
- package/dist/cjs/whoCan/WhoCanProcessor.js.map +1 -0
- package/dist/cjs/whoCan/WhoCanWorker.d.ts +87 -0
- package/dist/cjs/whoCan/WhoCanWorker.d.ts.map +1 -0
- package/dist/cjs/whoCan/WhoCanWorker.js +201 -0
- package/dist/cjs/whoCan/WhoCanWorker.js.map +1 -0
- package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.d.ts +2 -0
- package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.d.ts.map +1 -0
- package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.js +189 -0
- package/dist/cjs/whoCan/WhoCanWorkerThreadWorker.js.map +1 -0
- package/dist/cjs/whoCan/principalArnFilter.d.ts +84 -0
- package/dist/cjs/whoCan/principalArnFilter.d.ts.map +1 -0
- package/dist/cjs/whoCan/principalArnFilter.js +258 -0
- package/dist/cjs/whoCan/principalArnFilter.js.map +1 -0
- package/dist/cjs/whoCan/principalScope.d.ts +35 -0
- package/dist/cjs/whoCan/principalScope.d.ts.map +1 -0
- package/dist/cjs/whoCan/principalScope.js +104 -0
- package/dist/cjs/whoCan/principalScope.js.map +1 -0
- package/dist/cjs/whoCan/requestAnalysis.d.ts +73 -0
- package/dist/cjs/whoCan/requestAnalysis.d.ts.map +1 -0
- package/dist/cjs/whoCan/requestAnalysis.js +87 -0
- package/dist/cjs/whoCan/requestAnalysis.js.map +1 -0
- package/dist/cjs/whoCan/untrustingActions.d.ts +7 -0
- package/dist/cjs/whoCan/untrustingActions.d.ts.map +1 -0
- package/dist/cjs/whoCan/untrustingActions.js +30 -0
- package/dist/cjs/whoCan/untrustingActions.js.map +1 -0
- package/dist/cjs/whoCan/whoCan.d.ts +295 -0
- package/dist/cjs/whoCan/whoCan.d.ts.map +1 -0
- package/dist/cjs/whoCan/whoCan.js +574 -0
- package/dist/cjs/whoCan/whoCan.js.map +1 -0
- package/dist/cjs/whoCan/workerBootstrapPlugin.d.ts +17 -0
- package/dist/cjs/whoCan/workerBootstrapPlugin.d.ts.map +1 -0
- package/dist/cjs/whoCan/workerBootstrapPlugin.js +3 -0
- package/dist/cjs/whoCan/workerBootstrapPlugin.js.map +1 -0
- package/dist/cjs/workers/ArrayStreamingWorkQueue.d.ts +15 -0
- package/dist/cjs/workers/ArrayStreamingWorkQueue.d.ts.map +1 -0
- package/dist/cjs/workers/ArrayStreamingWorkQueue.js +35 -0
- package/dist/cjs/workers/ArrayStreamingWorkQueue.js.map +1 -0
- package/dist/cjs/workers/JobRunner.d.ts +47 -0
- package/dist/cjs/workers/JobRunner.d.ts.map +1 -0
- package/dist/cjs/workers/JobRunner.js +101 -0
- package/dist/cjs/workers/JobRunner.js.map +1 -0
- package/dist/cjs/workers/RingQueue.d.ts +14 -0
- package/dist/cjs/workers/RingQueue.d.ts.map +1 -0
- package/dist/cjs/workers/RingQueue.js +43 -0
- package/dist/cjs/workers/RingQueue.js.map +1 -0
- package/dist/cjs/workers/SharedArrayBufferMainCache.d.ts +10 -0
- package/dist/cjs/workers/SharedArrayBufferMainCache.d.ts.map +1 -0
- package/dist/cjs/workers/SharedArrayBufferMainCache.js +37 -0
- package/dist/cjs/workers/SharedArrayBufferMainCache.js.map +1 -0
- package/dist/cjs/workers/SharedArrayBufferWorkerCache.d.ts +10 -0
- package/dist/cjs/workers/SharedArrayBufferWorkerCache.d.ts.map +1 -0
- package/dist/cjs/workers/SharedArrayBufferWorkerCache.js +49 -0
- package/dist/cjs/workers/SharedArrayBufferWorkerCache.js.map +1 -0
- package/dist/cjs/workers/StreamingWorkQueue.d.ts +18 -0
- package/dist/cjs/workers/StreamingWorkQueue.d.ts.map +1 -0
- package/dist/cjs/workers/StreamingWorkQueue.js +67 -0
- package/dist/cjs/workers/StreamingWorkQueue.js.map +1 -0
- package/dist/cjs/workers/buffers.d.ts +4 -0
- package/dist/cjs/workers/buffers.d.ts.map +1 -0
- package/dist/cjs/workers/buffers.js +26 -0
- package/dist/cjs/workers/buffers.js.map +1 -0
- package/dist/esm/cli.d.ts +3 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +204 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/collect/client.d.ts +550 -0
- package/dist/esm/collect/client.d.ts.map +1 -0
- package/dist/esm/collect/client.js +1114 -0
- package/dist/esm/collect/client.js.map +1 -0
- package/dist/esm/collect/collect.d.ts +44 -0
- package/dist/esm/collect/collect.d.ts.map +1 -0
- package/dist/esm/collect/collect.js +51 -0
- package/dist/esm/collect/collect.js.map +1 -0
- package/dist/esm/collect/inMemoryClient.d.ts +6 -0
- package/dist/esm/collect/inMemoryClient.d.ts.map +1 -0
- package/dist/esm/collect/inMemoryClient.js +8 -0
- package/dist/esm/collect/inMemoryClient.js.map +1 -0
- package/dist/esm/index.d.ts +13 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/principalCan/permission.d.ts +125 -0
- package/dist/esm/principalCan/permission.d.ts.map +1 -0
- package/dist/esm/principalCan/permission.js +1212 -0
- package/dist/esm/principalCan/permission.js.map +1 -0
- package/dist/esm/principalCan/permissionSet.d.ts +140 -0
- package/dist/esm/principalCan/permissionSet.d.ts.map +1 -0
- package/dist/esm/principalCan/permissionSet.js +429 -0
- package/dist/esm/principalCan/permissionSet.js.map +1 -0
- package/dist/esm/principalCan/principalCan.d.ts +26 -0
- package/dist/esm/principalCan/principalCan.d.ts.map +1 -0
- package/dist/esm/principalCan/principalCan.js +193 -0
- package/dist/esm/principalCan/principalCan.js.map +1 -0
- package/dist/esm/principalCan/principalConstraints.d.ts +147 -0
- package/dist/esm/principalCan/principalConstraints.d.ts.map +1 -0
- package/dist/esm/principalCan/principalConstraints.js +456 -0
- package/dist/esm/principalCan/principalConstraints.js.map +1 -0
- package/dist/esm/principalCan/resources/actions.d.ts +9 -0
- package/dist/esm/principalCan/resources/actions.d.ts.map +1 -0
- package/dist/esm/principalCan/resources/actions.js +24 -0
- package/dist/esm/principalCan/resources/actions.js.map +1 -0
- package/dist/esm/principalCan/resources/resourceTypes/iamRoles.d.ts +31 -0
- package/dist/esm/principalCan/resources/resourceTypes/iamRoles.d.ts.map +1 -0
- package/dist/esm/principalCan/resources/resourceTypes/iamRoles.js +110 -0
- package/dist/esm/principalCan/resources/resourceTypes/iamRoles.js.map +1 -0
- package/dist/esm/principalCan/resources/resourceTypes/kmsKeys.d.ts +30 -0
- package/dist/esm/principalCan/resources/resourceTypes/kmsKeys.d.ts.map +1 -0
- package/dist/esm/principalCan/resources/resourceTypes/kmsKeys.js +106 -0
- package/dist/esm/principalCan/resources/resourceTypes/kmsKeys.js.map +1 -0
- package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.d.ts +18 -0
- package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.d.ts.map +1 -0
- package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.js +120 -0
- package/dist/esm/principalCan/resources/resourceTypes/s3Buckets.js.map +1 -0
- package/dist/esm/principalCan/resources/statements.d.ts +27 -0
- package/dist/esm/principalCan/resources/statements.d.ts.map +1 -0
- package/dist/esm/principalCan/resources/statements.js +117 -0
- package/dist/esm/principalCan/resources/statements.js.map +1 -0
- package/dist/esm/principalIndex/makePrincipalIndex.d.ts +8 -0
- package/dist/esm/principalIndex/makePrincipalIndex.d.ts.map +1 -0
- package/dist/esm/principalIndex/makePrincipalIndex.js +104 -0
- package/dist/esm/principalIndex/makePrincipalIndex.js.map +1 -0
- package/dist/esm/principals.d.ts +54 -0
- package/dist/esm/principals.d.ts.map +1 -0
- package/dist/esm/principals.js +133 -0
- package/dist/esm/principals.js.map +1 -0
- package/dist/esm/resources.d.ts +32 -0
- package/dist/esm/resources.d.ts.map +1 -0
- package/dist/esm/resources.js +69 -0
- package/dist/esm/resources.js.map +1 -0
- package/dist/esm/simulate/contextKeys.d.ts +68 -0
- package/dist/esm/simulate/contextKeys.d.ts.map +1 -0
- package/dist/esm/simulate/contextKeys.js +287 -0
- package/dist/esm/simulate/contextKeys.js.map +1 -0
- package/dist/esm/simulate/simulate.d.ts +72 -0
- package/dist/esm/simulate/simulate.d.ts.map +1 -0
- package/dist/esm/simulate/simulate.js +295 -0
- package/dist/esm/simulate/simulate.js.map +1 -0
- package/dist/esm/test-datasets/testClient.d.ts +17 -0
- package/dist/esm/test-datasets/testClient.d.ts.map +1 -0
- package/dist/esm/test-datasets/testClient.js +56 -0
- package/dist/esm/test-datasets/testClient.js.map +1 -0
- package/dist/esm/utils/arn.d.ts +22 -0
- package/dist/esm/utils/arn.d.ts.map +1 -0
- package/dist/esm/utils/arn.js +43 -0
- package/dist/esm/utils/arn.js.map +1 -0
- package/dist/esm/utils/bitset.d.ts +45 -0
- package/dist/esm/utils/bitset.d.ts.map +1 -0
- package/dist/esm/utils/bitset.js +141 -0
- package/dist/esm/utils/bitset.js.map +1 -0
- package/dist/esm/utils/dynamicImport.d.ts +31 -0
- package/dist/esm/utils/dynamicImport.d.ts.map +1 -0
- package/dist/esm/utils/dynamicImport.js +60 -0
- package/dist/esm/utils/dynamicImport.js.map +1 -0
- package/dist/esm/utils/packageVersion.d.ts +5 -0
- package/dist/esm/utils/packageVersion.d.ts.map +1 -0
- package/dist/esm/utils/packageVersion.js +22 -0
- package/dist/esm/utils/packageVersion.js.map +1 -0
- package/dist/esm/utils/readPackageFile.d.ts +3 -0
- package/dist/esm/utils/readPackageFile.d.ts.map +1 -0
- package/dist/esm/utils/readPackageFile.js +15 -0
- package/dist/esm/utils/readPackageFile.js.map +1 -0
- package/dist/esm/utils/readPackageFileEsm.d.ts.map +1 -0
- package/dist/esm/utils/s3Abac.d.ts +3 -0
- package/dist/esm/utils/s3Abac.d.ts.map +1 -0
- package/dist/esm/utils/s3Abac.js +2 -0
- package/dist/esm/utils/s3Abac.js.map +1 -0
- package/dist/esm/utils/stringOrFileArgument.d.ts +9 -0
- package/dist/esm/utils/stringOrFileArgument.d.ts.map +1 -0
- package/dist/esm/utils/stringOrFileArgument.js +22 -0
- package/dist/esm/utils/stringOrFileArgument.js.map +1 -0
- package/dist/esm/utils/sts.d.ts +2 -0
- package/dist/esm/utils/sts.d.ts.map +1 -0
- package/dist/esm/utils/sts.js +6 -0
- package/dist/esm/utils/sts.js.map +1 -0
- package/dist/esm/utils/testUtils.d.ts +56 -0
- package/dist/esm/utils/testUtils.d.ts.map +1 -0
- package/dist/esm/utils/testUtils.js +90 -0
- package/dist/esm/utils/testUtils.js.map +1 -0
- package/dist/esm/utils/workerScript.d.ts +8 -0
- package/dist/esm/utils/workerScript.d.ts.map +1 -0
- package/dist/esm/utils/workerScript.js +18 -0
- package/dist/esm/utils/workerScript.js.map +1 -0
- package/dist/esm/utils/workerScriptEsm.d.ts.map +1 -0
- package/dist/esm/whoCan/WhoCanMainThreadWorker.d.ts +73 -0
- package/dist/esm/whoCan/WhoCanMainThreadWorker.d.ts.map +1 -0
- package/dist/esm/whoCan/WhoCanMainThreadWorker.js +81 -0
- package/dist/esm/whoCan/WhoCanMainThreadWorker.js.map +1 -0
- package/dist/esm/whoCan/WhoCanProcessor.d.ts +400 -0
- package/dist/esm/whoCan/WhoCanProcessor.d.ts.map +1 -0
- package/dist/esm/whoCan/WhoCanProcessor.js +1080 -0
- package/dist/esm/whoCan/WhoCanProcessor.js.map +1 -0
- package/dist/esm/whoCan/WhoCanWorker.d.ts +87 -0
- package/dist/esm/whoCan/WhoCanWorker.d.ts.map +1 -0
- package/dist/esm/whoCan/WhoCanWorker.js +198 -0
- package/dist/esm/whoCan/WhoCanWorker.js.map +1 -0
- package/dist/esm/whoCan/WhoCanWorkerThreadWorker.d.ts +2 -0
- package/dist/esm/whoCan/WhoCanWorkerThreadWorker.d.ts.map +1 -0
- package/dist/esm/whoCan/WhoCanWorkerThreadWorker.js +193 -0
- package/dist/esm/whoCan/WhoCanWorkerThreadWorker.js.map +1 -0
- package/dist/esm/whoCan/principalArnFilter.d.ts +84 -0
- package/dist/esm/whoCan/principalArnFilter.d.ts.map +1 -0
- package/dist/esm/whoCan/principalArnFilter.js +253 -0
- package/dist/esm/whoCan/principalArnFilter.js.map +1 -0
- package/dist/esm/whoCan/principalScope.d.ts +35 -0
- package/dist/esm/whoCan/principalScope.d.ts.map +1 -0
- package/dist/esm/whoCan/principalScope.js +102 -0
- package/dist/esm/whoCan/principalScope.js.map +1 -0
- package/dist/esm/whoCan/requestAnalysis.d.ts +73 -0
- package/dist/esm/whoCan/requestAnalysis.d.ts.map +1 -0
- package/dist/esm/whoCan/requestAnalysis.js +83 -0
- package/dist/esm/whoCan/requestAnalysis.js.map +1 -0
- package/dist/esm/whoCan/untrustingActions.d.ts +7 -0
- package/dist/esm/whoCan/untrustingActions.d.ts.map +1 -0
- package/dist/esm/whoCan/untrustingActions.js +27 -0
- package/dist/esm/whoCan/untrustingActions.js.map +1 -0
- package/dist/esm/whoCan/whoCan.d.ts +295 -0
- package/dist/esm/whoCan/whoCan.d.ts.map +1 -0
- package/dist/esm/whoCan/whoCan.js +571 -0
- package/dist/esm/whoCan/whoCan.js.map +1 -0
- package/dist/esm/whoCan/workerBootstrapPlugin.d.ts +17 -0
- package/dist/esm/whoCan/workerBootstrapPlugin.d.ts.map +1 -0
- package/dist/esm/whoCan/workerBootstrapPlugin.js +2 -0
- package/dist/esm/whoCan/workerBootstrapPlugin.js.map +1 -0
- package/dist/esm/workers/ArrayStreamingWorkQueue.d.ts +15 -0
- package/dist/esm/workers/ArrayStreamingWorkQueue.d.ts.map +1 -0
- package/dist/esm/workers/ArrayStreamingWorkQueue.js +31 -0
- package/dist/esm/workers/ArrayStreamingWorkQueue.js.map +1 -0
- package/dist/esm/workers/JobRunner.d.ts +47 -0
- package/dist/esm/workers/JobRunner.d.ts.map +1 -0
- package/dist/esm/workers/JobRunner.js +94 -0
- package/dist/esm/workers/JobRunner.js.map +1 -0
- package/dist/esm/workers/RingQueue.d.ts +14 -0
- package/dist/esm/workers/RingQueue.d.ts.map +1 -0
- package/dist/esm/workers/RingQueue.js +36 -0
- package/dist/esm/workers/RingQueue.js.map +1 -0
- package/dist/esm/workers/SharedArrayBufferMainCache.d.ts +10 -0
- package/dist/esm/workers/SharedArrayBufferMainCache.d.ts.map +1 -0
- package/dist/esm/workers/SharedArrayBufferMainCache.js +34 -0
- package/dist/esm/workers/SharedArrayBufferMainCache.js.map +1 -0
- package/dist/esm/workers/SharedArrayBufferWorkerCache.d.ts +10 -0
- package/dist/esm/workers/SharedArrayBufferWorkerCache.d.ts.map +1 -0
- package/dist/esm/workers/SharedArrayBufferWorkerCache.js +46 -0
- package/dist/esm/workers/SharedArrayBufferWorkerCache.js.map +1 -0
- package/dist/esm/workers/StreamingWorkQueue.d.ts +18 -0
- package/dist/esm/workers/StreamingWorkQueue.d.ts.map +1 -0
- package/dist/esm/workers/StreamingWorkQueue.js +61 -0
- package/dist/esm/workers/StreamingWorkQueue.js.map +1 -0
- package/dist/esm/workers/buffers.d.ts +4 -0
- package/dist/esm/workers/buffers.d.ts.map +1 -0
- package/dist/esm/workers/buffers.js +21 -0
- package/dist/esm/workers/buffers.js.map +1 -0
- package/package.json +132 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An action-scoped set of principal ARN patterns extracted from a Deny statement.
|
|
3
|
+
* The patterns only apply when the action being simulated matches one of the
|
|
4
|
+
* entry's action patterns.
|
|
5
|
+
*/
|
|
6
|
+
export interface DenyFilterEntry {
|
|
7
|
+
/** Action patterns from the deny statement (e.g., 'secretsmanager:GetSecretValue', 's3:*'). */
|
|
8
|
+
actionPatterns: string[];
|
|
9
|
+
/** Principal ARN patterns extracted from the condition. */
|
|
10
|
+
principalPatterns: RegExp[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A pre-simulation filter that uses aws:PrincipalArn condition patterns
|
|
14
|
+
* from a resource policy to skip principals that cannot possibly be allowed.
|
|
15
|
+
*/
|
|
16
|
+
export interface PrincipalArnFilter {
|
|
17
|
+
/**
|
|
18
|
+
* Allow patterns extracted from resource policy Allow statements.
|
|
19
|
+
* If non-empty, a principal must match at least one pattern to be
|
|
20
|
+
* worth simulating.
|
|
21
|
+
*/
|
|
22
|
+
allowPatterns: RegExp[];
|
|
23
|
+
/**
|
|
24
|
+
* From Deny statements with negative operators (StringNotLike, etc.).
|
|
25
|
+
* For each entry, if the simulation action matches one of the entry's
|
|
26
|
+
* action patterns, the principal must match at least one of the entry's
|
|
27
|
+
* principal patterns to be worth simulating.
|
|
28
|
+
*/
|
|
29
|
+
denyDerivedAllowEntries: DenyFilterEntry[];
|
|
30
|
+
/**
|
|
31
|
+
* From Deny statements with positive operators (StringLike, etc.).
|
|
32
|
+
* For each entry, if the simulation action matches one of the entry's
|
|
33
|
+
* action patterns AND the principal matches one of the entry's principal
|
|
34
|
+
* patterns, the simulation can be skipped (the principal is explicitly denied).
|
|
35
|
+
*/
|
|
36
|
+
denyEntries: DenyFilterEntry[];
|
|
37
|
+
/**
|
|
38
|
+
* Account IDs that are explicitly named as account principals in the
|
|
39
|
+
* resource policy's Allow statements. Principals in these accounts
|
|
40
|
+
* must bypass the filter because the account-level principal grant
|
|
41
|
+
* is independent of any PrincipalArn conditions on wildcard statements.
|
|
42
|
+
*/
|
|
43
|
+
exemptAccounts: Set<string>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Converts an IAM wildcard pattern to a case-sensitive anchored RegExp.
|
|
47
|
+
* Handles `*` (any characters) and `?` (single character) wildcards.
|
|
48
|
+
* Does not handle replacement variables — callers must ensure patterns
|
|
49
|
+
* with variables are excluded before calling this.
|
|
50
|
+
*
|
|
51
|
+
* @param pattern the IAM pattern string (e.g. `arn:aws:iam::*:role/ec2/*`)
|
|
52
|
+
* @returns an anchored case-sensitive RegExp
|
|
53
|
+
*/
|
|
54
|
+
export declare function iamPatternToRegex(pattern: string): RegExp;
|
|
55
|
+
/**
|
|
56
|
+
* Builds a PrincipalArnFilter from a resource policy by extracting
|
|
57
|
+
* aws:PrincipalArn patterns from Allow statements with wildcard principals.
|
|
58
|
+
*
|
|
59
|
+
* The filter is only constructed if **every** wildcard-Allow statement has
|
|
60
|
+
* a usable aws:PrincipalArn condition. If any wildcard-Allow statement lacks
|
|
61
|
+
* one, the filter cannot safely exclude principals and undefined is returned.
|
|
62
|
+
*
|
|
63
|
+
* @param resourcePolicy the raw resource policy document, or undefined/null if none
|
|
64
|
+
* @returns a PrincipalArnFilter if filtering is possible, undefined otherwise
|
|
65
|
+
*/
|
|
66
|
+
export declare function buildPrincipalArnFilter(resourcePolicy: any): PrincipalArnFilter | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Tests whether a principal ARN passes the PrincipalArnFilter for a given action.
|
|
69
|
+
*
|
|
70
|
+
* Principals in the resource account or an exempt account bypass the positive
|
|
71
|
+
* allow-side filtering (allow patterns and deny-derived allow entries) because
|
|
72
|
+
* they may be granted access through account-level principal grants independent
|
|
73
|
+
* of any PrincipalArn conditions. However, they are still subject to deny-side
|
|
74
|
+
* filtering (deny entries) because an explicit deny in a resource policy applies
|
|
75
|
+
* regardless of the principal's account.
|
|
76
|
+
*
|
|
77
|
+
* @param principal the principal ARN to test
|
|
78
|
+
* @param action the action being simulated
|
|
79
|
+
* @param resourceAccount the account that owns the resource being checked
|
|
80
|
+
* @param filter the filter to apply
|
|
81
|
+
* @returns true if the principal should be simulated, false if it can be skipped
|
|
82
|
+
*/
|
|
83
|
+
export declare function principalMatchesFilter(principal: string, action: string, resourceAccount: string, filter: PrincipalArnFilter): boolean;
|
|
84
|
+
//# sourceMappingURL=principalArnFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principalArnFilter.d.ts","sourceRoot":"","sources":["../../../src/whoCan/principalArnFilter.ts"],"names":[],"mappings":"AAkCA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,+FAA+F;IAC/F,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,2DAA2D;IAC3D,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,aAAa,EAAE,MAAM,EAAE,CAAA;IAEvB;;;;;OAKG;IACH,uBAAuB,EAAE,eAAe,EAAE,CAAA;IAE1C;;;;;OAKG;IACH,WAAW,EAAE,eAAe,EAAE,CAAA;IAE9B;;;;;OAKG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIzD;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,GAAG,GAAG,kBAAkB,GAAG,SAAS,CA6I3F;AAcD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CA+BT"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.iamPatternToRegex = iamPatternToRegex;
|
|
4
|
+
exports.buildPrincipalArnFilter = buildPrincipalArnFilter;
|
|
5
|
+
exports.principalMatchesFilter = principalMatchesFilter;
|
|
6
|
+
const iam_policy_1 = require("@actsecurity/iam-policy");
|
|
7
|
+
const iam_utils_1 = require("@actsecurity/iam-utils");
|
|
8
|
+
/**
|
|
9
|
+
* Set of condition operators that can be used with aws:PrincipalArn to
|
|
10
|
+
* constrain which principals are allowed. These are the base operators
|
|
11
|
+
* (lowercase) without set modifiers or IfExists.
|
|
12
|
+
*/
|
|
13
|
+
const ALLOW_PRINCIPAL_ARN_OPERATORS = new Set([
|
|
14
|
+
'stringlike',
|
|
15
|
+
'stringequals',
|
|
16
|
+
'arnlike',
|
|
17
|
+
'arnequals'
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Negative condition operators on `aws:PrincipalArn` in Deny statements.
|
|
21
|
+
* The deny applies to principals NOT matching the patterns, so the patterns
|
|
22
|
+
* become an allow-list (only those principals are worth simulating).
|
|
23
|
+
*/
|
|
24
|
+
const DENY_NEGATIVE_OPERATORS = new Set([
|
|
25
|
+
'stringnotlike',
|
|
26
|
+
'stringnotequals',
|
|
27
|
+
'arnnotlike',
|
|
28
|
+
'arnnotequals'
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Positive condition operators on `aws:PrincipalArn` in Deny statements.
|
|
32
|
+
* The deny applies to principals matching the patterns, so those principals
|
|
33
|
+
* can be skipped for the deny statement's actions.
|
|
34
|
+
*/
|
|
35
|
+
const DENY_POSITIVE_OPERATORS = new Set(['stringlike', 'stringequals', 'arnlike', 'arnequals']);
|
|
36
|
+
/**
|
|
37
|
+
* Converts an IAM wildcard pattern to a case-sensitive anchored RegExp.
|
|
38
|
+
* Handles `*` (any characters) and `?` (single character) wildcards.
|
|
39
|
+
* Does not handle replacement variables — callers must ensure patterns
|
|
40
|
+
* with variables are excluded before calling this.
|
|
41
|
+
*
|
|
42
|
+
* @param pattern the IAM pattern string (e.g. `arn:aws:iam::*:role/ec2/*`)
|
|
43
|
+
* @returns an anchored case-sensitive RegExp
|
|
44
|
+
*/
|
|
45
|
+
function iamPatternToRegex(pattern) {
|
|
46
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
47
|
+
const withWildcards = escaped.replace(/\*/g, '.*').replace(/\?/g, '.');
|
|
48
|
+
return new RegExp(`^${withWildcards}$`);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Checks whether any value in an array contains a replacement variable (`${...}`).
|
|
52
|
+
*
|
|
53
|
+
* @param values the condition values to check
|
|
54
|
+
* @returns true if any value contains a replacement variable
|
|
55
|
+
*/
|
|
56
|
+
function hasAnyReplacementVariable(values) {
|
|
57
|
+
return values.some((v) => v.includes('${'));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Builds a PrincipalArnFilter from a resource policy by extracting
|
|
61
|
+
* aws:PrincipalArn patterns from Allow statements with wildcard principals.
|
|
62
|
+
*
|
|
63
|
+
* The filter is only constructed if **every** wildcard-Allow statement has
|
|
64
|
+
* a usable aws:PrincipalArn condition. If any wildcard-Allow statement lacks
|
|
65
|
+
* one, the filter cannot safely exclude principals and undefined is returned.
|
|
66
|
+
*
|
|
67
|
+
* @param resourcePolicy the raw resource policy document, or undefined/null if none
|
|
68
|
+
* @returns a PrincipalArnFilter if filtering is possible, undefined otherwise
|
|
69
|
+
*/
|
|
70
|
+
function buildPrincipalArnFilter(resourcePolicy) {
|
|
71
|
+
if (!resourcePolicy) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const policy = (0, iam_policy_1.loadPolicy)(resourcePolicy);
|
|
75
|
+
const allAllowPatterns = [];
|
|
76
|
+
const exemptAccounts = new Set();
|
|
77
|
+
let hasAnyWildcardAllow = false;
|
|
78
|
+
for (const statement of policy.statements()) {
|
|
79
|
+
if (!statement.isAllow()) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Check if this Allow statement has a wildcard principal, and collect
|
|
83
|
+
// explicit account principals whose accounts should be exempt from filtering
|
|
84
|
+
let hasWildcardPrincipal = false;
|
|
85
|
+
if (statement.isPrincipalStatement()) {
|
|
86
|
+
for (const principal of statement.principals()) {
|
|
87
|
+
if (principal.isWildcardPrincipal()) {
|
|
88
|
+
hasWildcardPrincipal = true;
|
|
89
|
+
}
|
|
90
|
+
else if (principal.isAccountPrincipal()) {
|
|
91
|
+
exemptAccounts.add(principal.accountId());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (statement.isNotPrincipalStatement()) {
|
|
96
|
+
// NotPrincipal Allow effectively allows everyone except the named principals,
|
|
97
|
+
// so it acts like a wildcard — we can't filter
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
if (!hasWildcardPrincipal) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
hasAnyWildcardAllow = true;
|
|
104
|
+
// Look for aws:PrincipalArn conditions with supported operators
|
|
105
|
+
let statementHasUsableFilter = false;
|
|
106
|
+
const conditions = statement.conditions();
|
|
107
|
+
for (const cond of conditions) {
|
|
108
|
+
if (cond.conditionKey().toLowerCase() !== 'aws:principalarn') {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const baseOp = cond.operation().baseOperator().toLowerCase();
|
|
112
|
+
if (!ALLOW_PRINCIPAL_ARN_OPERATORS.has(baseOp)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const values = cond.conditionValues();
|
|
116
|
+
// If any value has a replacement variable, ignore the entire condition
|
|
117
|
+
if (hasAnyReplacementVariable(values)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// All values count as a usable filter for the statement — even literal
|
|
121
|
+
// ARNs constrain which principals can match. However, only wildcard
|
|
122
|
+
// values are added as filter patterns; literal ARNs are already handled
|
|
123
|
+
// as specific principals by accountsToCheckBasedOnResourcePolicy.
|
|
124
|
+
for (const value of values) {
|
|
125
|
+
statementHasUsableFilter = true;
|
|
126
|
+
if (value.includes('*') || value.includes('?')) {
|
|
127
|
+
allAllowPatterns.push(iamPatternToRegex(value));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// If this wildcard-Allow has no usable PrincipalArn condition,
|
|
132
|
+
// it could allow any principal — filtering is not safe
|
|
133
|
+
if (!statementHasUsableFilter) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// --- Deny statement extraction ---
|
|
138
|
+
const denyDerivedAllowEntries = [];
|
|
139
|
+
const denyEntries = [];
|
|
140
|
+
for (const statement of policy.statements()) {
|
|
141
|
+
if (statement.isAllow())
|
|
142
|
+
continue;
|
|
143
|
+
if (!statement.isActionStatement())
|
|
144
|
+
continue;
|
|
145
|
+
if (statement.isNotResourceStatement())
|
|
146
|
+
continue;
|
|
147
|
+
if (statement.isNotPrincipalStatement())
|
|
148
|
+
continue;
|
|
149
|
+
// Must have a wildcard principal
|
|
150
|
+
let hasWildcardPrincipal = false;
|
|
151
|
+
if (statement.isPrincipalStatement()) {
|
|
152
|
+
for (const principal of statement.principals()) {
|
|
153
|
+
if (principal.isWildcardPrincipal()) {
|
|
154
|
+
hasWildcardPrincipal = true;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (!hasWildcardPrincipal)
|
|
160
|
+
continue;
|
|
161
|
+
// Resource must include '*' or be non-existent
|
|
162
|
+
if (statement.isResourceStatement()) {
|
|
163
|
+
if (!statement.resources().some((r) => r.isAllResources()))
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
// Must have exactly one condition and it must be aws:PrincipalArn
|
|
167
|
+
const conditions = statement.conditions();
|
|
168
|
+
if (conditions.length !== 1)
|
|
169
|
+
continue;
|
|
170
|
+
const cond = conditions[0];
|
|
171
|
+
if (cond.conditionKey().toLowerCase() !== 'aws:principalarn')
|
|
172
|
+
continue;
|
|
173
|
+
if (cond.operation().isIfExists())
|
|
174
|
+
continue;
|
|
175
|
+
const values = cond.conditionValues();
|
|
176
|
+
if (hasAnyReplacementVariable(values))
|
|
177
|
+
continue;
|
|
178
|
+
const baseOp = cond.operation().baseOperator().toLowerCase();
|
|
179
|
+
const actionPatterns = statement.actions().map((a) => a.value());
|
|
180
|
+
const principalPatterns = values.map(iamPatternToRegex);
|
|
181
|
+
if (DENY_NEGATIVE_OPERATORS.has(baseOp)) {
|
|
182
|
+
denyDerivedAllowEntries.push({ actionPatterns, principalPatterns });
|
|
183
|
+
}
|
|
184
|
+
else if (DENY_POSITIVE_OPERATORS.has(baseOp)) {
|
|
185
|
+
denyEntries.push({ actionPatterns, principalPatterns });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Return a filter if there's anything useful
|
|
189
|
+
const hasAllowPatterns = hasAnyWildcardAllow && allAllowPatterns.length > 0;
|
|
190
|
+
const hasDenyInfo = denyDerivedAllowEntries.length > 0 || denyEntries.length > 0;
|
|
191
|
+
if (!hasAllowPatterns && !hasDenyInfo) {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
allowPatterns: hasAllowPatterns ? allAllowPatterns : [],
|
|
196
|
+
denyDerivedAllowEntries,
|
|
197
|
+
denyEntries,
|
|
198
|
+
exemptAccounts
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Checks whether an action matches any of the given action patterns using
|
|
203
|
+
* IAM wildcard semantics.
|
|
204
|
+
*
|
|
205
|
+
* @param action the action being simulated (e.g., 'secretsmanager:GetSecretValue')
|
|
206
|
+
* @param patterns the action patterns from a deny statement
|
|
207
|
+
* @returns true if the action matches at least one pattern
|
|
208
|
+
*/
|
|
209
|
+
function actionMatchesAnyPattern(action, patterns) {
|
|
210
|
+
return patterns.some((pattern) => (0, iam_utils_1.actionMatchesPattern)(action, pattern));
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Tests whether a principal ARN passes the PrincipalArnFilter for a given action.
|
|
214
|
+
*
|
|
215
|
+
* Principals in the resource account or an exempt account bypass the positive
|
|
216
|
+
* allow-side filtering (allow patterns and deny-derived allow entries) because
|
|
217
|
+
* they may be granted access through account-level principal grants independent
|
|
218
|
+
* of any PrincipalArn conditions. However, they are still subject to deny-side
|
|
219
|
+
* filtering (deny entries) because an explicit deny in a resource policy applies
|
|
220
|
+
* regardless of the principal's account.
|
|
221
|
+
*
|
|
222
|
+
* @param principal the principal ARN to test
|
|
223
|
+
* @param action the action being simulated
|
|
224
|
+
* @param resourceAccount the account that owns the resource being checked
|
|
225
|
+
* @param filter the filter to apply
|
|
226
|
+
* @returns true if the principal should be simulated, false if it can be skipped
|
|
227
|
+
*/
|
|
228
|
+
function principalMatchesFilter(principal, action, resourceAccount, filter) {
|
|
229
|
+
const accountId = (0, iam_utils_1.splitArnParts)(principal).accountId;
|
|
230
|
+
const isExempt = accountId === resourceAccount || filter.exemptAccounts.has(accountId ?? '');
|
|
231
|
+
// Allow patterns from Allow statements: exempt principals bypass this check
|
|
232
|
+
// because they may be granted access through account-level principal grants
|
|
233
|
+
// independent of any PrincipalArn conditions on wildcard statements.
|
|
234
|
+
if (!isExempt && filter.allowPatterns.length > 0) {
|
|
235
|
+
if (!filter.allowPatterns.some((pattern) => pattern.test(principal)))
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
// Deny-derived filtering applies to ALL principals regardless of account.
|
|
239
|
+
// An explicit deny in a resource policy applies universally.
|
|
240
|
+
// For each deny-derived allow entry whose actions match,
|
|
241
|
+
// the principal must match at least one principal pattern
|
|
242
|
+
for (const entry of filter.denyDerivedAllowEntries) {
|
|
243
|
+
if (actionMatchesAnyPattern(action, entry.actionPatterns)) {
|
|
244
|
+
if (!entry.principalPatterns.some((p) => p.test(principal)))
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// For each deny entry whose actions match,
|
|
249
|
+
// skip if the principal matches any principal pattern
|
|
250
|
+
for (const entry of filter.denyEntries) {
|
|
251
|
+
if (actionMatchesAnyPattern(action, entry.actionPatterns)) {
|
|
252
|
+
if (entry.principalPatterns.some((p) => p.test(principal)))
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=principalArnFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principalArnFilter.js","sourceRoot":"","sources":["../../../src/whoCan/principalArnFilter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { IamCollectClient } from '../collect/client.js';
|
|
2
|
+
import { type WhoCanPrincipalScope } from './whoCan.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a `WhoCanPrincipalScope` into concrete sets of account IDs and principal ARNs
|
|
5
|
+
* using the collect client for OU lookups.
|
|
6
|
+
*
|
|
7
|
+
* `scope.principals` are kept separate from `scope.accounts` — a scope like
|
|
8
|
+
* `{ principals: ['arn:...:role/Foo'] }` tests only that one role and does NOT
|
|
9
|
+
* expand to search every principal in Foo's account.
|
|
10
|
+
*
|
|
11
|
+
* @param client The collect client used to resolve OU paths to account IDs.
|
|
12
|
+
* @param scope The principal scope to resolve.
|
|
13
|
+
* @returns An object with `accounts` and `principals` sets.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolvePrincipalScope(client: IamCollectClient, scope: WhoCanPrincipalScope): Promise<{
|
|
16
|
+
accounts: Set<string>;
|
|
17
|
+
principals: Set<string>;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Intersects the resource-policy-derived scope with a caller-supplied principal scope.
|
|
21
|
+
* Returns the narrowed set of accounts (for full-account search) and principals
|
|
22
|
+
* (for individual principal testing).
|
|
23
|
+
*
|
|
24
|
+
* @param resourcePolicyAccounts Account IDs derived from the resource policy.
|
|
25
|
+
* @param resourcePolicyPrincipals Individual principal ARNs derived from the resource policy.
|
|
26
|
+
* @param resourcePolicyCheckAllAccounts Whether the resource policy implies all accounts should be checked.
|
|
27
|
+
* @param scopeAccounts Account IDs from the resolved principal scope.
|
|
28
|
+
* @param suggestedPrincipals Principal ARNs from the resolved principal scope.
|
|
29
|
+
* @returns The intersected accounts and principals to search.
|
|
30
|
+
*/
|
|
31
|
+
export declare function intersectWithPrincipalScope(resourcePolicyAccounts: string[], resourcePolicyPrincipals: string[], resourcePolicyCheckAllAccounts: boolean, scopeAccounts: Set<string>, scopePrincipals: Set<string>): {
|
|
32
|
+
accounts: string[];
|
|
33
|
+
principals: string[];
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=principalScope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principalScope.d.ts","sourceRoot":"","sources":["../../../src/whoCan/principalScope.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEvD;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC;IAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,CAuB7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,sBAAsB,EAAE,MAAM,EAAE,EAChC,wBAAwB,EAAE,MAAM,EAAE,EAClC,8BAA8B,EAAE,OAAO,EACvC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAC1B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAC3B;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAwD9C"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolvePrincipalScope = resolvePrincipalScope;
|
|
4
|
+
exports.intersectWithPrincipalScope = intersectWithPrincipalScope;
|
|
5
|
+
const iam_utils_1 = require("@actsecurity/iam-utils");
|
|
6
|
+
/**
|
|
7
|
+
* Resolves a `WhoCanPrincipalScope` into concrete sets of account IDs and principal ARNs
|
|
8
|
+
* using the collect client for OU lookups.
|
|
9
|
+
*
|
|
10
|
+
* `scope.principals` are kept separate from `scope.accounts` — a scope like
|
|
11
|
+
* `{ principals: ['arn:...:role/Foo'] }` tests only that one role and does NOT
|
|
12
|
+
* expand to search every principal in Foo's account.
|
|
13
|
+
*
|
|
14
|
+
* @param client The collect client used to resolve OU paths to account IDs.
|
|
15
|
+
* @param scope The principal scope to resolve.
|
|
16
|
+
* @returns An object with `accounts` and `principals` sets.
|
|
17
|
+
*/
|
|
18
|
+
async function resolvePrincipalScope(client, scope) {
|
|
19
|
+
const accounts = new Set();
|
|
20
|
+
const principals = new Set();
|
|
21
|
+
for (const p of scope.principals ?? []) {
|
|
22
|
+
principals.add(p);
|
|
23
|
+
}
|
|
24
|
+
for (const a of scope.accounts ?? []) {
|
|
25
|
+
accounts.add(a);
|
|
26
|
+
}
|
|
27
|
+
for (const ouPath of scope.ous ?? []) {
|
|
28
|
+
const parts = ouPath.split('/');
|
|
29
|
+
const orgId = parts[0];
|
|
30
|
+
const pathParts = parts.slice(1);
|
|
31
|
+
const [, ouAccounts] = await client.getAccountsForOrgPath(orgId, pathParts);
|
|
32
|
+
for (const a of ouAccounts) {
|
|
33
|
+
accounts.add(a);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { accounts, principals };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Intersects the resource-policy-derived scope with a caller-supplied principal scope.
|
|
40
|
+
* Returns the narrowed set of accounts (for full-account search) and principals
|
|
41
|
+
* (for individual principal testing).
|
|
42
|
+
*
|
|
43
|
+
* @param resourcePolicyAccounts Account IDs derived from the resource policy.
|
|
44
|
+
* @param resourcePolicyPrincipals Individual principal ARNs derived from the resource policy.
|
|
45
|
+
* @param resourcePolicyCheckAllAccounts Whether the resource policy implies all accounts should be checked.
|
|
46
|
+
* @param scopeAccounts Account IDs from the resolved principal scope.
|
|
47
|
+
* @param suggestedPrincipals Principal ARNs from the resolved principal scope.
|
|
48
|
+
* @returns The intersected accounts and principals to search.
|
|
49
|
+
*/
|
|
50
|
+
function intersectWithPrincipalScope(resourcePolicyAccounts, resourcePolicyPrincipals, resourcePolicyCheckAllAccounts, scopeAccounts, scopePrincipals) {
|
|
51
|
+
// Accounts: intersection of resource policy accounts and scope accounts
|
|
52
|
+
const rpAccountSet = new Set(resourcePolicyAccounts);
|
|
53
|
+
const accounts = resourcePolicyCheckAllAccounts
|
|
54
|
+
? Array.from(scopeAccounts)
|
|
55
|
+
: resourcePolicyAccounts.filter((a) => scopeAccounts.has(a));
|
|
56
|
+
const accountsResultSet = new Set(accounts);
|
|
57
|
+
// Principals: merge from both sides, filtering by the other side's scope
|
|
58
|
+
const principalSet = new Set();
|
|
59
|
+
// From resource policy principals: keep if the principal's account is in scopeAccounts,
|
|
60
|
+
// OR the principal ARN is in scopePrincipals.
|
|
61
|
+
for (const p of resourcePolicyPrincipals) {
|
|
62
|
+
if ((0, iam_utils_1.isServicePrincipal)(p)) {
|
|
63
|
+
if (scopePrincipals.has(p)) {
|
|
64
|
+
principalSet.add(p);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const accountId = (0, iam_utils_1.splitArnParts)(p).accountId;
|
|
69
|
+
if (accountId && accountsResultSet.has(accountId)) {
|
|
70
|
+
// Account loop already covers this principal — skip
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (accountId && scopeAccounts.has(accountId)) {
|
|
74
|
+
principalSet.add(p);
|
|
75
|
+
}
|
|
76
|
+
else if (scopePrincipals.has(p)) {
|
|
77
|
+
principalSet.add(p);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const rpPrincipalSet = new Set(resourcePolicyPrincipals);
|
|
82
|
+
// From scope principals: keep if the principal's account is in resource policy accounts
|
|
83
|
+
// or resourcePolicyCheckAllAccounts is true. Exclude if account is already in accounts result.
|
|
84
|
+
// Service principals only survive if resourcePolicyCheckAllAccounts or the resource policy named them.
|
|
85
|
+
for (const p of scopePrincipals) {
|
|
86
|
+
if ((0, iam_utils_1.isServicePrincipal)(p)) {
|
|
87
|
+
if (resourcePolicyCheckAllAccounts || rpPrincipalSet.has(p)) {
|
|
88
|
+
principalSet.add(p);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const accountId = (0, iam_utils_1.splitArnParts)(p).accountId;
|
|
93
|
+
if (accountId && accountsResultSet.has(accountId)) {
|
|
94
|
+
// Account loop already covers this principal — skip
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (resourcePolicyCheckAllAccounts || (accountId && rpAccountSet.has(accountId))) {
|
|
98
|
+
principalSet.add(p);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return { accounts, principals: Array.from(principalSet) };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=principalScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principalScope.js","sourceRoot":"","sources":["../../../src/whoCan/principalScope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type BlockedReason, type EvaluationResult, type RequestAnalysis } from '@actsecurity/iam-simulate';
|
|
2
|
+
import type { DeniedWhoCanExecutionResultWithDetails } from './WhoCanWorker.js';
|
|
3
|
+
import type { WhoCanDenyDetail } from './whoCan.js';
|
|
4
|
+
/**
|
|
5
|
+
* A lightweight representation of RequestAnalysis containing only the result fields
|
|
6
|
+
* of the various policy analyses (identity, resource, SCP, RCP, permission boundary).
|
|
7
|
+
*/
|
|
8
|
+
export interface LightResourceAnalysis {
|
|
9
|
+
result: RequestAnalysis['result'];
|
|
10
|
+
sameAccount?: boolean;
|
|
11
|
+
identityAnalysis?: Pick<NonNullable<RequestAnalysis['identityAnalysis']>, 'result'>;
|
|
12
|
+
resourceAnalysis?: Pick<NonNullable<RequestAnalysis['resourceAnalysis']>, 'result'>;
|
|
13
|
+
scpAnalysis?: Pick<NonNullable<RequestAnalysis['scpAnalysis']>, 'result'>;
|
|
14
|
+
rcpAnalysis?: Pick<NonNullable<RequestAnalysis['rcpAnalysis']>, 'result'>;
|
|
15
|
+
permissionBoundaryAnalysis?: Pick<NonNullable<RequestAnalysis['permissionBoundaryAnalysis']>, 'result'>;
|
|
16
|
+
blockedBy: Set<BlockedReason>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A LightResourceAnalysis extended with resource pattern and type information.
|
|
20
|
+
* Used for wildcard resource analyses to provide details on each matched pattern.
|
|
21
|
+
*/
|
|
22
|
+
export interface LightResourceAnalysisWithPattern extends LightResourceAnalysis {
|
|
23
|
+
/**
|
|
24
|
+
* The specific resource pattern that was analyzed, most likely found in a policy statement's Resource field. This is used to provide more granular details in wildcard resource analyses, where multiple patterns may match the requested resource.
|
|
25
|
+
*/
|
|
26
|
+
pattern: string;
|
|
27
|
+
/**
|
|
28
|
+
* The resource type that was tested.
|
|
29
|
+
*/
|
|
30
|
+
resourceType: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A light request analysis for a single resource.
|
|
34
|
+
*/
|
|
35
|
+
export interface SingleResourceLightRequestAnalysis extends LightResourceAnalysis {
|
|
36
|
+
type: 'single';
|
|
37
|
+
overallResult: EvaluationResult;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* A light request analysis for a wildcard resource with multiple patterns.
|
|
41
|
+
* Used for wildcard resource analyses to provide details on each matched pattern.
|
|
42
|
+
*/
|
|
43
|
+
export interface WildcardResourceLightRequestAnalysis {
|
|
44
|
+
type: 'wildcard';
|
|
45
|
+
/**
|
|
46
|
+
* The overall result of the wildcard resource analysis, which is typically a combination of the results of the individual pattern analyses. This provides a high-level summary of whether the requested action is allowed or denied across all matched patterns, while the individual pattern analyses provide more granular details.
|
|
47
|
+
*/
|
|
48
|
+
overallResult: EvaluationResult;
|
|
49
|
+
/**
|
|
50
|
+
* The details of the analyses for each matched resource pattern/resource type pair.
|
|
51
|
+
*/
|
|
52
|
+
patterns: LightResourceAnalysisWithPattern[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A light version of RequestAnalysis containing only the result and sameAccount fields,
|
|
56
|
+
* along with the result fields of the various analyses.
|
|
57
|
+
*/
|
|
58
|
+
export type LightRequestAnalysis = SingleResourceLightRequestAnalysis | WildcardResourceLightRequestAnalysis;
|
|
59
|
+
/**
|
|
60
|
+
* Convert a full RequestAnalysis to a LightRequestAnalysis.
|
|
61
|
+
*
|
|
62
|
+
* @param executionResult - The denied execution result containing the RequestAnalysis to convert
|
|
63
|
+
* @returns A LightRequestAnalysis with only the essential fields
|
|
64
|
+
*/
|
|
65
|
+
export declare function toLightRequestAnalysis(executionResult: DeniedWhoCanExecutionResultWithDetails): LightRequestAnalysis;
|
|
66
|
+
/**
|
|
67
|
+
* Gets the denial reasons for a denied SimulationResult.
|
|
68
|
+
*
|
|
69
|
+
* @param executionResult - The denied execution result containing the RequestAnalysis with denial reasons
|
|
70
|
+
* @returns A WhoCanDenyDetail object containing the denial reasons and other details to be returned to the user
|
|
71
|
+
*/
|
|
72
|
+
export declare function convertToDenialDetails(executionResult: DeniedWhoCanExecutionResultWithDetails): WhoCanDenyDetail;
|
|
73
|
+
//# sourceMappingURL=requestAnalysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestAnalysis.d.ts","sourceRoot":"","sources":["../../../src/whoCan/requestAnalysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,mBAAmB,CAAA;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACjC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,gBAAgB,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACnF,gBAAgB,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACnF,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACzE,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACzE,0BAA0B,CAAC,EAAE,IAAI,CAC/B,WAAW,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAC,EAC1D,QAAQ,CACT,CAAA;IACD,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAA;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,gCAAiC,SAAQ,qBAAqB;IAC7E;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kCAAmC,SAAQ,qBAAqB;IAC/E,IAAI,EAAE,QAAQ,CAAA;IACd,aAAa,EAAE,gBAAgB,CAAA;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,oCAAoC;IACnD,IAAI,EAAE,UAAU,CAAA;IAEhB;;OAEG;IACH,aAAa,EAAE,gBAAgB,CAAA;IAE/B;;OAEG;IACH,QAAQ,EAAE,gCAAgC,EAAE,CAAA;CAC7C;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAC9B,kCAAkC,GAAG,oCAAoC,CAAA;AA2B3E;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,sCAAsC,GACtD,oBAAoB,CAqBtB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,sCAAsC,GACtD,gBAAgB,CA0BlB"}
|