@carlonicora/nestjs-neo4jsonapi 6.6.0 → 6.6.2

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 (113) hide show
  1. package/dist/common/decorators/index.d.ts +1 -0
  2. package/dist/common/decorators/index.d.ts.map +1 -1
  3. package/dist/common/decorators/index.js +1 -0
  4. package/dist/common/decorators/index.js.map +1 -1
  5. package/dist/common/decorators/token-scopes.decorator.d.ts +14 -0
  6. package/dist/common/decorators/token-scopes.decorator.d.ts.map +1 -0
  7. package/dist/common/decorators/token-scopes.decorator.js +18 -0
  8. package/dist/common/decorators/token-scopes.decorator.js.map +1 -0
  9. package/dist/common/guards/index.d.ts +1 -0
  10. package/dist/common/guards/index.d.ts.map +1 -1
  11. package/dist/common/guards/index.js +1 -0
  12. package/dist/common/guards/index.js.map +1 -1
  13. package/dist/common/guards/jwt.auth.admin.guard.d.ts.map +1 -1
  14. package/dist/common/guards/jwt.auth.admin.guard.js +20 -5
  15. package/dist/common/guards/jwt.auth.admin.guard.js.map +1 -1
  16. package/dist/common/guards/jwt.auth.any-scope.guard.d.ts +10 -3
  17. package/dist/common/guards/jwt.auth.any-scope.guard.d.ts.map +1 -1
  18. package/dist/common/guards/jwt.auth.any-scope.guard.js +17 -4
  19. package/dist/common/guards/jwt.auth.any-scope.guard.js.map +1 -1
  20. package/dist/common/guards/jwt.auth.guard.d.ts.map +1 -1
  21. package/dist/common/guards/jwt.auth.guard.js +22 -6
  22. package/dist/common/guards/jwt.auth.guard.js.map +1 -1
  23. package/dist/common/guards/jwt.auth.optional.guard.d.ts.map +1 -1
  24. package/dist/common/guards/jwt.auth.optional.guard.js +20 -5
  25. package/dist/common/guards/jwt.auth.optional.guard.js.map +1 -1
  26. package/dist/common/guards/session.token.d.ts +50 -0
  27. package/dist/common/guards/session.token.d.ts.map +1 -0
  28. package/dist/common/guards/session.token.js +71 -0
  29. package/dist/common/guards/session.token.js.map +1 -0
  30. package/dist/common/helpers/define-entity.d.ts.map +1 -1
  31. package/dist/common/helpers/define-entity.js +5 -2
  32. package/dist/common/helpers/define-entity.js.map +1 -1
  33. package/dist/common/interfaces/entity.schema.interface.d.ts +7 -0
  34. package/dist/common/interfaces/entity.schema.interface.d.ts.map +1 -1
  35. package/dist/common/registries/entity-tenancy.registry.d.ts +7 -2
  36. package/dist/common/registries/entity-tenancy.registry.d.ts.map +1 -1
  37. package/dist/common/registries/entity-tenancy.registry.js +14 -2
  38. package/dist/common/registries/entity-tenancy.registry.js.map +1 -1
  39. package/dist/common/strategies/jwt.strategy.d.ts +8 -0
  40. package/dist/common/strategies/jwt.strategy.d.ts.map +1 -1
  41. package/dist/common/strategies/jwt.strategy.js +8 -0
  42. package/dist/common/strategies/jwt.strategy.js.map +1 -1
  43. package/dist/core/websocket/gateways/event.gateway.d.ts.map +1 -1
  44. package/dist/core/websocket/gateways/event.gateway.js +12 -1
  45. package/dist/core/websocket/gateways/event.gateway.js.map +1 -1
  46. package/dist/core/websocket/guards/ws.jwt.auth.guard.d.ts.map +1 -1
  47. package/dist/core/websocket/guards/ws.jwt.auth.guard.js +4 -0
  48. package/dist/core/websocket/guards/ws.jwt.auth.guard.js.map +1 -1
  49. package/dist/foundations/auth/controllers/auth.company.controller.d.ts.map +1 -1
  50. package/dist/foundations/auth/controllers/auth.company.controller.js +4 -0
  51. package/dist/foundations/auth/controllers/auth.company.controller.js.map +1 -1
  52. package/dist/foundations/auth/repositories/auth.repository.d.ts.map +1 -1
  53. package/dist/foundations/auth/repositories/auth.repository.js +5 -0
  54. package/dist/foundations/auth/repositories/auth.repository.js.map +1 -1
  55. package/dist/foundations/chunk/controllers/chunk.controller.d.ts.map +1 -1
  56. package/dist/foundations/chunk/controllers/chunk.controller.js +7 -0
  57. package/dist/foundations/chunk/controllers/chunk.controller.js.map +1 -1
  58. package/dist/foundations/chunk/repositories/chunk.repository.d.ts +13 -0
  59. package/dist/foundations/chunk/repositories/chunk.repository.d.ts.map +1 -1
  60. package/dist/foundations/chunk/repositories/chunk.repository.js +27 -1
  61. package/dist/foundations/chunk/repositories/chunk.repository.js.map +1 -1
  62. package/dist/foundations/chunker/services/chunker.service.d.ts +48 -7
  63. package/dist/foundations/chunker/services/chunker.service.d.ts.map +1 -1
  64. package/dist/foundations/chunker/services/chunker.service.js +119 -61
  65. package/dist/foundations/chunker/services/chunker.service.js.map +1 -1
  66. package/dist/foundations/chunker/services/types/docx.service.d.ts +2 -0
  67. package/dist/foundations/chunker/services/types/docx.service.d.ts.map +1 -1
  68. package/dist/foundations/chunker/services/types/docx.service.js +10 -36
  69. package/dist/foundations/chunker/services/types/docx.service.js.map +1 -1
  70. package/dist/foundations/chunker/services/types/pptx.service.d.ts.map +1 -1
  71. package/dist/foundations/chunker/services/types/pptx.service.js +5 -0
  72. package/dist/foundations/chunker/services/types/pptx.service.js.map +1 -1
  73. package/dist/foundations/chunker/services/types/xlsx.service.d.ts.map +1 -1
  74. package/dist/foundations/chunker/services/types/xlsx.service.js +8 -1
  75. package/dist/foundations/chunker/services/types/xlsx.service.js.map +1 -1
  76. package/dist/foundations/chunker/utils/zip-limits.d.ts +37 -0
  77. package/dist/foundations/chunker/utils/zip-limits.d.ts.map +1 -0
  78. package/dist/foundations/chunker/utils/zip-limits.js +113 -0
  79. package/dist/foundations/chunker/utils/zip-limits.js.map +1 -0
  80. package/dist/foundations/oauth/constants/oauth.errors.d.ts +5 -0
  81. package/dist/foundations/oauth/constants/oauth.errors.d.ts.map +1 -1
  82. package/dist/foundations/oauth/constants/oauth.errors.js +6 -0
  83. package/dist/foundations/oauth/constants/oauth.errors.js.map +1 -1
  84. package/dist/foundations/oauth/controllers/oauth.registration.controller.d.ts.map +1 -1
  85. package/dist/foundations/oauth/controllers/oauth.registration.controller.js +10 -1
  86. package/dist/foundations/oauth/controllers/oauth.registration.controller.js.map +1 -1
  87. package/dist/foundations/oauth/queries/revoke-user-oauth-tokens.query.d.ts +13 -0
  88. package/dist/foundations/oauth/queries/revoke-user-oauth-tokens.query.d.ts.map +1 -0
  89. package/dist/foundations/oauth/queries/revoke-user-oauth-tokens.query.js +29 -0
  90. package/dist/foundations/oauth/queries/revoke-user-oauth-tokens.query.js.map +1 -0
  91. package/dist/foundations/oauth/repositories/oauth.repository.d.ts +22 -0
  92. package/dist/foundations/oauth/repositories/oauth.repository.d.ts.map +1 -1
  93. package/dist/foundations/oauth/repositories/oauth.repository.js +43 -12
  94. package/dist/foundations/oauth/repositories/oauth.repository.js.map +1 -1
  95. package/dist/foundations/oauth/services/oauth.service.d.ts.map +1 -1
  96. package/dist/foundations/oauth/services/oauth.service.js +11 -2
  97. package/dist/foundations/oauth/services/oauth.service.js.map +1 -1
  98. package/dist/foundations/oauth/services/oauth.token.service.d.ts +9 -0
  99. package/dist/foundations/oauth/services/oauth.token.service.d.ts.map +1 -1
  100. package/dist/foundations/oauth/services/oauth.token.service.js +22 -0
  101. package/dist/foundations/oauth/services/oauth.token.service.js.map +1 -1
  102. package/dist/foundations/s3/controllers/s3.controller.d.ts +13 -0
  103. package/dist/foundations/s3/controllers/s3.controller.d.ts.map +1 -1
  104. package/dist/foundations/s3/controllers/s3.controller.js +58 -7
  105. package/dist/foundations/s3/controllers/s3.controller.js.map +1 -1
  106. package/dist/foundations/user/repositories/user.repository.d.ts +18 -0
  107. package/dist/foundations/user/repositories/user.repository.d.ts.map +1 -1
  108. package/dist/foundations/user/repositories/user.repository.js +44 -1
  109. package/dist/foundations/user/repositories/user.repository.js.map +1 -1
  110. package/dist/mcp/controllers/mcp.controller.d.ts.map +1 -1
  111. package/dist/mcp/controllers/mcp.controller.js +7 -1
  112. package/dist/mcp/controllers/mcp.controller.js.map +1 -1
  113. package/package.json +1 -1
