@ddd-ts-kit/auth 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +834 -2
- package/dist/abac/attribute-policy.d.ts +13 -0
- package/dist/abac/attribute-policy.d.ts.map +1 -0
- package/dist/abac/attribute-policy.js +10 -0
- package/dist/abac/attribute-policy.js.map +1 -0
- package/dist/abac/condition.d.ts +6 -0
- package/dist/abac/condition.d.ts.map +1 -0
- package/dist/abac/condition.js +10 -0
- package/dist/abac/condition.js.map +1 -0
- package/dist/abac/policy-based-authorizer.d.ts +23 -0
- package/dist/abac/policy-based-authorizer.d.ts.map +1 -0
- package/dist/abac/policy-based-authorizer.js +39 -0
- package/dist/abac/policy-based-authorizer.js.map +1 -0
- package/dist/abac/policy-input.d.ts +17 -0
- package/dist/abac/policy-input.d.ts.map +1 -0
- package/dist/abac/policy-input.js +2 -0
- package/dist/abac/policy-input.js.map +1 -0
- package/dist/abac/resource-attribute-values.d.ts +3 -0
- package/dist/abac/resource-attribute-values.d.ts.map +1 -0
- package/dist/abac/resource-attribute-values.js +2 -0
- package/dist/abac/resource-attribute-values.js.map +1 -0
- package/dist/abac/resource-attributes.d.ts +8 -0
- package/dist/abac/resource-attributes.d.ts.map +1 -0
- package/dist/abac/resource-attributes.js +5 -0
- package/dist/abac/resource-attributes.js.map +1 -0
- package/dist/authentication/actor-of.d.ts +7 -0
- package/dist/authentication/actor-of.d.ts.map +1 -0
- package/dist/authentication/actor-of.js +9 -0
- package/dist/authentication/actor-of.js.map +1 -0
- package/dist/authentication/authenticator.d.ts +11 -0
- package/dist/authentication/authenticator.d.ts.map +1 -0
- package/dist/authentication/authenticator.js +9 -0
- package/dist/authentication/authenticator.js.map +1 -0
- package/dist/authentication/bearer-credential.d.ts +7 -0
- package/dist/authentication/bearer-credential.d.ts.map +1 -0
- package/dist/authentication/bearer-credential.js +19 -0
- package/dist/authentication/bearer-credential.js.map +1 -0
- package/dist/authentication/header-values.d.ts +2 -0
- package/dist/authentication/header-values.d.ts.map +1 -0
- package/dist/authentication/header-values.js +2 -0
- package/dist/authentication/header-values.js.map +1 -0
- package/dist/authentication/in-actor-context.d.ts +15 -0
- package/dist/authentication/in-actor-context.d.ts.map +1 -0
- package/dist/authentication/in-actor-context.js +11 -0
- package/dist/authentication/in-actor-context.js.map +1 -0
- package/dist/authentication/principal-resolver.d.ts +10 -0
- package/dist/authentication/principal-resolver.d.ts.map +1 -0
- package/dist/authentication/principal-resolver.js +25 -0
- package/dist/authentication/principal-resolver.js.map +1 -0
- package/dist/authentication/resolve-session.d.ts +9 -0
- package/dist/authentication/resolve-session.d.ts.map +1 -0
- package/dist/authentication/resolve-session.js +12 -0
- package/dist/authentication/resolve-session.js.map +1 -0
- package/dist/authentication/session-authenticator.d.ts +13 -0
- package/dist/authentication/session-authenticator.d.ts.map +1 -0
- package/dist/authentication/session-authenticator.js +11 -0
- package/dist/authentication/session-authenticator.js.map +1 -0
- package/dist/authentication/session-of.d.ts +9 -0
- package/dist/authentication/session-of.d.ts.map +1 -0
- package/dist/authentication/session-of.js +27 -0
- package/dist/authentication/session-of.js.map +1 -0
- package/dist/authorization/access-scope.d.ts +16 -0
- package/dist/authorization/access-scope.d.ts.map +1 -0
- package/dist/authorization/access-scope.js +2 -0
- package/dist/authorization/access-scope.js.map +1 -0
- package/dist/authorization/access.d.ts +17 -0
- package/dist/authorization/access.d.ts.map +1 -0
- package/dist/authorization/access.js +8 -0
- package/dist/authorization/access.js.map +1 -0
- package/dist/authorization/authorization-context.d.ts +3 -0
- package/dist/authorization/authorization-context.d.ts.map +1 -0
- package/dist/authorization/authorization-context.js +2 -0
- package/dist/authorization/authorization-context.js.map +1 -0
- package/dist/authorization/authorizer.d.ts +15 -0
- package/dist/authorization/authorizer.d.ts.map +1 -0
- package/dist/authorization/authorizer.js +8 -0
- package/dist/authorization/authorizer.js.map +1 -0
- package/dist/authorization/check-request.d.ts +11 -0
- package/dist/authorization/check-request.d.ts.map +1 -0
- package/dist/authorization/check-request.js +2 -0
- package/dist/authorization/check-request.js.map +1 -0
- package/dist/authorization/decision-record-of.d.ts +7 -0
- package/dist/authorization/decision-record-of.d.ts.map +1 -0
- package/dist/authorization/decision-record-of.js +11 -0
- package/dist/authorization/decision-record-of.js.map +1 -0
- package/dist/authorization/decision-record.d.ts +15 -0
- package/dist/authorization/decision-record.d.ts.map +1 -0
- package/dist/authorization/decision-record.js +2 -0
- package/dist/authorization/decision-record.js.map +1 -0
- package/dist/authorization/decision.d.ts +10 -0
- package/dist/authorization/decision.d.ts.map +1 -0
- package/dist/authorization/decision.js +5 -0
- package/dist/authorization/decision.js.map +1 -0
- package/dist/authorization/denial-reason.d.ts +14 -0
- package/dist/authorization/denial-reason.d.ts.map +1 -0
- package/dist/authorization/denial-reason.js +14 -0
- package/dist/authorization/denial-reason.js.map +1 -0
- package/dist/authorization/is-resource-ref.d.ts +4 -0
- package/dist/authorization/is-resource-ref.d.ts.map +1 -0
- package/dist/authorization/is-resource-ref.js +11 -0
- package/dist/authorization/is-resource-ref.js.map +1 -0
- package/dist/authorization/list-request.d.ts +8 -0
- package/dist/authorization/list-request.d.ts.map +1 -0
- package/dist/authorization/list-request.js +2 -0
- package/dist/authorization/list-request.js.map +1 -0
- package/dist/authorization/on-decision.d.ts +3 -0
- package/dist/authorization/on-decision.d.ts.map +1 -0
- package/dist/authorization/on-decision.js +2 -0
- package/dist/authorization/on-decision.js.map +1 -0
- package/dist/authorization/resource-ref.d.ts +6 -0
- package/dist/authorization/resource-ref.d.ts.map +1 -0
- package/dist/authorization/resource-ref.js +2 -0
- package/dist/authorization/resource-ref.js.map +1 -0
- package/dist/di/authorization-map-of.d.ts +5 -0
- package/dist/di/authorization-map-of.d.ts.map +1 -0
- package/dist/di/authorization-map-of.js +30 -0
- package/dist/di/authorization-map-of.js.map +1 -0
- package/dist/di/authorization-module.d.ts +24 -0
- package/dist/di/authorization-module.d.ts.map +1 -0
- package/dist/di/authorization-module.js +75 -0
- package/dist/di/authorization-module.js.map +1 -0
- package/dist/di.d.ts +7 -0
- package/dist/di.d.ts.map +1 -0
- package/dist/di.js +7 -0
- package/dist/di.js.map +1 -0
- package/dist/errors/authorization-setup-error.d.ts +5 -0
- package/dist/errors/authorization-setup-error.d.ts.map +1 -0
- package/dist/errors/authorization-setup-error.js +8 -0
- package/dist/errors/authorization-setup-error.js.map +1 -0
- package/dist/errors/forbidden-error.d.ts +14 -0
- package/dist/errors/forbidden-error.d.ts.map +1 -0
- package/dist/errors/forbidden-error.js +18 -0
- package/dist/errors/forbidden-error.js.map +1 -0
- package/dist/errors/invalid-credential-error.d.ts +8 -0
- package/dist/errors/invalid-credential-error.d.ts.map +1 -0
- package/dist/errors/invalid-credential-error.js +12 -0
- package/dist/errors/invalid-credential-error.js.map +1 -0
- package/dist/errors/listing-not-supported-error.d.ts +5 -0
- package/dist/errors/listing-not-supported-error.d.ts.map +1 -0
- package/dist/errors/listing-not-supported-error.js +8 -0
- package/dist/errors/listing-not-supported-error.js.map +1 -0
- package/dist/errors/missing-actor-error.d.ts +6 -0
- package/dist/errors/missing-actor-error.d.ts.map +1 -0
- package/dist/errors/missing-actor-error.js +8 -0
- package/dist/errors/missing-actor-error.js.map +1 -0
- package/dist/errors/unauthenticated-error.d.ts +12 -0
- package/dist/errors/unauthenticated-error.d.ts.map +1 -0
- package/dist/errors/unauthenticated-error.js +14 -0
- package/dist/errors/unauthenticated-error.js.map +1 -0
- package/dist/errors/undeclared-use-case-error.d.ts +9 -0
- package/dist/errors/undeclared-use-case-error.d.ts.map +1 -0
- package/dist/errors/undeclared-use-case-error.js +11 -0
- package/dist/errors/undeclared-use-case-error.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt/claims.d.ts +3 -0
- package/dist/jwt/claims.d.ts.map +1 -0
- package/dist/jwt/claims.js +2 -0
- package/dist/jwt/claims.js.map +1 -0
- package/dist/jwt/is-service-account.d.ts +3 -0
- package/dist/jwt/is-service-account.d.ts.map +1 -0
- package/dist/jwt/is-service-account.js +7 -0
- package/dist/jwt/is-service-account.js.map +1 -0
- package/dist/jwt/jwt-authenticator.d.ts +45 -0
- package/dist/jwt/jwt-authenticator.d.ts.map +1 -0
- package/dist/jwt/jwt-authenticator.js +109 -0
- package/dist/jwt/jwt-authenticator.js.map +1 -0
- package/dist/jwt/keycloak-actor-of.d.ts +6 -0
- package/dist/jwt/keycloak-actor-of.d.ts.map +1 -0
- package/dist/jwt/keycloak-actor-of.js +56 -0
- package/dist/jwt/keycloak-actor-of.js.map +1 -0
- package/dist/jwt/keycloak-authentication-method.d.ts +5 -0
- package/dist/jwt/keycloak-authentication-method.d.ts.map +1 -0
- package/dist/jwt/keycloak-authentication-method.js +6 -0
- package/dist/jwt/keycloak-authentication-method.js.map +1 -0
- package/dist/jwt/keycloak-authenticator.d.ts +23 -0
- package/dist/jwt/keycloak-authenticator.d.ts.map +1 -0
- package/dist/jwt/keycloak-authenticator.js +25 -0
- package/dist/jwt/keycloak-authenticator.js.map +1 -0
- package/dist/jwt/keycloak-claim-options.d.ts +9 -0
- package/dist/jwt/keycloak-claim-options.d.ts.map +1 -0
- package/dist/jwt/keycloak-claim-options.js +2 -0
- package/dist/jwt/keycloak-claim-options.js.map +1 -0
- package/dist/jwt/session-of-claims.d.ts +13 -0
- package/dist/jwt/session-of-claims.d.ts.map +1 -0
- package/dist/jwt/session-of-claims.js +71 -0
- package/dist/jwt/session-of-claims.js.map +1 -0
- package/dist/jwt/without-trailing-slashes.d.ts +3 -0
- package/dist/jwt/without-trailing-slashes.d.ts.map +1 -0
- package/dist/jwt/without-trailing-slashes.js +9 -0
- package/dist/jwt/without-trailing-slashes.js.map +1 -0
- package/dist/jwt.d.ts +3 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +3 -0
- package/dist/jwt.js.map +1 -0
- package/dist/permissions/define-permissions.d.ts +13 -0
- package/dist/permissions/define-permissions.d.ts.map +1 -0
- package/dist/permissions/define-permissions.js +23 -0
- package/dist/permissions/define-permissions.js.map +1 -0
- package/dist/permissions/grant-covers.d.ts +3 -0
- package/dist/permissions/grant-covers.d.ts.map +1 -0
- package/dist/permissions/grant-covers.js +5 -0
- package/dist/permissions/grant-covers.js.map +1 -0
- package/dist/permissions/grant-pattern.d.ts +5 -0
- package/dist/permissions/grant-pattern.d.ts.map +1 -0
- package/dist/permissions/grant-pattern.js +12 -0
- package/dist/permissions/grant-pattern.js.map +1 -0
- package/dist/permissions/grant.d.ts +4 -0
- package/dist/permissions/grant.d.ts.map +1 -0
- package/dist/permissions/grant.js +2 -0
- package/dist/permissions/grant.js.map +1 -0
- package/dist/permissions/is-permission.d.ts +3 -0
- package/dist/permissions/is-permission.d.ts.map +1 -0
- package/dist/permissions/is-permission.js +10 -0
- package/dist/permissions/is-permission.js.map +1 -0
- package/dist/permissions/permission-registry.d.ts +12 -0
- package/dist/permissions/permission-registry.d.ts.map +1 -0
- package/dist/permissions/permission-registry.js +31 -0
- package/dist/permissions/permission-registry.js.map +1 -0
- package/dist/permissions/permission.d.ts +9 -0
- package/dist/permissions/permission.d.ts.map +1 -0
- package/dist/permissions/permission.js +2 -0
- package/dist/permissions/permission.js.map +1 -0
- package/dist/policies/define-policy.d.ts +4 -0
- package/dist/policies/define-policy.d.ts.map +1 -0
- package/dist/policies/define-policy.js +10 -0
- package/dist/policies/define-policy.js.map +1 -0
- package/dist/policies/policy-access.d.ts +32 -0
- package/dist/policies/policy-access.d.ts.map +1 -0
- package/dist/policies/policy-access.js +78 -0
- package/dist/policies/policy-access.js.map +1 -0
- package/dist/policies/policy-context.d.ts +5 -0
- package/dist/policies/policy-context.d.ts.map +1 -0
- package/dist/policies/policy-context.js +2 -0
- package/dist/policies/policy-context.js.map +1 -0
- package/dist/policies/policy.d.ts +18 -0
- package/dist/policies/policy.d.ts.map +1 -0
- package/dist/policies/policy.js +2 -0
- package/dist/policies/policy.js.map +1 -0
- package/dist/rbac/role-based-authorizer.d.ts +35 -0
- package/dist/rbac/role-based-authorizer.d.ts.map +1 -0
- package/dist/rbac/role-based-authorizer.js +68 -0
- package/dist/rbac/role-based-authorizer.js.map +1 -0
- package/dist/rbac/tenant-of-context.d.ts +4 -0
- package/dist/rbac/tenant-of-context.d.ts.map +1 -0
- package/dist/rbac/tenant-of-context.js +6 -0
- package/dist/rbac/tenant-of-context.js.map +1 -0
- package/dist/rebac/define-schema.d.ts +8 -0
- package/dist/rebac/define-schema.d.ts.map +1 -0
- package/dist/rebac/define-schema.js +99 -0
- package/dist/rebac/define-schema.js.map +1 -0
- package/dist/rebac/evaluation.d.ts +31 -0
- package/dist/rebac/evaluation.d.ts.map +1 -0
- package/dist/rebac/evaluation.js +94 -0
- package/dist/rebac/evaluation.js.map +1 -0
- package/dist/rebac/expand-node.d.ts +13 -0
- package/dist/rebac/expand-node.d.ts.map +1 -0
- package/dist/rebac/expand-node.js +2 -0
- package/dist/rebac/expand-node.js.map +1 -0
- package/dist/rebac/in-memory-relation-tuple-store.d.ts +12 -0
- package/dist/rebac/in-memory-relation-tuple-store.d.ts.map +1 -0
- package/dist/rebac/in-memory-relation-tuple-store.js +25 -0
- package/dist/rebac/in-memory-relation-tuple-store.js.map +1 -0
- package/dist/rebac/invalid-tuple-error.d.ts +5 -0
- package/dist/rebac/invalid-tuple-error.d.ts.map +1 -0
- package/dist/rebac/invalid-tuple-error.js +8 -0
- package/dist/rebac/invalid-tuple-error.js.map +1 -0
- package/dist/rebac/object-of.d.ts +3 -0
- package/dist/rebac/object-of.d.ts.map +1 -0
- package/dist/rebac/object-of.js +4 -0
- package/dist/rebac/object-of.js.map +1 -0
- package/dist/rebac/parse-object.d.ts +3 -0
- package/dist/rebac/parse-object.d.ts.map +1 -0
- package/dist/rebac/parse-object.js +10 -0
- package/dist/rebac/parse-object.js.map +1 -0
- package/dist/rebac/parse-subject.d.ts +3 -0
- package/dist/rebac/parse-subject.d.ts.map +1 -0
- package/dist/rebac/parse-subject.js +11 -0
- package/dist/rebac/parse-subject.js.map +1 -0
- package/dist/rebac/permission-mapping.d.ts +3 -0
- package/dist/rebac/permission-mapping.d.ts.map +1 -0
- package/dist/rebac/permission-mapping.js +2 -0
- package/dist/rebac/permission-mapping.js.map +1 -0
- package/dist/rebac/relation-based-authorizer.d.ts +45 -0
- package/dist/rebac/relation-based-authorizer.d.ts.map +1 -0
- package/dist/rebac/relation-based-authorizer.js +113 -0
- package/dist/rebac/relation-based-authorizer.js.map +1 -0
- package/dist/rebac/relation-tuple-store.d.ts +16 -0
- package/dist/rebac/relation-tuple-store.d.ts.map +1 -0
- package/dist/rebac/relation-tuple-store.js +8 -0
- package/dist/rebac/relation-tuple-store.js.map +1 -0
- package/dist/rebac/relation-tuple.d.ts +12 -0
- package/dist/rebac/relation-tuple.d.ts.map +1 -0
- package/dist/rebac/relation-tuple.js +2 -0
- package/dist/rebac/relation-tuple.js.map +1 -0
- package/dist/rebac/resolution.d.ts +9 -0
- package/dist/rebac/resolution.d.ts.map +1 -0
- package/dist/rebac/resolution.js +2 -0
- package/dist/rebac/resolution.js.map +1 -0
- package/dist/rebac/reverse-expansion-limit-error.d.ts +5 -0
- package/dist/rebac/reverse-expansion-limit-error.d.ts.map +1 -0
- package/dist/rebac/reverse-expansion-limit-error.js +8 -0
- package/dist/rebac/reverse-expansion-limit-error.js.map +1 -0
- package/dist/rebac/rewrite.d.ts +24 -0
- package/dist/rebac/rewrite.d.ts.map +1 -0
- package/dist/rebac/rewrite.js +15 -0
- package/dist/rebac/rewrite.js.map +1 -0
- package/dist/rebac/schema-checked-tuple-store.d.ts +14 -0
- package/dist/rebac/schema-checked-tuple-store.d.ts.map +1 -0
- package/dist/rebac/schema-checked-tuple-store.js +25 -0
- package/dist/rebac/schema-checked-tuple-store.js.map +1 -0
- package/dist/rebac/schema-definition.d.ts +3 -0
- package/dist/rebac/schema-definition.d.ts.map +1 -0
- package/dist/rebac/schema-definition.js +2 -0
- package/dist/rebac/schema-definition.js.map +1 -0
- package/dist/rebac/schema-error.d.ts +5 -0
- package/dist/rebac/schema-error.d.ts.map +1 -0
- package/dist/rebac/schema-error.js +8 -0
- package/dist/rebac/schema-error.js.map +1 -0
- package/dist/rebac/schema.d.ts +18 -0
- package/dist/rebac/schema.d.ts.map +1 -0
- package/dist/rebac/schema.js +49 -0
- package/dist/rebac/schema.js.map +1 -0
- package/dist/rebac/subject-ref.d.ts +6 -0
- package/dist/rebac/subject-ref.d.ts.map +1 -0
- package/dist/rebac/subject-ref.js +2 -0
- package/dist/rebac/subject-ref.js.map +1 -0
- package/dist/rebac/tuple-key.d.ts +3 -0
- package/dist/rebac/tuple-key.d.ts.map +1 -0
- package/dist/rebac/tuple-key.js +4 -0
- package/dist/rebac/tuple-key.js.map +1 -0
- package/dist/rebac/type-definition.d.ts +7 -0
- package/dist/rebac/type-definition.d.ts.map +1 -0
- package/dist/rebac/type-definition.js +2 -0
- package/dist/rebac/type-definition.js.map +1 -0
- package/dist/rebac.d.ts +22 -0
- package/dist/rebac.d.ts.map +1 -0
- package/dist/rebac.js +15 -0
- package/dist/rebac.js.map +1 -0
- package/dist/testing/actor-builder.d.ts +21 -0
- package/dist/testing/actor-builder.d.ts.map +1 -0
- package/dist/testing/actor-builder.js +26 -0
- package/dist/testing/actor-builder.js.map +1 -0
- package/dist/testing/allow-all.d.ts +9 -0
- package/dist/testing/allow-all.d.ts.map +1 -0
- package/dist/testing/allow-all.js +11 -0
- package/dist/testing/allow-all.js.map +1 -0
- package/dist/testing/an-actor.d.ts +4 -0
- package/dist/testing/an-actor.d.ts.map +1 -0
- package/dist/testing/an-actor.js +7 -0
- package/dist/testing/an-actor.js.map +1 -0
- package/dist/testing/authorizer-contract.d.ts +18 -0
- package/dist/testing/authorizer-contract.d.ts.map +1 -0
- package/dist/testing/authorizer-contract.js +102 -0
- package/dist/testing/authorizer-contract.js.map +1 -0
- package/dist/testing/deny-all.d.ts +10 -0
- package/dist/testing/deny-all.d.ts.map +1 -0
- package/dist/testing/deny-all.js +14 -0
- package/dist/testing/deny-all.js.map +1 -0
- package/dist/testing/fake-authenticator.d.ts +13 -0
- package/dist/testing/fake-authenticator.d.ts.map +1 -0
- package/dist/testing/fake-authenticator.js +26 -0
- package/dist/testing/fake-authenticator.js.map +1 -0
- package/dist/testing/recording-authorizer.d.ts +15 -0
- package/dist/testing/recording-authorizer.d.ts.map +1 -0
- package/dist/testing/recording-authorizer.js +19 -0
- package/dist/testing/recording-authorizer.js.map +1 -0
- package/dist/testing/relation-tuple-store-contract.d.ts +10 -0
- package/dist/testing/relation-tuple-store-contract.d.ts.map +1 -0
- package/dist/testing/relation-tuple-store-contract.js +68 -0
- package/dist/testing/relation-tuple-store-contract.js.map +1 -0
- package/dist/testing.d.ts +9 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +9 -0
- package/dist/testing.js.map +1 -0
- package/dist/use-cases/authorization-map.d.ts +18 -0
- package/dist/use-cases/authorization-map.d.ts.map +1 -0
- package/dist/use-cases/authorization-map.js +32 -0
- package/dist/use-cases/authorization-map.js.map +1 -0
- package/dist/use-cases/authorization-middleware.d.ts +17 -0
- package/dist/use-cases/authorization-middleware.d.ts.map +1 -0
- package/dist/use-cases/authorization-middleware.js +49 -0
- package/dist/use-cases/authorization-middleware.js.map +1 -0
- package/dist/use-cases/public-use-case.d.ts +5 -0
- package/dist/use-cases/public-use-case.d.ts.map +1 -0
- package/dist/use-cases/public-use-case.js +5 -0
- package/dist/use-cases/public-use-case.js.map +1 -0
- package/dist/use-cases/requires.d.ts +17 -0
- package/dist/use-cases/requires.d.ts.map +1 -0
- package/dist/use-cases/requires.js +14 -0
- package/dist/use-cases/requires.js.map +1 -0
- package/dist/use-cases/use-case-declaration.d.ts +17 -0
- package/dist/use-cases/use-case-declaration.d.ts.map +1 -0
- package/dist/use-cases/use-case-declaration.js +2 -0
- package/dist/use-cases/use-case-declaration.js.map +1 -0
- package/package.json +67 -4
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { isAnonymous, isSystem } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import { ALLOWED, deny } from '../authorization/decision.js';
|
|
3
|
+
import { DenialReason } from '../authorization/denial-reason.js';
|
|
4
|
+
import { AuthorizationSetupError } from '../errors/authorization-setup-error.js';
|
|
5
|
+
import { grantCovers } from '../permissions/grant-covers.js';
|
|
6
|
+
import { grantPattern } from '../permissions/grant-pattern.js';
|
|
7
|
+
/** RBAC: an actor may do what one of its roles grants. It decides on actions, not on elements. */
|
|
8
|
+
export class RoleBasedAuthorizer {
|
|
9
|
+
options;
|
|
10
|
+
grants;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
this.grants = effectiveGrants(options);
|
|
14
|
+
}
|
|
15
|
+
async check(request) {
|
|
16
|
+
if (isAnonymous(request.actor)) {
|
|
17
|
+
return deny(DenialReason.anonymous);
|
|
18
|
+
}
|
|
19
|
+
if (!this.holds(request.actor, request.permission)) {
|
|
20
|
+
return deny(DenialReason.noMatchingRole);
|
|
21
|
+
}
|
|
22
|
+
return (await this.targetsAnotherTenant(request)) ? deny(DenialReason.tenantMismatch) : ALLOWED;
|
|
23
|
+
}
|
|
24
|
+
/** Constant time: everything, nothing, or the rows of the actor's tenant. */
|
|
25
|
+
async listAccessible({ actor, permission }) {
|
|
26
|
+
if (isAnonymous(actor) || !this.holds(actor, permission)) {
|
|
27
|
+
return { kind: 'none' };
|
|
28
|
+
}
|
|
29
|
+
if (this.options.tenantOf === undefined || this.crossesTenants(actor)) {
|
|
30
|
+
return { kind: 'all' };
|
|
31
|
+
}
|
|
32
|
+
return actor.tenantId === undefined ? { kind: 'none' } : { kind: 'filter', filter: { tenantId: actor.tenantId } };
|
|
33
|
+
}
|
|
34
|
+
holds(actor, permission) {
|
|
35
|
+
return this.rolesOf(actor).some((role) => (this.grants.get(role) ?? []).some((pattern) => grantCovers(pattern, permission)));
|
|
36
|
+
}
|
|
37
|
+
rolesOf(actor) {
|
|
38
|
+
const { systemRole } = this.options;
|
|
39
|
+
return isSystem(actor) && systemRole !== undefined ? [...actor.roles, systemRole] : actor.roles;
|
|
40
|
+
}
|
|
41
|
+
async targetsAnotherTenant(request) {
|
|
42
|
+
if (this.options.tenantOf === undefined || this.crossesTenants(request.actor)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const targeted = await this.options.tenantOf(request);
|
|
46
|
+
return targeted !== undefined && targeted !== request.actor.tenantId;
|
|
47
|
+
}
|
|
48
|
+
crossesTenants(actor) {
|
|
49
|
+
const crossing = this.options.crossTenantRoles ?? [];
|
|
50
|
+
return this.rolesOf(actor).some((role) => crossing.includes(role));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function effectiveGrants(options) {
|
|
54
|
+
const inherits = options.inherits ?? {};
|
|
55
|
+
const roles = new Set([...Object.keys(options.roles), ...Object.keys(inherits)]);
|
|
56
|
+
const own = new Map([...roles].map((role) => [role, (options.roles[role] ?? []).map(grantPattern)]));
|
|
57
|
+
const lineage = (role, path) => {
|
|
58
|
+
if (!roles.has(role)) {
|
|
59
|
+
throw new AuthorizationSetupError(`Role "${path.at(-1) ?? role}" inherits the unknown role "${role}".`);
|
|
60
|
+
}
|
|
61
|
+
if (path.includes(role)) {
|
|
62
|
+
throw new AuthorizationSetupError(`Role hierarchy cycle: ${[...path, role].join(' -> ')}.`);
|
|
63
|
+
}
|
|
64
|
+
return [role, ...(inherits[role] ?? []).flatMap((parent) => lineage(parent, [...path, role]))];
|
|
65
|
+
};
|
|
66
|
+
return new Map([...roles].map((role) => [role, [...new Set(lineage(role, []).flatMap((ancestor) => own.get(ancestor) ?? []))]]));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=role-based-authorizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-based-authorizer.js","sourceRoot":"","sources":["../../src/rbac/role-based-authorizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CheckRequest } from '../authorization/check-request.js';
|
|
2
|
+
/** For `tenantOf`: reads `context.tenantId`, which `requires(..., { context })` provides. */
|
|
3
|
+
export declare function tenantOfContext(request: CheckRequest): string | undefined;
|
|
4
|
+
//# sourceMappingURL=tenant-of-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-of-context.d.ts","sourceRoot":"","sources":["../../src/rbac/tenant-of-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAIzE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** For `tenantOf`: reads `context.tenantId`, which `requires(..., { context })` provides. */
|
|
2
|
+
export function tenantOfContext(request) {
|
|
3
|
+
const tenantId = request.context?.['tenantId'];
|
|
4
|
+
return typeof tenantId === 'string' ? tenantId : undefined;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=tenant-of-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-of-context.js","sourceRoot":"","sources":["../../src/rbac/tenant-of-context.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;IAE/C,OAAO,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Schema } from './schema.js';
|
|
2
|
+
import type { SchemaDefinition } from './schema-definition.js';
|
|
3
|
+
/**
|
|
4
|
+
* The object types, their relations and how permissions derive from them. Validated here, so
|
|
5
|
+
* an unknown type or relation, or a rewrite that could never terminate, never reaches a check.
|
|
6
|
+
*/
|
|
7
|
+
export declare function defineSchema(definition: SchemaDefinition): Schema;
|
|
8
|
+
//# sourceMappingURL=define-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-schema.d.ts","sourceRoot":"","sources":["../../src/rebac/define-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAcjE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Schema } from './schema.js';
|
|
2
|
+
import { SchemaError } from './schema-error.js';
|
|
3
|
+
/**
|
|
4
|
+
* The object types, their relations and how permissions derive from them. Validated here, so
|
|
5
|
+
* an unknown type or relation, or a rewrite that could never terminate, never reaches a check.
|
|
6
|
+
*/
|
|
7
|
+
export function defineSchema(definition) {
|
|
8
|
+
const schema = new Schema(definition);
|
|
9
|
+
for (const type of schema.types()) {
|
|
10
|
+
assertNoNameClash(schema, type);
|
|
11
|
+
assertSubjectsExist(schema, type);
|
|
12
|
+
for (const [name, rewrite] of Object.entries(schema.permissions(type))) {
|
|
13
|
+
assertResolves(schema, { type, name }, rewrite);
|
|
14
|
+
assertTerminates(schema, type, [name]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return schema;
|
|
18
|
+
}
|
|
19
|
+
function assertNoNameClash(schema, type) {
|
|
20
|
+
const relations = Object.keys(schema.relations(type));
|
|
21
|
+
const clash = Object.keys(schema.permissions(type)).find((name) => relations.includes(name));
|
|
22
|
+
if (clash !== undefined) {
|
|
23
|
+
throw new SchemaError(`"${type}" declares "${clash}" both as a relation and as a permission.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function assertSubjectsExist(schema, type) {
|
|
27
|
+
for (const [name, subjects] of Object.entries(schema.relations(type))) {
|
|
28
|
+
for (const subject of subjects) {
|
|
29
|
+
const [subjectType = '', relation] = subject.split('#');
|
|
30
|
+
if (!schema.types().includes(subjectType)) {
|
|
31
|
+
throw new SchemaError(`"${type}#${name}" accepts the unknown type "${subjectType}".`);
|
|
32
|
+
}
|
|
33
|
+
if (relation !== undefined && schema.resolve(subjectType, relation) === undefined) {
|
|
34
|
+
throw new SchemaError(`"${type}#${name}" accepts "${subject}", but "${subjectType}" has no "${relation}".`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function assertResolves(schema, at, rewrite) {
|
|
40
|
+
if (typeof rewrite === 'string') {
|
|
41
|
+
if (schema.resolve(at.type, rewrite) !== undefined) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
throw new SchemaError(`"${at.type}#${at.name}" refers to "${rewrite}", which "${at.type}" does not declare.`);
|
|
45
|
+
}
|
|
46
|
+
if (rewrite.kind === 'from') {
|
|
47
|
+
assertFollows(schema, at, rewrite);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const children = rewrite.kind === 'exclusion' ? [rewrite.base, rewrite.subtract] : rewrite.children;
|
|
51
|
+
if (children.length === 0) {
|
|
52
|
+
throw new SchemaError(`"${at.type}#${at.name}" has an empty ${rewrite.kind}.`);
|
|
53
|
+
}
|
|
54
|
+
for (const child of children) {
|
|
55
|
+
assertResolves(schema, at, child);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function assertFollows(schema, at, { relation, permission }) {
|
|
59
|
+
const followed = schema.resolve(at.type, relation);
|
|
60
|
+
if (followed?.kind !== 'relation') {
|
|
61
|
+
throw new SchemaError(`"${at.type}#${at.name}" follows "${relation}", which is not a relation of "${at.type}".`);
|
|
62
|
+
}
|
|
63
|
+
for (const target of followed.subjects) {
|
|
64
|
+
if (target.includes('#')) {
|
|
65
|
+
throw new SchemaError(`"${at.type}#${at.name}" follows "${relation}", which accepts the userset "${target}": only objects can be followed.`);
|
|
66
|
+
}
|
|
67
|
+
if (schema.resolve(target, permission) === undefined) {
|
|
68
|
+
throw new SchemaError(`"${at.type}#${at.name}" asks "${permission}" of "${target}", which does not declare it.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A permission defined by itself through names alone (`edit: 'view'`, `view: 'edit'`) reads
|
|
74
|
+
* no tuple and would loop for ever. A loop through `from` or a userset reads a tuple at each
|
|
75
|
+
* turn: it depends on the data and is cut at run time by the cycle protection.
|
|
76
|
+
*/
|
|
77
|
+
function assertTerminates(schema, type, path) {
|
|
78
|
+
const rewrite = schema.permissions(type)[path.at(-1) ?? ''];
|
|
79
|
+
if (rewrite === undefined) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (const name of namesIn(rewrite)) {
|
|
83
|
+
if (path.includes(name)) {
|
|
84
|
+
throw new SchemaError(`"${type}" has a rewrite that cannot terminate: ${[...path, name].join(' -> ')}.`);
|
|
85
|
+
}
|
|
86
|
+
assertTerminates(schema, type, [...path, name]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function namesIn(rewrite) {
|
|
90
|
+
if (typeof rewrite === 'string') {
|
|
91
|
+
return [rewrite];
|
|
92
|
+
}
|
|
93
|
+
if (rewrite.kind === 'from') {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
const children = rewrite.kind === 'exclusion' ? [rewrite.base, rewrite.subtract] : rewrite.children;
|
|
97
|
+
return children.flatMap(namesIn);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=define-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-schema.js","sourceRoot":"","sources":["../../src/rebac/define-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,UAA4B;IACvD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAClC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAElC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACvE,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YAChD,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,IAAY;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,WAAW,CAAC,IAAI,IAAI,eAAe,KAAK,2CAA2C,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,IAAY;IACvD,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACtE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,WAAW,GAAG,EAAE,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAExD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,WAAW,CAAC,IAAI,IAAI,IAAI,IAAI,+BAA+B,WAAW,IAAI,CAAC,CAAC;YACxF,CAAC;YAED,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;gBAClF,MAAM,IAAI,WAAW,CAAC,IAAI,IAAI,IAAI,IAAI,cAAc,OAAO,WAAW,WAAW,aAAa,QAAQ,IAAI,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAOD,SAAS,cAAc,CAAC,MAAc,EAAE,EAAS,EAAE,OAAgB;IACjE,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,gBAAgB,OAAO,aAAa,EAAE,CAAC,IAAI,qBAAqB,CAAC,CAAC;IAChH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAEnC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEpG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,kBAAkB,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,cAAc,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,EAAS,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAe;IACrF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEnD,IAAI,QAAQ,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,cAAc,QAAQ,kCAAkC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;IACnH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,WAAW,CACnB,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,cAAc,QAAQ,iCAAiC,MAAM,kCAAkC,CACtH,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;YACrD,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,WAAW,UAAU,SAAS,MAAM,+BAA+B,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,MAAc,EAAE,IAAY,EAAE,IAAuB;IAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE5D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,WAAW,CAAC,IAAI,IAAI,0CAA0C,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3G,CAAC;QAED,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,OAAgB;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEpG,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ExpandNode } from './expand-node.js';
|
|
2
|
+
import type { RelationTupleStore } from './relation-tuple-store.js';
|
|
3
|
+
import type { Schema } from './schema.js';
|
|
4
|
+
export interface EvaluationOptions {
|
|
5
|
+
readonly schema: Schema;
|
|
6
|
+
readonly store: RelationTupleStore;
|
|
7
|
+
/** `<type>:<id>` of who is asking. */
|
|
8
|
+
readonly subject: string;
|
|
9
|
+
readonly maxDepth: number;
|
|
10
|
+
/** Visits every branch instead of stopping at the first that settles the answer. */
|
|
11
|
+
readonly exhaustive: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** One question, answered by walking the rewrites of the schema over the stored tuples. */
|
|
14
|
+
export declare class Evaluation {
|
|
15
|
+
private readonly options;
|
|
16
|
+
private cutByDepthLimit;
|
|
17
|
+
constructor(options: EvaluationOptions);
|
|
18
|
+
/** True when a branch was cut by the depth limit: the answer is then not to be trusted. */
|
|
19
|
+
get depthExceeded(): boolean;
|
|
20
|
+
evaluate(object: string, relation: string, path?: readonly string[]): Promise<ExpandNode>;
|
|
21
|
+
private relation;
|
|
22
|
+
/** Runs the steps in order and stops at the first whose answer is `settling`, unless exhaustive. */
|
|
23
|
+
private until;
|
|
24
|
+
private tuple;
|
|
25
|
+
private rewrite;
|
|
26
|
+
private computed;
|
|
27
|
+
private from;
|
|
28
|
+
private exclusion;
|
|
29
|
+
private set;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=evaluation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation.d.ts","sourceRoot":"","sources":["../../src/rebac/evaluation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAWD,2FAA2F;AAC3F,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,eAAe,CAAS;IAEhC,YAA6B,OAAO,EAAE,iBAAiB,EAAI;IAE3D,2FAA2F;IAC3F,IAAI,aAAa,IAAI,OAAO,CAE3B;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,SAAS,MAAM,EAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAqBlG;YAEa,QAAQ;IAWtB,oGAAoG;YACtF,KAAK;YAgBL,KAAK;IAYnB,OAAO,CAAC,OAAO;YAYD,QAAQ;YAMR,IAAI;YAYJ,SAAS;YAYT,GAAG;CAYlB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { parseObject } from './parse-object.js';
|
|
2
|
+
/** One question, answered by walking the rewrites of the schema over the stored tuples. */
|
|
3
|
+
export class Evaluation {
|
|
4
|
+
options;
|
|
5
|
+
cutByDepthLimit = false;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
/** True when a branch was cut by the depth limit: the answer is then not to be trusted. */
|
|
10
|
+
get depthExceeded() {
|
|
11
|
+
return this.cutByDepthLimit;
|
|
12
|
+
}
|
|
13
|
+
async evaluate(object, relation, path = []) {
|
|
14
|
+
const key = `${object}#${relation}`;
|
|
15
|
+
const here = { object, relation, path: [...path, key] };
|
|
16
|
+
if (path.includes(key)) {
|
|
17
|
+
return node(here, { via: 'cycle', allowed: false });
|
|
18
|
+
}
|
|
19
|
+
if (path.length >= this.options.maxDepth) {
|
|
20
|
+
this.cutByDepthLimit = true;
|
|
21
|
+
return node(here, { via: 'depth-limit', allowed: false });
|
|
22
|
+
}
|
|
23
|
+
const resolution = this.options.schema.resolve(parseObject(object).type, relation);
|
|
24
|
+
if (resolution === undefined) {
|
|
25
|
+
return node(here, { via: 'unknown', allowed: false });
|
|
26
|
+
}
|
|
27
|
+
return resolution.kind === 'relation' ? this.relation(here) : this.rewrite(here, resolution.rewrite);
|
|
28
|
+
}
|
|
29
|
+
async relation(here) {
|
|
30
|
+
const tuples = await this.options.store.readByObject(here.object, here.relation);
|
|
31
|
+
const children = await this.until(true, tuples.map((tuple) => () => this.tuple(here, tuple)));
|
|
32
|
+
return node(here, { via: 'relation', allowed: children.some(isAllowed), children });
|
|
33
|
+
}
|
|
34
|
+
/** Runs the steps in order and stops at the first whose answer is `settling`, unless exhaustive. */
|
|
35
|
+
async until(settling, steps) {
|
|
36
|
+
const visited = [];
|
|
37
|
+
for (const step of steps) {
|
|
38
|
+
const outcome = await step();
|
|
39
|
+
visited.push(outcome);
|
|
40
|
+
if (!this.options.exhaustive && outcome.allowed === settling) {
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return visited;
|
|
45
|
+
}
|
|
46
|
+
async tuple(here, tuple) {
|
|
47
|
+
const [object = '', relation] = tuple.subject.split('#');
|
|
48
|
+
if (relation === undefined) {
|
|
49
|
+
return node(here, { via: 'direct', allowed: tuple.subject === this.options.subject, tuple });
|
|
50
|
+
}
|
|
51
|
+
const members = await this.evaluate(object, relation, here.path);
|
|
52
|
+
return node(here, { via: 'userset', allowed: members.allowed, children: [members], tuple });
|
|
53
|
+
}
|
|
54
|
+
rewrite(here, rewrite) {
|
|
55
|
+
if (typeof rewrite === 'string') {
|
|
56
|
+
return this.computed(here, rewrite);
|
|
57
|
+
}
|
|
58
|
+
if (rewrite.kind === 'from') {
|
|
59
|
+
return this.from(here, rewrite);
|
|
60
|
+
}
|
|
61
|
+
return rewrite.kind === 'exclusion' ? this.exclusion(here, rewrite) : this.set(here, rewrite);
|
|
62
|
+
}
|
|
63
|
+
async computed(here, name) {
|
|
64
|
+
const child = await this.evaluate(here.object, name, here.path);
|
|
65
|
+
return node(here, { via: 'computed', allowed: child.allowed, children: [child] });
|
|
66
|
+
}
|
|
67
|
+
async from(here, { relation, permission }) {
|
|
68
|
+
const tuples = await this.options.store.readByObject(here.object, relation);
|
|
69
|
+
const followed = tuples.filter((tuple) => !tuple.subject.includes('#'));
|
|
70
|
+
const children = await this.until(true, followed.map((tuple) => async () => ({ ...(await this.evaluate(tuple.subject, permission, here.path)), tuple })));
|
|
71
|
+
return node(here, { via: 'from', allowed: children.some(isAllowed), children });
|
|
72
|
+
}
|
|
73
|
+
async exclusion(here, { base, subtract }) {
|
|
74
|
+
const kept = await this.rewrite(here, base);
|
|
75
|
+
if (!kept.allowed && !this.options.exhaustive) {
|
|
76
|
+
return node(here, { via: 'exclusion', allowed: false, children: [kept] });
|
|
77
|
+
}
|
|
78
|
+
const removed = await this.rewrite(here, subtract);
|
|
79
|
+
return node(here, { via: 'exclusion', allowed: kept.allowed && !removed.allowed, children: [kept, removed] });
|
|
80
|
+
}
|
|
81
|
+
async set(here, { kind, children }) {
|
|
82
|
+
const settles = kind === 'union';
|
|
83
|
+
const visited = await this.until(settles, children.map((child) => () => this.rewrite(here, child)));
|
|
84
|
+
const allowed = settles ? visited.some(isAllowed) : visited.every(isAllowed);
|
|
85
|
+
return node(here, { via: kind, allowed, children: visited });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function node({ object, relation }, outcome) {
|
|
89
|
+
return { object, relation, children: [], ...outcome };
|
|
90
|
+
}
|
|
91
|
+
function isAllowed(outcome) {
|
|
92
|
+
return outcome.allowed;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=evaluation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation.js","sourceRoot":"","sources":["../../src/rebac/evaluation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RelationTuple } from './relation-tuple.js';
|
|
2
|
+
/** One step of an evaluation: what was asked of which object, how, and with what answer. */
|
|
3
|
+
export interface ExpandNode {
|
|
4
|
+
readonly object: string;
|
|
5
|
+
/** The relation or permission evaluated on the object. */
|
|
6
|
+
readonly relation: string;
|
|
7
|
+
readonly via: 'relation' | 'direct' | 'userset' | 'computed' | 'union' | 'intersection' | 'exclusion' | 'from' | 'cycle' | 'depth-limit' | 'unknown';
|
|
8
|
+
readonly allowed: boolean;
|
|
9
|
+
/** The stored fact that led to this step. */
|
|
10
|
+
readonly tuple?: RelationTuple;
|
|
11
|
+
readonly children: readonly ExpandNode[];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=expand-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand-node.d.ts","sourceRoot":"","sources":["../../src/rebac/expand-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EACR,UAAU,GACV,QAAQ,GACR,SAAS,GACT,UAAU,GACV,OAAO,GACP,cAAc,GACd,WAAW,GACX,MAAM,GACN,OAAO,GACP,aAAa,GACb,SAAS,CAAC;IACd,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand-node.js","sourceRoot":"","sources":["../../src/rebac/expand-node.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RelationTuple } from './relation-tuple.js';
|
|
2
|
+
import type { RelationTupleStore } from './relation-tuple-store.js';
|
|
3
|
+
export declare class InMemoryRelationTupleStore implements RelationTupleStore {
|
|
4
|
+
private readonly tuples;
|
|
5
|
+
write(tuples: readonly RelationTuple[]): Promise<void>;
|
|
6
|
+
delete(tuples: readonly RelationTuple[]): Promise<void>;
|
|
7
|
+
readByObject(object: string, relation: string): Promise<readonly RelationTuple[]>;
|
|
8
|
+
readBySubject(subject: string): Promise<readonly RelationTuple[]>;
|
|
9
|
+
/** Every stored tuple, for the assertions of a test. */
|
|
10
|
+
all(): readonly RelationTuple[];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=in-memory-relation-tuple-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-relation-tuple-store.d.ts","sourceRoot":"","sources":["../../src/rebac/in-memory-relation-tuple-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAErD,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3D;IAEK,MAAM,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5D;IAEK,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAEtF;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAEtE;IAED,wDAAwD;IACxD,GAAG,IAAI,SAAS,aAAa,EAAE,CAE9B;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { tupleKey } from './tuple-key.js';
|
|
2
|
+
export class InMemoryRelationTupleStore {
|
|
3
|
+
tuples = new Map();
|
|
4
|
+
async write(tuples) {
|
|
5
|
+
for (const tuple of tuples) {
|
|
6
|
+
this.tuples.set(tupleKey(tuple), { ...tuple });
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
async delete(tuples) {
|
|
10
|
+
for (const tuple of tuples) {
|
|
11
|
+
this.tuples.delete(tupleKey(tuple));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async readByObject(object, relation) {
|
|
15
|
+
return this.all().filter((tuple) => tuple.object === object && tuple.relation === relation);
|
|
16
|
+
}
|
|
17
|
+
async readBySubject(subject) {
|
|
18
|
+
return this.all().filter((tuple) => tuple.subject === subject);
|
|
19
|
+
}
|
|
20
|
+
/** Every stored tuple, for the assertions of a test. */
|
|
21
|
+
all() {
|
|
22
|
+
return [...this.tuples.values()];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=in-memory-relation-tuple-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-relation-tuple-store.js","sourceRoot":"","sources":["../../src/rebac/in-memory-relation-tuple-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,OAAO,0BAA0B;IACpB,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE3D,KAAK,CAAC,KAAK,CAAC,MAAgC;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAgC;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,QAAgB;QACjD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,wDAAwD;IACxD,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalid-tuple-error.d.ts","sourceRoot":"","sources":["../../src/rebac/invalid-tuple-error.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalid-tuple-error.js","sourceRoot":"","sources":["../../src/rebac/invalid-tuple-error.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-of.d.ts","sourceRoot":"","sources":["../../src/rebac/object-of.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-of.js","sourceRoot":"","sources":["../../src/rebac/object-of.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,QAAqB;IAC5C,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-object.d.ts","sourceRoot":"","sources":["../../src/rebac/parse-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAKpE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAQvD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { InvalidTupleError } from './invalid-tuple-error.js';
|
|
2
|
+
const OBJECT_PATTERN = /^([a-z][a-z0-9_-]*):([^#@\s]+)$/;
|
|
3
|
+
export function parseObject(object) {
|
|
4
|
+
const [, type, id] = OBJECT_PATTERN.exec(object) ?? [];
|
|
5
|
+
if (type === undefined || id === undefined) {
|
|
6
|
+
throw new InvalidTupleError(`"${object}" is not an object: expected <type>:<id>.`);
|
|
7
|
+
}
|
|
8
|
+
return { type, id };
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=parse-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-object.js","sourceRoot":"","sources":["../../src/rebac/parse-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAEzD,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,iBAAiB,CAAC,IAAI,MAAM,2CAA2C,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-subject.d.ts","sourceRoot":"","sources":["../../src/rebac/parse-subject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAQxD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { InvalidTupleError } from './invalid-tuple-error.js';
|
|
2
|
+
import { parseObject } from './parse-object.js';
|
|
3
|
+
const NAME_PATTERN = /^[a-z][a-z0-9_-]*$/;
|
|
4
|
+
export function parseSubject(subject) {
|
|
5
|
+
const [object = '', relation, ...rest] = subject.split('#');
|
|
6
|
+
if (rest.length > 0 || (relation !== undefined && !NAME_PATTERN.test(relation))) {
|
|
7
|
+
throw new InvalidTupleError(`"${subject}" is not a subject: expected <type>:<id> or <type>:<id>#<relation>.`);
|
|
8
|
+
}
|
|
9
|
+
return relation === undefined ? parseObject(object) : { ...parseObject(object), relation };
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=parse-subject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-subject.js","sourceRoot":"","sources":["../../src/rebac/parse-subject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAE1C,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE5D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,iBAAiB,CAAC,IAAI,OAAO,qEAAqE,CAAC,CAAC;IAChH,CAAC;IAED,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-mapping.d.ts","sourceRoot":"","sources":["../../src/rebac/permission-mapping.ts"],"names":[],"mappings":"AAAA,iIAAiI;AACjI,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-mapping.js","sourceRoot":"","sources":["../../src/rebac/permission-mapping.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Actor } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import type { AccessScope } from '../authorization/access-scope.js';
|
|
3
|
+
import type { Authorizer } from '../authorization/authorizer.js';
|
|
4
|
+
import type { CheckRequest } from '../authorization/check-request.js';
|
|
5
|
+
import { type Decision } from '../authorization/decision.js';
|
|
6
|
+
import type { ListRequest } from '../authorization/list-request.js';
|
|
7
|
+
import type { ExpandNode } from './expand-node.js';
|
|
8
|
+
import type { PermissionMapping } from './permission-mapping.js';
|
|
9
|
+
import type { RelationTupleStore } from './relation-tuple-store.js';
|
|
10
|
+
import type { Schema } from './schema.js';
|
|
11
|
+
export interface RelationBasedAuthorizerOptions {
|
|
12
|
+
readonly schema: Schema;
|
|
13
|
+
readonly store: RelationTupleStore;
|
|
14
|
+
readonly mapping: PermissionMapping;
|
|
15
|
+
/** How many `object#relation` hops one check may chain. Default 16. Beyond it the answer is no. */
|
|
16
|
+
readonly maxDepth?: number;
|
|
17
|
+
/** How many subjects a listing may walk through before giving up loudly. Default 10000. */
|
|
18
|
+
readonly listLimit?: number;
|
|
19
|
+
/** The subject an actor is in the tuples. Default `<actor type>:<actor id>`, such as `user:ada`. */
|
|
20
|
+
readonly subjectOf?: (actor: Actor) => string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* ReBAC in the manner of Zanzibar, evaluated in process: a permission holds when the rewrites
|
|
24
|
+
* of the schema find a path of stored tuples from the object to the actor.
|
|
25
|
+
*/
|
|
26
|
+
export declare class RelationBasedAuthorizer implements Authorizer {
|
|
27
|
+
private readonly options;
|
|
28
|
+
constructor(options: RelationBasedAuthorizerOptions);
|
|
29
|
+
check(request: CheckRequest): Promise<Decision>;
|
|
30
|
+
/**
|
|
31
|
+
* By reverse expansion: walks every tuple reachable from the actor, then checks each object
|
|
32
|
+
* of the type it met. Cost: one read per reachable subject and userset, plus one check per
|
|
33
|
+
* candidate. Fine for thousands of tuples per actor, not for a search index.
|
|
34
|
+
*/
|
|
35
|
+
listAccessible({ actor, permission, resourceType }: ListRequest): Promise<AccessScope>;
|
|
36
|
+
/** Why is this allowed, or not: the whole evaluation tree, every branch visited. For debugging. */
|
|
37
|
+
expand(request: Required<Pick<CheckRequest, 'actor' | 'permission' | 'resource'>>): Promise<ExpandNode>;
|
|
38
|
+
private mapped;
|
|
39
|
+
private evaluation;
|
|
40
|
+
private subjectOf;
|
|
41
|
+
private reachable;
|
|
42
|
+
/** How an object may itself be the subject of a tuple: as such, or as one of its usersets. */
|
|
43
|
+
private subjectFormsOf;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=relation-based-authorizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-based-authorizer.d.ts","sourceRoot":"","sources":["../../src/rebac/relation-based-authorizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oGAAoG;IACpG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;CAC/C;AAKD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,UAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,8BAA8B,EAEnE;IAEK,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuBpD;IAED;;;;OAIG;IACG,cAAc,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAmB3F;IAED,mGAAmG;IAC7F,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAU5G;IAED,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,SAAS;YAIH,SAAS;IAyBvB,8FAA8F;IAC9F,OAAO,CAAC,cAAc;CAKvB"}
|