@spinajs/rbac 2.0.481 → 2.0.484

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 (105) hide show
  1. package/lib/cjs/actions.d.ts.map +1 -1
  2. package/lib/cjs/actions.js +38 -7
  3. package/lib/cjs/actions.js.map +1 -1
  4. package/lib/cjs/auth.d.ts.map +1 -1
  5. package/lib/cjs/auth.js +8 -4
  6. package/lib/cjs/auth.js.map +1 -1
  7. package/lib/cjs/cli/ActivateUser.js +1 -1
  8. package/lib/cjs/cli/ActivateUser.js.map +1 -1
  9. package/lib/cjs/cli/BanUser.js +1 -1
  10. package/lib/cjs/cli/BanUser.js.map +1 -1
  11. package/lib/cjs/config/rbac.d.ts +11 -1
  12. package/lib/cjs/config/rbac.d.ts.map +1 -1
  13. package/lib/cjs/config/rbac.js +12 -3
  14. package/lib/cjs/config/rbac.js.map +1 -1
  15. package/lib/cjs/cron/DeactivatePasswords.d.ts.map +1 -1
  16. package/lib/cjs/cron/DeactivatePasswords.js +6 -2
  17. package/lib/cjs/cron/DeactivatePasswords.js.map +1 -1
  18. package/lib/cjs/index.d.ts +6 -0
  19. package/lib/cjs/index.d.ts.map +1 -1
  20. package/lib/cjs/index.js +6 -0
  21. package/lib/cjs/index.js.map +1 -1
  22. package/lib/cjs/interfaces.d.ts +87 -37
  23. package/lib/cjs/interfaces.d.ts.map +1 -1
  24. package/lib/cjs/interfaces.js +47 -1
  25. package/lib/cjs/interfaces.js.map +1 -1
  26. package/lib/cjs/middleware.d.ts +24 -1
  27. package/lib/cjs/middleware.d.ts.map +1 -1
  28. package/lib/cjs/middleware.js +204 -104
  29. package/lib/cjs/middleware.js.map +1 -1
  30. package/lib/cjs/models/User.d.ts.map +1 -1
  31. package/lib/cjs/models/User.js +23 -4
  32. package/lib/cjs/models/User.js.map +1 -1
  33. package/lib/cjs/models/UserMetadata.d.ts.map +1 -1
  34. package/lib/cjs/models/UserMetadata.js +6 -0
  35. package/lib/cjs/models/UserMetadata.js.map +1 -1
  36. package/lib/cjs/ownership.d.ts +2 -0
  37. package/lib/cjs/ownership.d.ts.map +1 -0
  38. package/lib/cjs/ownership.js +46 -0
  39. package/lib/cjs/ownership.js.map +1 -0
  40. package/lib/cjs/session-codec.d.ts +15 -0
  41. package/lib/cjs/session-codec.d.ts.map +1 -0
  42. package/lib/cjs/session-codec.js +59 -0
  43. package/lib/cjs/session-codec.js.map +1 -0
  44. package/lib/cjs/session-expiration.d.ts +40 -0
  45. package/lib/cjs/session-expiration.d.ts.map +1 -0
  46. package/lib/cjs/session-expiration.js +93 -0
  47. package/lib/cjs/session-expiration.js.map +1 -0
  48. package/lib/cjs/session.d.ts +38 -18
  49. package/lib/cjs/session.d.ts.map +1 -1
  50. package/lib/cjs/session.js +91 -50
  51. package/lib/cjs/session.js.map +1 -1
  52. package/lib/mjs/actions.d.ts.map +1 -1
  53. package/lib/mjs/actions.js +38 -7
  54. package/lib/mjs/actions.js.map +1 -1
  55. package/lib/mjs/auth.d.ts.map +1 -1
  56. package/lib/mjs/auth.js +8 -4
  57. package/lib/mjs/auth.js.map +1 -1
  58. package/lib/mjs/cli/ActivateUser.js +1 -1
  59. package/lib/mjs/cli/ActivateUser.js.map +1 -1
  60. package/lib/mjs/cli/BanUser.js +1 -1
  61. package/lib/mjs/cli/BanUser.js.map +1 -1
  62. package/lib/mjs/config/rbac.d.ts +11 -1
  63. package/lib/mjs/config/rbac.d.ts.map +1 -1
  64. package/lib/mjs/config/rbac.js +12 -3
  65. package/lib/mjs/config/rbac.js.map +1 -1
  66. package/lib/mjs/cron/DeactivatePasswords.d.ts.map +1 -1
  67. package/lib/mjs/cron/DeactivatePasswords.js +6 -2
  68. package/lib/mjs/cron/DeactivatePasswords.js.map +1 -1
  69. package/lib/mjs/index.d.ts +6 -0
  70. package/lib/mjs/index.d.ts.map +1 -1
  71. package/lib/mjs/index.js +6 -0
  72. package/lib/mjs/index.js.map +1 -1
  73. package/lib/mjs/interfaces.d.ts +87 -37
  74. package/lib/mjs/interfaces.d.ts.map +1 -1
  75. package/lib/mjs/interfaces.js +45 -0
  76. package/lib/mjs/interfaces.js.map +1 -1
  77. package/lib/mjs/middleware.d.ts +24 -1
  78. package/lib/mjs/middleware.d.ts.map +1 -1
  79. package/lib/mjs/middleware.js +204 -104
  80. package/lib/mjs/middleware.js.map +1 -1
  81. package/lib/mjs/models/User.d.ts.map +1 -1
  82. package/lib/mjs/models/User.js +24 -5
  83. package/lib/mjs/models/User.js.map +1 -1
  84. package/lib/mjs/models/UserMetadata.d.ts.map +1 -1
  85. package/lib/mjs/models/UserMetadata.js +6 -0
  86. package/lib/mjs/models/UserMetadata.js.map +1 -1
  87. package/lib/mjs/ownership.d.ts +2 -0
  88. package/lib/mjs/ownership.d.ts.map +1 -0
  89. package/lib/mjs/ownership.js +44 -0
  90. package/lib/mjs/ownership.js.map +1 -0
  91. package/lib/mjs/session-codec.d.ts +15 -0
  92. package/lib/mjs/session-codec.d.ts.map +1 -0
  93. package/lib/mjs/session-codec.js +55 -0
  94. package/lib/mjs/session-codec.js.map +1 -0
  95. package/lib/mjs/session-expiration.d.ts +40 -0
  96. package/lib/mjs/session-expiration.d.ts.map +1 -0
  97. package/lib/mjs/session-expiration.js +90 -0
  98. package/lib/mjs/session-expiration.js.map +1 -0
  99. package/lib/mjs/session.d.ts +38 -18
  100. package/lib/mjs/session.d.ts.map +1 -1
  101. package/lib/mjs/session.js +89 -47
  102. package/lib/mjs/session.js.map +1 -1
  103. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  104. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  105. package/package.json +15 -12
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA2E3C;;GAEG;AACH,MAAM,OAAgB,gBAAgB;CAsBrC;AAED;;;;;GAKG;AACH,MAAM,OAAgB,YAAY;CAgEjC;AAED;;;;;;GAMG;AACH,MAAM,OAAgB,qBAAqB;CAwB1C;AAED,MAAM,OAAgB,eAA8B,SAAQ,YAAY;CAwDvE;AAED,MAAM,CAAN,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,uFAAiB,CAAA;IACjB,+FAAqB,CAAA;IACrB,uGAAyB,CAAA;IACzB,+GAA6B,CAAA;AAC/B,CAAC,EALW,uBAAuB,KAAvB,uBAAuB,QAKlC;AAUD;;GAEG;AACH,MAAM,OAAgB,0BAA0B;CAE/C;AAGD,MAAM,OAAO,WAAW;IAItB,YAAmB,IAAW,EAAE,IAAU;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAgB,mBAAmB;CAExC"}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAkEjC;;;;;GAKG;AACH,MAAM,OAAgB,yBAAyB;CAU9C;AAED;;GAEG;AACH,MAAM,OAAgB,gBAAgB;CAsBrC;AAED;;;;;GAKG;AACH,MAAM,OAAgB,YAAY;CAgEjC;AAED;;;;;;GAMG;AACH,MAAM,OAAgB,qBAAqB;CAwB1C;AAED,MAAM,OAAgB,eAA+C,SAAQ,YAAY;IA8DvF;;OAEG;IACO,sBAAsB,CAAC,CAAW;QAC1C,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACO,sBAAsB,CAAC,CAAW;QAC1C,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACO,SAAS,CAAC,CAAW;QAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC1D,CAAC;CACF;AA3EW;IADT,iBAAiB,CAAC,yBAAyB,CAAC;8BACtB,yBAAyB;mDAAC;AA6EnD,MAAM,CAAN,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,uFAAiB,CAAA;IACjB,+FAAqB,CAAA;IACrB,uGAAyB,CAAA;IACzB,+GAA6B,CAAA;AAC/B,CAAC,EALW,uBAAuB,KAAvB,uBAAuB,QAKlC;AAyBD;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAQzC;;GAEG;AACH,MAAM,OAAgB,0BAA0B;CAE/C;AAGD,MAAM,OAAO,WAAW;IAItB,YAAmB,IAAW,EAAE,IAAU;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAgB,mBAAmB;CAExC"}
@@ -1,10 +1,33 @@
1
1
  import { QueryBuilder, QueryMiddleware } from '@spinajs/orm';