@@ -5,6 +5,7 @@ export * from "./module.decorator";
5
5
  export * from "./oauth.scopes.decorator";
6
6
  export * from "./rate-limit.decorator";
7
7
  export * from "./roles.decorator";
8
+ export * from "./token-scopes.decorator";
8
9
  export * from "./tool.decorator";
9
10
  export * from "./validate-id.decorator";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
@@ -21,6 +21,7 @@ __exportStar(require("./module.decorator"), exports);
21
21
  __exportStar(require("./oauth.scopes.decorator"), exports);
22
22
  __exportStar(require("./rate-limit.decorator"), exports);
23
23
  __exportStar(require("./roles.decorator"), exports);
24
+ __exportStar(require("./token-scopes.decorator"), exports);
24
25
  __exportStar(require("./tool.decorator"), exports);
25
26
  __exportStar(require("./validate-id.decorator"), exports);
26
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,+DAA6C;AAC7C,kEAAgD;AAChD,qDAAmC;AACnC,2DAAyC;AACzC,yDAAuC;AACvC,oDAAkC;AAClC,mDAAiC;AACjC,0DAAwC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,+DAA6C;AAC7C,kEAAgD;AAChD,qDAAmC;AACnC,2DAAyC;AACzC,yDAAuC;AACvC,oDAAkC;AAClC,2DAAyC;AACzC,mDAAiC;AACjC,0DAAwC"}
@@ -0,0 +1,14 @@
1
+ import type { TokenScope } from "../guards/session.token";
2
+ /** Metadata key read by `AnyScopeAuthGuard`. */
3
+ export declare const TOKEN_SCOPES_KEY = "token_scopes";
4
+ /**
5
+ * The selection-token scopes `AnyScopeAuthGuard` admits on a route, besides a full
6
+ * session. Without this decorator the guard admits a full session only.
7
+ *
8
+ * @example
9
+ * @UseGuards(AnyScopeAuthGuard)
10
+ * @AllowedTokenScopes("company-selection")
11
+ * async selectCompany() { ... }
12
+ */
13
+ export declare const AllowedTokenScopes: (...scopes: TokenScope[]) => import("@nestjs/common", { with: { "resolution-mode": "import" } }).CustomDecorator<string>;
14
+ //# sourceMappingURL=token-scopes.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-scopes.decorator.d.ts","sourceRoot":"","sources":["../../../src/common/decorators/token-scopes.decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,gDAAgD;AAChD,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,QAAQ,UAAU,EAAE,gGAA0C,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AllowedTokenScopes = exports.TOKEN_SCOPES_KEY = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ /** Metadata key read by `AnyScopeAuthGuard`. */
6
+ exports.TOKEN_SCOPES_KEY = "token_scopes";
7
+ /**
8
+ * The selection-token scopes `AnyScopeAuthGuard` admits on a route, besides a full
9
+ * session. Without this decorator the guard admits a full session only.
10
+ *
11
+ * @example
12
+ * @UseGuards(AnyScopeAuthGuard)
13
+ * @AllowedTokenScopes("company-selection")
14
+ * async selectCompany() { ... }
15
+ */
16
+ const AllowedTokenScopes = (...scopes) => (0, common_1.SetMetadata)(exports.TOKEN_SCOPES_KEY, scopes);
17
+ exports.AllowedTokenScopes = AllowedTokenScopes;
18
+ //# sourceMappingURL=token-scopes.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-scopes.decorator.js","sourceRoot":"","sources":["../../../src/common/decorators/token-scopes.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAG7C,gDAAgD;AACnC,QAAA,gBAAgB,GAAG,cAAc,CAAC;AAE/C;;;;;;;;GAQG;AACI,MAAM,kBAAkB,GAAG,CAAC,GAAG,MAAoB,EAAE,EAAE,CAAC,IAAA,oBAAW,EAAC,wBAAgB,EAAE,MAAM,CAAC,CAAC;AAAxF,QAAA,kBAAkB,sBAAsE"}
@@ -4,4 +4,5 @@ export * from "./jwt.auth.any-scope.guard";
4
4
  export * from "./jwt.auth.guard";
