@venizia/ignis 0.2.0-2 → 0.2.0-21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base/applications/base.d.ts +14 -13
- package/dist/base/applications/base.d.ts.map +1 -1
- package/dist/base/applications/base.js +55 -52
- package/dist/base/applications/base.js.map +1 -1
- package/dist/base/applications/boot-steps.d.ts +13 -0
- package/dist/base/applications/boot-steps.d.ts.map +1 -0
- package/dist/base/applications/boot-steps.js +23 -0
- package/dist/base/applications/boot-steps.js.map +1 -0
- package/dist/base/applications/common/index.d.ts +2 -0
- package/dist/base/applications/common/index.d.ts.map +1 -0
- package/dist/base/applications/common/index.js +18 -0
- package/dist/base/applications/common/index.js.map +1 -0
- package/dist/base/applications/{types.d.ts → common/types.d.ts} +11 -0
- package/dist/base/applications/common/types.d.ts.map +1 -0
- package/dist/base/applications/common/types.js.map +1 -0
- package/dist/base/applications/index.d.ts +2 -1
- package/dist/base/applications/index.d.ts.map +1 -1
- package/dist/base/applications/index.js +2 -1
- package/dist/base/applications/index.js.map +1 -1
- package/dist/base/applications/server.d.ts +4 -2
- package/dist/base/applications/server.d.ts.map +1 -1
- package/dist/base/applications/server.js +25 -2
- package/dist/base/applications/server.js.map +1 -1
- package/dist/base/controllers/grpc/adapter.d.ts +2 -1
- package/dist/base/controllers/grpc/adapter.d.ts.map +1 -1
- package/dist/base/controllers/grpc/adapter.js +4 -3
- package/dist/base/controllers/grpc/adapter.js.map +1 -1
- package/dist/base/middlewares/app-error/app-error.middleware.d.ts +3 -2
- package/dist/base/middlewares/app-error/app-error.middleware.d.ts.map +1 -1
- package/dist/base/middlewares/app-error/app-error.middleware.js +4 -3
- package/dist/base/middlewares/app-error/app-error.middleware.js.map +1 -1
- package/dist/base/middlewares/request-spy/request-spy.middleware.d.ts.map +1 -1
- package/dist/base/middlewares/request-spy/request-spy.middleware.js +2 -1
- package/dist/base/middlewares/request-spy/request-spy.middleware.js.map +1 -1
- package/dist/components/api-reference/component.d.ts.map +1 -1
- package/dist/components/api-reference/component.js +4 -2
- package/dist/components/api-reference/component.js.map +1 -1
- package/dist/components/api-reference/index.d.ts +1 -1
- package/dist/components/api-reference/index.d.ts.map +1 -1
- package/dist/components/api-reference/index.js +1 -1
- package/dist/components/api-reference/index.js.map +1 -1
- package/dist/components/api-reference/ui/factory.d.ts +14 -0
- package/dist/components/api-reference/ui/factory.d.ts.map +1 -0
- package/dist/components/api-reference/{ui-factory.js → ui/factory.js} +7 -21
- package/dist/components/api-reference/ui/factory.js.map +1 -0
- package/dist/components/api-reference/ui/index.d.ts +4 -0
- package/dist/components/api-reference/ui/index.d.ts.map +1 -0
- package/dist/components/api-reference/ui/index.js +20 -0
- package/dist/components/api-reference/ui/index.js.map +1 -0
- package/dist/components/api-reference/ui/scalar.d.ts +8 -0
- package/dist/components/api-reference/ui/scalar.d.ts.map +1 -0
- package/dist/components/api-reference/ui/scalar.js +28 -0
- package/dist/components/api-reference/ui/scalar.js.map +1 -0
- package/dist/components/api-reference/ui/swagger.d.ts +8 -0
- package/dist/components/api-reference/ui/swagger.d.ts.map +1 -0
- package/dist/components/api-reference/ui/swagger.js +28 -0
- package/dist/components/api-reference/ui/swagger.js.map +1 -0
- package/dist/components/auth/authenticate/component.d.ts +10 -1
- package/dist/components/auth/authenticate/component.d.ts.map +1 -1
- package/dist/components/auth/authenticate/component.js +79 -25
- package/dist/components/auth/authenticate/component.js.map +1 -1
- package/dist/components/auth/authenticate/controllers/factory.d.ts +33 -2
- package/dist/components/auth/authenticate/controllers/factory.d.ts.map +1 -1
- package/dist/components/auth/authenticate/controllers/index.d.ts +1 -0
- package/dist/components/auth/authenticate/controllers/index.d.ts.map +1 -1
- package/dist/components/auth/authenticate/controllers/index.js +1 -0
- package/dist/components/auth/authenticate/controllers/index.js.map +1 -1
- package/dist/components/auth/authenticate/controllers/service-certs/controller.d.ts +10 -0
- package/dist/components/auth/authenticate/controllers/service-certs/controller.d.ts.map +1 -0
- package/dist/components/auth/authenticate/controllers/service-certs/controller.js +50 -0
- package/dist/components/auth/authenticate/controllers/service-certs/controller.js.map +1 -0
- package/dist/components/auth/authenticate/controllers/service-certs/definitions.d.ts +73 -0
- package/dist/components/auth/authenticate/controllers/service-certs/definitions.d.ts.map +1 -0
- package/dist/components/auth/authenticate/controllers/service-certs/definitions.js +34 -0
- package/dist/components/auth/authenticate/controllers/service-certs/definitions.js.map +1 -0
- package/dist/components/auth/authenticate/controllers/service-certs/index.d.ts +3 -0
- package/dist/components/auth/authenticate/controllers/service-certs/index.d.ts.map +1 -0
- package/dist/components/auth/authenticate/controllers/service-certs/index.js +19 -0
- package/dist/components/auth/authenticate/controllers/service-certs/index.js.map +1 -0
- package/dist/components/auth/authenticate/services/bearer/jwks/issuer.service.d.ts +16 -0
- package/dist/components/auth/authenticate/services/bearer/jwks/issuer.service.d.ts.map +1 -1
- package/dist/components/auth/authenticate/services/bearer/jwks/issuer.service.js +29 -0
- package/dist/components/auth/authenticate/services/bearer/jwks/issuer.service.js.map +1 -1
- package/dist/components/auth/authenticate/services/index.d.ts +1 -0
- package/dist/components/auth/authenticate/services/index.d.ts.map +1 -1
- package/dist/components/auth/authenticate/services/index.js +1 -0
- package/dist/components/auth/authenticate/services/index.js.map +1 -1
- package/dist/components/auth/authenticate/services/service/index.d.ts +3 -0
- package/dist/components/auth/authenticate/services/service/index.d.ts.map +1 -0
- package/dist/components/auth/authenticate/services/service/index.js +19 -0
- package/dist/components/auth/authenticate/services/service/index.js.map +1 -0
- package/dist/components/auth/authenticate/services/service/signer.service.d.ts +46 -0
- package/dist/components/auth/authenticate/services/service/signer.service.d.ts.map +1 -0
- package/dist/components/auth/authenticate/services/service/signer.service.js +135 -0
- package/dist/components/auth/authenticate/services/service/signer.service.js.map +1 -0
- package/dist/components/auth/authenticate/services/service/verifier.service.d.ts +40 -0
- package/dist/components/auth/authenticate/services/service/verifier.service.d.ts.map +1 -0
- package/dist/components/auth/authenticate/services/service/verifier.service.js +165 -0
- package/dist/components/auth/authenticate/services/service/verifier.service.js.map +1 -0
- package/dist/components/auth/authenticate/strategies/index.d.ts +2 -1
- package/dist/components/auth/authenticate/strategies/index.d.ts.map +1 -1
- package/dist/components/auth/authenticate/strategies/index.js +2 -1
- package/dist/components/auth/authenticate/strategies/index.js.map +1 -1
- package/dist/components/auth/authenticate/strategies/jwks/index.d.ts +3 -0
- package/dist/components/auth/authenticate/strategies/jwks/index.d.ts.map +1 -0
- package/dist/components/auth/authenticate/strategies/jwks/index.js +19 -0
- package/dist/components/auth/authenticate/strategies/jwks/index.js.map +1 -0
- package/dist/components/auth/authenticate/strategies/jwks/issuer.d.ts +13 -0
- package/dist/components/auth/authenticate/strategies/jwks/issuer.d.ts.map +1 -0
- package/dist/components/auth/authenticate/strategies/{jwks.strategy.js → jwks/issuer.js} +4 -27
- package/dist/components/auth/authenticate/strategies/jwks/issuer.js.map +1 -0
- package/dist/components/auth/authenticate/strategies/{jwks.strategy.d.ts → jwks/verifier.d.ts} +2 -10
- package/dist/components/auth/authenticate/strategies/jwks/verifier.d.ts.map +1 -0
- package/dist/components/auth/authenticate/strategies/jwks/verifier.js +45 -0
- package/dist/components/auth/authenticate/strategies/jwks/verifier.js.map +1 -0
- package/dist/components/auth/authenticate/strategies/service.strategy.d.ts +19 -0
- package/dist/components/auth/authenticate/strategies/service.strategy.d.ts.map +1 -0
- package/dist/components/auth/authenticate/strategies/service.strategy.js +73 -0
- package/dist/components/auth/authenticate/strategies/service.strategy.js.map +1 -0
- package/dist/components/auth/authorize/adapters/base-filtered.d.ts +1 -1
- package/dist/components/auth/authorize/adapters/base-filtered.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/base-filtered.js +5 -8
- package/dist/components/auth/authorize/adapters/base-filtered.js.map +1 -1
- package/dist/components/auth/authorize/adapters/common/index.d.ts +2 -0
- package/dist/components/auth/authorize/adapters/common/index.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/common/index.js +18 -0
- package/dist/components/auth/authorize/adapters/common/index.js.map +1 -0
- package/dist/components/auth/authorize/adapters/{types.d.ts → common/types.d.ts} +1 -1
- package/dist/components/auth/authorize/adapters/common/types.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/common/types.js.map +1 -0
- package/dist/components/auth/authorize/adapters/connector.d.ts +10 -0
- package/dist/components/auth/authorize/adapters/connector.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/connector.js +20 -0
- package/dist/components/auth/authorize/adapters/connector.js.map +1 -0
- package/dist/components/auth/authorize/adapters/custom-grant-expander.d.ts +52 -0
- package/dist/components/auth/authorize/adapters/custom-grant-expander.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/custom-grant-expander.js +111 -0
- package/dist/components/auth/authorize/adapters/custom-grant-expander.js.map +1 -0
- package/dist/components/auth/authorize/adapters/index.d.ts +4 -2
- package/dist/components/auth/authorize/adapters/index.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/index.js +4 -2
- package/dist/components/auth/authorize/adapters/index.js.map +1 -1
- package/dist/components/auth/authorize/adapters/scoped-casbin/adapter.d.ts +93 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/adapter.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/{scoped-casbin.adapter.js → scoped-casbin/adapter.js} +95 -97
- package/dist/components/auth/authorize/adapters/scoped-casbin/adapter.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.d.ts +2 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.js +5 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.d.ts +3 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.js +19 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.d.ts +50 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.js +3 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/index.d.ts +4 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/index.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/index.js +19 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/index.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.d.ts +17 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.js +11 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.js.map +1 -0
- package/dist/components/auth/authorize/component.d.ts.map +1 -1
- package/dist/components/auth/authorize/component.js +3 -0
- package/dist/components/auth/authorize/component.js.map +1 -1
- package/dist/components/auth/authorize/enforcers/casbin.enforcer.d.ts +7 -36
- package/dist/components/auth/authorize/enforcers/casbin.enforcer.d.ts.map +1 -1
- package/dist/components/auth/authorize/enforcers/casbin.enforcer.js +48 -117
- package/dist/components/auth/authorize/enforcers/casbin.enforcer.js.map +1 -1
- package/dist/components/auth/authorize/enforcers/index.d.ts +2 -1
- package/dist/components/auth/authorize/enforcers/index.d.ts.map +1 -1
- package/dist/components/auth/authorize/enforcers/index.js +2 -1
- package/dist/components/auth/authorize/enforcers/index.js.map +1 -1
- package/dist/components/auth/authorize/enforcers/policy-line-codec.d.ts +26 -0
- package/dist/components/auth/authorize/enforcers/policy-line-codec.d.ts.map +1 -0
- package/dist/components/auth/authorize/enforcers/policy-line-codec.js +57 -0
- package/dist/components/auth/authorize/enforcers/policy-line-codec.js.map +1 -0
- package/dist/components/auth/authorize/enforcers/user-policy-line-cache.d.ts +46 -0
- package/dist/components/auth/authorize/enforcers/user-policy-line-cache.d.ts.map +1 -0
- package/dist/components/auth/authorize/enforcers/user-policy-line-cache.js +98 -0
- package/dist/components/auth/authorize/enforcers/user-policy-line-cache.js.map +1 -0
- package/dist/components/auth/authorize/index.d.ts +1 -0
- package/dist/components/auth/authorize/index.d.ts.map +1 -1
- package/dist/components/auth/authorize/index.js +1 -0
- package/dist/components/auth/authorize/index.js.map +1 -1
- package/dist/components/auth/authorize/role-managers/base.d.ts +34 -0
- package/dist/components/auth/authorize/role-managers/base.d.ts.map +1 -0
- package/dist/components/auth/authorize/role-managers/base.js +76 -0
- package/dist/components/auth/authorize/role-managers/base.js.map +1 -0
- package/dist/components/auth/authorize/role-managers/domain-hierarchy.d.ts +28 -0
- package/dist/components/auth/authorize/role-managers/domain-hierarchy.d.ts.map +1 -0
- package/dist/components/auth/authorize/role-managers/domain-hierarchy.js +77 -0
- package/dist/components/auth/authorize/role-managers/domain-hierarchy.js.map +1 -0
- package/dist/components/auth/authorize/role-managers/index.d.ts +5 -0
- package/dist/components/auth/authorize/role-managers/index.d.ts.map +1 -0
- package/dist/components/auth/authorize/role-managers/index.js +21 -0
- package/dist/components/auth/authorize/role-managers/index.js.map +1 -0
- package/dist/components/auth/authorize/role-managers/membership.d.ts +21 -0
- package/dist/components/auth/authorize/role-managers/membership.d.ts.map +1 -0
- package/dist/components/auth/authorize/role-managers/membership.js +69 -0
- package/dist/components/auth/authorize/role-managers/membership.js.map +1 -0
- package/dist/components/auth/authorize/{enforcers/resource-role-manager.d.ts → role-managers/resource.d.ts} +3 -9
- package/dist/components/auth/authorize/role-managers/resource.d.ts.map +1 -0
- package/dist/components/auth/authorize/{enforcers/resource-role-manager.js → role-managers/resource.js} +9 -21
- package/dist/components/auth/authorize/role-managers/resource.js.map +1 -0
- package/dist/components/auth/models/entities/policy-definition.model.d.ts +49 -14
- package/dist/components/auth/models/entities/policy-definition.model.d.ts.map +1 -1
- package/dist/components/auth/models/entities/policy-definition.model.js +45 -11
- package/dist/components/auth/models/entities/policy-definition.model.js.map +1 -1
- package/dist/components/auth/models/entities/user.model.d.ts +2 -2
- package/dist/components/mail/common/constants.d.ts +7 -0
- package/dist/components/mail/common/constants.d.ts.map +1 -1
- package/dist/components/mail/common/constants.js +7 -1
- package/dist/components/mail/common/constants.js.map +1 -1
- package/dist/components/mail/common/types/index.d.ts +6 -0
- package/dist/components/mail/common/types/index.d.ts.map +1 -0
- package/dist/components/mail/common/types/index.js +22 -0
- package/dist/components/mail/common/types/index.js.map +1 -0
- package/dist/components/mail/common/types/message.d.ts +48 -0
- package/dist/components/mail/common/types/message.d.ts.map +1 -0
- package/dist/components/mail/common/types/message.js +3 -0
- package/dist/components/mail/common/types/message.js.map +1 -0
- package/dist/components/mail/common/types/options.d.ts +42 -0
- package/dist/components/mail/common/types/options.d.ts.map +1 -0
- package/dist/components/mail/common/types/options.js +3 -0
- package/dist/components/mail/common/types/options.js.map +1 -0
- package/dist/components/mail/common/types/queue.d.ts +53 -0
- package/dist/components/mail/common/types/queue.d.ts.map +1 -0
- package/dist/components/mail/common/types/queue.js +3 -0
- package/dist/components/mail/common/types/queue.js.map +1 -0
- package/dist/components/mail/common/types/template.d.ts +33 -0
- package/dist/components/mail/common/types/template.d.ts.map +1 -0
- package/dist/components/mail/common/types/template.js +3 -0
- package/dist/components/mail/common/types/template.js.map +1 -0
- package/dist/components/mail/common/types/verification.d.ts +26 -0
- package/dist/components/mail/common/types/verification.d.ts.map +1 -0
- package/dist/components/mail/common/types/verification.js +3 -0
- package/dist/components/mail/common/types/verification.js.map +1 -0
- package/dist/components/mail/services/generators/index.d.ts +4 -0
- package/dist/components/mail/services/generators/index.d.ts.map +1 -0
- package/dist/components/mail/services/generators/index.js +20 -0
- package/dist/components/mail/services/generators/index.js.map +1 -0
- package/dist/components/mail/services/generators/numeric-code.d.ts +7 -0
- package/dist/components/mail/services/generators/numeric-code.d.ts.map +1 -0
- package/dist/components/mail/services/generators/numeric-code.js +20 -0
- package/dist/components/mail/services/generators/numeric-code.js.map +1 -0
- package/dist/components/mail/services/generators/random-token.d.ts +7 -0
- package/dist/components/mail/services/generators/random-token.d.ts.map +1 -0
- package/dist/components/mail/services/generators/random-token.js +18 -0
- package/dist/components/mail/services/generators/random-token.js.map +1 -0
- package/dist/components/mail/services/generators/verification-data.d.ts +9 -0
- package/dist/components/mail/services/generators/verification-data.d.ts.map +1 -0
- package/dist/components/mail/services/{generator.service.js → generators/verification-data.js} +10 -25
- package/dist/components/mail/services/generators/verification-data.js.map +1 -0
- package/dist/components/mail/services/index.d.ts +1 -1
- package/dist/components/mail/services/index.d.ts.map +1 -1
- package/dist/components/mail/services/index.js +1 -1
- package/dist/components/mail/services/index.js.map +1 -1
- package/dist/components/static-asset/controller/factory.d.ts +34 -2
- package/dist/components/static-asset/controller/factory.d.ts.map +1 -1
- package/dist/components/static-asset/models/base.model.d.ts +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/package.json +22 -23
- package/dist/base/applications/types.d.ts.map +0 -1
- package/dist/base/applications/types.js.map +0 -1
- package/dist/components/api-reference/ui-factory.d.ts +0 -21
- package/dist/components/api-reference/ui-factory.d.ts.map +0 -1
- package/dist/components/api-reference/ui-factory.js.map +0 -1
- package/dist/components/auth/authenticate/strategies/jwks.strategy.d.ts.map +0 -1
- package/dist/components/auth/authenticate/strategies/jwks.strategy.js.map +0 -1
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.d.ts +0 -121
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.d.ts.map +0 -1
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.js.map +0 -1
- package/dist/components/auth/authorize/adapters/types.d.ts.map +0 -1
- package/dist/components/auth/authorize/adapters/types.js.map +0 -1
- package/dist/components/auth/authorize/enforcers/resource-role-manager.d.ts.map +0 -1
- package/dist/components/auth/authorize/enforcers/resource-role-manager.js.map +0 -1
- package/dist/components/mail/common/types.d.ts +0 -201
- package/dist/components/mail/common/types.d.ts.map +0 -1
- package/dist/components/mail/common/types.js +0 -10
- package/dist/components/mail/common/types.js.map +0 -1
- package/dist/components/mail/services/generator.service.d.ts +0 -14
- package/dist/components/mail/services/generator.service.d.ts.map +0 -1
- package/dist/components/mail/services/generator.service.js.map +0 -1
- /package/dist/base/applications/{types.js → common/types.js} +0 -0
- /package/dist/components/auth/authorize/adapters/{types.js → common/types.js} +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserPolicyLineCache = void 0;
|
|
4
|
+
const core_1 = require("@venizia/ignis-helpers/core");
|
|
5
|
+
const ignis_kernel_1 = require("@venizia/ignis-kernel");
|
|
6
|
+
/**
|
|
7
|
+
* Per-user redis cache of casbin policy lines. Owns the cache key, the TTL, and concurrent-miss
|
|
8
|
+
* de-duplication so N simultaneous misses for the same user collapse onto one extraction.
|
|
9
|
+
*/
|
|
10
|
+
class UserPolicyLineCache extends core_1.BaseHelper {
|
|
11
|
+
constructor(opts) {
|
|
12
|
+
super({ scope: UserPolicyLineCache.name });
|
|
13
|
+
// cacheKey -> in-progress line-fetch; concurrent misses for the same user share one extraction instead of all hitting the DB (see fetch()).
|
|
14
|
+
this.pendingLineFetches = new Map();
|
|
15
|
+
this.cached = opts.cached;
|
|
16
|
+
this.loadLines = opts.loadLines;
|
|
17
|
+
}
|
|
18
|
+
/** Fetch the user's lines, collapsing concurrent misses per key onto one extraction. Best-effort: two misses may race past the cache read and both extract (benign - per-user lines are identical). */
|
|
19
|
+
async fetch(opts) {
|
|
20
|
+
const cacheKey = await this.resolveCacheKey({ user: opts.user });
|
|
21
|
+
// Cache hit - Redis owns expiry (PX on write), so a present key is fresh; a corrupted/legacy entry must NOT 500 the request, so it is discarded and refetched.
|
|
22
|
+
const raw = await this.cached.options.connection.get({ key: cacheKey });
|
|
23
|
+
if (raw) {
|
|
24
|
+
const lines = this.parseLines({ raw, cacheKey });
|
|
25
|
+
if (lines) {
|
|
26
|
+
return lines;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const existing = this.pendingLineFetches.get(cacheKey);
|
|
30
|
+
if (existing) {
|
|
31
|
+
return existing;
|
|
32
|
+
}
|
|
33
|
+
// Cache miss (or discarded corrupt entry) - extract from an ISOLATED enforcer so a concurrent load cannot contaminate the cache, persist it, then return the lines for THIS request.
|
|
34
|
+
const task = async () => {
|
|
35
|
+
const lines = await this.loadLines({ user: opts.user });
|
|
36
|
+
await this.writeLines({ cacheKey, lines });
|
|
37
|
+
return lines;
|
|
38
|
+
};
|
|
39
|
+
const promise = task().finally(() => {
|
|
40
|
+
this.pendingLineFetches.delete(cacheKey);
|
|
41
|
+
});
|
|
42
|
+
this.pendingLineFetches.set(cacheKey, promise);
|
|
43
|
+
return promise;
|
|
44
|
+
}
|
|
45
|
+
/** Drop the user's cached entry. */
|
|
46
|
+
async invalidate(opts) {
|
|
47
|
+
const cacheKey = await this.resolveCacheKey({ user: opts.user });
|
|
48
|
+
const invalidatedKeys = await this.cached.options.connection.del({ keys: [cacheKey] });
|
|
49
|
+
return { cacheKey, invalidatedKeys };
|
|
50
|
+
}
|
|
51
|
+
/** Drop then recompute the user's cached entry via `loadLines` - an isolated extraction (never a pooled serving enforcer), so a concurrent request cannot make the cache hold another user's lines. */
|
|
52
|
+
async rebuild(opts) {
|
|
53
|
+
const cacheKey = await this.resolveCacheKey({ user: opts.user });
|
|
54
|
+
await this.cached.options.connection.del({ keys: [cacheKey] });
|
|
55
|
+
const lines = await this.loadLines({ user: opts.user });
|
|
56
|
+
await this.writeLines({ cacheKey, lines });
|
|
57
|
+
return { cacheKey, lines };
|
|
58
|
+
}
|
|
59
|
+
/** Compute the user's cache key and reject an empty result - consistent with the read path. */
|
|
60
|
+
async resolveCacheKey(opts) {
|
|
61
|
+
const cacheKey = await this.cached.options.keyFn({ user: opts.user });
|
|
62
|
+
if (!cacheKey) {
|
|
63
|
+
throw (0, core_1.getError)({
|
|
64
|
+
error: ignis_kernel_1.AuthorizationErrors.CACHE_KEY_INVALID,
|
|
65
|
+
message: '[UserPolicyLineCache] keyFn returned an empty cache key.',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return cacheKey;
|
|
69
|
+
}
|
|
70
|
+
/** Single source of truth for the cache encoding. Used by the miss path and rebuild(). */
|
|
71
|
+
async writeLines(opts) {
|
|
72
|
+
await this.cached.options.connection.set({
|
|
73
|
+
key: opts.cacheKey,
|
|
74
|
+
value: opts.lines,
|
|
75
|
+
options: { expiresIn: this.cached.options.expiresIn },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/** Decode cached policy lines; on any corruption, log and return null so the caller refetches. */
|
|
79
|
+
parseLines(opts) {
|
|
80
|
+
try {
|
|
81
|
+
const parsed = JSON.parse(opts.raw);
|
|
82
|
+
if (!Array.isArray(parsed) || parsed.some(line => typeof line !== 'string')) {
|
|
83
|
+
throw (0, core_1.getError)({
|
|
84
|
+
message: '[UserPolicyLineCache] Cached payload is not an array of policy lines.',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return parsed;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
this.logger
|
|
91
|
+
.for(this.parseLines.name)
|
|
92
|
+
.warn('Discarding corrupted authz cache entry | key: %s | error: %s', opts.cacheKey, error);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.UserPolicyLineCache = UserPolicyLineCache;
|
|
98
|
+
//# sourceMappingURL=user-policy-line-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-policy-line-cache.js","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/enforcers/user-policy-line-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/authorize/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AAEtC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/authorize/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AAEtC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
|
|
@@ -20,4 +20,5 @@ __exportStar(require("@venizia/ignis-kernel"), exports);
|
|
|
20
20
|
__exportStar(require("./adapters"), exports);
|
|
21
21
|
__exportStar(require("./component"), exports);
|
|
22
22
|
__exportStar(require("./enforcers"), exports);
|
|
23
|
+
__exportStar(require("./role-managers"), exports);
|
|
23
24
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/auth/authorize/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6FAA6F;AAC7F,oFAAoF;AACpF,wDAAsC;AAEtC,6CAA2B;AAC3B,8CAA4B;AAC5B,8CAA4B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/auth/authorize/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6FAA6F;AAC7F,oFAAoF;AACpF,wDAAsC;AAEtC,6CAA2B;AAC3B,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BaseHelper } from '@venizia/ignis-helpers/core';
|
|
2
|
+
/**
|
|
3
|
+
* Shared casbin `RoleManager` scaffolding for the resource, domain-hierarchy, and membership
|
|
4
|
+
* role managers: the debug-only interface members (`printRoles`, `getDomains`, `getAllDomains`),
|
|
5
|
+
* the `hasLink` wrapper around the synchronous `syncedHasLink`, the once-per-`clear()`
|
|
6
|
+
* overlay-initialized log line, and the shared ancestor walk both hierarchy-aware managers use.
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class BaseRoleManager extends BaseHelper {
|
|
9
|
+
protected graphReported: boolean;
|
|
10
|
+
abstract syncedHasLink(name1: string, name2: string): boolean;
|
|
11
|
+
hasLink(name1: string, name2: string): Promise<boolean>;
|
|
12
|
+
/** casbin calls this after buildRoleLinks purely as a debug hook; none of the role managers log from here. */
|
|
13
|
+
printRoles(): Promise<void>;
|
|
14
|
+
getDomains(): Promise<string[]>;
|
|
15
|
+
getAllDomains(): Promise<string[]>;
|
|
16
|
+
/** Logs the initialized-overlay line once per `clear()` cycle; `build` is only invoked the first time so counts stay lazy. */
|
|
17
|
+
protected reportGraphOnce(build: () => {
|
|
18
|
+
message: string;
|
|
19
|
+
args: unknown[];
|
|
20
|
+
}): void;
|
|
21
|
+
/** Node and edge counts of a domain-hierarchy overlay, for the once-per-`clear()` debug log. */
|
|
22
|
+
protected static overlayStats(overlay?: Map<string, Set<string>>): {
|
|
23
|
+
nodeCount: number;
|
|
24
|
+
edgeCount: number;
|
|
25
|
+
};
|
|
26
|
+
/** `node` itself plus every ancestor reachable by walking the overlay's child->parent edges,
|
|
27
|
+
* node first. Cycle-safe: visited Set + index cursor, never shift(). Static - `ResourceRoleManager`
|
|
28
|
+
* extends this base with no overlay of this shape, so this must not force instance state onto it. */
|
|
29
|
+
protected static collectAncestors(opts: {
|
|
30
|
+
overlay?: Map<string, Set<string>>;
|
|
31
|
+
node: string;
|
|
32
|
+
}): string[];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD;;;;;GAKG;AACH,8BAAsB,eAAgB,SAAQ,UAAU;IACtD,SAAS,CAAC,aAAa,UAAS;IAEhC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAEvD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7D,8GAA8G;IACxG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/B,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxC,8HAA8H;IAC9H,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG,IAAI;IAUlF,gGAAgG;IAChG,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG;QACjE,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB;IAaD;;yGAEqG;IACrG,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;QACtC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,MAAM,EAAE;CA4Bb"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseRoleManager = void 0;
|
|
4
|
+
const core_1 = require("@venizia/ignis-helpers/core");
|
|
5
|
+
/**
|
|
6
|
+
* Shared casbin `RoleManager` scaffolding for the resource, domain-hierarchy, and membership
|
|
7
|
+
* role managers: the debug-only interface members (`printRoles`, `getDomains`, `getAllDomains`),
|
|
8
|
+
* the `hasLink` wrapper around the synchronous `syncedHasLink`, the once-per-`clear()`
|
|
9
|
+
* overlay-initialized log line, and the shared ancestor walk both hierarchy-aware managers use.
|
|
10
|
+
*/
|
|
11
|
+
class BaseRoleManager extends core_1.BaseHelper {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.graphReported = false;
|
|
15
|
+
}
|
|
16
|
+
async hasLink(name1, name2) {
|
|
17
|
+
return this.syncedHasLink(name1, name2);
|
|
18
|
+
}
|
|
19
|
+
/** casbin calls this after buildRoleLinks purely as a debug hook; none of the role managers log from here. */
|
|
20
|
+
async printRoles() { }
|
|
21
|
+
async getDomains() {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
async getAllDomains() {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
/** Logs the initialized-overlay line once per `clear()` cycle; `build` is only invoked the first time so counts stay lazy. */
|
|
28
|
+
reportGraphOnce(build) {
|
|
29
|
+
if (this.graphReported) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
this.graphReported = true;
|
|
33
|
+
const { message, args } = build();
|
|
34
|
+
this.logger.for(this.syncedHasLink.name).debug(message, ...args);
|
|
35
|
+
}
|
|
36
|
+
/** Node and edge counts of a domain-hierarchy overlay, for the once-per-`clear()` debug log. */
|
|
37
|
+
static overlayStats(overlay) {
|
|
38
|
+
if (!overlay) {
|
|
39
|
+
return { nodeCount: 0, edgeCount: 0 };
|
|
40
|
+
}
|
|
41
|
+
let edgeCount = 0;
|
|
42
|
+
for (const parents of overlay.values()) {
|
|
43
|
+
edgeCount += parents.size;
|
|
44
|
+
}
|
|
45
|
+
return { nodeCount: overlay.size, edgeCount };
|
|
46
|
+
}
|
|
47
|
+
/** `node` itself plus every ancestor reachable by walking the overlay's child->parent edges,
|
|
48
|
+
* node first. Cycle-safe: visited Set + index cursor, never shift(). Static - `ResourceRoleManager`
|
|
49
|
+
* extends this base with no overlay of this shape, so this must not force instance state onto it. */
|
|
50
|
+
static collectAncestors(opts) {
|
|
51
|
+
const { overlay, node } = opts;
|
|
52
|
+
const result = [node];
|
|
53
|
+
const visited = new Set([node]);
|
|
54
|
+
const queue = [node];
|
|
55
|
+
let head = 0;
|
|
56
|
+
while (head < queue.length) {
|
|
57
|
+
const current = queue[head];
|
|
58
|
+
head += 1;
|
|
59
|
+
const parents = overlay?.get(current);
|
|
60
|
+
if (!parents) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
for (const parent of parents) {
|
|
64
|
+
if (visited.has(parent)) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
visited.add(parent);
|
|
68
|
+
result.push(parent);
|
|
69
|
+
queue.push(parent);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.BaseRoleManager = BaseRoleManager;
|
|
76
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/base.ts"],"names":[],"mappings":";;;AAAA,sDAAyD;AAEzD;;;;;GAKG;AACH,MAAsB,eAAgB,SAAQ,iBAAU;IAAxD;;QACY,kBAAa,GAAG,KAAK,CAAC;IAiFlC,CAAC;IA7EC,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,KAAa;QACxC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,8GAA8G;IAC9G,KAAK,CAAC,UAAU,KAAmB,CAAC;IAEpC,KAAK,CAAC,UAAU;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,8HAA8H;IACpH,eAAe,CAAC,KAAiD;QACzE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,gGAAgG;IACtF,MAAM,CAAC,YAAY,CAAC,OAAkC;QAI9D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAChD,CAAC;IAED;;yGAEqG;IAC3F,MAAM,CAAC,gBAAgB,CAAC,IAGjC;QACC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAa,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,CAAC;YAEV,MAAM,OAAO,GAAG,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxB,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAlFD,0CAkFC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RoleManager } from 'casbin';
|
|
2
|
+
import { BaseRoleManager } from './base';
|
|
3
|
+
/**
|
|
4
|
+
* Serves the `g3` axis (`g3(r.dom, p.dom)`) and, with `reversed`, casbin's
|
|
5
|
+
* `DefaultRoleManager.addDomainHierarchy()` on `g`, which asks in the opposite argument order.
|
|
6
|
+
* `clear()` wipes only the overlay, never shared across requests: `buildRoleLinksInternal` clears
|
|
7
|
+
* every registered role manager each request. Pass both instances one `overlay` so per-request `g3`
|
|
8
|
+
* edges reach the `g` axis, which casbin never puts in `rmMap` and so never feeds `addLink`.
|
|
9
|
+
*/
|
|
10
|
+
export declare class DomainHierarchyRoleManager extends BaseRoleManager implements RoleManager {
|
|
11
|
+
private readonly reversed;
|
|
12
|
+
private readonly overlay;
|
|
13
|
+
constructor(opts: {
|
|
14
|
+
reversed?: boolean;
|
|
15
|
+
overlay?: Map<string, Set<string>>;
|
|
16
|
+
});
|
|
17
|
+
/** Mutates the map in place - never reassigns `this.overlay` - so a caller sharing this map with another instance (see `opts.overlay`) sees the clear too. */
|
|
18
|
+
clear(): Promise<void>;
|
|
19
|
+
addLink(child: string, parent: string): Promise<void>;
|
|
20
|
+
deleteLink(child: string, parent: string): Promise<void>;
|
|
21
|
+
syncedHasLink(name1: string, name2: string): boolean;
|
|
22
|
+
/** Local overlay only, not the shared graph - correct for hasLink, incomplete for casbin's management API. */
|
|
23
|
+
getRoles(name: string): Promise<string[]>;
|
|
24
|
+
getUsers(name: string): Promise<string[]>;
|
|
25
|
+
/** True when `start` is `target`, or reaches it through the overlay. */
|
|
26
|
+
private reaches;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=domain-hierarchy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-hierarchy.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/domain-hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC;;;;;;GAMG;AACH,qBAAa,0BAA2B,SAAQ,eAAgB,YAAW,WAAW;IACpF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGtB;gBAEU,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;KAAE;IAM5E,8JAA8J;IACxJ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAarD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAepD,8GAA8G;IACxG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAY/C,wEAAwE;IACxE,OAAO,CAAC,OAAO;CAahB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DomainHierarchyRoleManager = void 0;
|
|
4
|
+
const base_1 = require("./base");
|
|
5
|
+
/**
|
|
6
|
+
* Serves the `g3` axis (`g3(r.dom, p.dom)`) and, with `reversed`, casbin's
|
|
7
|
+
* `DefaultRoleManager.addDomainHierarchy()` on `g`, which asks in the opposite argument order.
|
|
8
|
+
* `clear()` wipes only the overlay, never shared across requests: `buildRoleLinksInternal` clears
|
|
9
|
+
* every registered role manager each request. Pass both instances one `overlay` so per-request `g3`
|
|
10
|
+
* edges reach the `g` axis, which casbin never puts in `rmMap` and so never feeds `addLink`.
|
|
11
|
+
*/
|
|
12
|
+
class DomainHierarchyRoleManager extends base_1.BaseRoleManager {
|
|
13
|
+
constructor(opts) {
|
|
14
|
+
super({ scope: DomainHierarchyRoleManager.name });
|
|
15
|
+
this.reversed = opts.reversed ?? false;
|
|
16
|
+
this.overlay = opts.overlay ?? new Map();
|
|
17
|
+
}
|
|
18
|
+
/** Mutates the map in place - never reassigns `this.overlay` - so a caller sharing this map with another instance (see `opts.overlay`) sees the clear too. */
|
|
19
|
+
async clear() {
|
|
20
|
+
this.overlay.clear();
|
|
21
|
+
this.graphReported = false;
|
|
22
|
+
}
|
|
23
|
+
async addLink(child, parent) {
|
|
24
|
+
const existing = this.overlay.get(child);
|
|
25
|
+
if (existing) {
|
|
26
|
+
existing.add(parent);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.overlay.set(child, new Set([parent]));
|
|
30
|
+
}
|
|
31
|
+
if (!this.overlay.has(parent)) {
|
|
32
|
+
this.overlay.set(parent, new Set());
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async deleteLink(child, parent) {
|
|
36
|
+
this.overlay.get(child)?.delete(parent);
|
|
37
|
+
}
|
|
38
|
+
syncedHasLink(name1, name2) {
|
|
39
|
+
this.reportGraphOnce(() => {
|
|
40
|
+
const { nodeCount, edgeCount } = DomainHierarchyRoleManager.overlayStats(this.overlay);
|
|
41
|
+
return {
|
|
42
|
+
message: 'domain-hierarchy role manager initialized | nodes: %d | edges: %d | reversed: %s',
|
|
43
|
+
args: [nodeCount, edgeCount, this.reversed],
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
const start = this.reversed ? name2 : name1;
|
|
47
|
+
const target = this.reversed ? name1 : name2;
|
|
48
|
+
return this.reaches({ start, target });
|
|
49
|
+
}
|
|
50
|
+
/** Local overlay only, not the shared graph - correct for hasLink, incomplete for casbin's management API. */
|
|
51
|
+
async getRoles(name) {
|
|
52
|
+
return [...(this.overlay.get(name) ?? [])];
|
|
53
|
+
}
|
|
54
|
+
async getUsers(name) {
|
|
55
|
+
const users = [];
|
|
56
|
+
for (const [child, parents] of this.overlay) {
|
|
57
|
+
if (parents.has(name)) {
|
|
58
|
+
users.push(child);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return users;
|
|
62
|
+
}
|
|
63
|
+
/** True when `start` is `target`, or reaches it through the overlay. */
|
|
64
|
+
reaches(opts) {
|
|
65
|
+
const { start, target } = opts;
|
|
66
|
+
if (start === target) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const ancestors = DomainHierarchyRoleManager.collectAncestors({
|
|
70
|
+
overlay: this.overlay,
|
|
71
|
+
node: start,
|
|
72
|
+
});
|
|
73
|
+
return ancestors.includes(target);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.DomainHierarchyRoleManager = DomainHierarchyRoleManager;
|
|
77
|
+
//# sourceMappingURL=domain-hierarchy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-hierarchy.js","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/domain-hierarchy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./base"), exports);
|
|
18
|
+
__exportStar(require("./domain-hierarchy"), exports);
|
|
19
|
+
__exportStar(require("./membership"), exports);
|
|
20
|
+
__exportStar(require("./resource"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,qDAAmC;AACnC,+CAA6B;AAC7B,6CAA2B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RoleManager } from 'casbin';
|
|
2
|
+
import { BaseRoleManager } from './base';
|
|
3
|
+
/** `g2` axis (`g2(r.sub, r.dom)`): membership holds when the user joined the request domain or any
|
|
4
|
+
* ancestor of it, walking the shared per-request domain-hierarchy overlay. Memberships are
|
|
5
|
+
* per-principal and rebuilt every request, so `clear()` wipes all. */
|
|
6
|
+
export declare class MembershipRoleManager extends BaseRoleManager implements RoleManager {
|
|
7
|
+
private readonly overlay?;
|
|
8
|
+
private memberships;
|
|
9
|
+
constructor(opts: {
|
|
10
|
+
overlay?: Map<string, Set<string>>;
|
|
11
|
+
});
|
|
12
|
+
clear(): Promise<void>;
|
|
13
|
+
addLink(user: string, domain: string): Promise<void>;
|
|
14
|
+
deleteLink(user: string, domain: string): Promise<void>;
|
|
15
|
+
/** True when `name1` (user) joined `name2` (request domain) itself, or any ancestor of it. Walks UP from the request domain only - walking down from every joined domain would fan out over the whole subtree. */
|
|
16
|
+
syncedHasLink(name1: string, name2: string): boolean;
|
|
17
|
+
/** Local membership state only, not the shared graph - correct for hasLink, incomplete for casbin's management API. */
|
|
18
|
+
getRoles(name: string): Promise<string[]>;
|
|
19
|
+
getUsers(name: string): Promise<string[]>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=membership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/membership.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC;;sEAEsE;AACtE,qBAAa,qBAAsB,SAAQ,eAAgB,YAAW,WAAW;IAC/E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAGvB;IACF,OAAO,CAAC,WAAW,CAGf;gBAEQ,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;KAAE;IAKlD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASpD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,kNAAkN;IAClN,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IA2BpD,uHAAuH;IACjH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAWhD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MembershipRoleManager = void 0;
|
|
4
|
+
const base_1 = require("./base");
|
|
5
|
+
/** `g2` axis (`g2(r.sub, r.dom)`): membership holds when the user joined the request domain or any
|
|
6
|
+
* ancestor of it, walking the shared per-request domain-hierarchy overlay. Memberships are
|
|
7
|
+
* per-principal and rebuilt every request, so `clear()` wipes all. */
|
|
8
|
+
class MembershipRoleManager extends base_1.BaseRoleManager {
|
|
9
|
+
constructor(opts) {
|
|
10
|
+
super({ scope: MembershipRoleManager.name });
|
|
11
|
+
this.memberships = new Map();
|
|
12
|
+
this.overlay = opts.overlay;
|
|
13
|
+
}
|
|
14
|
+
async clear() {
|
|
15
|
+
this.memberships = new Map();
|
|
16
|
+
this.graphReported = false;
|
|
17
|
+
}
|
|
18
|
+
async addLink(user, domain) {
|
|
19
|
+
const existing = this.memberships.get(user);
|
|
20
|
+
if (existing) {
|
|
21
|
+
existing.add(domain);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.memberships.set(user, new Set([domain]));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async deleteLink(user, domain) {
|
|
28
|
+
this.memberships.get(user)?.delete(domain);
|
|
29
|
+
}
|
|
30
|
+
/** True when `name1` (user) joined `name2` (request domain) itself, or any ancestor of it. Walks UP from the request domain only - walking down from every joined domain would fan out over the whole subtree. */
|
|
31
|
+
syncedHasLink(name1, name2) {
|
|
32
|
+
this.reportGraphOnce(() => {
|
|
33
|
+
const { nodeCount, edgeCount } = MembershipRoleManager.overlayStats(this.overlay);
|
|
34
|
+
return {
|
|
35
|
+
message: 'membership role manager initialized | nodes: %d | edges: %d',
|
|
36
|
+
args: [nodeCount, edgeCount],
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
const joined = this.memberships.get(name1);
|
|
40
|
+
if (!joined || joined.size === 0) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const ancestors = MembershipRoleManager.collectAncestors({
|
|
44
|
+
overlay: this.overlay,
|
|
45
|
+
node: name2,
|
|
46
|
+
});
|
|
47
|
+
for (const ancestor of ancestors) {
|
|
48
|
+
if (joined.has(ancestor)) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
/** Local membership state only, not the shared graph - correct for hasLink, incomplete for casbin's management API. */
|
|
55
|
+
async getRoles(name) {
|
|
56
|
+
return [...(this.memberships.get(name) ?? [])];
|
|
57
|
+
}
|
|
58
|
+
async getUsers(name) {
|
|
59
|
+
const users = [];
|
|
60
|
+
for (const [user, domains] of this.memberships) {
|
|
61
|
+
if (domains.has(name)) {
|
|
62
|
+
users.push(user);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return users;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.MembershipRoleManager = MembershipRoleManager;
|
|
69
|
+
//# sourceMappingURL=membership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.js","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/membership.ts"],"names":[],"mappings":";;;AACA,iCAAyC;AAEzC;;sEAEsE;AACtE,MAAa,qBAAsB,SAAQ,sBAAe;IAUxD,YAAY,IAA4C;QACtD,KAAK,CAAC,EAAE,KAAK,EAAE,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC;QANvC,gBAAW,GAAG,IAAI,GAAG,EAG1B,CAAC;QAIF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,MAAc;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,MAAc;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,kNAAkN;IAClN,aAAa,CAAC,KAAa,EAAE,KAAa;QACxC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE;YACxB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClF,OAAO;gBACL,OAAO,EAAE,6DAA6D;gBACtE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;aAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;YACvD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uHAAuH;IACvH,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA7ED,sDA6EC"}
|
|
@@ -1,22 +1,16 @@
|
|
|
1
|
-
import { BaseHelper } from '@venizia/ignis-helpers/core';
|
|
2
1
|
import type { RoleManager } from 'casbin';
|
|
2
|
+
import { BaseRoleManager } from './base';
|
|
3
3
|
/** Resource-axis (`g4`) role manager: `addMatchingFunc` would set `hasPattern` and disable DefaultRoleManager's O(1) fast path, so prefix ancestors are walked manually; `addLink` must stay idempotent because `buildRoleLinks` re-adds every edge once per request. */
|
|
4
|
-
export declare class ResourceRoleManager extends
|
|
4
|
+
export declare class ResourceRoleManager extends BaseRoleManager implements RoleManager {
|
|
5
5
|
private parents;
|
|
6
|
-
private graphReported;
|
|
7
6
|
constructor();
|
|
8
7
|
clear(): Promise<void>;
|
|
9
8
|
addLink(child: string, parent: string): Promise<void>;
|
|
10
9
|
deleteLink(child: string, parent: string): Promise<void>;
|
|
11
10
|
syncedHasLink(name1: string, name2: string): boolean;
|
|
12
|
-
hasLink(name1: string, name2: string): Promise<boolean>;
|
|
13
11
|
getRoles(name: string): Promise<string[]>;
|
|
14
12
|
getUsers(name: string): Promise<string[]>;
|
|
15
|
-
/** casbin calls this after buildRoleLinks purely as a debug hook; the resource graph is not logged. */
|
|
16
|
-
printRoles(): Promise<void>;
|
|
17
|
-
getDomains(): Promise<string[]>;
|
|
18
|
-
getAllDomains(): Promise<string[]>;
|
|
19
13
|
/** All stored prefix ancestors of a dotted code (`a.b.c` -> `a.b` -> `a`), not only the deepest, plus a literal stored `'*'` node - `objectMatch(anything, '*')` is always true, so a `g4` edge whose child is `'*'` must stay reachable from every request object. */
|
|
20
14
|
private collectStoredAncestors;
|
|
21
15
|
}
|
|
22
|
-
//# sourceMappingURL=resource
|
|
16
|
+
//# sourceMappingURL=resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC,yQAAyQ;AACzQ,qBAAa,mBAAoB,SAAQ,eAAgB,YAAW,WAAW;IAC7E,OAAO,CAAC,OAAO,CAGX;;IAME,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IA8C9C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAY/C,uQAAuQ;IACvQ,OAAO,CAAC,sBAAsB;CA0B/B"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ResourceRoleManager = void 0;
|
|
4
|
-
const
|
|
4
|
+
const base_1 = require("./base");
|
|
5
5
|
/** Resource-axis (`g4`) role manager: `addMatchingFunc` would set `hasPattern` and disable DefaultRoleManager's O(1) fast path, so prefix ancestors are walked manually; `addLink` must stay idempotent because `buildRoleLinks` re-adds every edge once per request. */
|
|
6
|
-
class ResourceRoleManager extends
|
|
6
|
+
class ResourceRoleManager extends base_1.BaseRoleManager {
|
|
7
7
|
constructor() {
|
|
8
8
|
super({ scope: ResourceRoleManager.name });
|
|
9
9
|
this.parents = new Map();
|
|
10
|
-
this.graphReported = false;
|
|
11
10
|
}
|
|
12
11
|
async clear() {
|
|
13
12
|
this.parents = new Map();
|
|
@@ -29,14 +28,14 @@ class ResourceRoleManager extends core_1.BaseHelper {
|
|
|
29
28
|
this.parents.get(child)?.delete(parent);
|
|
30
29
|
}
|
|
31
30
|
syncedHasLink(name1, name2) {
|
|
32
|
-
|
|
33
|
-
this.graphReported = true;
|
|
31
|
+
this.reportGraphOnce(() => {
|
|
34
32
|
const nodeCount = this.parents.size;
|
|
35
33
|
const edgeCount = Array.from(this.parents.values()).reduce((sum, set) => sum + set.size, 0);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
return {
|
|
35
|
+
message: 'resource-role initialized | nodes: %d | edges: %d',
|
|
36
|
+
args: [nodeCount, edgeCount],
|
|
37
|
+
};
|
|
38
|
+
});
|
|
40
39
|
if (name1 === name2) {
|
|
41
40
|
return true;
|
|
42
41
|
}
|
|
@@ -65,9 +64,6 @@ class ResourceRoleManager extends core_1.BaseHelper {
|
|
|
65
64
|
}
|
|
66
65
|
return false;
|
|
67
66
|
}
|
|
68
|
-
async hasLink(name1, name2) {
|
|
69
|
-
return this.syncedHasLink(name1, name2);
|
|
70
|
-
}
|
|
71
67
|
async getRoles(name) {
|
|
72
68
|
return [...(this.parents.get(name) ?? [])];
|
|
73
69
|
}
|
|
@@ -80,14 +76,6 @@ class ResourceRoleManager extends core_1.BaseHelper {
|
|
|
80
76
|
}
|
|
81
77
|
return users;
|
|
82
78
|
}
|
|
83
|
-
/** casbin calls this after buildRoleLinks purely as a debug hook; the resource graph is not logged. */
|
|
84
|
-
async printRoles() { }
|
|
85
|
-
async getDomains() {
|
|
86
|
-
return [];
|
|
87
|
-
}
|
|
88
|
-
async getAllDomains() {
|
|
89
|
-
return [];
|
|
90
|
-
}
|
|
91
79
|
/** All stored prefix ancestors of a dotted code (`a.b.c` -> `a.b` -> `a`), not only the deepest, plus a literal stored `'*'` node - `objectMatch(anything, '*')` is always true, so a `g4` edge whose child is `'*'` must stay reachable from every request object. */
|
|
92
80
|
collectStoredAncestors(opts) {
|
|
93
81
|
const ancestors = [];
|
|
@@ -112,4 +100,4 @@ class ResourceRoleManager extends core_1.BaseHelper {
|
|
|
112
100
|
}
|
|
113
101
|
}
|
|
114
102
|
exports.ResourceRoleManager = ResourceRoleManager;
|
|
115
|
-
//# sourceMappingURL=resource
|
|
103
|
+
//# sourceMappingURL=resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../../../src/components/auth/authorize/role-managers/resource.ts"],"names":[],"mappings":"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"}
|