@spinajs/rbac-http-token 2.0.512 → 2.0.514

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.
Files changed (60) hide show
  1. package/README.md +62 -6
  2. package/lib/cjs/actions.d.ts +34 -6
  3. package/lib/cjs/actions.d.ts.map +1 -1
  4. package/lib/cjs/actions.js +54 -14
  5. package/lib/cjs/actions.js.map +1 -1
  6. package/lib/cjs/cli/CreateToken.js +1 -1
  7. package/lib/cjs/cli/CreateToken.js.map +1 -1
  8. package/lib/cjs/cli/GrantTokenRole.js +1 -1
  9. package/lib/cjs/cli/GrantTokenRole.js.map +1 -1
  10. package/lib/cjs/config/rbac-http-token.d.ts +17 -0
  11. package/lib/cjs/config/rbac-http-token.d.ts.map +1 -1
  12. package/lib/cjs/config/rbac-http-token.js +17 -0
  13. package/lib/cjs/config/rbac-http-token.js.map +1 -1
  14. package/lib/cjs/controllers/AccessTokenController.d.ts +18 -5
  15. package/lib/cjs/controllers/AccessTokenController.d.ts.map +1 -1
  16. package/lib/cjs/controllers/AccessTokenController.js +28 -5
  17. package/lib/cjs/controllers/AccessTokenController.js.map +1 -1
  18. package/lib/cjs/index.d.ts +2 -0
  19. package/lib/cjs/index.d.ts.map +1 -1
  20. package/lib/cjs/index.js +2 -0
  21. package/lib/cjs/index.js.map +1 -1
  22. package/lib/cjs/interfaces.d.ts +41 -0
  23. package/lib/cjs/interfaces.d.ts.map +1 -1
  24. package/lib/cjs/interfaces.js +33 -1
  25. package/lib/cjs/interfaces.js.map +1 -1
  26. package/lib/cjs/role-policy.d.ts +28 -0
  27. package/lib/cjs/role-policy.d.ts.map +1 -0
  28. package/lib/cjs/role-policy.js +52 -0
  29. package/lib/cjs/role-policy.js.map +1 -0
  30. package/lib/mjs/actions.d.ts +34 -6
  31. package/lib/mjs/actions.d.ts.map +1 -1
  32. package/lib/mjs/actions.js +54 -15
  33. package/lib/mjs/actions.js.map +1 -1
  34. package/lib/mjs/cli/CreateToken.js +1 -1
  35. package/lib/mjs/cli/CreateToken.js.map +1 -1
  36. package/lib/mjs/cli/GrantTokenRole.js +1 -1
  37. package/lib/mjs/cli/GrantTokenRole.js.map +1 -1
  38. package/lib/mjs/config/rbac-http-token.d.ts +17 -0
  39. package/lib/mjs/config/rbac-http-token.d.ts.map +1 -1
  40. package/lib/mjs/config/rbac-http-token.js +17 -0
  41. package/lib/mjs/config/rbac-http-token.js.map +1 -1
  42. package/lib/mjs/controllers/AccessTokenController.d.ts +18 -5
  43. package/lib/mjs/controllers/AccessTokenController.d.ts.map +1 -1
  44. package/lib/mjs/controllers/AccessTokenController.js +29 -6
  45. package/lib/mjs/controllers/AccessTokenController.js.map +1 -1
  46. package/lib/mjs/index.d.ts +2 -0
  47. package/lib/mjs/index.d.ts.map +1 -1
  48. package/lib/mjs/index.js +2 -0
  49. package/lib/mjs/index.js.map +1 -1
  50. package/lib/mjs/interfaces.d.ts +41 -0
  51. package/lib/mjs/interfaces.d.ts.map +1 -1
  52. package/lib/mjs/interfaces.js +31 -0
  53. package/lib/mjs/interfaces.js.map +1 -1
  54. package/lib/mjs/role-policy.d.ts +28 -0
  55. package/lib/mjs/role-policy.d.ts.map +1 -0
  56. package/lib/mjs/role-policy.js +48 -0
  57. package/lib/mjs/role-policy.js.map +1 -0
  58. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  59. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  60. package/package.json +15 -15