5
5
  export * from "./jwt.auth.optional.guard";
6
6
  export * from "./jwt.or.oauth.guard";
7
+ export * from "./session.token";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/guards/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/guards/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC"}
@@ -20,4 +20,5 @@ __exportStar(require("./jwt.auth.any-scope.guard"), exports);
20
20
  __exportStar(require("./jwt.auth.guard"), exports);
21
21
  __exportStar(require("./jwt.auth.optional.guard"), exports);
22
22
  __exportStar(require("./jwt.or.oauth.guard"), exports);
23
+ __exportStar(require("./session.token"), exports);
23
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/guards/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,yDAAuC;AACvC,6DAA2C;AAC3C,mDAAiC;AACjC,4DAA0C;AAC1C,uDAAqC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/guards/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,yDAAuC;AACvC,6DAA2C;AAC3C,mDAAiC;AACjC,4DAA0C;AAC1C,uDAAqC;AACrC,kDAAgC"}
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.auth.admin.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.admin.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAA+C,MAAM,gBAAgB,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAqB,wBAAwB,EAAgB,oBAAoB,EAAE,MAAM,WAAW,CAAC;;AAE5G,qBACa,iBAAkB,SAAQ,sBAAiB,YAAW,WAAW;IAE1E,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAGtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAQ7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAbhB,GAAG,EAAE,UAAU,EACxB,SAAS,EAAE,SAAS,EACX,KAAK,EAAE,YAAY,EAGnB,WAAW,CAAC,EAAE,oBAAoB,EAQlC,eAAe,CAAC,EAAE,wBAAwB;IAKvD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAmCvE,OAAO,CAAC,cAAc;CAQvB"}
1
+ {"version":3,"file":"jwt.auth.admin.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.admin.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAA+C,MAAM,gBAAgB,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAqB,wBAAwB,EAAgB,oBAAoB,EAAE,MAAM,WAAW,CAAC;;AAG5G,qBACa,iBAAkB,SAAQ,sBAAiB,YAAW,WAAW;IAE1E,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAGtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAQ7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAbhB,GAAG,EAAE,UAAU,EACxB,SAAS,EAAE,SAAS,EACX,KAAK,EAAE,YAAY,EAGnB,WAAW,CAAC,EAAE,oBAAoB,EAQlC,eAAe,CAAC,EAAE,wBAAwB;IAKvD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAgDvE,OAAO,CAAC,cAAc;CAWvB"}
@@ -19,6 +19,7 @@ const passport_1 = require("@nestjs/passport");
19
19
  const nestjs_cls_1 = require("nestjs-cls");
20
20
  const neo4j_service_1 = require("../../core/neo4j/services/neo4j.service");
21
21
  const tokens_1 = require("../tokens");
22
+ const session_token_1 = require("./session.token");
22
23
  let AdminJwtAuthGuard = class AdminJwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