2
+ import { IRbacModelDescriptor, RbacHookName } from './interfaces.js';
2
3
  import { AccessControl } from 'accesscontrol';
3
4
  import { Log } from '@spinajs/log-common';
4
5
  export declare class RbacModelPermissionMiddleware extends QueryMiddleware {
5
6
  protected Log: Log;
6
7
  protected Ac: AccessControl;
7
- beforeQueryExecution(_query: QueryBuilder<any>): void;
8
+ /**
9
+ * INSERT is enforced here rather than in `afterQueryCreation` because the row payload does
10
+ * not exist at construction time — `values()` is called afterwards and would overwrite an
11
+ * owner column stamped earlier. Reads and writes keep their where-clause injection at
12
+ * construction, where it has always been.
13
+ */
14
+ beforeQueryExecution(builder: QueryBuilder<any>): Promise<void>;
8
15
  afterQueryCreation(builder: QueryBuilder): void;
16
+ /**
17
+ * Everything both hooks need, or `undefined` when this query is not subject to a check.
18
+ *
19
+ * Shared so the two hooks cannot drift on who is exempt: no async context, no user, an
20
+ * explicit skip flag, a model with no `@Resource()`, or a declared `PermissionScope` that
21
+ * does not match this builder type.
22
+ */
23
+ protected context(builder: QueryBuilder): {
24
+ descriptor: IRbacModelDescriptor;
25
+ resource: string;
26
+ canOwn: boolean;
27
+ canAny: boolean;
28
+ action: string;
29
+ hook: RbacHookName;
30
+ user: import("./index.js").User;
31
+ } | undefined;
9
32
  }