@@ -16,7 +16,7 @@ import { Permission, Resource, User } from '@spinajs/rbac-http';
16
16
  import { ErrorCode } from '@spinajs/exceptions';
17
17
  import { DateTime } from 'luxon';
18
18
  import { AccessToken } from '../models/AccessToken.js';
19
- import { E_TOKEN_CODES, createToken, deleteToken, grantTokenRole, revokeTokenRole } from '../actions.js';
19
+ import { E_TOKEN_CODES, _allowed_roles, createToken, deleteToken, grantTokenRole, revokeTokenRole } from '../actions.js';
20
20
  import { CreateTokenDto } from '../dto/create-token-dto.js';
21
21
  import { NoTokenAuthPolicy } from '../policies/NoTokenAuthPolicy.js';
22
22
  import { NoImpersonationPolicy } from '../policies/NoImpersonationPolicy.js';
@@ -57,6 +57,19 @@ import { NoImpersonationPolicy } from '../policies/NoImpersonationPolicy.js';
57
57
  * @tags AccessTokens
58
58
  */
59
59
  let AccessTokenController = class AccessTokenController extends BaseController {
60
+ /**
61
+ * Roles that may be put on a new token
62
+ * Answers from the configured AccessTokenRolePolicy - the same source
63
+ * `POST user/tokens` validates against, so a client can never be offered a
64
+ * role the create call would then refuse.
65
+ * @security cookieAuth
66
+ * @response 200 Roles the caller may put on a token
67
+ * @response 401 Unauthorized - valid session required
68
+ * @response 403 Forbidden - access tokens cannot be used on this route
69
+ */
70
+ async roles(user) {
71
+ return new Ok({ Roles: await _allowed_roles(user) });
72
+ }
60
73
  /**
61
74
  * List own access tokens
62
75
  * Hashes are never returned - `Token` is `@Hidden()` on the model, so the
@@ -73,10 +86,11 @@ let AccessTokenController = class AccessTokenController extends BaseController {
73
86
  /**
74
87
  * Create an access token
75
88
  * The plaintext appears in this response only and cannot be retrieved again.
76
- * Roles must be a subset of the caller's own roles.
89
+ * Roles must be a subset of what the configured AccessTokenRolePolicy allows
90
+ * the caller - the same set `GET user/tokens/roles` reports.
77
91
  * @security cookieAuth
78
92
  * @response 200 Token created, `Plaintext` returned once
79
- * @response 400 Requested roles are not held by the caller
93
+ * @response 400 Requested roles are not allowed for the caller by the configured role policy
80
94
  * @response 401 Unauthorized - valid session required
81
95
  * @response 403 Forbidden - access tokens cannot be used on this route
82
96
  */
@@ -109,13 +123,14 @@ let AccessTokenController = class AccessTokenController extends BaseController {
109
123
  }
110
124
  /**
111
125
  * Grant a role to an own token
112
- * The role must be held by the caller - a token can never carry more than its
113
- * owner does.
126
+ * The role must be allowed for the caller by the configured
127
+ * AccessTokenRolePolicy - a token can never carry more than the policy
128
+ * permits its owner.
114
129
  * @security cookieAuth
115
130
  * @param uuid Public identifier of the token
116
131
  * @param role Role name to grant
117
132
  * @response 200 Updated token
118
- * @response 400 Role is not held by the caller
133
+ * @response 400 Role is not allowed for the caller by the configured role policy
119
134
  * @response 401 Unauthorized - valid session required
120
135
  * @response 403 Forbidden - access tokens cannot be used on this route
121
136
  * @response 404 No such token for this user
@@ -206,6 +221,14 @@ let AccessTokenController = class AccessTokenController extends BaseController {
206
221
  throw err;
207
222
  }
208
223
  };
224
+ __decorate([
225
+ Get('tokens/roles'),
226
+ Permission(['readOwn']),
227
+ __param(0, User()),
228
+ __metadata("design:type", Function),
229
+ __metadata("design:paramtypes", [UserModel]),
230
+ __metadata("design:returntype", Promise)
231
+ ], AccessTokenController.prototype, "roles", null);
209
232
  __decorate([
210
233
  Get('tokens'),
211
234
  Permission(['readOwn']),
@@ -1 +1 @@
1
- {"version":3,"file":"AccessTokenController.js","sourceRoot":"","sources":["../../../src/controllers/AccessTokenController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccessTokenController.js","sourceRoot":"","sources":["../../../src/controllers/AccessTokenController.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import './generator.js';
2
+ import './role-policy.js';
2
3
  import './middlewares.js';
3
4
  export * from './interfaces.js';
4
5
  export * from './models/AccessToken.js';
5
6
  export * from './migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.js';
6
7
  export * from './generator.js';
8
+ export * from './role-policy.js';
7
9
  export * from './events/index.js';
8
10
  export * from './actions.js';
9
11
  export * from './middlewares.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0DAA0D,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0DAA0D,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
package/lib/mjs/index.js CHANGED
@@ -2,11 +2,13 @@
2
2
  // generator and the token authorization middleware ) the moment they are
3
3
  // loaded, so they must run even if a consumer imports nothing from them.
4
4
  import './generator.js';
5
+ import './role-policy.js';
5
6
  import './middlewares.js';
6
7
  export * from './interfaces.js';
7
8
  export * from './models/AccessToken.js';
8
9
  export * from './migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.js';
9
10
  export * from './generator.js';
11
+ export * from './role-policy.js';
10
12
  export * from './events/index.js';
11
13
  export * from './actions.js';
12
14
  export * from './middlewares.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AACzE,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0DAA0D,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AACzE,OAAO,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0DAA0D,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { User } from '@spinajs/rbac';
1
2
  export interface IGeneratedToken {
2
3
  /**
3
4
  * Full token as handed to the user, e.g. `spt_<base64url>`. Shown exactly once.
@@ -32,6 +33,46 @@ export interface ITokenAuthInfo {
32
33
  */
33
34
  Uuid: string;
34
35
  }