23
24
  constructor(cls, reflector, neo4j, systemRoles, authContextHook) {
24
25
  super();
@@ -63,15 +64,29 @@ let AdminJwtAuthGuard = class AdminJwtAuthGuard extends (0, passport_1.AuthGuard
63
64
  // package's own rbac, feature, company, waitlist and stripe-* controllers.
64
65
  throw new common_1.HttpException("Unauthorised", 401);
65
66
  }
66
- this._validateRoles(user, context);
67
- this.cls.set("userId", user.userId);
68
- this.cls.set("companyId", user.companyId ?? request.headers["x-companyid"]);
67
+ // Only a full session passes: pending-2FA, selection and portal tokens are signed
68
+ // with the same secret and verify, but must never act as a session.
69
+ // Asserted on a local copy: narrowing `user` itself would change the return type
70
+ // away from IAuthGuard's generic `TUser`.
71
+ const session = user;
72
+ (0, session_token_1.assertSessionPayload)(session);
73
+ this._validateRoles(session, context);
74
+ const companyId = (0, session_token_1.resolveSessionCompanyId)({
75
+ payload: session,
76
+ headerCompanyId: request.headers["x-companyid"],
77
+ administratorRole: this.systemRoles?.Administrator,
78
+ });
79
+ this.cls.set("userId", session.userId);
80
+ this.cls.set("companyId", companyId);
69
81
  this.cls.set("language", request.headers["x-language"]);
70
- this.cls.set("roles", user.roles);
82
+ this.cls.set("roles", session.roles);
71
83
  return user;
72
84
  }