10
33
  //# sourceMappingURL=middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAgF,YAAY,EAAE,eAAe,EAA0C,MAAM,cAAc,CAAC;AAGnL,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,GAAG,EAAU,MAAM,qBAAqB,CAAC;AA4BlD,qBACa,6BAA8B,SAAQ,eAAe;IAGhE,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,EAAE,EAAG,aAAa,CAAC;IAE7B,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI;IACrD,kBAAkB,CAAC,OAAO,EAAE,YAAY;CAwFzC"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAgF,YAAY,EAAE,eAAe,EAA0C,MAAM,cAAc,CAAC;AAEnL,OAAO,EAAqB,oBAAoB,EAAsC,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5H,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,GAAG,EAAU,MAAM,qBAAqB,CAAC;AAuFlD,qBACa,6BAA8B,SAAQ,eAAe;IAGhE,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,EAAE,EAAG,aAAa,CAAC;IAE7B;;;;;OAKG;IACG,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CrE,kBAAkB,CAAC,OAAO,EAAE,YAAY;IA8CxC;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY;;;;;;;;;CAoExC"}
@@ -10,118 +10,218 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  import { Autoinject, DI, Injectable } from '@spinajs/di';
11
11
  import { DeleteQueryBuilder, extractModelDescriptor, InsertQueryBuilder, OrmException, QueryMiddleware, SelectQueryBuilder, UpdateQueryBuilder } from '@spinajs/orm';
12
12
  import { AsyncLocalStorage } from 'async_hooks';
13
+ import { RBAC_HOOK_FALLBACK } from './interfaces.js';
13
14
  import { AccessControl } from 'accesscontrol';
14
15
  import { Forbidden } from '@spinajs/exceptions';
15
16
  import { Log, Logger } from '@spinajs/log-common';