36
+ /**
37
+ * Decides which roles a given owner may put on an access token.
38
+ *
39
+ * ONE method, FOUR call sites - `createToken`, `grantTokenRole`,
40
+ * `validateToken`, and the `GET user/tokens/roles` controller route (all
41
+ * through the shared `_allowed_roles` helper in `src/actions.ts`). That is
42
+ * deliberate: creation time and request time have to answer the same
43
+ * question, otherwise a role a user was allowed to pick could be one their
44
+ * token silently loses on the next request.
45
+ *
46
+ * `owner` is NOT hydrated the same way by every call site: `GET
47
+ * user/tokens/roles` and `createToken` (from `POST user/tokens`) are handed
48
+ * `req.storage.User` - the application's `User` subclass, with whatever
49
+ * request-pipeline hydration already ran - while `grantTokenRole` and
50
+ * `validateToken` are handed a base `User` with only `Metadata` populated
51
+ * ( `_owner()` / a direct `User.where(...)` lookup, deliberately unscoped by
52
+ * any application model override - see `_owner()`'s comments in
53
+ * `src/actions.ts` ). A correct implementation MUST NOT rely on anything
54
+ * beyond the base `User` model plus `Metadata` being present on `owner` -
55
+ * that is the only shape all four call sites agree on. Any
56
+ * application-specific field a policy reads may be populated on a
57
+ * session-authenticated call and absent on a token-authenticated one,
58
+ * answering the identical question two different ways.
59
+ *
60
+ * Replaceable via config `rbac.token.rolePolicy.service`, the same pattern
61
+ * `rbac.token.generation.service` uses for the token generator. The shipped
62
+ * default ( `OwnRolesTokenRolePolicy` ) answers with the owner's own roles,
63
+ * which is the behaviour this package had before the seam existed.
64
+ */
65
+ export declare abstract class AccessTokenRolePolicy {
66
+ /**
67
+ * Roles `owner` may carry on a token. Also the set every one of their
68
+ * existing tokens is re-intersected with on each authenticated request, so a
69
+ * role dropped from this answer stops authorising immediately.
70
+ *
71
+ * @param owner - at minimum a base `User` with `Metadata` populated; see the
72
+ * class docblock above for why nothing more may be assumed.
73
+ */
74
+ abstract allowedRoles(owner: User): Promise<string[]>;
75
+ }
35
76
  declare module '@spinajs/rbac' {
36
77
  interface IRbacAsyncStorage {
37
78
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,8BAAsB,6BAA6B;IACjD;;OAEG;IACH,SAAgB,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAErD;;OAEG;IACH,SAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,iBAAiB;QACzB;;WAEG;QACH,SAAS,CAAC,EAAE,cAAc,CAAC;KAC5B;CACF;AAED;;;;;GAKG;AACH,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,0BAA0B;QAClC;;WAEG;QACH,SAAS,CAAC,EAAE,cAAc,CAAC;KAC5B;CACF"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAO1C,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,8BAAsB,6BAA6B;IACjD;;OAEG;IACH,SAAgB,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAErD;;OAEG;IACH,SAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,8BAAsB,qBAAqB;IACzC;;;;;;;OAOG;IACH,SAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9D;AAED,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,iBAAiB;QACzB;;WAEG;QACH,SAAS,CAAC,EAAE,cAAc,CAAC;KAC5B;CACF;AAED;;;;;GAKG;AACH,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,0BAA0B;QAClC;;WAEG;QACH,SAAS,CAAC,EAAE,cAAc,CAAC;KAC5B;CACF"}
@@ -4,4 +4,35 @@
4
4
  */
5
5
  export class AccessTokenGenerationProvider {
6
6
  }
7
+ /**
8
+ * Decides which roles a given owner may put on an access token.
9
+ *
10
+ * ONE method, FOUR call sites - `createToken`, `grantTokenRole`,
11
+ * `validateToken`, and the `GET user/tokens/roles` controller route (all
12
+ * through the shared `_allowed_roles` helper in `src/actions.ts`). That is
13
+ * deliberate: creation time and request time have to answer the same
14
+ * question, otherwise a role a user was allowed to pick could be one their
15
+ * token silently loses on the next request.
16
+ *
17
+ * `owner` is NOT hydrated the same way by every call site: `GET
18
+ * user/tokens/roles` and `createToken` (from `POST user/tokens`) are handed
19
+ * `req.storage.User` - the application's `User` subclass, with whatever
20
+ * request-pipeline hydration already ran - while `grantTokenRole` and
21
+ * `validateToken` are handed a base `User` with only `Metadata` populated
22
+ * ( `_owner()` / a direct `User.where(...)` lookup, deliberately unscoped by
23
+ * any application model override - see `_owner()`'s comments in
24
+ * `src/actions.ts` ). A correct implementation MUST NOT rely on anything
25
+ * beyond the base `User` model plus `Metadata` being present on `owner` -
26
+ * that is the only shape all four call sites agree on. Any
27
+ * application-specific field a policy reads may be populated on a
28
+ * session-authenticated call and absent on a token-authenticated one,
29
+ * answering the identical question two different ways.
30
+ *
31
+ * Replaceable via config `rbac.token.rolePolicy.service`, the same pattern
32
+ * `rbac.token.generation.service` uses for the token generator. The shipped
33
+ * default ( `OwnRolesTokenRolePolicy` ) answers with the owner's own roles,
34
+ * which is the behaviour this package had before the seam existed.
35
+ */
36
+ export class AccessTokenRolePolicy {
37
+ }
7
38
  //# sourceMappingURL=interfaces.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,MAAM,OAAgB,6BAA6B;CAUlD"}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,MAAM,OAAgB,6BAA6B;CAUlD;AAaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,OAAgB,qBAAqB;CAU1C"}
@@ -0,0 +1,28 @@
1
+ import { User } from '@spinajs/rbac';
2
+ import { AccessTokenRolePolicy } from './interfaces.js';
3
+ /**
4
+ * The behaviour this package shipped before the policy seam: a token may carry
5
+ * only roles its owner literally holds in `users.Role`.
6
+ *
7
+ * Safe by construction and needs no access-control lookup, which is why it
8
+ * stays the default - an application that wants finer scopes opts in by
9
+ * registering its own implementation under `rbac.token.rolePolicy.service`.
10
+ */
11
+ export declare class OwnRolesTokenRolePolicy extends AccessTokenRolePolicy {
12
+ allowedRoles(owner: User): Promise<string[]>;
13
+ }
14
+ /**
15
+ * Whether `role` matches any entry of `patterns`.
16
+ *
17
+ * A pattern is either an exact role name, or a name ending in `.*` which
18
+ * matches that prefix and everything beneath it - `route.*` covers `route.home`
19
+ * and `route.admin.users`, but not `routes.read`: the dot is part of the
20
+ * boundary, so a pattern can never swallow an unrelated role that merely starts
21
+ * with the same letters. No other wildcard syntax, on purpose - a full glob in
22
+ * a security list invites patterns nobody can reason about.
23
+ *
24
+ * @param role - role name to test
25
+ * @param patterns - exclusion patterns, typically from `rbac.token.excludedRoles`
26
+ */
27
+ export declare function _role_excluded(role: string, patterns: string[]): boolean;
28
+ //# sourceMappingURL=role-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-policy.d.ts","sourceRoot":"","sources":["../../src/role-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;GAOG;AACH,qBACa,uBAAwB,SAAQ,qBAAqB;IACnD,YAAY,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAExD;CACF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CASxE"}
@@ -0,0 +1,48 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Injectable } from '@spinajs/di';
8
+ import { AccessTokenRolePolicy } from './interfaces.js';
9
+ /**
10
+ * The behaviour this package shipped before the policy seam: a token may carry
11
+ * only roles its owner literally holds in `users.Role`.
12
+ *
13
+ * Safe by construction and needs no access-control lookup, which is why it
14
+ * stays the default - an application that wants finer scopes opts in by
15
+ * registering its own implementation under `rbac.token.rolePolicy.service`.
16
+ */
17
+ let OwnRolesTokenRolePolicy = class OwnRolesTokenRolePolicy extends AccessTokenRolePolicy {
18
+ async allowedRoles(owner) {
19
+ return [...owner.Role];
20
+ }
21
+ };
22
+ OwnRolesTokenRolePolicy = __decorate([
23
+ Injectable(AccessTokenRolePolicy)
24
+ ], OwnRolesTokenRolePolicy);
25
+ export { OwnRolesTokenRolePolicy };
26
+ /**
27
+ * Whether `role` matches any entry of `patterns`.
28
+ *
29
+ * A pattern is either an exact role name, or a name ending in `.*` which
30
+ * matches that prefix and everything beneath it - `route.*` covers `route.home`
31
+ * and `route.admin.users`, but not `routes.read`: the dot is part of the
32
+ * boundary, so a pattern can never swallow an unrelated role that merely starts
33
+ * with the same letters. No other wildcard syntax, on purpose - a full glob in
34
+ * a security list invites patterns nobody can reason about.
35
+ *
36
+ * @param role - role name to test
37
+ * @param patterns - exclusion patterns, typically from `rbac.token.excludedRoles`
38
+ */
39
+ export function _role_excluded(role, patterns) {
40
+ return patterns.some((pattern) => {
41
+ if (pattern.endsWith('.*')) {
42
+ const prefix = pattern.slice(0, -1); // keeps the trailing dot
43
+ return role.startsWith(prefix);
44
+ }
45
+ return role === pattern;
46
+ });
47
+ }
48
+ //# sourceMappingURL=role-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-policy.js","sourceRoot":"","sources":["../../src/role-policy.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;GAOG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,qBAAqB;IACzD,KAAK,CAAC,YAAY,CAAC,KAAW;QACnC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CACF,CAAA;AAJY,uBAAuB;IADnC,UAAU,CAAC,qBAAqB,CAAC;GACrB,uBAAuB,CAInC;;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,QAAkB;IAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;YAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,KAAK,OAAO,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}