@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,71 @@
|
|
|
1
|
+
/** RFC 8693: the party acting for the subject is the `sub` of the `act` claim. */
|
|
2
|
+
const ACTOR_CLAIM = 'act';
|
|
3
|
+
const NEVER_ISSUED = new Date(0);
|
|
4
|
+
/**
|
|
5
|
+
* The session a verified token stands for. Registered claims only (RFC 7519, OpenID Connect
|
|
6
|
+
* Core, RFC 8176, RFC 8693): the identity provider decides what they say.
|
|
7
|
+
*/
|
|
8
|
+
export function sessionOfClaims(claims, actor, options) {
|
|
9
|
+
const issuedAt = instantOf(claims['iat']);
|
|
10
|
+
return {
|
|
11
|
+
id: textOf(claims['sid']) ?? textOf(claims['jti']) ?? `${actor.id}@${String(issuedAt?.getTime() ?? 0)}`,
|
|
12
|
+
actor,
|
|
13
|
+
issuedAt: issuedAt ?? NEVER_ISSUED,
|
|
14
|
+
authenticationMethod: methodOf(claims, options.authenticationMethod),
|
|
15
|
+
...optional('expiresAt', instantOf(claims['exp'])),
|
|
16
|
+
...optional('authenticationStrength', strengthOf(claims)),
|
|
17
|
+
...optional('impersonatedBy', impersonatorOf(claims[options.impersonatorClaim ?? ACTOR_CLAIM])),
|
|
18
|
+
...optional('locale', textOf(claims['locale'])),
|
|
19
|
+
...optional('timeZone', textOf(claims['zoneinfo'])),
|
|
20
|
+
extensions: options.toSessionExtensions?.(claims) ?? {},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** A NumericDate (RFC 7519): seconds since the epoch. */
|
|
24
|
+
function instantOf(claim) {
|
|
25
|
+
return typeof claim === 'number' && Number.isFinite(claim) ? new Date(claim * 1000) : undefined;
|
|
26
|
+
}
|
|
27
|
+
function textOf(claim) {
|
|
28
|
+
return typeof claim === 'string' && claim !== '' ? claim : undefined;
|
|
29
|
+
}
|
|
30
|
+
function methodOf(claims, configured) {
|
|
31
|
+
if (typeof configured === 'function') {
|
|
32
|
+
return configured(claims);
|
|
33
|
+
}
|
|
34
|
+
return configured ?? (methodReferencesOf(claims)?.includes('pwd') === true ? 'password' : 'token');
|
|
35
|
+
}
|
|
36
|
+
function methodReferencesOf(claims) {
|
|
37
|
+
const references = claims['amr'];
|
|
38
|
+
if (!Array.isArray(references)) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return references.filter((reference) => typeof reference === 'string');
|
|
42
|
+
}
|
|
43
|
+
function optional(key, value) {
|
|
44
|
+
if (value === undefined) {
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
const present = {};
|
|
48
|
+
present[key] = value;
|
|
49
|
+
return present;
|
|
50
|
+
}
|
|
51
|
+
/** `amr` (RFC 8176) says how; `acr` says how sure, in the vocabulary of the provider. */
|
|
52
|
+
function strengthOf(claims) {
|
|
53
|
+
const references = methodReferencesOf(claims);
|
|
54
|
+
const assuranceLevel = textOf(claims['acr']);
|
|
55
|
+
if (references === undefined && assuranceLevel === undefined) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
...(references === undefined ? {} : { mfa: references.includes('mfa') }),
|
|
60
|
+
...(assuranceLevel === undefined ? {} : { assuranceLevel }),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** The claim is the id itself, or an object naming it under `sub` (RFC 8693) or `id`. */
|
|
64
|
+
function impersonatorOf(claim) {
|
|
65
|
+
if (typeof claim !== 'object' || claim === null) {
|
|
66
|
+
return textOf(claim);
|
|
67
|
+
}
|
|
68
|
+
const named = { ...claim };
|
|
69
|
+
return textOf(named['sub']) ?? textOf(named['id']);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=session-of-claims.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-of-claims.js","sourceRoot":"","sources":["../../src/jwt/session-of-claims.ts"],"names":[],"mappings":"AAeA,kFAAkF;AAClF,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAmB,MAAS,EAAE,KAAY,EAAE,OAA+B;IACxG,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1C,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE;QACvG,KAAK;QACL,QAAQ,EAAE,QAAQ,IAAI,YAAY;QAClC,oBAAoB,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC;QACpE,GAAG,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,GAAG,QAAQ,CAAC,wBAAwB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACzD,GAAG,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,IAAI,WAAW,CAAC,CAAC,CAAC;QAC/F,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,GAAG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACnD,UAAU,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;KACxD,CAAC;AACJ,CAAC;AAED,yDAAyD;AACzD,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClG,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,SAAS,QAAQ,CACf,MAAS,EACT,UAA0D;IAE1D,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,UAAU,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAuB,EAAE,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,QAAQ,CAA4B,GAAQ,EAAE,KAAwB;IAC7E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAgC,EAAE,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAErB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yFAAyF;AACzF,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7C,IAAI,UAAU,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,KAAK,GAAW,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"without-trailing-slashes.d.ts","sourceRoot":"","sources":["../../src/jwt/without-trailing-slashes.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** `value` without the slashes it ends with. */
|
|
2
|
+
export function withoutTrailingSlashes(value) {
|
|
3
|
+
let end = value.length;
|
|
4
|
+
while (end > 0 && value[end - 1] === '/') {
|
|
5
|
+
end -= 1;
|
|
6
|
+
}
|
|
7
|
+
return value.slice(0, end);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=without-trailing-slashes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"without-trailing-slashes.js","sourceRoot":"","sources":["../../src/jwt/without-trailing-slashes.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IAEvB,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACzC,GAAG,IAAI,CAAC,CAAC;IACX,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/jwt.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAAE,KAAK,4BAA4B,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/jwt.js
ADDED
package/dist/jwt.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgC,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAAqC,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Permission } from './permission.js';
|
|
2
|
+
export interface PermissionDeclaration {
|
|
3
|
+
readonly description: string;
|
|
4
|
+
}
|
|
5
|
+
export type PermissionSet<Context extends string, Name extends string> = {
|
|
6
|
+
readonly [N in Name]: Permission<`${Context}:${N}`>;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* The permissions of one bounded context, as data:
|
|
10
|
+
* `definePermissions('billing', { 'invoice.issue': { description: 'Issue an invoice' } })`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function definePermissions<const Context extends string, const Declarations extends Readonly<Record<string, PermissionDeclaration>>>(context: Context, declarations: Declarations): PermissionSet<Context, keyof Declarations & string>;
|
|
13
|
+
//# sourceMappingURL=define-permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-permissions.d.ts","sourceRoot":"","sources":["../../src/permissions/define-permissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,IAAI;IACvE,QAAQ,EAAE,CAAC,IAAI,IAAI,GAAG,UAAU,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;CACpD,CAAC;AAKF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,OAAO,SAAS,MAAM,EAC5B,KAAK,CAAC,YAAY,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,EAC1E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,YAAY,GAAG,MAAM,CAAC,CAWnG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AuthorizationSetupError } from '../errors/authorization-setup-error.js';
|
|
2
|
+
const CONTEXT_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
3
|
+
const NAME_PATTERN = /^[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)*$/;
|
|
4
|
+
/**
|
|
5
|
+
* The permissions of one bounded context, as data:
|
|
6
|
+
* `definePermissions('billing', { 'invoice.issue': { description: 'Issue an invoice' } })`.
|
|
7
|
+
*/
|
|
8
|
+
export function definePermissions(context, declarations) {
|
|
9
|
+
assertMatches(context, CONTEXT_PATTERN, 'context');
|
|
10
|
+
const permissions = Object.entries(declarations).map(([name, { description }]) => {
|
|
11
|
+
assertMatches(name, NAME_PATTERN, 'permission');
|
|
12
|
+
return [name, Object.freeze({ id: `${context}:${name}`, context, name, description })];
|
|
13
|
+
});
|
|
14
|
+
// eslint-disable-next-line ddd-ts-kit/clean-no-escape-hatch -- one entry was built per key of Declarations with the id of that key, which the compiler cannot follow through Object.fromEntries
|
|
15
|
+
return Object.freeze(Object.fromEntries(permissions));
|
|
16
|
+
}
|
|
17
|
+
function assertMatches(value, pattern, what) {
|
|
18
|
+
if (pattern.test(value)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
throw new AuthorizationSetupError(`"${value}" is not a valid ${what} name: lower-case words, digits and dashes${what === 'permission' ? ', dot-separated' : ''}.`);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=define-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-permissions.js","sourceRoot":"","sources":["../../src/permissions/define-permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAWjF,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAC5C,MAAM,YAAY,GAAG,uCAAuC,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAG/B,OAAgB,EAAE,YAA0B;IAC5C,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IAEnD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE;QAC/E,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAEhD,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,gMAAgM;IAChM,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAwD,CAAC;AAC/G,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,OAAe,EAAE,IAAY;IACjE,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,uBAAuB,CAC/B,IAAI,KAAK,oBAAoB,IAAI,6CAA6C,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,GAAG,CAChI,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant-covers.d.ts","sourceRoot":"","sources":["../../src/permissions/grant-covers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAE5E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant-covers.js","sourceRoot":"","sources":["../../src/permissions/grant-covers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,UAAsB;IACjE,OAAO,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,CAAC,EAAE,IAAI,OAAO,KAAK,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC;AACtG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant-pattern.d.ts","sourceRoot":"","sources":["../../src/permissions/grant-pattern.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,iEAAiE;AACjE,eAAO,MAAM,UAAU,MAAM,CAAC;AAI9B,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAQjD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AuthorizationSetupError } from '../errors/authorization-setup-error.js';
|
|
2
|
+
/** The pattern that grants every permission of every context. */
|
|
3
|
+
export const EVERYTHING = '*';
|
|
4
|
+
const GRANT_PATTERN = /^[a-z][a-z0-9-]*:(\*|[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)*)$/;
|
|
5
|
+
export function grantPattern(grant) {
|
|
6
|
+
const pattern = typeof grant === 'string' ? grant : grant.id;
|
|
7
|
+
if (pattern !== EVERYTHING && !GRANT_PATTERN.test(pattern)) {
|
|
8
|
+
throw new AuthorizationSetupError(`"${pattern}" is not a grant: use a permission, its id, "<context>:*" or "*".`);
|
|
9
|
+
}
|
|
10
|
+
return pattern;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=grant-pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant-pattern.js","sourceRoot":"","sources":["../../src/permissions/grant-pattern.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAGjF,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAE9B,MAAM,aAAa,GAAG,4DAA4D,CAAC;AAEnF,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IAE7D,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,uBAAuB,CAAC,IAAI,OAAO,mEAAmE,CAAC,CAAC;IACpH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant.d.ts","sourceRoot":"","sources":["../../src/permissions/grant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,6FAA6F;AAC7F,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant.js","sourceRoot":"","sources":["../../src/permissions/grant.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-permission.d.ts","sourceRoot":"","sources":["../../src/permissions/is-permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAUhE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function isPermission(value) {
|
|
2
|
+
if (typeof value !== 'object' || value === null) {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
if (!('id' in value) || !('context' in value) || !('name' in value) || !('description' in value)) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
return typeof value.id === 'string' && value.id === `${String(value.context)}:${String(value.name)}`;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=is-permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-permission.js","sourceRoot":"","sources":["../../src/permissions/is-permission.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,KAAK,CAAC,EAAE,CAAC;QACjG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AACvG,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Permission } from './permission.js';
|
|
2
|
+
/** Every permission of the application, for generated documentation and administration screens. */
|
|
3
|
+
export declare class PermissionRegistry {
|
|
4
|
+
private readonly byId;
|
|
5
|
+
static of(...sets: readonly Readonly<Record<string, Permission>>[]): PermissionRegistry;
|
|
6
|
+
all(): readonly Permission[];
|
|
7
|
+
contexts(): readonly string[];
|
|
8
|
+
inContext(context: string): readonly Permission[];
|
|
9
|
+
find(id: string): Permission | undefined;
|
|
10
|
+
private add;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=permission-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-registry.d.ts","sourceRoot":"","sources":["../../src/permissions/permission-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,mGAAmG;AACnG,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IAEtD,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,GAAG,kBAAkB,CAQtF;IAED,GAAG,IAAI,SAAS,UAAU,EAAE,CAE3B;IAED,QAAQ,IAAI,SAAS,MAAM,EAAE,CAE5B;IAED,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,UAAU,EAAE,CAEhD;IAED,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEvC;IAED,OAAO,CAAC,GAAG;CAOZ"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AuthorizationSetupError } from '../errors/authorization-setup-error.js';
|
|
2
|
+
/** Every permission of the application, for generated documentation and administration screens. */
|
|
3
|
+
export class PermissionRegistry {
|
|
4
|
+
byId = new Map();
|
|
5
|
+
static of(...sets) {
|
|
6
|
+
const registry = new PermissionRegistry();
|
|
7
|
+
for (const permission of sets.flatMap((set) => Object.values(set))) {
|
|
8
|
+
registry.add(permission);
|
|
9
|
+
}
|
|
10
|
+
return registry;
|
|
11
|
+
}
|
|
12
|
+
all() {
|
|
13
|
+
return [...this.byId.values()].sort((left, right) => left.id.localeCompare(right.id));
|
|
14
|
+
}
|
|
15
|
+
contexts() {
|
|
16
|
+
return [...new Set(this.all().map((permission) => permission.context))];
|
|
17
|
+
}
|
|
18
|
+
inContext(context) {
|
|
19
|
+
return this.all().filter((permission) => permission.context === context);
|
|
20
|
+
}
|
|
21
|
+
find(id) {
|
|
22
|
+
return this.byId.get(id);
|
|
23
|
+
}
|
|
24
|
+
add(permission) {
|
|
25
|
+
if (this.byId.has(permission.id)) {
|
|
26
|
+
throw new AuthorizationSetupError(`Permission "${permission.id}" is declared twice.`);
|
|
27
|
+
}
|
|
28
|
+
this.byId.set(permission.id, permission);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=permission-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-registry.js","sourceRoot":"","sources":["../../src/permissions/permission-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAGjF,mGAAmG;AACnG,MAAM,OAAO,kBAAkB;IACZ,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEtD,MAAM,CAAC,EAAE,CAAC,GAAG,IAAqD;QAChE,MAAM,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAE1C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACnE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,SAAS,CAAC,OAAe;QACvB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,EAAU;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEO,GAAG,CAAC,UAAsB;QAChC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,uBAAuB,CAAC,eAAe,UAAU,CAAC,EAAE,sBAAsB,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** A right somebody may hold, declared once by the context that owns it. */
|
|
2
|
+
export interface Permission<Id extends string = string> {
|
|
3
|
+
/** Stable and unique: `<context>:<name>`. What roles, policies and audit trails refer to. */
|
|
4
|
+
readonly id: Id;
|
|
5
|
+
readonly context: string;
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly description: string;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=permission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../src/permissions/permission.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,WAAW,UAAU,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM;IACpD,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/permissions/permission.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-policy.d.ts","sourceRoot":"","sources":["../../src/policies/define-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAQ9E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AuthorizationSetupError } from '../errors/authorization-setup-error.js';
|
|
2
|
+
const POLICY_NAME_PATTERN = /^[a-z][a-z0-9]*([.-][a-z0-9]+)*$/;
|
|
3
|
+
/** Lives in `application/authorization/<name>.policy.ts`, with a spec of its own. */
|
|
4
|
+
export function definePolicy(policy) {
|
|
5
|
+
if (!POLICY_NAME_PATTERN.test(policy.name)) {
|
|
6
|
+
throw new AuthorizationSetupError(`"${policy.name}" is not a valid policy name: lower-case words separated by dots or dashes, as it becomes a reason code.`);
|
|
7
|
+
}
|
|
8
|
+
return Object.freeze({ ...policy });
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=define-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-policy.js","sourceRoot":"","sources":["../../src/policies/define-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAGjF,MAAM,mBAAmB,GAAG,kCAAkC,CAAC;AAE/D,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAU,MAAuB;IAC3D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,uBAAuB,CAC/B,IAAI,MAAM,CAAC,IAAI,0GAA0G,CAC1H,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type Actor, type Clock } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import type { Access } from '../authorization/access.js';
|
|
3
|
+
import type { AccessScope } from '../authorization/access-scope.js';
|
|
4
|
+
import type { Authorizer } from '../authorization/authorizer.js';
|
|
5
|
+
import { type Decision } from '../authorization/decision.js';
|
|
6
|
+
import type { OnDecision } from '../authorization/on-decision.js';
|
|
7
|
+
import type { ResourceRef } from '../authorization/resource-ref.js';
|
|
8
|
+
import type { Permission } from '../permissions/permission.js';
|
|
9
|
+
import type { Policy } from './policy.js';
|
|
10
|
+
export interface PolicyAccessOptions {
|
|
11
|
+
/** Asked after the policies, with the resource the subject stands for. */
|
|
12
|
+
readonly authorizer?: Authorizer;
|
|
13
|
+
readonly policies?: readonly Policy<unknown>[];
|
|
14
|
+
readonly clock: Clock;
|
|
15
|
+
/** How a subject (an aggregate, a read model) names its resource. Default: a `ResourceRef` is itself. */
|
|
16
|
+
readonly resourceOf?: (subject: unknown) => ResourceRef | undefined;
|
|
17
|
+
readonly onDecision?: OnDecision;
|
|
18
|
+
}
|
|
19
|
+
/** No policy and no authorizer can answer for the permission: refused, as everything undeclared. */
|
|
20
|
+
export declare const NO_POLICY = "NO_POLICY";
|
|
21
|
+
/** The `Access` of this package: every policy of the permission, then the authorizer, must allow. */
|
|
22
|
+
export declare class PolicyAccess implements Access {
|
|
23
|
+
private readonly options;
|
|
24
|
+
private readonly policiesByPermission;
|
|
25
|
+
constructor(options: PolicyAccessOptions);
|
|
26
|
+
authorize(actor: Actor, permission: Permission, subject: unknown): Promise<void>;
|
|
27
|
+
decide(actor: Actor, permission: Permission, subject: unknown): Promise<Decision>;
|
|
28
|
+
scope(actor: Actor, permission: Permission, resourceType: string): Promise<AccessScope>;
|
|
29
|
+
private resourceOf;
|
|
30
|
+
private evaluate;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=policy-access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-access.d.ts","sourceRoot":"","sources":["../../src/policies/policy-access.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAI5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAIpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,yGAAyG;IACzG,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,oGAAoG;AACpG,eAAO,MAAM,SAAS,cAAc,CAAC;AAErC,qGAAqG;AACrG,qBAAa,YAAa,YAAW,MAAM;IAG7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwC;IAE7E,YAA6B,OAAO,EAAE,mBAAmB,EAMxD;IAEK,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrF;IAEK,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQtF;IAEK,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAY5F;IAED,OAAO,CAAC,UAAU;YAIJ,QAAQ;CAoBvB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { isAnonymous } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import { ALLOWED, deny } from '../authorization/decision.js';
|
|
3
|
+
import { decisionRecordOf } from '../authorization/decision-record-of.js';
|
|
4
|
+
import { DenialReason } from '../authorization/denial-reason.js';
|
|
5
|
+
import { isResourceRef } from '../authorization/is-resource-ref.js';
|
|
6
|
+
import { ForbiddenError } from '../errors/forbidden-error.js';
|
|
7
|
+
import { ListingNotSupportedError } from '../errors/listing-not-supported-error.js';
|
|
8
|
+
import { UnauthenticatedError } from '../errors/unauthenticated-error.js';
|
|
9
|
+
/** No policy and no authorizer can answer for the permission: refused, as everything undeclared. */
|
|
10
|
+
export const NO_POLICY = 'NO_POLICY';
|
|
11
|
+
/** The `Access` of this package: every policy of the permission, then the authorizer, must allow. */
|
|
12
|
+
export class PolicyAccess {
|
|
13
|
+
options;
|
|
14
|
+
policiesByPermission = new Map();
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
for (const policy of options.policies ?? []) {
|
|
18
|
+
const sharing = this.policiesByPermission.get(policy.permission.id) ?? [];
|
|
19
|
+
this.policiesByPermission.set(policy.permission.id, [...sharing, policy]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async authorize(actor, permission, subject) {
|
|
23
|
+
const decision = await this.decide(actor, permission, subject);
|
|
24
|
+
if (decision.allowed) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
throw isAnonymous(actor) ? new UnauthenticatedError() : new ForbiddenError(permission.id, decision.reason);
|
|
28
|
+
}
|
|
29
|
+
async decide(actor, permission, subject) {
|
|
30
|
+
const resource = this.resourceOf(subject);
|
|
31
|
+
const request = { actor, permission, ...(resource === undefined ? {} : { resource }), context: { subject } };
|
|
32
|
+
const decision = isAnonymous(actor) ? deny(DenialReason.anonymous) : await this.evaluate(request, subject);
|
|
33
|
+
await this.options.onDecision?.(decisionRecordOf(request, decision));
|
|
34
|
+
return decision;
|
|
35
|
+
}
|
|
36
|
+
async scope(actor, permission, resourceType) {
|
|
37
|
+
if (isAnonymous(actor)) {
|
|
38
|
+
return { kind: 'none' };
|
|
39
|
+
}
|
|
40
|
+
const { authorizer } = this.options;
|
|
41
|
+
if (authorizer?.listAccessible === undefined) {
|
|
42
|
+
throw new ListingNotSupportedError();
|
|
43
|
+
}
|
|
44
|
+
return authorizer.listAccessible({ actor, permission, resourceType });
|
|
45
|
+
}
|
|
46
|
+
resourceOf(subject) {
|
|
47
|
+
return (this.options.resourceOf ?? resourceRefOf)(subject);
|
|
48
|
+
}
|
|
49
|
+
async evaluate(request, subject) {
|
|
50
|
+
const policies = this.policiesByPermission.get(request.permission.id) ?? [];
|
|
51
|
+
const { authorizer, clock } = this.options;
|
|
52
|
+
if (policies.length === 0 && authorizer === undefined) {
|
|
53
|
+
return deny(NO_POLICY);
|
|
54
|
+
}
|
|
55
|
+
const context = { now: clock.now() };
|
|
56
|
+
for (const policy of policies) {
|
|
57
|
+
const verdict = verdictOf(policy, { actor: request.actor, subject }, context);
|
|
58
|
+
if (!verdict.allowed) {
|
|
59
|
+
return verdict;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return authorizer === undefined ? ALLOWED : authorizer.check(request);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function resourceRefOf(subject) {
|
|
66
|
+
return isResourceRef(subject) ? subject : undefined;
|
|
67
|
+
}
|
|
68
|
+
function verdictOf(policy, { actor, subject }, context) {
|
|
69
|
+
if (policy.appliesTo !== undefined && !policy.appliesTo(subject)) {
|
|
70
|
+
return deny(DenialReason.subjectMismatch);
|
|
71
|
+
}
|
|
72
|
+
const verdict = policy.allows(actor, subject, context);
|
|
73
|
+
if (typeof verdict !== 'boolean') {
|
|
74
|
+
return verdict;
|
|
75
|
+
}
|
|
76
|
+
return verdict ? ALLOWED : deny(policy.name);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=policy-access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-access.js","sourceRoot":"","sources":["../../src/policies/policy-access.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-context.d.ts","sourceRoot":"","sources":["../../src/policies/policy-context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-context.js","sourceRoot":"","sources":["../../src/policies/policy-context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Actor } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import type { Decision } from '../authorization/decision.js';
|
|
3
|
+
import type { Permission } from '../permissions/permission.js';
|
|
4
|
+
import type { PolicyContext } from './policy-context.js';
|
|
5
|
+
/**
|
|
6
|
+
* A named rule that needs loaded state: "only the author may edit, and not after publication".
|
|
7
|
+
* `allows` is declared with method syntax on purpose: a method parameter is compared
|
|
8
|
+
* bivariantly, so policies about different subjects can be listed together.
|
|
9
|
+
*/
|
|
10
|
+
export interface Policy<Subject> {
|
|
11
|
+
/** Stable: it is the reason of the refusal when `allows` answers `false`. */
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly permission: Permission;
|
|
14
|
+
/** Tells whether a value is a subject of this policy; anything else is refused. */
|
|
15
|
+
appliesTo?(subject: unknown): subject is Subject;
|
|
16
|
+
allows(actor: Actor, subject: Subject, context: PolicyContext): boolean | Decision;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/policies/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,MAAM,CAAC,OAAO;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,mFAAmF;IACnF,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;CACpF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/policies/policy.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { AccessScope } from '../authorization/access-scope.js';
|
|
2
|
+
import type { Authorizer } from '../authorization/authorizer.js';
|
|
3
|
+
import type { CheckRequest } from '../authorization/check-request.js';
|
|
4
|
+
import { type Decision } from '../authorization/decision.js';
|
|
5
|
+
import type { ListRequest } from '../authorization/list-request.js';
|
|
6
|
+
import type { Grant } from '../permissions/grant.js';
|
|
7
|
+
export interface RoleBasedAuthorizerOptions {
|
|
8
|
+
/** What each role grants: permissions, `billing:*` for a whole context, `*` for everything. */
|
|
9
|
+
readonly roles: Readonly<Record<string, readonly Grant[]>>;
|
|
10
|
+
/** The roles a role includes: `{ admin: ['accountant'] }` gives an admin all an accountant has. */
|
|
11
|
+
readonly inherits?: Readonly<Record<string, readonly string[]>>;
|
|
12
|
+
/**
|
|
13
|
+
* Turns the tenant check on: the tenant the request targets, or `undefined` when it targets
|
|
14
|
+
* none. A request about another tenant than the actor's is refused. See `tenantOfContext`.
|
|
15
|
+
*/
|
|
16
|
+
readonly tenantOf?: (request: CheckRequest) => string | undefined | Promise<string | undefined>;
|
|
17
|
+
/** Roles that act across tenants, such as a platform operator. */
|
|
18
|
+
readonly crossTenantRoles?: readonly string[];
|
|
19
|
+
/** The role given to actors of type `system`, which carry none. Default: no role. */
|
|
20
|
+
readonly systemRole?: string;
|
|
21
|
+
}
|
|
22
|
+
/** RBAC: an actor may do what one of its roles grants. It decides on actions, not on elements. */
|
|
23
|
+
export declare class RoleBasedAuthorizer implements Authorizer {
|
|
24
|
+
private readonly options;
|
|
25
|
+
private readonly grants;
|
|
26
|
+
constructor(options: RoleBasedAuthorizerOptions);
|
|
27
|
+
check(request: CheckRequest): Promise<Decision>;
|
|
28
|
+
/** Constant time: everything, nothing, or the rows of the actor's tenant. */
|
|
29
|
+
listAccessible({ actor, permission }: ListRequest): Promise<AccessScope>;
|
|
30
|
+
private holds;
|
|
31
|
+
private rolesOf;
|
|
32
|
+
private targetsAnotherTenant;
|
|
33
|
+
private crossesTenants;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=role-based-authorizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-based-authorizer.d.ts","sourceRoot":"","sources":["../../src/rbac/role-based-authorizer.ts"],"names":[],"mappings":"AACA,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;AAEpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAKrD,MAAM,WAAW,0BAA0B;IACzC,+FAA+F;IAC/F,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3D,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAChE;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChG,kEAAkE;IAClE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,qFAAqF;IACrF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,kGAAkG;AAClG,qBAAa,mBAAoB,YAAW,UAAU;IAGxC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAEhE,YAA6B,OAAO,EAAE,0BAA0B,EAE/D;IAEK,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAUpD;IAED,6EAA6E;IACvE,cAAc,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAU7E;IAED,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,OAAO;YAMD,oBAAoB;IAUlC,OAAO,CAAC,cAAc;CAKvB"}
|