16
- const QUERY_TO_PERMISSION = {
17
- DeleteQueryBuilder: {
18
- own: "deleteOwn",
19
- all: "deleteAny"
20
- },
21
- UpdateQueryBuilder: {
22
- own: "updateOwn",
23
- all: "updateAny"
24
- },
25
- SelectQueryBuilder: {
26
- own: "readOwn",
27
- all: "readAny"
17
+ /**
18
+ * Which permission scopes a builder type is checked against, and which per-operation
19
+ * model hook it looks for.
20
+ *
21
+ * Keyed on the CONSTRUCTOR, not on `constructor.name`. A name-keyed lookup breaks under
22
+ * minification and silently yields "no mapping" — for a security check that means an
23
+ * unguarded query, which is why `IdentityMap` rejects name keys for the same reason (A9).
24
+ *
25
+ * `InsertQueryBuilder` was missing here while `PERMISSION_SCOPE_TO_QUERY` claimed to
26
+ * support `createOwn`/`createAny`, so the insert branch of the middleware could only ever
27
+ * have thrown a TypeError. The inverse map below is now DERIVED from this one, so the two
28
+ * cannot drift apart again — and the hook name lives here for the same reason, so a hook
29
+ * can never be paired with the wrong builder type.
30
+ */
31
+ const QUERY_TO_PERMISSION = new Map([
32
+ [DeleteQueryBuilder, { own: 'deleteOwn', all: 'deleteAny', hook: 'rbacDelete' }],
33
+ [UpdateQueryBuilder, { own: 'updateOwn', all: 'updateAny', hook: 'rbacUpdate' }],
34
+ [SelectQueryBuilder, { own: 'readOwn', all: 'readAny', hook: 'rbacRead' }],
35
+ [InsertQueryBuilder, { own: 'createOwn', all: 'createAny', hook: 'rbacCreate' }],
36
+ ]);
37
+ /** Derived inverse of {@link QUERY_TO_PERMISSION}. Never hand-maintained. */
38
+ const PERMISSION_SCOPE_TO_QUERY = new Map();
39
+ for (const [ctor, scopes] of QUERY_TO_PERMISSION) {
40
+ PERMISSION_SCOPE_TO_QUERY.set(scopes.own, ctor);
41
+ PERMISSION_SCOPE_TO_QUERY.set(scopes.all, ctor);
42
+ }
43
+ /**
44
+ * The permission scopes for `builder`, matched by `instanceof` so a driver-specific
45
+ * subclass resolves to its base builder's scopes instead of falling off the map.
46
+ */
47
+ function permissionsFor(builder) {
48
+ for (const [ctor, scopes] of QUERY_TO_PERMISSION) {
49
+ if (builder instanceof ctor) {
50
+ return scopes;
51
+ }
28
52
  }
29
- };
30
- const PERMISSION_SCOPE_TO_QUERY = {
31
- deleteOwn: "DeleteQueryBuilder",
32
- deleteAny: "DeleteQueryBuilder",
33
- updateOwn: "UpdateQueryBuilder",
34
- updateAny: "UpdateQueryBuilder",
35
- readOwn: "SelectQueryBuilder",
36
- readAny: "SelectQueryBuilder",
37
- createOwn: "InsertQueryBuilder",
38
- createAny: "InsertQueryBuilder"
39
- };
53
+ return undefined;
54
+ }
55
+ /**
56
+ * The custom rbac constraint `model` declares for this operation, or `undefined` when it
57
+ * declares none and the caller should fall through to `OwnerField`.
58
+ *
59
+ * Resolution is specific-then-generic: `rbacDelete` beats `rbac` on a delete, and a model
60
+ * declaring only `rbac` keeps its pre-split behaviour on every operation. Statics resolve
61
+ * through the prototype chain, so a subclass inherits whichever hooks it does not override.
62
+ *
63
+ * `allowFallback` is false for INSERT only. `rbac` has always been called on builders that
64
+ * have a WHERE clause, so every implementation in the wild is where-shaped —
65
+ * `ContentEntries.rbac` and `EntriesGroup.rbac` both call `whereExist`, which
66
+ * `InsertQueryBuilder` does not define. Falling back there would turn a silent gap into a
67
+ * crash on every insert for every model already using the feature. Insert-time control is
68
+ * opt-in via an explicit `rbacCreate`.
69
+ */
70
+ function rbacHook(model, hook, allowFallback) {
71
+ const statics = model;
72
+ if (!statics) {
73
+ return undefined;
74
+ }
75
+ if (typeof statics[hook] === 'function') {
76
+ return statics[hook];
77
+ }
78
+ if (allowFallback && typeof statics[RBAC_HOOK_FALLBACK] === 'function') {
79
+ return statics[RBAC_HOOK_FALLBACK];
80
+ }
81
+ return undefined;
82
+ }
40
83
  let RbacModelPermissionMiddleware = class RbacModelPermissionMiddleware extends QueryMiddleware {
41
- beforeQueryExecution(_query) { }
84
+ /**
85
+ * INSERT is enforced here rather than in `afterQueryCreation` because the row payload does
86
+ * not exist at construction time — `values()` is called afterwards and would overwrite an
87
+ * owner column stamped earlier. Reads and writes keep their where-clause injection at
88
+ * construction, where it has always been.
89
+ */
90
+ async beforeQueryExecution(builder) {
91
+ if (!(builder instanceof InsertQueryBuilder)) {
92
+ return;
93
+ }
94
+ const context = this.context(builder);
95
+ if (!context) {
96
+ return;
97
+ }
98
+ const { descriptor, resource, canOwn, canAny } = context;
99
+ if (canAny) {
100
+ this.Log.trace(`Resource ${resource}:any insert permission granted`);
101
+ return;
102
+ }
103
+ if (!canOwn) {
104
+ throw new Forbidden(`User does not have permission to access ${resource}:${context.action} permission`);
105
+ }
106
+ /**
107
+ * Model can take over insert-time ownership itself. No fallback to the generic `rbac`
108
+ * here — see {@link rbacHook}.
109
+ *
110
+ * Awaited: unlike the where-clause hooks, an insert rule usually cannot be decided from
111
+ * the payload alone — "is this the caller's group?" is a lookup. Dropping the returned
112
+ * promise would let the row land before the answer came back.
113
+ */
114
+ const rbacFunc = rbacHook(builder.Model, context.hook, false);
115
+ if (rbacFunc) {
116
+ this.Log.trace(`Applying custom ${context.hook} func for ${resource}`);
117
+ await rbacFunc.call(builder, context.user);
118
+ return;
119
+ }
120
+ if (!descriptor.OwnerField) {
121
+ this.Log.error(`Model ${descriptor.Name} does not have OwnerField set, cannot apply :own permission`);
122
+ throw new OrmException(`Model ${descriptor.Name} does not have OwnerField set, cannot apply :own permission`);
123
+ }
124
+ // Overwrite, never merge: a caller-supplied owner id is exactly the IDOR this closes.
125
+ builder.forceColumn(descriptor.OwnerField, context.user.PrimaryKeyValue);
126
+ }
42
127
  afterQueryCreation(builder) {
43
- if (typeof AsyncLocalStorage === 'function') {
44
- const store = DI.get(AsyncLocalStorage);
45
- if (store) {
46
- const storage = store.getStore();
47
- if (storage && storage.SkipModelPermissionCheck) {
48
- this.Log.trace(`Model permission check disabled for current execution context, skipping rbac check`);
49
- return;
50
- }
51
- if (storage && storage.User) {
52
- // add where statement
53
- const descriptor = extractModelDescriptor(builder.Model);
54
- // if model does not have @Resource() decorator set, model name is used
55
- const resource = descriptor.RbacResource; // ?? descriptor.Name; // temporarly remove resource assign
56
- // no rbac is set do nothing
57
- if (!resource) {
58
- return;
59
- }
60
- if (storage?.PermissionScope) {
61
- if (!PERMISSION_SCOPE_TO_QUERY[storage.PermissionScope]) {
62
- this.Log.warn(`Permission scope ${storage.PermissionScope} does not match any query type, skipping rbac check`);
63
- return;
64
- }
65
- if (builder.constructor.name !== PERMISSION_SCOPE_TO_QUERY[storage.PermissionScope]) {
66
- this.Log.warn(`Permission scope ${storage.PermissionScope} does not match query type ${builder.constructor.name}, skipping rbac check`);
67
- return;
68
- }
69
- }
70
- const ownScope = storage?.PermissionScope ?? QUERY_TO_PERMISSION[builder.constructor.name].own;
71
- const anyScope = storage?.PermissionScope ?? QUERY_TO_PERMISSION[builder.constructor.name].all;
72
- const roles = storage.ActiveRole ? [storage.ActiveRole] : storage.User.Role;
73
- let canAny = false;
74
- let canOwn = false;
75
- try {
76
- canAny = this.Ac.can(roles)[anyScope](resource).granted;
77
- canOwn = this.Ac.can(roles)[ownScope](resource).granted;
78
- }
79
- catch (err) {
80
- // accesscontrol throws eg. "Role not found" when role has no grants registered
81
- // treat as no permission so caller gets Forbidden instead of library error
82
- this.Log.trace(`Permission check for roles ${roles} on resource ${resource} failed: ${err.message}, treating as no permission`);
83
- }
84
- if (builder instanceof SelectQueryBuilder || builder instanceof UpdateQueryBuilder || builder instanceof DeleteQueryBuilder) {
85
- /**
86
- * Model can have custom rbac permission check
87
- */
88
- const rbacFunc = builder.Model?.rbac;
89
- if (canAny) {
90
- this.Log.trace(`Resource ${resource}:any permission granted for ${storage.User.Role}, scope: ${storage.PermissionScope}`);
91
- return;
92
- }
93
- else if (canOwn) {
94
- this.Log.trace(`Resource ${resource}:own permission granted for ${storage.User.Role}, scope: ${storage.PermissionScope}`);
95
- if (rbacFunc) {
96
- this.Log.trace(`Applying custom rbac func for ${resource}`);
97
- rbacFunc.call(builder, storage.User);
98
- }
99
- else if (descriptor.OwnerField) {
100
- this.Log.trace(`Applying owner field restriction for ${resource}`);
101
- builder.andWhere(descriptor.OwnerField, storage.User.PrimaryKeyValue);
102
- }
103
- else {
104
- this.Log.error(`Model ${descriptor.Name} does not have OwnerField set or static rbac function, cannot apply :own permission`);
105
- throw new OrmException(`Model ${descriptor.Name} does not have OwnerField set, cannot apply :own permission`);
106
- }
107
- }
108
- else {
109
- throw new Forbidden(`User does not have permission to access ${resource}:read permission`);
110
- }
111
- }
112
- else if (builder instanceof InsertQueryBuilder) {
113
- if (canOwn) {
114
- builder.values({
115
- [descriptor.OwnerField]: storage.User.PrimaryKeyValue
116
- });
117
- }
118
- else if (!canAny) {
119
- throw new Forbidden(`User does not have permission to access ${resource}:insert permission`);
120
- }
121
- }
122
- }
128
+ // Insert is handled at execution time; anything else without a WHERE clause to constrain
129
+ // is not something this middleware knows how to guard.
130
+ if (!(builder instanceof SelectQueryBuilder || builder instanceof UpdateQueryBuilder || builder instanceof DeleteQueryBuilder)) {
131
+ return;
132
+ }
133
+ const context = this.context(builder);
134
+ if (!context) {
135
+ return;
136
+ }
137
+ const { descriptor, resource, canOwn, canAny } = context;
138
+ if (canAny) {
139
+ this.Log.trace(`Resource ${resource}:any permission granted`);
140
+ return;
141
+ }
142
+ if (!canOwn) {
143
+ throw new Forbidden(`User does not have permission to access ${resource}:${context.action} permission`);
144
+ }
145
+ this.Log.trace(`Resource ${resource}:own permission granted`);
146
+ /**
147
+ * Model can have a custom rbac permission check, either for this operation
148
+ * specifically (`rbacRead` / `rbacUpdate` / `rbacDelete`) or generically (`rbac`).
149
+ */
150
+ const rbacFunc = rbacHook(builder.Model, context.hook, true);
151
+ if (rbacFunc) {
152
+ this.Log.trace(`Applying custom ${context.hook} func for ${resource}`);
153
+ rbacFunc.call(builder, context.user);
154
+ return;
155
+ }
156
+ if (!descriptor.OwnerField) {
157
+ this.Log.error(`Model ${descriptor.Name} does not have OwnerField set or static rbac function, cannot apply :own permission`);
158
+ throw new OrmException(`Model ${descriptor.Name} does not have OwnerField set, cannot apply :own permission`);
159
+ }
160
+ this.Log.trace(`Applying owner field restriction for ${resource}`);
161
+ builder.andWhere(descriptor.OwnerField, context.user.PrimaryKeyValue);
162
+ }
163
+ /**
164
+ * Everything both hooks need, or `undefined` when this query is not subject to a check.
165
+ *
166
+ * Shared so the two hooks cannot drift on who is exempt: no async context, no user, an
167
+ * explicit skip flag, a model with no `@Resource()`, or a declared `PermissionScope` that
168
+ * does not match this builder type.
169
+ */
170
+ context(builder) {
171
+ if (typeof AsyncLocalStorage !== 'function') {
172
+ return undefined;
173
+ }
174
+ const store = DI.get(AsyncLocalStorage);
175
+ const storage = store?.getStore();
176
+ if (!storage || !storage.User) {
177
+ return undefined;
178
+ }
179
+ if (storage.SkipModelPermissionCheck) {
180
+ this.Log.trace(`Model permission check disabled for current execution context, skipping rbac check`);
181
+ return undefined;
182
+ }
183
+ const descriptor = extractModelDescriptor(builder.Model);
184
+ // if model does not have @Resource() decorator set, no rbac is applied
185
+ const resource = descriptor?.RbacResource;
186
+ if (!resource) {
187
+ return undefined;
188
+ }
189
+ const scopes = permissionsFor(builder);
190
+ if (!scopes) {
191
+ // An unmapped builder type reaching a security middleware means an unguarded query.
192
+ // Fail loudly rather than let it through — the previous code read `.own` off
193
+ // `undefined` here and died with a bare TypeError.
194
+ throw new OrmException(`rbac cannot check permissions for query builder ${builder.constructor.name}: no permission mapping registered`);
195
+ }
196
+ if (storage.PermissionScope) {
197
+ const expected = PERMISSION_SCOPE_TO_QUERY.get(storage.PermissionScope);
198
+ if (!expected) {
199
+ this.Log.warn(`Permission scope ${storage.PermissionScope} does not match any query type, skipping rbac check`);
200
+ return undefined;
123
201
  }
202
+ if (!(builder instanceof expected)) {
203
+ this.Log.warn(`Permission scope ${storage.PermissionScope} does not match query type ${builder.constructor.name}, skipping rbac check`);
204
+ return undefined;
205
+ }
206
+ }
207
+ const ownScope = storage.PermissionScope ?? scopes.own;
208
+ const anyScope = storage.PermissionScope ?? scopes.all;
209
+ const roles = storage.ActiveRole ? [storage.ActiveRole] : storage.User.Role;
210
+ let canAny = false;
211
+ let canOwn = false;
212
+ try {
213
+ canAny = this.Ac.can(roles)[anyScope](resource).granted;
214
+ canOwn = this.Ac.can(roles)[ownScope](resource).granted;
215
+ }
216
+ catch (err) {
217
+ // accesscontrol throws eg. "Role not found" when role has no grants registered
218
+ // treat as no permission so caller gets Forbidden instead of library error
219
+ this.Log.trace(`Permission check for roles ${roles} on resource ${resource} failed: ${err.message}, treating as no permission`);
124
220
  }
221
+ // 'readOwn' -> 'read'. Keeps the Forbidden message accurate per builder type instead of
222
+ // the old hard-coded ':read', which was wrong for updates and deletes.
223
+ const action = anyScope.replace(/(Any|Own)$/, '');
224
+ return { descriptor, resource, canOwn, canAny, action, hook: scopes.hook, user: storage.User };
125
225
  }
126
226
  };
127
227
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/middleware.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"User.d.ts","sourceRoot":"","sources":["../../../src/models/User.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"User.d.ts","sourceRoot":"","sources":["../../../src/models/User.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ import { ModelBase, Primary, Connection, Model, Set, CreatedAt, SoftDelete, HasM
13
13
  import { DI } from '@spinajs/di';
14
14
  import { UserMetadata, UserMetadataBase } from './UserMetadata.js';
15
15
  import { v4 as uuidv4 } from 'uuid';
16
- import { _check_arg, _gt, _non_nil, _is_email, _non_empty, _trim, _is_number, _or, _is_string, _to_int, _default, _is_uuid, _is_object } from '@spinajs/util';
16
+ import { _check_arg, _gt, _non_nil, _is_email, _non_empty, _trim, _is_number, _or, _is_string, _default, _is_uuid, _is_object } from '@spinajs/util';
17
17
  import { _cfg } from '@spinajs/configuration';
18
18
  export class UserQueryScopes {
19
19
  /**
@@ -106,9 +106,14 @@ export class UserQueryScopes {
106
106
  * @returns
107
107
  */
108
108
  whereAnything(identifier) {
109
- identifier = _check_arg(_or(_is_number(_gt(0)), _to_int(), _is_string(_trim(), _non_empty())))(identifier, 'identifier');
110
- return this.when(typeof identifier === 'number', function () {
111
- this.where('Id', identifier);
109
+ identifier = _check_arg(_or(_is_number(_gt(0)), _is_string(_trim(), _non_empty())))(identifier, 'identifier');
110
+ // NOTE: `_to_int()` used to sit in the check list above, and parseInt()
111
+ // happily turns "9f8e7d6c-…" into 9 — so every uuid ( or login ) starting
112
+ // with a digit was looked up as an Id and simply not found. Only a string
113
+ // that is a number END TO END may be treated as an id.
114
+ const id = typeof identifier === 'number' ? identifier : /^\d+$/.test(identifier) ? Number.parseInt(identifier, 10) : null;
115
+ return this.when(id !== null, function () {
116
+ this.where('Id', id);
112
117
  }, function () {
113
118
  this.where('Uuid', identifier).orWhere('Email', identifier).orWhere('Login', identifier);
114
119
  });
@@ -164,7 +169,21 @@ let UserBase = UserBase_1 = class UserBase extends ModelBase {
164
169
  return this.Role.indexOf('guest') !== -1 || this.Role.length === 0;
165
170
  }
166
171
  get IsBanned() {
167
- return this.Metadata[USER_COMMON_METADATA.USER_BAN_IS_BANNED] === true;
172
+ if (this.Metadata[USER_COMMON_METADATA.USER_BAN_IS_BANNED] !== true) {
173
+ return false;
174
+ }
175
+ const start = this.Metadata[USER_COMMON_METADATA.USER_BAN_START_DATE];
176
+ const duration = this.Metadata[USER_COMMON_METADATA.USER_BAN_DURATION];
177
+ // no start/duration recorded -> treat as a permanent ban
178
+ if (!start || duration === null || duration === undefined) {
179
+ return true;
180
+ }
181
+ const startDt = start instanceof DateTime ? start : DateTime.fromISO(String(start));
182
+ if (!startDt.isValid) {
183
+ return true;
184
+ }
185
+ // ban is still active only until start + duration (seconds) elapses
186
+ return startDt.plus({ seconds: Number(duration) }) > DateTime.now();
168
187
  }
169
188
  dehydrateWithRelations(options) {
170
189
  const base = super.dehydrateWithRelations(options);
@@ -1 +1 @@
1
- {"version":3,"file":"User.js","sourceRoot":"","sources":["../../../src/models/User.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"User.js","sourceRoot":"","sources":["../../../src/models/User.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserMetadata.d.ts","sourceRoot":"","sources":["../../../src/models/UserMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC;;;GAGG;AACH,qBAEa,gBAAiB,SAAQ,aAAa,CAAC,gBAAgB,CAAC;IAEnE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAuB;IAElD;;;OAGG;IACH,OAAc,WAAW,EAAE,MAAM,EAAE,CAAM;IAGlC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IAG3B,OAAO,EAAE,MAAM,CAAC;CACxB;AAGD,qBAEa,YAAa,SAAQ,gBAAgB;CAEjD"}
1
+ {"version":3,"file":"UserMetadata.d.ts","sourceRoot":"","sources":["../../../src/models/UserMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC;;;GAGG;AACH,qBAEa,gBAAiB,SAAQ,aAAa,CAAC,gBAAgB,CAAC;IAEnE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAuB;IAElD;;;OAGG;IACH,OAAc,WAAW,EAAE,MAAM,EAAE,CAAM;IAGlC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IAG3B,OAAO,EAAE,MAAM,CAAC;CACxB;AAQD,qBAGa,YAAa,SAAQ,gBAAgB;CAEjD"}
@@ -37,10 +37,16 @@ UserMetadataBase = __decorate([
37
37
  Model('users_metadata')
38
38
  ], UserMetadataBase);
39
39
  export { UserMetadataBase };
40
+ // NOTE: @Model is required next to @OrmResource — without it the Orm never
41
+ // picks this class up as a model, so its descriptor keeps only the columns
42
+ // declared by decorators. Anything relying on the real table description
43
+ // ( insert-or-update conflict columns, primary key aware deletes ) then fails
44
+ // even though the very same table works through UserMetadataBase.
40
45
  let UserMetadata = class UserMetadata extends UserMetadataBase {
41
46
  };
42
47
  UserMetadata = __decorate([
43
48
  Connection('default'),
49
+ Model('users_metadata'),
44
50
  OrmResource('user.metadata')
45
51
  ], UserMetadata);
46
52
  export { UserMetadata };
@@ -1 +1 @@
1
- {"version":3,"file":"UserMetadata.js","sourceRoot":"","sources":["../../../src/models/UserMetadata.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG3F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE9D;;;GAGG;AAGI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,aAA+B;IAA9D;;QAEK,YAAO,GAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAapD,CAAC;;AAXC;;;GAGG;AACW,4BAAW,GAAa,EAAE,AAAf,CAAgB;AAGlC;IADN,SAAS,CAAC,MAAM,CAAC;8BACL,cAAc;8CAAO;AAG3B;IADN,aAAa,EAAE;;iDACO;AAdZ,gBAAgB;IAF5B,UAAU,CAAC,SAAS,CAAC;IACrB,KAAK,CAAC,gBAAgB,CAAC;GACX,gBAAgB,CAe5B;;AAKM,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,gBAAgB;CAEjD,CAAA;AAFY,YAAY;IAFxB,UAAU,CAAC,SAAS,CAAC;IACrB,WAAW,CAAC,eAAe,CAAC;GAChB,YAAY,CAExB"}
1
+ {"version":3,"file":"UserMetadata.js","sourceRoot":"","sources":["../../../src/models/UserMetadata.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG3F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE9D;;;GAGG;AAGI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,aAA+B;IAA9D;;QAEK,YAAO,GAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAapD,CAAC;;AAXC;;;GAGG;AACW,4BAAW,GAAa,EAAE,AAAf,CAAgB;AAGlC;IADN,SAAS,CAAC,MAAM,CAAC;8BACL,cAAc;8CAAO;AAG3B;IADN,aAAa,EAAE;;iDACO;AAdZ,gBAAgB;IAF5B,UAAU,CAAC,SAAS,CAAC;IACrB,KAAK,CAAC,gBAAgB,CAAC;GACX,gBAAgB,CAe5B;;AAGD,2EAA2E;AAC3E,2EAA2E;AAC3E,yEAAyE;AACzE,8EAA8E;AAC9E,kEAAkE;AAI3D,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,gBAAgB;CAEjD,CAAA;AAFY,YAAY;IAHxB,UAAU,CAAC,SAAS,CAAC;IACrB,KAAK,CAAC,gBAAgB,CAAC;IACvB,WAAW,CAAC,eAAe,CAAC;GAChB,YAAY,CAExB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../../src/ownership.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { ModelBase, OrmException, extractModelDescriptor, wherePk } from '@spinajs/orm';
2
+ /**
3
+ * Implementation of the ownership helpers declared on `IModelStatic` in
4
+ * `interfaces.ts`. They were previously declared but never implemented, so any
5
+ * call to `Model.ensureOwnership` / `Model.checkOwnership` threw
6
+ * "not a function". They are attached to `ModelBase` so every model gets them.
7
+ *
8
+ * A model participates in ownership checks by decorating its owner column with
9
+ * `@ResourceOwner()`, which sets `OwnerField` on the model descriptor.
10
+ */
11
+ function rbacDescriptor(model) {
12
+ const descriptor = extractModelDescriptor(model);
13
+ if (!descriptor || !descriptor.OwnerField) {
14
+ const name = descriptor?.Name ?? model?.name;
15
+ throw new OrmException(`Model ${name} does not have an @ResourceOwner() field, cannot check ownership`);
16
+ }
17
+ return descriptor;
18
+ }
19
+ /**
20
+ * Alters a query so it only returns/updates/deletes rows owned by `user`.
21
+ */
22
+ ModelBase.ensureOwnership = function (query, user) {
23
+ const descriptor = rbacDescriptor(this);
24
+ return query.where(descriptor.OwnerField, user.PrimaryKeyValue);
25
+ };
26
+ /**
27
+ * Checks whether a model (or its primary key) is owned by `user`.
28
+ * When passed a loaded model the owner column is compared in memory; when
29
+ * passed a primary key the ownership is verified with a scoped DB query.
30
+ */
31
+ ModelBase.checkOwnership = async function (modelOrPrimaryKey, user) {
32
+ const descriptor = rbacDescriptor(this);
33
+ if (modelOrPrimaryKey instanceof ModelBase) {
34
+ return modelOrPrimaryKey[descriptor.OwnerField] === user.PrimaryKeyValue;
35
+ }
36
+ // `descriptor.PrimaryKey` is a string[] since the composite-key refactor, so it cannot be
37
+ // handed to `where()` as a column name — that took the whereObject path and filtered on
38
+ // nothing. `wherePk` is the ORM's single home for key predicates and handles both shapes.
39
+ const query = this.query();
40
+ wherePk(query, descriptor, modelOrPrimaryKey);
41
+ const found = await query.where(descriptor.OwnerField, user.PrimaryKeyValue).first();
42
+ return found !== undefined && found !== null;
43
+ };
44
+ //# sourceMappingURL=ownership.js.map