@cloud-copilot/iam-simulate 0.1.12 → 0.1.14
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/dist/cjs/StatementAnalysis.d.ts +14 -0
- package/dist/cjs/StatementAnalysis.d.ts.map +1 -1
- package/dist/cjs/StatementAnalysis.js +51 -0
- package/dist/cjs/StatementAnalysis.js.map +1 -1
- package/dist/cjs/action/action.d.ts +13 -3
- package/dist/cjs/action/action.d.ts.map +1 -1
- package/dist/cjs/action/action.js +43 -21
- package/dist/cjs/action/action.js.map +1 -1
- package/dist/cjs/condition/BaseConditionOperator.d.ts +6 -1
- package/dist/cjs/condition/BaseConditionOperator.d.ts.map +1 -1
- package/dist/cjs/condition/arn/ArnEquals.d.ts.map +1 -1
- package/dist/cjs/condition/arn/ArnEquals.js +2 -1
- package/dist/cjs/condition/arn/ArnEquals.js.map +1 -1
- package/dist/cjs/condition/arn/ArnLike.d.ts.map +1 -1
- package/dist/cjs/condition/arn/ArnLike.js +8 -40
- package/dist/cjs/condition/arn/ArnLike.js.map +1 -1
- package/dist/cjs/condition/arn/ArnNotEquals.d.ts.map +1 -1
- package/dist/cjs/condition/arn/ArnNotEquals.js +2 -1
- package/dist/cjs/condition/arn/ArnNotEquals.js.map +1 -1
- package/dist/cjs/condition/arn/ArnNotLike.d.ts.map +1 -1
- package/dist/cjs/condition/arn/ArnNotLike.js +8 -3
- package/dist/cjs/condition/arn/ArnNotLike.js.map +1 -1
- package/dist/cjs/condition/arn/arn.d.ts +12 -0
- package/dist/cjs/condition/arn/arn.d.ts.map +1 -0
- package/dist/cjs/condition/arn/arn.js +68 -0
- package/dist/cjs/condition/arn/arn.js.map +1 -0
- package/dist/cjs/condition/baseConditionperatorTests.d.ts +7 -1
- package/dist/cjs/condition/baseConditionperatorTests.d.ts.map +1 -1
- package/dist/cjs/condition/baseConditionperatorTests.js +17 -1
- package/dist/cjs/condition/baseConditionperatorTests.js.map +1 -1
- package/dist/cjs/condition/binary/BinaryEquals.d.ts.map +1 -1
- package/dist/cjs/condition/binary/BinaryEquals.js +14 -2
- package/dist/cjs/condition/binary/BinaryEquals.js.map +1 -1
- package/dist/cjs/condition/boolean/Bool.d.ts.map +1 -1
- package/dist/cjs/condition/boolean/Bool.js +36 -7
- package/dist/cjs/condition/boolean/Bool.js.map +1 -1
- package/dist/cjs/condition/condition.d.ts +46 -3
- package/dist/cjs/condition/condition.d.ts.map +1 -1
- package/dist/cjs/condition/condition.js +242 -48
- package/dist/cjs/condition/condition.js.map +1 -1
- package/dist/cjs/condition/conditionUtil.d.ts +10 -0
- package/dist/cjs/condition/conditionUtil.d.ts.map +1 -0
- package/dist/cjs/condition/conditionUtil.js +16 -0
- package/dist/cjs/condition/conditionUtil.js.map +1 -0
- package/dist/cjs/condition/date/DateEquals.d.ts.map +1 -1
- package/dist/cjs/condition/date/DateEquals.js +7 -2
- package/dist/cjs/condition/date/DateEquals.js.map +1 -1
- package/dist/cjs/condition/date/DateGreaterThan.d.ts.map +1 -1
- package/dist/cjs/condition/date/DateGreaterThan.js +7 -2
- package/dist/cjs/condition/date/DateGreaterThan.js.map +1 -1
- package/dist/cjs/condition/date/DateGreaterThanEquals.d.ts.map +1 -1
- package/dist/cjs/condition/date/DateGreaterThanEquals.js +7 -2
- package/dist/cjs/condition/date/DateGreaterThanEquals.js.map +1 -1
- package/dist/cjs/condition/date/DateLessThan.d.ts.map +1 -1
- package/dist/cjs/condition/date/DateLessThan.js +7 -2
- package/dist/cjs/condition/date/DateLessThan.js.map +1 -1
- package/dist/cjs/condition/date/DateLessThanEquals.d.ts.map +1 -1
- package/dist/cjs/condition/date/DateLessThanEquals.js +7 -2
- package/dist/cjs/condition/date/DateLessThanEquals.js.map +1 -1
- package/dist/cjs/condition/date/DateNotEquals.d.ts.map +1 -1
- package/dist/cjs/condition/date/DateNotEquals.js +11 -18
- package/dist/cjs/condition/date/DateNotEquals.js.map +1 -1
- package/dist/cjs/condition/date/date.d.ts +2 -1
- package/dist/cjs/condition/date/date.d.ts.map +1 -1
- package/dist/cjs/condition/date/date.js +20 -5
- package/dist/cjs/condition/date/date.js.map +1 -1
- package/dist/cjs/condition/ipaddress/IpAddress.d.ts.map +1 -1
- package/dist/cjs/condition/ipaddress/IpAddress.js +9 -16
- package/dist/cjs/condition/ipaddress/IpAddress.js.map +1 -1
- package/dist/cjs/condition/ipaddress/NotIpAddress.d.ts.map +1 -1
- package/dist/cjs/condition/ipaddress/NotIpAddress.js +9 -20
- package/dist/cjs/condition/ipaddress/NotIpAddress.js.map +1 -1
- package/dist/cjs/condition/ipaddress/ip.d.ts +10 -0
- package/dist/cjs/condition/ipaddress/ip.d.ts.map +1 -0
- package/dist/cjs/condition/ipaddress/ip.js +57 -0
- package/dist/cjs/condition/ipaddress/ip.js.map +1 -0
- package/dist/cjs/condition/numeric/NumericEquals.d.ts.map +1 -1
- package/dist/cjs/condition/numeric/NumericEquals.js +7 -2
- package/dist/cjs/condition/numeric/NumericEquals.js.map +1 -1
- package/dist/cjs/condition/numeric/NumericGreaterThan.d.ts.map +1 -1
- package/dist/cjs/condition/numeric/NumericGreaterThan.js +7 -2
- package/dist/cjs/condition/numeric/NumericGreaterThan.js.map +1 -1
- package/dist/cjs/condition/numeric/NumericGreaterThanEquals.d.ts.map +1 -1
- package/dist/cjs/condition/numeric/NumericGreaterThanEquals.js +7 -2
- package/dist/cjs/condition/numeric/NumericGreaterThanEquals.js.map +1 -1
- package/dist/cjs/condition/numeric/NumericLessThan.d.ts.map +1 -1
- package/dist/cjs/condition/numeric/NumericLessThan.js +7 -2
- package/dist/cjs/condition/numeric/NumericLessThan.js.map +1 -1
- package/dist/cjs/condition/numeric/NumericLessThanEquals.d.ts.map +1 -1
- package/dist/cjs/condition/numeric/NumericLessThanEquals.js +7 -2
- package/dist/cjs/condition/numeric/NumericLessThanEquals.js.map +1 -1
- package/dist/cjs/condition/numeric/NumericNotEquals.d.ts.map +1 -1
- package/dist/cjs/condition/numeric/NumericNotEquals.js +11 -18
- package/dist/cjs/condition/numeric/NumericNotEquals.js.map +1 -1
- package/dist/cjs/condition/numeric/numeric.d.ts +2 -1
- package/dist/cjs/condition/numeric/numeric.d.ts.map +1 -1
- package/dist/cjs/condition/numeric/numeric.js +18 -3
- package/dist/cjs/condition/numeric/numeric.js.map +1 -1
- package/dist/cjs/condition/string/StringEquals.d.ts.map +1 -1
- package/dist/cjs/condition/string/StringEquals.js +24 -3
- package/dist/cjs/condition/string/StringEquals.js.map +1 -1
- package/dist/cjs/condition/string/StringEqualsIgnoreCase.d.ts.map +1 -1
- package/dist/cjs/condition/string/StringEqualsIgnoreCase.js +23 -5
- package/dist/cjs/condition/string/StringEqualsIgnoreCase.js.map +1 -1
- package/dist/cjs/condition/string/StringLike.d.ts.map +1 -1
- package/dist/cjs/condition/string/StringLike.js +24 -3
- package/dist/cjs/condition/string/StringLike.js.map +1 -1
- package/dist/cjs/condition/string/StringNotEquals.d.ts.map +1 -1
- package/dist/cjs/condition/string/StringNotEquals.js +24 -3
- package/dist/cjs/condition/string/StringNotEquals.js.map +1 -1
- package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.d.ts.map +1 -1
- package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.js +25 -3
- package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.js.map +1 -1
- package/dist/cjs/condition/string/StringNotLike.d.ts.map +1 -1
- package/dist/cjs/condition/string/StringNotLike.js +25 -3
- package/dist/cjs/condition/string/StringNotLike.js.map +1 -1
- package/dist/cjs/core_engine/coreSimulatorEngine.d.ts +10 -7
- package/dist/cjs/core_engine/coreSimulatorEngine.d.ts.map +1 -1
- package/dist/cjs/core_engine/coreSimulatorEngine.js +148 -28
- package/dist/cjs/core_engine/coreSimulatorEngine.js.map +1 -1
- package/dist/cjs/evaluate.d.ts +47 -0
- package/dist/cjs/evaluate.d.ts.map +1 -1
- package/dist/cjs/explain/displayExplainCli.d.ts +3 -0
- package/dist/cjs/explain/displayExplainCli.d.ts.map +1 -0
- package/dist/cjs/explain/displayExplainCli.js +249 -0
- package/dist/cjs/explain/displayExplainCli.js.map +1 -0
- package/dist/cjs/explain/statementExplain.d.ts +51 -0
- package/dist/cjs/explain/statementExplain.d.ts.map +1 -0
- package/dist/cjs/explain/statementExplain.js +7 -0
- package/dist/cjs/explain/statementExplain.js.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/principal/principal.d.ts +28 -6
- package/dist/cjs/principal/principal.d.ts.map +1 -1
- package/dist/cjs/principal/principal.js +146 -40
- package/dist/cjs/principal/principal.js.map +1 -1
- package/dist/cjs/resource/resource.d.ts +13 -3
- package/dist/cjs/resource/resource.d.ts.map +1 -1
- package/dist/cjs/resource/resource.js +68 -15
- package/dist/cjs/resource/resource.js.map +1 -1
- package/dist/cjs/services/DefaultServiceAuthorizer.d.ts +2 -34
- package/dist/cjs/services/DefaultServiceAuthorizer.d.ts.map +1 -1
- package/dist/cjs/services/DefaultServiceAuthorizer.js +95 -131
- package/dist/cjs/services/DefaultServiceAuthorizer.js.map +1 -1
- package/dist/cjs/services/ServiceAuthorizer.d.ts +6 -7
- package/dist/cjs/services/ServiceAuthorizer.d.ts.map +1 -1
- package/dist/cjs/simulation_engine/simulation.d.ts +4 -0
- package/dist/cjs/simulation_engine/simulation.d.ts.map +1 -1
- package/dist/cjs/simulation_engine/simulationEngine.d.ts +2 -4
- package/dist/cjs/simulation_engine/simulationEngine.d.ts.map +1 -1
- package/dist/cjs/simulation_engine/simulationEngine.js +16 -4
- package/dist/cjs/simulation_engine/simulationEngine.js.map +1 -1
- package/dist/cjs/simulation_engine/unsafeSimulationEngine.d.ts.map +1 -1
- package/dist/cjs/simulation_engine/unsafeSimulationEngine.js +5 -2
- package/dist/cjs/simulation_engine/unsafeSimulationEngine.js.map +1 -1
- package/dist/cjs/util.d.ts +31 -3
- package/dist/cjs/util.d.ts.map +1 -1
- package/dist/cjs/util.js +74 -32
- package/dist/cjs/util.js.map +1 -1
- package/dist/esm/StatementAnalysis.d.ts +14 -0
- package/dist/esm/StatementAnalysis.d.ts.map +1 -1
- package/dist/esm/StatementAnalysis.js +48 -1
- package/dist/esm/StatementAnalysis.js.map +1 -1
- package/dist/esm/action/action.d.ts +13 -3
- package/dist/esm/action/action.d.ts.map +1 -1
- package/dist/esm/action/action.js +43 -21
- package/dist/esm/action/action.js.map +1 -1
- package/dist/esm/condition/BaseConditionOperator.d.ts +6 -1
- package/dist/esm/condition/BaseConditionOperator.d.ts.map +1 -1
- package/dist/esm/condition/arn/ArnEquals.d.ts.map +1 -1
- package/dist/esm/condition/arn/ArnEquals.js +2 -1
- package/dist/esm/condition/arn/ArnEquals.js.map +1 -1
- package/dist/esm/condition/arn/ArnLike.d.ts.map +1 -1
- package/dist/esm/condition/arn/ArnLike.js +8 -40
- package/dist/esm/condition/arn/ArnLike.js.map +1 -1
- package/dist/esm/condition/arn/ArnNotEquals.d.ts.map +1 -1
- package/dist/esm/condition/arn/ArnNotEquals.js +2 -1
- package/dist/esm/condition/arn/ArnNotEquals.js.map +1 -1
- package/dist/esm/condition/arn/ArnNotLike.d.ts.map +1 -1
- package/dist/esm/condition/arn/ArnNotLike.js +8 -3
- package/dist/esm/condition/arn/ArnNotLike.js.map +1 -1
- package/dist/esm/condition/arn/arn.d.ts +12 -0
- package/dist/esm/condition/arn/arn.d.ts.map +1 -0
- package/dist/esm/condition/arn/arn.js +65 -0
- package/dist/esm/condition/arn/arn.js.map +1 -0
- package/dist/esm/condition/baseConditionperatorTests.d.ts +7 -1
- package/dist/esm/condition/baseConditionperatorTests.d.ts.map +1 -1
- package/dist/esm/condition/baseConditionperatorTests.js +17 -1
- package/dist/esm/condition/baseConditionperatorTests.js.map +1 -1
- package/dist/esm/condition/binary/BinaryEquals.d.ts.map +1 -1
- package/dist/esm/condition/binary/BinaryEquals.js +14 -2
- package/dist/esm/condition/binary/BinaryEquals.js.map +1 -1
- package/dist/esm/condition/boolean/Bool.d.ts.map +1 -1
- package/dist/esm/condition/boolean/Bool.js +37 -8
- package/dist/esm/condition/boolean/Bool.js.map +1 -1
- package/dist/esm/condition/condition.d.ts +46 -3
- package/dist/esm/condition/condition.d.ts.map +1 -1
- package/dist/esm/condition/condition.js +239 -48
- package/dist/esm/condition/condition.js.map +1 -1
- package/dist/esm/condition/conditionUtil.d.ts +10 -0
- package/dist/esm/condition/conditionUtil.d.ts.map +1 -0
- package/dist/esm/condition/conditionUtil.js +13 -0
- package/dist/esm/condition/conditionUtil.js.map +1 -0
- package/dist/esm/condition/date/DateEquals.d.ts.map +1 -1
- package/dist/esm/condition/date/DateEquals.js +7 -2
- package/dist/esm/condition/date/DateEquals.js.map +1 -1
- package/dist/esm/condition/date/DateGreaterThan.d.ts.map +1 -1
- package/dist/esm/condition/date/DateGreaterThan.js +7 -2
- package/dist/esm/condition/date/DateGreaterThan.js.map +1 -1
- package/dist/esm/condition/date/DateGreaterThanEquals.d.ts.map +1 -1
- package/dist/esm/condition/date/DateGreaterThanEquals.js +7 -2
- package/dist/esm/condition/date/DateGreaterThanEquals.js.map +1 -1
- package/dist/esm/condition/date/DateLessThan.d.ts.map +1 -1
- package/dist/esm/condition/date/DateLessThan.js +7 -2
- package/dist/esm/condition/date/DateLessThan.js.map +1 -1
- package/dist/esm/condition/date/DateLessThanEquals.d.ts.map +1 -1
- package/dist/esm/condition/date/DateLessThanEquals.js +7 -2
- package/dist/esm/condition/date/DateLessThanEquals.js.map +1 -1
- package/dist/esm/condition/date/DateNotEquals.d.ts.map +1 -1
- package/dist/esm/condition/date/DateNotEquals.js +12 -19
- package/dist/esm/condition/date/DateNotEquals.js.map +1 -1
- package/dist/esm/condition/date/date.d.ts +2 -1
- package/dist/esm/condition/date/date.d.ts.map +1 -1
- package/dist/esm/condition/date/date.js +20 -5
- package/dist/esm/condition/date/date.js.map +1 -1
- package/dist/esm/condition/ipaddress/IpAddress.d.ts.map +1 -1
- package/dist/esm/condition/ipaddress/IpAddress.js +9 -16
- package/dist/esm/condition/ipaddress/IpAddress.js.map +1 -1
- package/dist/esm/condition/ipaddress/NotIpAddress.d.ts.map +1 -1
- package/dist/esm/condition/ipaddress/NotIpAddress.js +9 -20
- package/dist/esm/condition/ipaddress/NotIpAddress.js.map +1 -1
- package/dist/esm/condition/ipaddress/ip.d.ts +10 -0
- package/dist/esm/condition/ipaddress/ip.d.ts.map +1 -0
- package/dist/esm/condition/ipaddress/ip.js +54 -0
- package/dist/esm/condition/ipaddress/ip.js.map +1 -0
- package/dist/esm/condition/numeric/NumericEquals.d.ts.map +1 -1
- package/dist/esm/condition/numeric/NumericEquals.js +7 -2
- package/dist/esm/condition/numeric/NumericEquals.js.map +1 -1
- package/dist/esm/condition/numeric/NumericGreaterThan.d.ts.map +1 -1
- package/dist/esm/condition/numeric/NumericGreaterThan.js +7 -2
- package/dist/esm/condition/numeric/NumericGreaterThan.js.map +1 -1
- package/dist/esm/condition/numeric/NumericGreaterThanEquals.d.ts.map +1 -1
- package/dist/esm/condition/numeric/NumericGreaterThanEquals.js +7 -2
- package/dist/esm/condition/numeric/NumericGreaterThanEquals.js.map +1 -1
- package/dist/esm/condition/numeric/NumericLessThan.d.ts.map +1 -1
- package/dist/esm/condition/numeric/NumericLessThan.js +7 -2
- package/dist/esm/condition/numeric/NumericLessThan.js.map +1 -1
- package/dist/esm/condition/numeric/NumericLessThanEquals.d.ts.map +1 -1
- package/dist/esm/condition/numeric/NumericLessThanEquals.js +7 -2
- package/dist/esm/condition/numeric/NumericLessThanEquals.js.map +1 -1
- package/dist/esm/condition/numeric/NumericNotEquals.d.ts.map +1 -1
- package/dist/esm/condition/numeric/NumericNotEquals.js +12 -19
- package/dist/esm/condition/numeric/NumericNotEquals.js.map +1 -1
- package/dist/esm/condition/numeric/numeric.d.ts +2 -1
- package/dist/esm/condition/numeric/numeric.d.ts.map +1 -1
- package/dist/esm/condition/numeric/numeric.js +18 -3
- package/dist/esm/condition/numeric/numeric.js.map +1 -1
- package/dist/esm/condition/string/StringEquals.d.ts.map +1 -1
- package/dist/esm/condition/string/StringEquals.js +25 -4
- package/dist/esm/condition/string/StringEquals.js.map +1 -1
- package/dist/esm/condition/string/StringEqualsIgnoreCase.d.ts.map +1 -1
- package/dist/esm/condition/string/StringEqualsIgnoreCase.js +24 -6
- package/dist/esm/condition/string/StringEqualsIgnoreCase.js.map +1 -1
- package/dist/esm/condition/string/StringLike.d.ts.map +1 -1
- package/dist/esm/condition/string/StringLike.js +25 -4
- package/dist/esm/condition/string/StringLike.js.map +1 -1
- package/dist/esm/condition/string/StringNotEquals.d.ts.map +1 -1
- package/dist/esm/condition/string/StringNotEquals.js +25 -4
- package/dist/esm/condition/string/StringNotEquals.js.map +1 -1
- package/dist/esm/condition/string/StringNotEqualsIgnoreCase.d.ts.map +1 -1
- package/dist/esm/condition/string/StringNotEqualsIgnoreCase.js +25 -3
- package/dist/esm/condition/string/StringNotEqualsIgnoreCase.js.map +1 -1
- package/dist/esm/condition/string/StringNotLike.d.ts.map +1 -1
- package/dist/esm/condition/string/StringNotLike.js +25 -3
- package/dist/esm/condition/string/StringNotLike.js.map +1 -1
- package/dist/esm/core_engine/coreSimulatorEngine.d.ts +10 -7
- package/dist/esm/core_engine/coreSimulatorEngine.d.ts.map +1 -1
- package/dist/esm/core_engine/coreSimulatorEngine.js +147 -28
- package/dist/esm/core_engine/coreSimulatorEngine.js.map +1 -1
- package/dist/esm/evaluate.d.ts +47 -0
- package/dist/esm/evaluate.d.ts.map +1 -1
- package/dist/esm/explain/displayExplainCli.d.ts +3 -0
- package/dist/esm/explain/displayExplainCli.d.ts.map +1 -0
- package/dist/esm/explain/displayExplainCli.js +246 -0
- package/dist/esm/explain/displayExplainCli.js.map +1 -0
- package/dist/esm/explain/statementExplain.d.ts +51 -0
- package/dist/esm/explain/statementExplain.d.ts.map +1 -0
- package/dist/esm/explain/statementExplain.js +6 -0
- package/dist/esm/explain/statementExplain.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/principal/principal.d.ts +28 -6
- package/dist/esm/principal/principal.d.ts.map +1 -1
- package/dist/esm/principal/principal.js +144 -38
- package/dist/esm/principal/principal.js.map +1 -1
- package/dist/esm/resource/resource.d.ts +13 -3
- package/dist/esm/resource/resource.d.ts.map +1 -1
- package/dist/esm/resource/resource.js +69 -16
- package/dist/esm/resource/resource.js.map +1 -1
- package/dist/esm/services/DefaultServiceAuthorizer.d.ts +2 -34
- package/dist/esm/services/DefaultServiceAuthorizer.d.ts.map +1 -1
- package/dist/esm/services/DefaultServiceAuthorizer.js +95 -131
- package/dist/esm/services/DefaultServiceAuthorizer.js.map +1 -1
- package/dist/esm/services/ServiceAuthorizer.d.ts +6 -7
- package/dist/esm/services/ServiceAuthorizer.d.ts.map +1 -1
- package/dist/esm/simulation_engine/simulation.d.ts +4 -0
- package/dist/esm/simulation_engine/simulation.d.ts.map +1 -1
- package/dist/esm/simulation_engine/simulationEngine.d.ts +2 -4
- package/dist/esm/simulation_engine/simulationEngine.d.ts.map +1 -1
- package/dist/esm/simulation_engine/simulationEngine.js +16 -4
- package/dist/esm/simulation_engine/simulationEngine.js.map +1 -1
- package/dist/esm/simulation_engine/unsafeSimulationEngine.d.ts.map +1 -1
- package/dist/esm/simulation_engine/unsafeSimulationEngine.js +5 -2
- package/dist/esm/simulation_engine/unsafeSimulationEngine.js.map +1 -1
- package/dist/esm/util.d.ts +31 -3
- package/dist/esm/util.d.ts.map +1 -1
- package/dist/esm/util.js +70 -31
- package/dist/esm/util.js.map +1 -1
- package/package.json +2 -2
- package/dist/cjs/SCPAnalysis.d.ts +0 -6
- package/dist/cjs/SCPAnalysis.d.ts.map +0 -1
- package/dist/cjs/SCPAnalysis.js +0 -3
- package/dist/cjs/SCPAnalysis.js.map +0 -1
- package/dist/esm/SCPAnalysis.d.ts +0 -6
- package/dist/esm/SCPAnalysis.d.ts.map +0 -1
- package/dist/esm/SCPAnalysis.js +0 -2
- package/dist/esm/SCPAnalysis.js.map +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ConditionValueExplain } from "../../explain/statementExplain.js";
|
|
2
|
+
import { AwsRequest } from "../../request/request.js";
|
|
3
|
+
/**
|
|
4
|
+
* Checks to see if a single ARN matches in ArnLike format
|
|
5
|
+
*
|
|
6
|
+
* @param policyArn the ARN to check against
|
|
7
|
+
* @param requestArn the ARN to check
|
|
8
|
+
* @param request the request to check
|
|
9
|
+
* @returns if the ARN matches
|
|
10
|
+
*/
|
|
11
|
+
export declare function arnMatches(policyArn: string, requestArn: string, request: AwsRequest, expectMatch: boolean): ConditionValueExplain;
|
|
12
|
+
//# sourceMappingURL=arn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arn.d.ts","sourceRoot":"","sources":["../../../../src/condition/arn/arn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAGrD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,GAAG,qBAAqB,CA6DlI"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { convertIamString, isNotDefined, splitArnParts } from "../../util.js";
|
|
2
|
+
/**
|
|
3
|
+
* Checks to see if a single ARN matches in ArnLike format
|
|
4
|
+
*
|
|
5
|
+
* @param policyArn the ARN to check against
|
|
6
|
+
* @param requestArn the ARN to check
|
|
7
|
+
* @param request the request to check
|
|
8
|
+
* @returns if the ARN matches
|
|
9
|
+
*/
|
|
10
|
+
export function arnMatches(policyArn, requestArn, request, expectMatch) {
|
|
11
|
+
const policyParts = splitArnParts(policyArn);
|
|
12
|
+
const requestParts = splitArnParts(requestArn);
|
|
13
|
+
// If any of the parts are missing, return false
|
|
14
|
+
if (isNotDefined(policyParts.partition) ||
|
|
15
|
+
isNotDefined(policyParts.service) ||
|
|
16
|
+
isNotDefined(policyParts.region) ||
|
|
17
|
+
isNotDefined(policyParts.accountId) ||
|
|
18
|
+
isNotDefined(policyParts.resource)) {
|
|
19
|
+
return {
|
|
20
|
+
matches: false,
|
|
21
|
+
value: policyArn,
|
|
22
|
+
errors: ['Invalid ARN']
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const resolvedPolicyArn = [
|
|
26
|
+
'arn',
|
|
27
|
+
policyParts.partition,
|
|
28
|
+
policyParts.service,
|
|
29
|
+
policyParts.region,
|
|
30
|
+
policyParts.accountId,
|
|
31
|
+
policyParts.resource
|
|
32
|
+
].map(part => convertIamString(part, request, { convertToRegex: false, replaceWildcards: false })).join(':');
|
|
33
|
+
const resolvedValue = resolvedPolicyArn == policyArn ? undefined : resolvedPolicyArn;
|
|
34
|
+
// If any of the parts are missing, return false
|
|
35
|
+
if (isNotDefined(requestParts.partition) ||
|
|
36
|
+
isNotDefined(requestParts.service) ||
|
|
37
|
+
isNotDefined(requestParts.region) ||
|
|
38
|
+
isNotDefined(requestParts.accountId) ||
|
|
39
|
+
isNotDefined(requestParts.resource)) {
|
|
40
|
+
return {
|
|
41
|
+
matches: false,
|
|
42
|
+
value: policyArn,
|
|
43
|
+
resolvedValue,
|
|
44
|
+
errors: [`request ARN '${requestArn}' is not a valid ARN`]
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const allErrors = [];
|
|
48
|
+
const replaceAndMatch = (policyPart, requestPart) => {
|
|
49
|
+
const { pattern, errors } = convertIamString(policyPart, request, { replaceWildcards: true });
|
|
50
|
+
allErrors.push(...(errors || []));
|
|
51
|
+
return pattern.test(requestPart);
|
|
52
|
+
};
|
|
53
|
+
const matches = replaceAndMatch(policyParts.partition, requestParts.partition) &&
|
|
54
|
+
replaceAndMatch(policyParts.service, requestParts.service) &&
|
|
55
|
+
replaceAndMatch(policyParts.region, requestParts.region) &&
|
|
56
|
+
replaceAndMatch(policyParts.accountId, requestParts.accountId) &&
|
|
57
|
+
replaceAndMatch(policyParts.resource, requestParts.resource);
|
|
58
|
+
return {
|
|
59
|
+
matches: matches == expectMatch && allErrors.length == 0,
|
|
60
|
+
value: policyArn,
|
|
61
|
+
resolvedValue,
|
|
62
|
+
errors: allErrors.length > 0 ? allErrors : undefined
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=arn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arn.js","sourceRoot":"","sources":["../../../../src/condition/arn/arn.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7E;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,UAAkB,EAAE,OAAmB,EAAE,WAAoB;IACzG,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;IAC5C,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IAC9C,gDAAgD;IAChD,IAAG,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC;QACnC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC;QACjC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC;QAChC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC;QACnC,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,CAAC,aAAa,CAAC;SACxB,CAAA;IACH,CAAC;IAED,MAAM,iBAAiB,GAAG;QACxB,KAAK;QACL,WAAW,CAAC,SAAS;QACrB,WAAW,CAAC,OAAO;QACnB,WAAW,CAAC,MAAM;QAClB,WAAW,CAAC,SAAS;QACrB,WAAW,CAAC,QAAQ;KACrB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAC,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE1G,MAAM,aAAa,GAAG,iBAAiB,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAEpF,gDAAgD;IAChD,IAAG,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC;QACpC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC;QAClC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC;QACjC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC;QACpC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAAS;YAChB,aAAa;YACb,MAAM,EAAE,CAAC,gBAAgB,UAAU,sBAAsB,CAAC;SAC3D,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,WAAmB,EAAW,EAAE;QAC3E,MAAM,EAAC,OAAO,EAAE,MAAM,EAAC,GAAG,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAC,gBAAgB,EAAE,IAAI,EAAC,CAAC,CAAA;QACzF,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAA;QACjC,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAClC,CAAC,CAAA;IAGD,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;QAC9D,eAAe,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;QAC1D,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;QACxD,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;QAC9D,eAAe,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;IAE5E,OAAO;QACL,OAAO,EAAE,OAAO,IAAI,WAAW,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC;QACxD,KAAK,EAAE,SAAS;QAChB,aAAa;QACb,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACrD,CAAA;AACH,CAAC"}
|
|
@@ -2,11 +2,17 @@ import { BaseConditionOperator } from "./BaseConditionOperator.js";
|
|
|
2
2
|
export interface BaseOperatorTest {
|
|
3
3
|
name: string;
|
|
4
4
|
requestContext?: {
|
|
5
|
-
[key: string]: string;
|
|
5
|
+
[key: string]: string | string[];
|
|
6
6
|
};
|
|
7
7
|
policyValues: string[];
|
|
8
8
|
testValue: string;
|
|
9
9
|
expected: boolean;
|
|
10
|
+
explains?: {
|
|
11
|
+
value: string;
|
|
12
|
+
matches: boolean;
|
|
13
|
+
resolvedValue?: string;
|
|
14
|
+
errors?: string[];
|
|
15
|
+
}[];
|
|
10
16
|
}
|
|
11
17
|
export declare function testOperator(name: string, tests: BaseOperatorTest[], operator: BaseConditionOperator): void;
|
|
12
18
|
//# sourceMappingURL=baseConditionperatorTests.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseConditionperatorTests.d.ts","sourceRoot":"","sources":["../../../src/condition/baseConditionperatorTests.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"baseConditionperatorTests.d.ts","sourceRoot":"","sources":["../../../src/condition/baseConditionperatorTests.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;IACrD,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,OAAO,CAAA;QAChB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAClB,EAAE,CAAA;CACJ;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,QAAQ,EAAE,qBAAqB,QA6BpG"}
|
|
@@ -10,7 +10,23 @@ export function testOperator(name, tests, operator) {
|
|
|
10
10
|
//When the condition is evaluated
|
|
11
11
|
const result = operator.matches(request, test.testValue, test.policyValues);
|
|
12
12
|
//Then the result should be as expected
|
|
13
|
-
expect(result).toBe(test.expected);
|
|
13
|
+
expect(result.matches).toBe(test.expected);
|
|
14
|
+
if (test.explains) {
|
|
15
|
+
for (const explain of test.explains) {
|
|
16
|
+
const found = result.explains.find(e => e.value === explain.value);
|
|
17
|
+
expect(found, `Missing explain for ${explain.value}`).toBeDefined();
|
|
18
|
+
expect(found?.matches, `${explain.value} match`).toBe(explain.matches);
|
|
19
|
+
if (explain.resolvedValue) {
|
|
20
|
+
expect(found?.resolvedValue, `${explain.value} resolved value`).toBe(explain.resolvedValue);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
expect(found?.resolvedValue, `${explain.value} resolved value to be undefined`).toBeUndefined();
|
|
24
|
+
}
|
|
25
|
+
if (explain.errors) {
|
|
26
|
+
expect(found?.errors, `${explain.value} errors`).toEqual(explain.errors.sort());
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
14
30
|
});
|
|
15
31
|
}
|
|
16
32
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseConditionperatorTests.js","sourceRoot":"","sources":["../../../src/condition/baseConditionperatorTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"baseConditionperatorTests.js","sourceRoot":"","sources":["../../../src/condition/baseConditionperatorTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAiBzD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAyB,EAAE,QAA+B;IACnG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;QAClB,KAAI,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACxB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACjB,mBAAmB;gBACnB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAC,EAAE,EAAE,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC5H,iCAAiC;gBACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;gBAE3E,uCAAuC;gBACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAC1C,IAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACjB,KAAI,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACnC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;wBAClE,MAAM,CAAC,KAAK,EAAE,uBAAuB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;wBACnE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;wBACtE,IAAG,OAAO,CAAC,aAAa,EAAE,CAAC;4BACzB,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,KAAK,iBAAiB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;wBAC7F,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,KAAK,iCAAiC,CAAC,CAAC,aAAa,EAAE,CAAA;wBACjG,CAAC;wBACD,IAAG,OAAO,CAAC,MAAM,EAAE,CAAC;4BAClB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;wBACjF,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BinaryEquals.d.ts","sourceRoot":"","sources":["../../../../src/condition/binary/BinaryEquals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BinaryEquals.d.ts","sourceRoot":"","sources":["../../../../src/condition/binary/BinaryEquals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGpE;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,qBAmB1B,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolvedValue } from "../conditionUtil.js";
|
|
1
2
|
/**
|
|
2
3
|
* For Binary we don't really have the ability to accept binary
|
|
3
4
|
* values right now, so just do a string match.
|
|
@@ -5,9 +6,20 @@
|
|
|
5
6
|
export const BinaryEquals = {
|
|
6
7
|
name: 'BinaryEquals',
|
|
7
8
|
matches: (request, keyValue, policyValues) => {
|
|
8
|
-
|
|
9
|
+
const explains = policyValues.map((policyValue) => {
|
|
10
|
+
return {
|
|
11
|
+
value: policyValue,
|
|
12
|
+
matches: policyValue === keyValue,
|
|
13
|
+
resolvedValue: resolvedValue(policyValue, request),
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
matches: explains.some((explain) => explain.matches),
|
|
18
|
+
explains
|
|
19
|
+
};
|
|
9
20
|
},
|
|
10
21
|
allowsVariables: true,
|
|
11
|
-
allowsWildcards: false
|
|
22
|
+
allowsWildcards: false,
|
|
23
|
+
isNegative: false
|
|
12
24
|
};
|
|
13
25
|
//# sourceMappingURL=BinaryEquals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BinaryEquals.js","sourceRoot":"","sources":["../../../../src/condition/binary/BinaryEquals.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAC3C,
|
|
1
|
+
{"version":3,"file":"BinaryEquals.js","sourceRoot":"","sources":["../../../../src/condition/binary/BinaryEquals.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAA4B,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;YACzE,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,WAAW,KAAK,QAAQ;gBACjC,aAAa,EAAE,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC;aACnD,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;YACpD,QAAQ;SACT,CAAA;IACH,CAAC;IACD,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,KAAK;IACtB,UAAU,EAAE,KAAK;CAClB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bool.d.ts","sourceRoot":"","sources":["../../../../src/condition/boolean/Bool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Bool.d.ts","sourceRoot":"","sources":["../../../../src/condition/boolean/Bool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,eAAO,MAAM,IAAI,EAAE,qBAiDlB,CAAA"}
|
|
@@ -1,17 +1,46 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { convertIamString } from "../../util.js";
|
|
2
2
|
export const Bool = {
|
|
3
3
|
name: 'Bool',
|
|
4
4
|
matches: (request, keyValue, policyValues) => {
|
|
5
|
-
|
|
6
|
-
const pattern =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
const explains = policyValues.map(policyValue => {
|
|
6
|
+
const { pattern, errors } = convertIamString(policyValue, request, { replaceWildcards: false });
|
|
7
|
+
if (errors && errors.length > 0) {
|
|
8
|
+
return {
|
|
9
|
+
value: policyValue,
|
|
10
|
+
matches: false,
|
|
11
|
+
errors
|
|
12
|
+
};
|
|
10
13
|
}
|
|
11
|
-
|
|
14
|
+
const resolvedValue = convertIamString(policyValue, request, { replaceWildcards: false, convertToRegex: false });
|
|
15
|
+
const lowercaseResolvedValue = resolvedValue.toLowerCase();
|
|
16
|
+
if (lowercaseResolvedValue != 'true' && lowercaseResolvedValue != 'false') {
|
|
17
|
+
return {
|
|
18
|
+
matches: false,
|
|
19
|
+
value: policyValue,
|
|
20
|
+
errors: ['Invalid boolean pattern'],
|
|
21
|
+
resolvedValue: resolvedValue == policyValue ? undefined : resolvedValue
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (keyValue.toLowerCase() != 'true' && keyValue.toLowerCase() != 'false') {
|
|
25
|
+
return {
|
|
26
|
+
matches: false,
|
|
27
|
+
value: policyValue,
|
|
28
|
+
errors: [`request value '${keyValue}' is not a boolean`],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
matches: new RegExp(pattern, 'i').test(keyValue),
|
|
33
|
+
value: policyValue,
|
|
34
|
+
resolvedValue: resolvedValue == policyValue ? undefined : resolvedValue
|
|
35
|
+
};
|
|
12
36
|
});
|
|
37
|
+
return {
|
|
38
|
+
matches: explains.some(explain => explain.matches),
|
|
39
|
+
explains
|
|
40
|
+
};
|
|
13
41
|
},
|
|
14
42
|
allowsVariables: true,
|
|
15
|
-
allowsWildcards: false
|
|
43
|
+
allowsWildcards: false,
|
|
44
|
+
isNegative: false
|
|
16
45
|
};
|
|
17
46
|
//# sourceMappingURL=Bool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bool.js","sourceRoot":"","sources":["../../../../src/condition/boolean/Bool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Bool.js","sourceRoot":"","sources":["../../../../src/condition/boolean/Bool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,MAAM,CAAC,MAAM,IAAI,GAA0B;IACzC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAE3C,MAAM,QAAQ,GAA4B,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YACvE,MAAM,EAAC,OAAO,EAAE,MAAM,EAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAC,gBAAgB,EAAE,KAAK,EAAC,CAAC,CAAA;YAC3F,IAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO;oBACL,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,KAAK;oBACd,MAAM;iBACP,CAAA;YACH,CAAC;YAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAC,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAC,CAAC,CAAA;YAC9G,MAAM,sBAAsB,GAAG,aAAa,CAAC,WAAW,EAAE,CAAA;YAE1D,IAAG,sBAAsB,IAAI,MAAM,IAAI,sBAAsB,IAAI,OAAO,EAAE,CAAC;gBACzE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,CAAC,yBAAyB,CAAC;oBACnC,aAAa,EAAE,aAAa,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;iBACxE,CAAA;YACH,CAAC;YAED,IAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,CAAC,kBAAkB,QAAQ,oBAAoB,CAAC;iBACzD,CAAA;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAChD,KAAK,EAAE,WAAW;gBAClB,aAAa,EAAE,aAAa,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;aACxE,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;YAClD,QAAQ;SACT,CAAA;IACH,CAAC;IACD,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,KAAK;IACtB,UAAU,EAAE,KAAK;CAClB,CAAA"}
|
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
import { Condition } from '@cloud-copilot/iam-policy';
|
|
2
|
+
import { ConditionExplain, StatementExplain } from '../explain/statementExplain.js';
|
|
2
3
|
import { AwsRequest } from '../request/request';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export
|
|
4
|
+
import { ContextKey } from '../requestContext.js';
|
|
5
|
+
import { BaseConditionOperator } from './BaseConditionOperator.js';
|
|
6
|
+
export type ConditionMatchResult = 'Match' | 'NoMatch';
|
|
7
|
+
/**
|
|
8
|
+
* Evaluate a set of conditions against a request
|
|
9
|
+
*
|
|
10
|
+
* @param request the request to test
|
|
11
|
+
* @param conditions the conditions to test
|
|
12
|
+
* @returns Match if all conditions match, NoMatch if any do not. Also returns all the details of the evaluation
|
|
13
|
+
*/
|
|
14
|
+
export declare function requestMatchesConditions(request: AwsRequest, conditions: Condition[]): {
|
|
15
|
+
matches: ConditionMatchResult;
|
|
16
|
+
details: Pick<StatementExplain, 'conditions'>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Checks to see if a single condition matches a request
|
|
20
|
+
*
|
|
21
|
+
* @param request the request to test
|
|
22
|
+
* @param condition the condition to test
|
|
23
|
+
* @returns the result of evaluating the condition
|
|
24
|
+
*/
|
|
25
|
+
export declare function singleConditionMatchesRequest(request: AwsRequest, condition: Condition): ConditionExplain;
|
|
26
|
+
export declare function singleValueMatch(request: AwsRequest, condition: Condition, baseOperation: BaseConditionOperator, keyValue: ContextKey | undefined): ConditionExplain;
|
|
27
|
+
/**
|
|
28
|
+
* Tests a condition with a ForAllValues set operator
|
|
29
|
+
*
|
|
30
|
+
* @param request the request to test
|
|
31
|
+
* @param condition the condition with ForAllValues set operator
|
|
32
|
+
* @param keyExists whether the key exists in the request
|
|
33
|
+
* @param keyValue the value of the key in the request
|
|
34
|
+
* @param baseOperation the base operation to test the key against
|
|
35
|
+
* @returns the result of evaluating the ForAllValues set operator
|
|
36
|
+
*/
|
|
37
|
+
export declare function forAllValuesMatch(request: AwsRequest, condition: Condition, keyValue: ContextKey | undefined, baseOperation: BaseConditionOperator): ConditionExplain;
|
|
38
|
+
/**
|
|
39
|
+
* Test a condition with a ForAnyValue set operator
|
|
40
|
+
*
|
|
41
|
+
* @param request the request to test
|
|
42
|
+
* @param condition the condition with ForAnyValue set operator
|
|
43
|
+
* @param keyExists whether the key exists in the request
|
|
44
|
+
* @param keyValue the value of the key in the request
|
|
45
|
+
* @param baseOperation the base operation to test the key against
|
|
46
|
+
* @returns the result of evaluating the ForAnyValue set operator
|
|
47
|
+
*/
|
|
48
|
+
export declare function forAnyValueMatch(request: AwsRequest, condition: Condition, keyValue: ContextKey | undefined, baseOperation: BaseConditionOperator): ConditionExplain;
|
|
6
49
|
//# sourceMappingURL=condition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../../src/condition/condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../../src/condition/condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAyB,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAuBnE,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,SAAS,CAAA;AAiBtD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG;IAAE,OAAO,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA;CAAE,CASvK;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,gBAAgB,CAuBzG;AA0BD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,qBAAqB,EACpC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,gBAAgB,CA8CnF;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,aAAa,EAAE,qBAAqB,GAAG,gBAAgB,CA+ExF;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,aAAa,EAAE,qBAAqB,GAAG,gBAAgB,CAiEvF"}
|
|
@@ -36,22 +36,33 @@ const baseOperations = {};
|
|
|
36
36
|
for (const operator of allOperators) {
|
|
37
37
|
baseOperations[operator.name.toLowerCase()] = operator;
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Evaluate a set of conditions against a request
|
|
41
|
+
*
|
|
42
|
+
* @param request the request to test
|
|
43
|
+
* @param conditions the conditions to test
|
|
44
|
+
* @returns Match if all conditions match, NoMatch if any do not. Also returns all the details of the evaluation
|
|
45
|
+
*/
|
|
39
46
|
export function requestMatchesConditions(request, conditions) {
|
|
40
47
|
const results = conditions.map(condition => singleConditionMatchesRequest(request, condition));
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
return 'Match';
|
|
48
|
+
const nonMatch = results.some(result => !result.matches);
|
|
49
|
+
return {
|
|
50
|
+
matches: nonMatch ? 'NoMatch' : 'Match',
|
|
51
|
+
details: {
|
|
52
|
+
conditions: results
|
|
53
|
+
}
|
|
54
|
+
};
|
|
50
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Checks to see if a single condition matches a request
|
|
58
|
+
*
|
|
59
|
+
* @param request the request to test
|
|
60
|
+
* @param condition the condition to test
|
|
61
|
+
* @returns the result of evaluating the condition
|
|
62
|
+
*/
|
|
51
63
|
export function singleConditionMatchesRequest(request, condition) {
|
|
52
64
|
const key = condition.conditionKey();
|
|
53
|
-
const
|
|
54
|
-
const baseOperation = baseOperations[condition.operation().baseOperator().toLowerCase()]?.matches;
|
|
65
|
+
const baseOperation = baseOperations[condition.operation().baseOperator().toLowerCase()];
|
|
55
66
|
const keyExists = request.contextKeyExists(key);
|
|
56
67
|
const keyValue = keyExists ? request.getContextKeyValue(key) : undefined;
|
|
57
68
|
if (condition.operation().value().toLowerCase() == 'null' || condition.operation().baseOperator()?.toLowerCase() == 'null') {
|
|
@@ -60,60 +71,240 @@ export function singleConditionMatchesRequest(request, condition) {
|
|
|
60
71
|
if (condition.operation().setOperator()) {
|
|
61
72
|
const setOperator = condition.operation().setOperator();
|
|
62
73
|
if (setOperator === 'ForAnyValue') {
|
|
63
|
-
|
|
64
|
-
return 'NoMatch';
|
|
65
|
-
}
|
|
66
|
-
if (!baseOperation) {
|
|
67
|
-
return 'Unknown';
|
|
68
|
-
}
|
|
69
|
-
//Do the loop
|
|
70
|
-
const anyMatch = keyValue.values.some(value => {
|
|
71
|
-
return baseOperation(request, value, policyValues);
|
|
72
|
-
});
|
|
73
|
-
return anyMatch ? 'Match' : 'NoMatch';
|
|
74
|
+
return forAnyValueMatch(request, condition, keyValue, baseOperation);
|
|
74
75
|
}
|
|
75
76
|
else if (setOperator === 'ForAllValues') {
|
|
76
|
-
|
|
77
|
-
return 'Match';
|
|
78
|
-
}
|
|
79
|
-
if (!keyValue || !keyValue.isArrayValue()) {
|
|
80
|
-
return 'NoMatch';
|
|
81
|
-
}
|
|
82
|
-
if (!baseOperation) {
|
|
83
|
-
return 'Unknown';
|
|
84
|
-
}
|
|
85
|
-
//Do the loop
|
|
86
|
-
const anyNotMatch = keyValue.values.some(value => {
|
|
87
|
-
return !baseOperation(request, value, policyValues);
|
|
88
|
-
});
|
|
89
|
-
return anyNotMatch ? 'NoMatch' : 'Match';
|
|
77
|
+
return forAllValuesMatch(request, condition, keyValue, baseOperation);
|
|
90
78
|
}
|
|
91
79
|
else {
|
|
92
80
|
throw new Error(`Unknown set operator: ${setOperator}`);
|
|
93
81
|
}
|
|
94
82
|
}
|
|
95
|
-
|
|
83
|
+
return singleValueMatch(request, condition, baseOperation, keyValue);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Tests a condition with a null operator
|
|
87
|
+
*
|
|
88
|
+
* @param condition the condition to test
|
|
89
|
+
* @param keyExists whether the key exists in the request
|
|
90
|
+
* @returns the result of evaluating the null operator
|
|
91
|
+
*/
|
|
92
|
+
function testNull(condition, keyExists) {
|
|
93
|
+
const goalValue = keyExists ? 'false' : 'true';
|
|
94
|
+
const conditionValues = condition.conditionValues().map(value => {
|
|
95
|
+
return {
|
|
96
|
+
value,
|
|
97
|
+
matches: value.toLowerCase() === goalValue
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
operator: condition.operation().value(),
|
|
102
|
+
conditionKeyValue: condition.conditionKey(),
|
|
103
|
+
values: conditionValues,
|
|
104
|
+
matches: conditionValues.some(value => value.matches)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function singleValueMatch(request, condition, baseOperation, keyValue) {
|
|
108
|
+
const isNotOperator = condition.operation().baseOperator().toLowerCase().includes('not');
|
|
109
|
+
if (condition.operation().isIfExists() || isNotOperator) {
|
|
96
110
|
//Check if it exists, return true if it doesn't
|
|
97
111
|
//Double check what happens here if the key is not a valid key or is of the wrong type
|
|
98
|
-
if (!
|
|
99
|
-
return
|
|
112
|
+
if (!keyValue) {
|
|
113
|
+
return {
|
|
114
|
+
operator: condition.operation().value(),
|
|
115
|
+
conditionKeyValue: condition.conditionKey(),
|
|
116
|
+
values: [],
|
|
117
|
+
matches: true,
|
|
118
|
+
matchedBecauseMissing: true
|
|
119
|
+
};
|
|
100
120
|
}
|
|
101
121
|
}
|
|
102
122
|
if (!keyValue || !keyValue.isStringValue()) {
|
|
103
123
|
//Set operator is required for a multi-value key
|
|
104
|
-
return
|
|
124
|
+
return {
|
|
125
|
+
operator: condition.operation().value(),
|
|
126
|
+
conditionKeyValue: condition.conditionKey(),
|
|
127
|
+
values: [],
|
|
128
|
+
matches: false,
|
|
129
|
+
failedBecauseMissing: !keyValue,
|
|
130
|
+
failedBecauseArray: keyValue?.isArrayValue(),
|
|
131
|
+
};
|
|
105
132
|
}
|
|
106
133
|
if (!baseOperation) {
|
|
107
|
-
return
|
|
134
|
+
return {
|
|
135
|
+
operator: condition.operation().value(),
|
|
136
|
+
conditionKeyValue: condition.conditionKey(),
|
|
137
|
+
values: [],
|
|
138
|
+
matches: false,
|
|
139
|
+
missingOperator: true
|
|
140
|
+
};
|
|
108
141
|
}
|
|
109
|
-
const matches = baseOperation(request, keyValue.value,
|
|
110
|
-
return
|
|
142
|
+
const { matches, explains } = baseOperation.matches(request, keyValue.value, condition.conditionValues());
|
|
143
|
+
return {
|
|
144
|
+
matches,
|
|
145
|
+
operator: condition.operation().value(),
|
|
146
|
+
conditionKeyValue: condition.conditionKey(),
|
|
147
|
+
values: condition.valueIsArray() ? explains : explains[0]
|
|
148
|
+
};
|
|
111
149
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
150
|
+
/**
|
|
151
|
+
* Tests a condition with a ForAllValues set operator
|
|
152
|
+
*
|
|
153
|
+
* @param request the request to test
|
|
154
|
+
* @param condition the condition with ForAllValues set operator
|
|
155
|
+
* @param keyExists whether the key exists in the request
|
|
156
|
+
* @param keyValue the value of the key in the request
|
|
157
|
+
* @param baseOperation the base operation to test the key against
|
|
158
|
+
* @returns the result of evaluating the ForAllValues set operator
|
|
159
|
+
*/
|
|
160
|
+
export function forAllValuesMatch(request, condition, keyValue, baseOperation) {
|
|
161
|
+
if (!keyValue) {
|
|
162
|
+
return {
|
|
163
|
+
operator: condition.operation().value(),
|
|
164
|
+
conditionKeyValue: condition.conditionKey(),
|
|
165
|
+
values: [],
|
|
166
|
+
matches: true,
|
|
167
|
+
matchedBecauseMissing: true
|
|
168
|
+
};
|
|
169
|
+
// return 'Match'
|
|
170
|
+
}
|
|
171
|
+
if (!keyValue || !keyValue.isArrayValue()) {
|
|
172
|
+
return {
|
|
173
|
+
operator: condition.operation().value(),
|
|
174
|
+
conditionKeyValue: condition.conditionKey(),
|
|
175
|
+
values: [],
|
|
176
|
+
matches: false,
|
|
177
|
+
failedBecauseMissing: !keyValue,
|
|
178
|
+
failedBecauseNotArray: !!keyValue && !keyValue.isArrayValue()
|
|
179
|
+
};
|
|
180
|
+
// return 'NoMatch'
|
|
181
|
+
}
|
|
182
|
+
if (!baseOperation) {
|
|
183
|
+
//TODO: This should return a nomatch rather than throw an error
|
|
184
|
+
return {
|
|
185
|
+
operator: condition.operation().value(),
|
|
186
|
+
conditionKeyValue: condition.conditionKey(),
|
|
187
|
+
values: [],
|
|
188
|
+
matches: false,
|
|
189
|
+
missingOperator: true
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const valueExplains = keyValue.values.map(value => {
|
|
193
|
+
const { matches, explains } = baseOperation.matches(request, value, condition.conditionValues());
|
|
194
|
+
return {
|
|
195
|
+
requestValue: value,
|
|
196
|
+
matches,
|
|
197
|
+
explains
|
|
198
|
+
};
|
|
199
|
+
});
|
|
200
|
+
const anyNonMatches = valueExplains.some(valueExplain => !valueExplain.matches);
|
|
201
|
+
const overallMatch = !anyNonMatches;
|
|
202
|
+
const unmatchedValues = [];
|
|
203
|
+
const explains = {};
|
|
204
|
+
for (const valueExplain of valueExplains) {
|
|
205
|
+
if (!baseOperation.isNegative && !valueExplain.matches) {
|
|
206
|
+
unmatchedValues.push(valueExplain.requestValue);
|
|
207
|
+
}
|
|
208
|
+
else if (baseOperation.isNegative && valueExplain.matches) {
|
|
209
|
+
unmatchedValues.push(valueExplain.requestValue);
|
|
210
|
+
}
|
|
211
|
+
for (const explain of valueExplain.explains) {
|
|
212
|
+
let theExplain = explains[explain.value];
|
|
213
|
+
if (!theExplain) {
|
|
214
|
+
explains[explain.value] = {
|
|
215
|
+
value: explain.value,
|
|
216
|
+
matches: overallMatch
|
|
217
|
+
};
|
|
218
|
+
theExplain = explains[explain.value];
|
|
219
|
+
}
|
|
220
|
+
if (explain.matches && !baseOperation.isNegative) {
|
|
221
|
+
theExplain.matchingValues = theExplain.matchingValues || [];
|
|
222
|
+
theExplain.matchingValues.push(valueExplain.requestValue);
|
|
223
|
+
}
|
|
224
|
+
else if (!explain.matches && baseOperation.isNegative) {
|
|
225
|
+
theExplain.negativeMatchingValues = theExplain.negativeMatchingValues || [];
|
|
226
|
+
theExplain.negativeMatchingValues.push(valueExplain.requestValue);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
operator: condition.operation().value(),
|
|
232
|
+
conditionKeyValue: condition.conditionKey(),
|
|
233
|
+
values: Object.values(explains),
|
|
234
|
+
matches: overallMatch,
|
|
235
|
+
unmatchedValues
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Test a condition with a ForAnyValue set operator
|
|
240
|
+
*
|
|
241
|
+
* @param request the request to test
|
|
242
|
+
* @param condition the condition with ForAnyValue set operator
|
|
243
|
+
* @param keyExists whether the key exists in the request
|
|
244
|
+
* @param keyValue the value of the key in the request
|
|
245
|
+
* @param baseOperation the base operation to test the key against
|
|
246
|
+
* @returns the result of evaluating the ForAnyValue set operator
|
|
247
|
+
*/
|
|
248
|
+
export function forAnyValueMatch(request, condition, keyValue, baseOperation) {
|
|
249
|
+
if (!keyValue || !keyValue.isArrayValue()) {
|
|
250
|
+
return {
|
|
251
|
+
operator: condition.operation().value(),
|
|
252
|
+
conditionKeyValue: condition.conditionKey(),
|
|
253
|
+
values: [],
|
|
254
|
+
matches: false,
|
|
255
|
+
failedBecauseMissing: !keyValue,
|
|
256
|
+
failedBecauseNotArray: keyValue && !keyValue.isArrayValue()
|
|
257
|
+
};
|
|
258
|
+
// return 'NoMatch'
|
|
259
|
+
}
|
|
260
|
+
if (!baseOperation) {
|
|
261
|
+
return {
|
|
262
|
+
operator: condition.operation().value(),
|
|
263
|
+
conditionKeyValue: condition.conditionKey(),
|
|
264
|
+
values: [],
|
|
265
|
+
matches: false,
|
|
266
|
+
missingOperator: true
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
const valueExplains = keyValue.values.map(value => {
|
|
270
|
+
const { matches, explains } = baseOperation.matches(request, value, condition.conditionValues());
|
|
271
|
+
return {
|
|
272
|
+
requestValue: value,
|
|
273
|
+
matches,
|
|
274
|
+
explains
|
|
275
|
+
};
|
|
276
|
+
});
|
|
277
|
+
const overallMatch = valueExplains.some(valueExplain => valueExplain.matches);
|
|
278
|
+
const unmatchedValues = [];
|
|
279
|
+
const explains = {};
|
|
280
|
+
for (const valueExplain of valueExplains) {
|
|
281
|
+
if (!baseOperation.isNegative && !valueExplain.matches) {
|
|
282
|
+
unmatchedValues.push(valueExplain.requestValue);
|
|
283
|
+
}
|
|
284
|
+
else if (baseOperation.isNegative && valueExplain.matches) {
|
|
285
|
+
unmatchedValues.push(valueExplain.requestValue);
|
|
286
|
+
}
|
|
287
|
+
for (const explain of valueExplain.explains) {
|
|
288
|
+
let theExplain = explains[explain.value];
|
|
289
|
+
if (!theExplain) {
|
|
290
|
+
explains[explain.value] = {
|
|
291
|
+
value: explain.value,
|
|
292
|
+
matches: overallMatch
|
|
293
|
+
};
|
|
294
|
+
theExplain = explains[explain.value];
|
|
295
|
+
}
|
|
296
|
+
if (explain.matches) {
|
|
297
|
+
theExplain.matchingValues = theExplain.matchingValues || [];
|
|
298
|
+
theExplain.matchingValues.push(valueExplain.requestValue);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
116
301
|
}
|
|
117
|
-
return
|
|
302
|
+
return {
|
|
303
|
+
operator: condition.operation().value(),
|
|
304
|
+
conditionKeyValue: condition.conditionKey(),
|
|
305
|
+
values: Object.values(explains),
|
|
306
|
+
matches: overallMatch,
|
|
307
|
+
unmatchedValues
|
|
308
|
+
};
|
|
118
309
|
}
|
|
119
310
|
//# sourceMappingURL=condition.js.map
|