73
85
  _validateRoles(user, context) {
74
- const requiredRoles = this.reflector.get("roles", context.getHandler()) ?? [];
86
+ // Handler AND class, copied so pushing the admin role never mutates the metadata.
87
+ const requiredRoles = [
88
+ ...(this.reflector.getAllAndOverride("roles", [context.getHandler(), context.getClass()]) ?? []),
89
+ ];
75
90
  const adminRole = this.systemRoles?.Administrator ?? "administrator";
76
91
  if (!requiredRoles.includes(adminRole))
77
92
  requiredRoles.push(adminRole);
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.auth.admin.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.admin.guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jwt.auth.admin.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.admin.guard.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,25 @@
1
1
  import { ExecutionContext } from "@nestjs/common";
2
+ import { Reflector } from "@nestjs/core";
2
3
  import { ClsService } from "nestjs-cls";
3
4
  declare const AnyScopeAuthGuard_base: import("@nestjs/passport", { with: { "resolution-mode": "import" } }).Type<import("@nestjs/passport", { with: { "resolution-mode": "import" } }).IAuthGuard>;
4
5
  /**
5
- * Admits BOTH a full session JWT and a scoped selection JWT (e.g. the
6
- * short-lived "company-selection" token issued at login).
6
+ * Admits a full session JWT, or a selection JWT whose scope the route lists with
7
+ * `@AllowedTokenScopes(...)` (handler or class). Without that decorator only a full
8
+ * session passes.
7
9
  *
8
10
  * The company-selection routes are legitimately reachable by either: a user
9
11
  * who belongs to more than one company arrives from the login screen holding
10
12
  * only a selection token, while a user switching company from inside the app
11
13
  * arrives holding a full token.
14
+ *
15
+ * Always refused: a pending-2FA token (it would otherwise mint a full session through
16
+ * POST /auth/company-selection with a password only), a portal token, and a selection
17
+ * token of a scope the route does not list.
12
18
  */
13
19
  export declare class AnyScopeAuthGuard extends AnyScopeAuthGuard_base {
14
20
  private readonly cls;
15
- constructor(cls: ClsService);
21
+ private readonly reflector;
22
+ constructor(cls: ClsService, reflector: Reflector);
16
23
  canActivate(context: ExecutionContext): Promise<boolean>;
17
24
  handleRequest(err: any, user: any, info: any, context: any): any;
18
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.auth.any-scope.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.any-scope.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA6B,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;;AAExC;;;;;;;;GAQG;AACH,qBACa,iBAAkB,SAAQ,sBAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU;IAItC,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9D,aAAa,CAAC,GAAG,KAAA,EAAE,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,OAAO,KAAA;CAiBvC"}
1
+ {"version":3,"file":"jwt.auth.any-scope.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.any-scope.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA6B,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;;AAIxC;;;;;;;;;;;;;GAaG;AACH,qBACa,iBAAkB,SAAQ,sBAAgB;IAEnD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,SAAS;IAKjC,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9D,aAAa,CAAC,GAAG,KAAA,EAAE,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,OAAO,KAAA;CAsBvC"}
@@ -11,21 +11,30 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.AnyScopeAuthGuard = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
14
15
  const passport_1 = require("@nestjs/passport");
15
16
  const nestjs_cls_1 = require("nestjs-cls");
17
+ const token_scopes_decorator_1 = require("../decorators/token-scopes.decorator");
18
+ const session_token_1 = require("./session.token");
16
19
  /**
17
- * Admits BOTH a full session JWT and a scoped selection JWT (e.g. the
18
- * short-lived "company-selection" token issued at login).
20
+ * Admits a full session JWT, or a selection JWT whose scope the route lists with
21
+ * `@AllowedTokenScopes(...)` (handler or class). Without that decorator only a full
22
+ * session passes.
19
23
  *
20
24
  * The company-selection routes are legitimately reachable by either: a user
21
25
  * who belongs to more than one company arrives from the login screen holding
22
26
  * only a selection token, while a user switching company from inside the app
23
27
  * arrives holding a full token.
28
+ *
29
+ * Always refused: a pending-2FA token (it would otherwise mint a full session through
30
+ * POST /auth/company-selection with a password only), a portal token, and a selection
31
+ * token of a scope the route does not list.
24
32
  */
25
33
  let AnyScopeAuthGuard = class AnyScopeAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
26
- constructor(cls) {
34
+ constructor(cls, reflector) {
27
35
  super();
28
36
  this.cls = cls;
37
+ this.reflector = reflector;
29
38
  }
30
39
  async canActivate(context) {
31
40
  const request = context.switchToHttp().getRequest();
@@ -48,6 +57,9 @@ let AnyScopeAuthGuard = class AnyScopeAuthGuard extends (0, passport_1.AuthGuard
48
57
  throw err;
49
58
  throw new common_1.HttpException("Unauthorised", 401);
50
59
  }
60
+ const allowedScopes = this.reflector.getAllAndOverride(token_scopes_decorator_1.TOKEN_SCOPES_KEY, [context.getHandler(), context.getClass()]) ?? [];
61
+ if (!(0, session_token_1.isAcceptedScopedPayload)(user, allowedScopes))
62
+ throw new common_1.HttpException("Unauthorised", 401);
51
63
  this.cls.set("userId", user.userId);
52
64
  this.cls.set("token", token.startsWith("Bearer ") ? token.slice(7) : token);
53
65
  return user;
@@ -56,6 +68,7 @@ let AnyScopeAuthGuard = class AnyScopeAuthGuard extends (0, passport_1.AuthGuard
56
68
  exports.AnyScopeAuthGuard = AnyScopeAuthGuard;
57
69
  exports.AnyScopeAuthGuard = AnyScopeAuthGuard = __decorate([
58
70
  (0, common_1.Injectable)(),
59
- __metadata("design:paramtypes", [nestjs_cls_1.ClsService])
71
+ __metadata("design:paramtypes", [nestjs_cls_1.ClsService,
72
+ core_1.Reflector])
60
73
  ], AnyScopeAuthGuard);
61
74
  //# sourceMappingURL=jwt.auth.any-scope.guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.auth.any-scope.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.any-scope.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA6E;AAC7E,+CAA6C;AAC7C,2CAAwC;AAExC;;;;;;;;GAQG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,IAAA,oBAAS,EAAC,KAAK,CAAC;IACrD,YAA6B,GAAe;QAC1C,KAAK,EAAE,CAAC;QADmB,QAAG,GAAH,GAAG,CAAY;IAE5C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,4EAA4E;QAC5E,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa;YAAE,MAAM,IAAI,sBAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAEjF,OAAO,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAY,CAAC;IACvD,CAAC;IAED,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAE5C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,sBAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAEzD,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,IAAI,EAAE,OAAO,KAAK,aAAa;gBAAE,MAAM,IAAI,sBAAa,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACnF,IAAI,GAAG;gBAAE,MAAM,GAAG,CAAC;YACnB,MAAM,IAAI,sBAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAhCY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAEuB,uBAAU;GADjC,iBAAiB,CAgC7B"}
1
+ {"version":3,"file":"jwt.auth.any-scope.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.any-scope.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA6E;AAC7E,uCAAyC;AACzC,+CAA6C;AAC7C,2CAAwC;AACxC,iFAAwE;AACxE,mDAA0D;AAE1D;;;;;;;;;;;;;GAaG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,IAAA,oBAAS,EAAC,KAAK,CAAC;IACrD,YACmB,GAAe,EACf,SAAoB;QAErC,KAAK,EAAE,CAAC;QAHS,QAAG,GAAH,GAAG,CAAY;QACf,cAAS,GAAT,SAAS,CAAW;IAGvC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,4EAA4E;QAC5E,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa;YAAE,MAAM,IAAI,sBAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAEjF,OAAO,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAY,CAAC;IACvD,CAAC;IAED,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAE5C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,sBAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAEzD,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,IAAI,EAAE,OAAO,KAAK,aAAa;gBAAE,MAAM,IAAI,sBAAa,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACnF,IAAI,GAAG;gBAAE,MAAM,GAAG,CAAC;YACnB,MAAM,IAAI,sBAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,aAAa,GACjB,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAW,yCAAgB,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEjH,IAAI,CAAC,IAAA,uCAAuB,EAAC,IAAI,EAAE,aAAa,CAAC;YAAE,MAAM,IAAI,sBAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAEhG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAxCY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAGa,uBAAU;QACJ,gBAAS;GAH5B,iBAAiB,CAwC7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.auth.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA+C,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAqB,wBAAwB,EAAgB,oBAAoB,EAAE,MAAM,WAAW,CAAC;;AAE5G,qBACa,YAAa,SAAQ,iBAAgB;IAE9C,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAItB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAG7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAThB,GAAG,EAAE,UAAU,EACxB,SAAS,EAAE,SAAS,EACX,KAAK,EAAE,YAAY,EAInB,WAAW,CAAC,EAAE,oBAAoB,EAGlC,eAAe,CAAC,EAAE,wBAAwB;IAKvD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IA2BvE,OAAO,CAAC,cAAc;CAQvB"}
1
+ {"version":3,"file":"jwt.auth.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA+C,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAqB,wBAAwB,EAAgB,oBAAoB,EAAE,MAAM,WAAW,CAAC;;AAG5G,qBACa,YAAa,SAAQ,iBAAgB;IAE9C,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAGtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAG7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBARhB,GAAG,EAAE,UAAU,EACxB,SAAS,EAAE,SAAS,EACX,KAAK,EAAE,YAAY,EAGnB,WAAW,CAAC,EAAE,oBAAoB,EAGlC,eAAe,CAAC,EAAE,wBAAwB;IAKvD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAwCvE,OAAO,CAAC,cAAc;CAavB"}
@@ -19,6 +19,7 @@ const passport_1 = require("@nestjs/passport");
19
19
  const nestjs_cls_1 = require("nestjs-cls");
20
20
  const neo4j_service_1 = require("../../core/neo4j/services/neo4j.service");
21
21
  const tokens_1 = require("../tokens");
22
+ const session_token_1 = require("./session.token");
22
23
  let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
23
24
  constructor(cls, reflector, neo4j, systemRoles, authContextHook) {
24
25
  super();
@@ -52,17 +53,33 @@ let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
52
53
  }
53
54
  throw new common_1.HttpException("Unauthorised", 401);
54
55
  }
55
- this._validateRoles(user, context);
56
- this.cls.set("userId", user.userId);
57
- this.cls.set("companyId", user.companyId ?? request.headers["x-companyid"]);
58
- this.cls.set("roles", user.roles);
56
+ // Only a full session passes: pending-2FA, selection and portal tokens are signed
57
+ // with the same secret and verify, but must never act as a session.
58
+ // Asserted on a local copy: narrowing `user` itself would change the return type
59
+ // away from IAuthGuard's generic `TUser`.
60
+ const session = user;
61
+ (0, session_token_1.assertSessionPayload)(session);
62
+ this._validateRoles(session, context);
63
+ const companyId = (0, session_token_1.resolveSessionCompanyId)({
64
+ payload: session,
65
+ headerCompanyId: request.headers["x-companyid"],
66
+ administratorRole: this.systemRoles?.Administrator,
67
+ });
68
+ this.cls.set("userId", session.userId);
69
+ this.cls.set("companyId", companyId);
70
+ this.cls.set("roles", session.roles);
59
71
  this.cls.set("language", request.headers["x-language"]);
60
72
  this.cls.set("token", token.startsWith("Bearer ") ? token.slice(7) : token);
61
73
  this.cls.set("ipAddress", request.ip);
62
74
  return user;
63
75
  }
64
76
  _validateRoles(user, context) {
65
- const requiredRoles = this.reflector.get("roles", context.getHandler()) ?? [];
77
+ // Handler AND class: a class-level @Roles was inert while only the handler was read.
78
+ // Copied, because pushing into the array returned by the reflector mutates the
79
+ // decorator metadata for every later request.
80
+ const requiredRoles = [
81
+ ...(this.reflector.getAllAndOverride("roles", [context.getHandler(), context.getClass()]) ?? []),
82
+ ];
66
83
  if (requiredRoles.length > 0) {
67
84
  const adminRole = this.systemRoles?.Administrator ?? "administrator";
68
85
  if (!requiredRoles.includes(adminRole))
@@ -76,7 +93,6 @@ exports.JwtAuthGuard = JwtAuthGuard;
76
93
  exports.JwtAuthGuard = JwtAuthGuard = __decorate([
77
94
  (0, common_1.Injectable)(),
78
95
  __param(3, (0, common_1.Optional)()),
79
- __param(3, (0, common_1.Optional)()),
80
96
  __param(3, (0, common_1.Inject)(tokens_1.SYSTEM_ROLES)),
81
97
  __param(4, (0, common_1.Optional)()),
82
98
  __param(4, (0, common_1.Inject)(tokens_1.AUTH_CONTEXT_HOOK)),
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.auth.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jwt.auth.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.guard.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.auth.optional.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.optional.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA+C,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAgB,oBAAoB,EAAE,MAAM,WAAW,CAAC;;AAE/D,qBACa,oBAAqB,SAAQ,yBAAgB;IAEtD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAJZ,GAAG,EAAE,UAAU,EACxB,SAAS,EAAE,SAAS,EAGX,WAAW,CAAC,EAAE,oBAAoB;IAK/C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAyBvE,OAAO,CAAC,cAAc;CASvB"}
1
+ {"version":3,"file":"jwt.auth.optional.guard.d.ts","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.optional.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA+C,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAgB,oBAAoB,EAAE,MAAM,WAAW,CAAC;;AAG/D,qBACa,oBAAqB,SAAQ,yBAAgB;IAEtD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAJZ,GAAG,EAAE,UAAU,EACxB,SAAS,EAAE,SAAS,EAGX,WAAW,CAAC,EAAE,oBAAoB;IAK/C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAsCvE,OAAO,CAAC,cAAc;CAYvB"}
@@ -18,6 +18,7 @@ const core_1 = require("@nestjs/core");
18
18
  const passport_1 = require("@nestjs/passport");
19
19
  const nestjs_cls_1 = require("nestjs-cls");
20
20
  const tokens_1 = require("../tokens");
21
+ const session_token_1 = require("./session.token");
21
22
  let OptionalJwtAuthGuard = class OptionalJwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
22
23
  constructor(cls, reflector, systemRoles) {
23
24
  super();
@@ -47,15 +48,29 @@ let OptionalJwtAuthGuard = class OptionalJwtAuthGuard extends (0, passport_1.Aut
47
48
  }
48
49
  return null;
49
50
  }
50
- this._validateRoles(user, context);
51
- this.cls.set("userId", user.userId);
52
- this.cls.set("companyId", user.companyId ?? request.headers["x-companyid"]);
51
+ // A token that is present and verifies but is not a full session (pending-2FA,
52
+ // selection, portal) is refused, not downgraded to anonymous.
53
+ // Asserted on a local copy: narrowing `user` itself would change the return type
54
+ // away from IAuthGuard's generic `TUser`.
55
+ const session = user;
56
+ (0, session_token_1.assertSessionPayload)(session);
57
+ this._validateRoles(session, context);
58
+ const companyId = (0, session_token_1.resolveSessionCompanyId)({
59
+ payload: session,
60
+ headerCompanyId: request.headers["x-companyid"],
61
+ administratorRole: this.systemRoles?.Administrator,
62
+ });
63
+ this.cls.set("userId", session.userId);
64
+ this.cls.set("companyId", companyId);
53
65
  this.cls.set("language", request.headers["x-language"]);
54
- this.cls.set("roles", user.roles);
66
+ this.cls.set("roles", session.roles);
55
67
  return user;
56
68
  }
57
69
  _validateRoles(user, context) {
58
- const requiredRoles = this.reflector.get("roles", context.getHandler()) ?? [];
70
+ // Handler AND class, copied so pushing the admin role never mutates the metadata.
71
+ const requiredRoles = [
72
+ ...(this.reflector.getAllAndOverride("roles", [context.getHandler(), context.getClass()]) ?? []),
73
+ ];
59
74
  if (requiredRoles.length > 0) {
60
75
  if (!user)
61
76
  throw new common_1.HttpException("Unauthorised", 401);
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.auth.optional.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.optional.guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jwt.auth.optional.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.optional.guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Every token the library issues is signed with the same `jwt.secret`, so a valid
3
+ * signature alone does not make a session. `JwtStrategy` accepts all of them:
4
+ *
5
+ * - full session (`SecurityService.signJwt`): `{ userId, roles, companyId?, features, userName, expiration }`
6
+ * - pending 2FA (`signPendingJwt`): `{ userId, pendingId, pending: true, type: "pending_2fa", expiration }`
7
+ * - company selection (`signCompanySelectionJwt`): `{ userId, scope: "company-selection", expiration }`
8
+ * - invitation selection (`signInvitationSelectionJwt`): `{ userId, scope: "invitation-selection", expiration }`
9
+ *
10
+ * Apps may also sign portal tokens (`personEmail`) with the same secret. The helpers
11
+ * below tell these classes apart, so each guard admits only the class it is meant for.
12
+ */
13
+ export interface SessionPayload {
14
+ userId: string;
15
+ roles: string[];
16
+ companyId?: string | null;
17
+ features?: string[];
18
+ userName?: string;
19
+ expiration?: string | Date;
20
+ }
21
+ /** The selection scopes the library signs. */
22
+ export type TokenScope = "company-selection" | "invitation-selection";
23
+ /**
24
+ * True only for a full session payload: a non-empty string `userId`, a `roles` array
25
+ * of strings, a string-or-absent `companyId`, and none of the non-session markers.
26
+ */
27
+ export declare function isSessionPayload(payload: unknown): payload is SessionPayload;
28
+ /** Throws 401 unless `payload` is a full session payload. */
29
+ export declare function assertSessionPayload(payload: unknown): asserts payload is SessionPayload;
30
+ /**
31
+ * True for a full session, or for a selection token whose `scope` is in
32
+ * `allowedScopes`. A pending-2FA token, a portal token and a selection token of
33
+ * another scope are refused: a pending-2FA token must never reach a route that can
34
+ * mint a full session.
35
+ */
36
+ export declare function isAcceptedScopedPayload(payload: unknown, allowedScopes: readonly string[]): boolean;
37
+ /**
38
+ * The company a session acts in.
39
+ *
40
+ * - The token carries a company: that company, whatever the `x-companyid` header says.
41
+ * - The token carries no company: only a system Administrator may pick one through the
42
+ * header (or act without one). Any other user is refused with 401, because a request
43
+ * without a company runs with no tenant filter.
44
+ */
45
+ export declare function resolveSessionCompanyId(params: {
46
+ payload: SessionPayload;
47
+ headerCompanyId: unknown;
48
+ administratorRole?: string;
49
+ }): string | undefined;
50
+ //# sourceMappingURL=session.token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.token.d.ts","sourceRoot":"","sources":["../../../src/common/guards/session.token.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAAG,mBAAmB,GAAG,sBAAsB,CAAC;AAQtE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,cAAc,CAW5E;AAED,6DAA6D;AAC7D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAExF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CASnG;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,OAAO,EAAE,cAAc,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,MAAM,GAAG,SAAS,CASrB"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSessionPayload = isSessionPayload;
4
+ exports.assertSessionPayload = assertSessionPayload;
5
+ exports.isAcceptedScopedPayload = isAcceptedScopedPayload;
6
+ exports.resolveSessionCompanyId = resolveSessionCompanyId;
7
+ const common_1 = require("@nestjs/common");
8
+ const system_roles_1 = require("../constants/system.roles");
9
+ /** Keys that only non-session tokens carry. */
10
+ const NON_SESSION_KEYS = ["personEmail", "pending", "pendingId", "scope", "type"];
11
+ /** Keys a selection token must never carry (it carries `scope`, nothing else of these). */
12
+ const NON_SELECTION_KEYS = ["personEmail", "pending", "pendingId", "type"];
13
+ /**
14
+ * True only for a full session payload: a non-empty string `userId`, a `roles` array
15
+ * of strings, a string-or-absent `companyId`, and none of the non-session markers.
16
+ */
17
+ function isSessionPayload(payload) {
18
+ if (!payload || typeof payload !== "object")
19
+ return false;
20
+ const candidate = payload;
21
+ if (typeof candidate.userId !== "string" || candidate.userId.length === 0)
22
+ return false;
23
+ if (!Array.isArray(candidate.roles) || !candidate.roles.every((role) => typeof role === "string"))
24
+ return false;
25
+ if (NON_SESSION_KEYS.some((key) => candidate[key] !== undefined))
26
+ return false;
27
+ if (candidate.companyId !== undefined && candidate.companyId !== null && typeof candidate.companyId !== "string")
28
+ return false;
29
+ return true;
30
+ }
31
+ /** Throws 401 unless `payload` is a full session payload. */
32
+ function assertSessionPayload(payload) {
33
+ if (!isSessionPayload(payload))
34
+ throw new common_1.HttpException("Unauthorised", 401);
35
+ }
36
+ /**
37
+ * True for a full session, or for a selection token whose `scope` is in
38
+ * `allowedScopes`. A pending-2FA token, a portal token and a selection token of
39
+ * another scope are refused: a pending-2FA token must never reach a route that can
40
+ * mint a full session.
41
+ */
42
+ function isAcceptedScopedPayload(payload, allowedScopes) {
43
+ if (isSessionPayload(payload))
44
+ return true;
45
+ if (!payload || typeof payload !== "object")
46
+ return false;
47
+ const candidate = payload;
48
+ if (typeof candidate.userId !== "string" || candidate.userId.length === 0)
49
+ return false;
50
+ if (NON_SELECTION_KEYS.some((key) => candidate[key] !== undefined))
51
+ return false;
52
+ return typeof candidate.scope === "string" && allowedScopes.includes(candidate.scope);
53
+ }
54
+ /**
55
+ * The company a session acts in.
56
+ *
57
+ * - The token carries a company: that company, whatever the `x-companyid` header says.
58
+ * - The token carries no company: only a system Administrator may pick one through the
59
+ * header (or act without one). Any other user is refused with 401, because a request
60
+ * without a company runs with no tenant filter.
61
+ */
62
+ function resolveSessionCompanyId(params) {
63
+ const { payload, headerCompanyId } = params;
64
+ if (typeof payload.companyId === "string" && payload.companyId.length > 0)
65
+ return payload.companyId;
66
+ const administratorRole = params.administratorRole ?? system_roles_1.SystemRoles.Administrator;
67
+ if (!payload.roles.includes(administratorRole))
68
+ throw new common_1.HttpException("Unauthorised", 401);
69
+ return typeof headerCompanyId === "string" && headerCompanyId.length > 0 ? headerCompanyId : undefined;
70
+ }
71
+ //# sourceMappingURL=session.token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.token.js","sourceRoot":"","sources":["../../../src/common/guards/session.token.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"define-entity.d.ts","sourceRoot":"","sources":["../../../src/common/helpers/define-entity.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EAEjB,eAAe,EAEhB,MAAM,uCAAuC,CAAC;AAE/C,2IAA2I;AAC3I,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAqEnC;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,GAAG,GAAG,CAoBnE;AA+BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,YAAY,CAAC,CAAC,MACX,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,QAAQ,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAgSrH;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC5E,cAAc,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EACtC,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACjF,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAYxB"}
1
+ {"version":3,"file":"define-entity.d.ts","sourceRoot":"","sources":["../../../src/common/helpers/define-entity.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EAEjB,eAAe,EAEhB,MAAM,uCAAuC,CAAC;AAE/C,2IAA2I;AAC3I,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAqEnC;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,GAAG,GAAG,CAoBnE;AA+BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,YAAY,CAAC,CAAC,MACX,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,QAAQ,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAoSrH;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC5E,cAAc,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EACtC,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACjF,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAYxB"}
@@ -191,7 +191,7 @@ function createSerialiserForDescriptor(descriptor, labelName) {
191
191
  */
192
192
  function defineEntity() {
193
193
  return function (schema) {
194
- const { type, endpoint, nodeName, labelName, fields, relationships, computed = {}, virtualFields = {}, serialiser: customSerialiser, injectServices = [], isCompanyScoped = true, description, chat, bridge, tenancy, linkScope, } = schema;
194
+ const { type, endpoint, nodeName, labelName, fields, relationships, computed = {}, virtualFields = {}, serialiser: customSerialiser, injectServices = [], isCompanyScoped = true, description, chat, bridge, tenancy, linkScope, isProjection = false, } = schema;
195
195
  if (isCompanyScoped && tenancy) {
196
196
  throw new Error(`defineEntity(${type}): "tenancy" is only valid with isCompanyScoped: false.`);
197
197
  }
@@ -412,7 +412,10 @@ function defineEntity() {
412
412
  descriptor.model = model;
413
413
  // Label → tenancy, read by the generic relationship writers to decide what a
414
414
  // client-supplied target id of this label must satisfy (see entity-tenancy.registry.ts).
415
- entity_tenancy_registry_1.entityTenancyRegistry.register({ labelName, isCompanyScoped, tenancy, linkScope, via: viaHop });
415
+ // A projection is another view of a label owned by a different descriptor: it never sets the rule.
416
+ if (!isProjection) {
417
+ entity_tenancy_registry_1.entityTenancyRegistry.register({ labelName, type, isCompanyScoped, tenancy, linkScope, via: viaHop });
418
+ }
416
419
  return descriptor;
417
420
  };
418
421
  }