@carlonicora/nestjs-neo4jsonapi 6.6.1 → 6.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/operator/controllers/operator.controller.d.ts.map +1 -1
- package/dist/agents/operator/controllers/operator.controller.js +3 -0
- package/dist/agents/operator/controllers/operator.controller.js.map +1 -1
- package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
- package/dist/bootstrap/app.module.factory.js +9 -0
- package/dist/bootstrap/app.module.factory.js.map +1 -1
- package/dist/bootstrap/bootstrap.options.d.ts +19 -0
- package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
- package/dist/common/constants/core-module.ids.d.ts +39 -0
- package/dist/common/constants/core-module.ids.d.ts.map +1 -0
- package/dist/common/constants/core-module.ids.js +41 -0
- package/dist/common/constants/core-module.ids.js.map +1 -0
- package/dist/common/decorators/index.d.ts +1 -0
- package/dist/common/decorators/index.d.ts.map +1 -1
- package/dist/common/decorators/index.js +1 -0
- package/dist/common/decorators/index.js.map +1 -1
- package/dist/common/decorators/module.decorator.d.ts +19 -0
- package/dist/common/decorators/module.decorator.d.ts.map +1 -1
- package/dist/common/decorators/module.decorator.js +8 -2
- package/dist/common/decorators/module.decorator.js.map +1 -1
- package/dist/common/decorators/token-scopes.decorator.d.ts +14 -0
- package/dist/common/decorators/token-scopes.decorator.d.ts.map +1 -0
- package/dist/common/decorators/token-scopes.decorator.js +18 -0
- package/dist/common/decorators/token-scopes.decorator.js.map +1 -0
- package/dist/common/guards/index.d.ts +1 -0
- package/dist/common/guards/index.d.ts.map +1 -1
- package/dist/common/guards/index.js +1 -0
- package/dist/common/guards/index.js.map +1 -1
- package/dist/common/guards/jwt.auth.admin.guard.d.ts +3 -1
- package/dist/common/guards/jwt.auth.admin.guard.d.ts.map +1 -1
- package/dist/common/guards/jwt.auth.admin.guard.js +28 -7
- package/dist/common/guards/jwt.auth.admin.guard.js.map +1 -1
- package/dist/common/guards/jwt.auth.any-scope.guard.d.ts +10 -3
- package/dist/common/guards/jwt.auth.any-scope.guard.d.ts.map +1 -1
- package/dist/common/guards/jwt.auth.any-scope.guard.js +17 -4
- package/dist/common/guards/jwt.auth.any-scope.guard.js.map +1 -1
- package/dist/common/guards/jwt.auth.guard.d.ts +3 -1
- package/dist/common/guards/jwt.auth.guard.d.ts.map +1 -1
- package/dist/common/guards/jwt.auth.guard.js +30 -8
- package/dist/common/guards/jwt.auth.guard.js.map +1 -1
- package/dist/common/guards/jwt.auth.optional.guard.d.ts +3 -1
- package/dist/common/guards/jwt.auth.optional.guard.d.ts.map +1 -1
- package/dist/common/guards/jwt.auth.optional.guard.js +32 -8
- package/dist/common/guards/jwt.auth.optional.guard.js.map +1 -1
- package/dist/common/guards/session.token.d.ts +50 -0
- package/dist/common/guards/session.token.d.ts.map +1 -0
- package/dist/common/guards/session.token.js +71 -0
- package/dist/common/guards/session.token.js.map +1 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +1 -0
- package/dist/common/index.js.map +1 -1
- package/dist/common/strategies/jwt.strategy.d.ts +8 -0
- package/dist/common/strategies/jwt.strategy.d.ts.map +1 -1
- package/dist/common/strategies/jwt.strategy.js +8 -0
- package/dist/common/strategies/jwt.strategy.js.map +1 -1
- package/dist/core/websocket/gateways/event.gateway.d.ts.map +1 -1
- package/dist/core/websocket/gateways/event.gateway.js +12 -1
- package/dist/core/websocket/gateways/event.gateway.js.map +1 -1
- package/dist/core/websocket/guards/ws.jwt.auth.guard.d.ts.map +1 -1
- package/dist/core/websocket/guards/ws.jwt.auth.guard.js +4 -0
- package/dist/core/websocket/guards/ws.jwt.auth.guard.js.map +1 -1
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.d.ts.map +1 -1
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.js +4 -0
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.js.map +1 -1
- package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts.map +1 -1
- package/dist/foundations/analytics/controllers/analytics.admin.controller.js +3 -0
- package/dist/foundations/analytics/controllers/analytics.admin.controller.js.map +1 -1
- package/dist/foundations/analytics/controllers/analytics.controller.d.ts.map +1 -1
- package/dist/foundations/analytics/controllers/analytics.controller.js +3 -0
- package/dist/foundations/analytics/controllers/analytics.controller.js.map +1 -1
- package/dist/foundations/assistant/controllers/assistant.controller.d.ts.map +1 -1
- package/dist/foundations/assistant/controllers/assistant.controller.js +3 -0
- package/dist/foundations/assistant/controllers/assistant.controller.js.map +1 -1
- package/dist/foundations/assistant-action/controllers/assistant-action.controller.d.ts.map +1 -1
- package/dist/foundations/assistant-action/controllers/assistant-action.controller.js +3 -0
- package/dist/foundations/assistant-action/controllers/assistant-action.controller.js.map +1 -1
- package/dist/foundations/assistant-message/controllers/assistant-message.controller.d.ts.map +1 -1
- package/dist/foundations/assistant-message/controllers/assistant-message.controller.js +3 -0
- package/dist/foundations/assistant-message/controllers/assistant-message.controller.js.map +1 -1
- package/dist/foundations/audit/controllers/audit.controller.d.ts.map +1 -1
- package/dist/foundations/audit/controllers/audit.controller.js +3 -0
- package/dist/foundations/audit/controllers/audit.controller.js.map +1 -1
- package/dist/foundations/auth/controllers/auth.company.controller.d.ts.map +1 -1
- package/dist/foundations/auth/controllers/auth.company.controller.js +4 -0
- package/dist/foundations/auth/controllers/auth.company.controller.js.map +1 -1
- package/dist/foundations/auth/controllers/auth.controller.d.ts.map +1 -1
- package/dist/foundations/auth/controllers/auth.controller.js +3 -0
- package/dist/foundations/auth/controllers/auth.controller.js.map +1 -1
- package/dist/foundations/auth/repositories/auth.repository.d.ts.map +1 -1
- package/dist/foundations/auth/repositories/auth.repository.js +5 -0
- package/dist/foundations/auth/repositories/auth.repository.js.map +1 -1
- package/dist/foundations/chunk/controllers/chunk.controller.d.ts.map +1 -1
- package/dist/foundations/chunk/controllers/chunk.controller.js +10 -0
- package/dist/foundations/chunk/controllers/chunk.controller.js.map +1 -1
- package/dist/foundations/chunk/repositories/chunk.repository.d.ts +13 -0
- package/dist/foundations/chunk/repositories/chunk.repository.d.ts.map +1 -1
- package/dist/foundations/chunk/repositories/chunk.repository.js +27 -1
- package/dist/foundations/chunk/repositories/chunk.repository.js.map +1 -1
- package/dist/foundations/chunker/services/chunker.service.d.ts +48 -7
- package/dist/foundations/chunker/services/chunker.service.d.ts.map +1 -1
- package/dist/foundations/chunker/services/chunker.service.js +119 -61
- package/dist/foundations/chunker/services/chunker.service.js.map +1 -1
- package/dist/foundations/chunker/services/types/docx.service.d.ts +2 -0
- package/dist/foundations/chunker/services/types/docx.service.d.ts.map +1 -1
- package/dist/foundations/chunker/services/types/docx.service.js +10 -36
- package/dist/foundations/chunker/services/types/docx.service.js.map +1 -1
- package/dist/foundations/chunker/services/types/pptx.service.d.ts.map +1 -1
- package/dist/foundations/chunker/services/types/pptx.service.js +5 -0
- package/dist/foundations/chunker/services/types/pptx.service.js.map +1 -1
- package/dist/foundations/chunker/services/types/xlsx.service.d.ts.map +1 -1
- package/dist/foundations/chunker/services/types/xlsx.service.js +8 -1
- package/dist/foundations/chunker/services/types/xlsx.service.js.map +1 -1
- package/dist/foundations/chunker/utils/zip-limits.d.ts +37 -0
- package/dist/foundations/chunker/utils/zip-limits.d.ts.map +1 -0
- package/dist/foundations/chunker/utils/zip-limits.js +113 -0
- package/dist/foundations/chunker/utils/zip-limits.js.map +1 -0
- package/dist/foundations/company/controllers/company.controller.d.ts.map +1 -1
- package/dist/foundations/company/controllers/company.controller.js +3 -0
- package/dist/foundations/company/controllers/company.controller.js.map +1 -1
- package/dist/foundations/content/controllers/content.controller.d.ts.map +1 -1
- package/dist/foundations/content/controllers/content.controller.js +3 -0
- package/dist/foundations/content/controllers/content.controller.js.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.d.ts.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.js +3 -0
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.js.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation.controller.d.ts.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation.controller.js +3 -0
- package/dist/foundations/email-automation/controllers/email-automation.controller.js.map +1 -1
- package/dist/foundations/feature/controllers/feature.controller.d.ts.map +1 -1
- package/dist/foundations/feature/controllers/feature.controller.js +3 -0
- package/dist/foundations/feature/controllers/feature.controller.js.map +1 -1
- package/dist/foundations/handbook/controllers/handbook-thread.controller.d.ts.map +1 -1
- package/dist/foundations/handbook/controllers/handbook-thread.controller.js +3 -0
- package/dist/foundations/handbook/controllers/handbook-thread.controller.js.map +1 -1
- package/dist/foundations/handbook/controllers/handbook.controller.d.ts.map +1 -1
- package/dist/foundations/handbook/controllers/handbook.controller.js +3 -0
- package/dist/foundations/handbook/controllers/handbook.controller.js.map +1 -1
- package/dist/foundations/how-to/controllers/how-to.controller.d.ts.map +1 -1
- package/dist/foundations/how-to/controllers/how-to.controller.js +3 -0
- package/dist/foundations/how-to/controllers/how-to.controller.js.map +1 -1
- package/dist/foundations/keyconcept/controllers/keyconcept.controller.d.ts.map +1 -1
- package/dist/foundations/keyconcept/controllers/keyconcept.controller.js +3 -0
- package/dist/foundations/keyconcept/controllers/keyconcept.controller.js.map +1 -1
- package/dist/foundations/notification/controllers/notification.controller.d.ts.map +1 -1
- package/dist/foundations/notification/controllers/notification.controller.js +4 -0
- package/dist/foundations/notification/controllers/notification.controller.js.map +1 -1
- package/dist/foundations/oauth/constants/oauth.errors.d.ts +5 -0
- package/dist/foundations/oauth/constants/oauth.errors.d.ts.map +1 -1
- package/dist/foundations/oauth/constants/oauth.errors.js +6 -0
- package/dist/foundations/oauth/constants/oauth.errors.js.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.authorize.controller.d.ts.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.authorize.controller.js +4 -0
- package/dist/foundations/oauth/controllers/oauth.authorize.controller.js.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.management.controller.d.ts.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.management.controller.js +3 -0
- package/dist/foundations/oauth/controllers/oauth.management.controller.js.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.registration.controller.d.ts.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.registration.controller.js +10 -1
- package/dist/foundations/oauth/controllers/oauth.registration.controller.js.map +1 -1
- package/dist/foundations/oauth/queries/revoke-user-oauth-tokens.query.d.ts +13 -0
- package/dist/foundations/oauth/queries/revoke-user-oauth-tokens.query.d.ts.map +1 -0
- package/dist/foundations/oauth/queries/revoke-user-oauth-tokens.query.js +29 -0
- package/dist/foundations/oauth/queries/revoke-user-oauth-tokens.query.js.map +1 -0
- package/dist/foundations/oauth/repositories/oauth.repository.d.ts +22 -0
- package/dist/foundations/oauth/repositories/oauth.repository.d.ts.map +1 -1
- package/dist/foundations/oauth/repositories/oauth.repository.js +43 -12
- package/dist/foundations/oauth/repositories/oauth.repository.js.map +1 -1
- package/dist/foundations/oauth/services/oauth.service.d.ts.map +1 -1
- package/dist/foundations/oauth/services/oauth.service.js +11 -2
- package/dist/foundations/oauth/services/oauth.service.js.map +1 -1
- package/dist/foundations/oauth/services/oauth.token.service.d.ts +9 -0
- package/dist/foundations/oauth/services/oauth.token.service.d.ts.map +1 -1
- package/dist/foundations/oauth/services/oauth.token.service.js +22 -0
- package/dist/foundations/oauth/services/oauth.token.service.js.map +1 -1
- package/dist/foundations/push/controllers/push.controller.d.ts.map +1 -1
- package/dist/foundations/push/controllers/push.controller.js +3 -0
- package/dist/foundations/push/controllers/push.controller.js.map +1 -1
- package/dist/foundations/rbac/controllers/rbac-dev.controller.d.ts.map +1 -1
- package/dist/foundations/rbac/controllers/rbac-dev.controller.js +3 -0
- package/dist/foundations/rbac/controllers/rbac-dev.controller.js.map +1 -1
- package/dist/foundations/rbac/controllers/rbac-module-paths.controller.d.ts.map +1 -1
- package/dist/foundations/rbac/controllers/rbac-module-paths.controller.js +3 -0
- package/dist/foundations/rbac/controllers/rbac-module-paths.controller.js.map +1 -1
- package/dist/foundations/rbac/controllers/rbac.controller.d.ts.map +1 -1
- package/dist/foundations/rbac/controllers/rbac.controller.js +3 -0
- package/dist/foundations/rbac/controllers/rbac.controller.js.map +1 -1
- package/dist/foundations/rbac/index.d.ts +5 -0
- package/dist/foundations/rbac/index.d.ts.map +1 -1
- package/dist/foundations/rbac/index.js +12 -1
- package/dist/foundations/rbac/index.js.map +1 -1
- package/dist/foundations/rbac/rbac-permission.module.d.ts +4 -0
- package/dist/foundations/rbac/rbac-permission.module.d.ts.map +1 -1
- package/dist/foundations/rbac/rbac-permission.module.js +18 -2
- package/dist/foundations/rbac/rbac-permission.module.js.map +1 -1
- package/dist/foundations/rbac/rbac.tokens.d.ts +8 -0
- package/dist/foundations/rbac/rbac.tokens.d.ts.map +1 -1
- package/dist/foundations/rbac/rbac.tokens.js +9 -1
- package/dist/foundations/rbac/rbac.tokens.js.map +1 -1
- package/dist/foundations/rbac/repositories/rbac-permission.repository.d.ts +29 -1
- package/dist/foundations/rbac/repositories/rbac-permission.repository.d.ts.map +1 -1
- package/dist/foundations/rbac/repositories/rbac-permission.repository.js +73 -1
- package/dist/foundations/rbac/repositories/rbac-permission.repository.js.map +1 -1
- package/dist/foundations/rbac/services/module-permission-audit.service.d.ts +34 -0
- package/dist/foundations/rbac/services/module-permission-audit.service.d.ts.map +1 -0
- package/dist/foundations/rbac/services/module-permission-audit.service.js +137 -0
- package/dist/foundations/rbac/services/module-permission-audit.service.js.map +1 -0
- package/dist/foundations/rbac/services/module-permission.gate.d.ts +51 -0
- package/dist/foundations/rbac/services/module-permission.gate.d.ts.map +1 -0
- package/dist/foundations/rbac/services/module-permission.gate.js +108 -0
- package/dist/foundations/rbac/services/module-permission.gate.js.map +1 -0
- package/dist/foundations/rbac/services/module-permission.service.d.ts +34 -0
- package/dist/foundations/rbac/services/module-permission.service.d.ts.map +1 -0
- package/dist/foundations/rbac/services/module-permission.service.js +64 -0
- package/dist/foundations/rbac/services/module-permission.service.js.map +1 -0
- package/dist/foundations/rbac/services/rbac-permission.service.d.ts +10 -1
- package/dist/foundations/rbac/services/rbac-permission.service.d.ts.map +1 -1
- package/dist/foundations/rbac/services/rbac-permission.service.js +32 -2
- package/dist/foundations/rbac/services/rbac-permission.service.js.map +1 -1
- package/dist/foundations/rbac/services/rbac-reconciler.service.d.ts +11 -2
- package/dist/foundations/rbac/services/rbac-reconciler.service.d.ts.map +1 -1
- package/dist/foundations/rbac/services/rbac-reconciler.service.js +19 -6
- package/dist/foundations/rbac/services/rbac-reconciler.service.js.map +1 -1
- package/dist/foundations/referral/controllers/referral.controller.d.ts.map +1 -1
- package/dist/foundations/referral/controllers/referral.controller.js +3 -0
- package/dist/foundations/referral/controllers/referral.controller.js.map +1 -1
- package/dist/foundations/role/controllers/role.controller.d.ts.map +1 -1
- package/dist/foundations/role/controllers/role.controller.js +3 -0
- package/dist/foundations/role/controllers/role.controller.js.map +1 -1
- package/dist/foundations/role/controllers/role.user.controller.d.ts.map +1 -1
- package/dist/foundations/role/controllers/role.user.controller.js +3 -0
- package/dist/foundations/role/controllers/role.user.controller.js.map +1 -1
- package/dist/foundations/s3/controllers/s3.controller.d.ts +13 -0
- package/dist/foundations/s3/controllers/s3.controller.d.ts.map +1 -1
- package/dist/foundations/s3/controllers/s3.controller.js +61 -7
- package/dist/foundations/s3/controllers/s3.controller.js.map +1 -1
- package/dist/foundations/stripe/controllers/billing.controller.d.ts.map +1 -1
- package/dist/foundations/stripe/controllers/billing.controller.js +4 -0
- package/dist/foundations/stripe/controllers/billing.controller.js.map +1 -1
- package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.js +3 -0
- package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.js.map +1 -1
- package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.js +3 -0
- package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.js.map +1 -1
- package/dist/foundations/stripe-price/controllers/stripe-price.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-price/controllers/stripe-price.controller.js +3 -0
- package/dist/foundations/stripe-price/controllers/stripe-price.controller.js.map +1 -1
- package/dist/foundations/stripe-product/controllers/stripe-product.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-product/controllers/stripe-product.controller.js +3 -0
- package/dist/foundations/stripe-product/controllers/stripe-product.controller.js.map +1 -1
- package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.js +4 -0
- package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.js.map +1 -1
- package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.js +3 -0
- package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.js.map +1 -1
- package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.js +3 -0
- package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.js.map +1 -1
- package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.d.ts.map +1 -1
- package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.js +3 -0
- package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.js.map +1 -1
- package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.d.ts.map +1 -1
- package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.js +3 -0
- package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.js.map +1 -1
- package/dist/foundations/two-factor/controllers/passkey.controller.d.ts.map +1 -1
- package/dist/foundations/two-factor/controllers/passkey.controller.js +7 -0
- package/dist/foundations/two-factor/controllers/passkey.controller.js.map +1 -1
- package/dist/foundations/two-factor/controllers/totp.controller.d.ts.map +1 -1
- package/dist/foundations/two-factor/controllers/totp.controller.js +6 -0
- package/dist/foundations/two-factor/controllers/totp.controller.js.map +1 -1
- package/dist/foundations/two-factor/controllers/two-factor.controller.d.ts.map +1 -1
- package/dist/foundations/two-factor/controllers/two-factor.controller.js +7 -0
- package/dist/foundations/two-factor/controllers/two-factor.controller.js.map +1 -1
- package/dist/foundations/user/controllers/user.controller.d.ts.map +1 -1
- package/dist/foundations/user/controllers/user.controller.js +3 -0
- package/dist/foundations/user/controllers/user.controller.js.map +1 -1
- package/dist/foundations/user/repositories/user.repository.d.ts +18 -0
- package/dist/foundations/user/repositories/user.repository.d.ts.map +1 -1
- package/dist/foundations/user/repositories/user.repository.js +44 -1
- package/dist/foundations/user/repositories/user.repository.js.map +1 -1
- package/dist/foundations/waitlist/controllers/waitlist.controller.d.ts.map +1 -1
- package/dist/foundations/waitlist/controllers/waitlist.controller.js +3 -0
- package/dist/foundations/waitlist/controllers/waitlist.controller.js.map +1 -1
- package/dist/mcp/controllers/mcp.controller.d.ts.map +1 -1
- package/dist/mcp/controllers/mcp.controller.js +7 -1
- package/dist/mcp/controllers/mcp.controller.js.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
|
18
|
-
*
|
|
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;
|
|
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"}
|
|
@@ -2,6 +2,7 @@ import { ExecutionContext } from "@nestjs/common";
|
|
|
2
2
|
import { Reflector } from "@nestjs/core";
|
|
3
3
|
import { ClsService } from "nestjs-cls";
|
|
4
4
|
import { Neo4jService } from "../../core/neo4j/services/neo4j.service";
|
|
5
|
+
import { ModulePermissionGate } from "../../foundations/rbac/services/module-permission.gate";
|
|
5
6
|
import { AuthContextHookInterface, SystemRolesInterface } from "../tokens";
|
|
6
7
|
declare const JwtAuthGuard_base: import("@nestjs/passport", { with: { "resolution-mode": "import" } }).Type<import("@nestjs/passport", { with: { "resolution-mode": "import" } }).IAuthGuard>;
|
|
7
8
|
export declare class JwtAuthGuard extends JwtAuthGuard_base {
|
|
@@ -10,7 +11,8 @@ export declare class JwtAuthGuard extends JwtAuthGuard_base {
|
|
|
10
11
|
private readonly neo4j;
|
|
11
12
|
private readonly systemRoles?;
|
|
12
13
|
private readonly authContextHook?;
|
|
13
|
-
|
|
14
|
+
private readonly permissionGate?;
|
|
15
|
+
constructor(cls: ClsService, reflector: Reflector, neo4j: Neo4jService, systemRoles?: SystemRolesInterface, authContextHook?: AuthContextHookInterface, permissionGate?: ModulePermissionGate);
|
|
14
16
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
15
17
|
handleRequest(err: any, user: any, info: any, context: ExecutionContext): any;
|
|
16
18
|
private _validateRoles;
|
|
@@ -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;;
|
|
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,EAAE,oBAAoB,EAAE,MAAM,wDAAwD,CAAC;AAC9F,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;IAIjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAZf,GAAG,EAAE,UAAU,EACxB,SAAS,EAAE,SAAS,EACX,KAAK,EAAE,YAAY,EAGnB,WAAW,CAAC,EAAE,oBAAoB,EAGlC,eAAe,CAAC,EAAE,wBAAwB,EAI1C,cAAc,CAAC,EAAE,oBAAoB;IAKlD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB9D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAwCvE,OAAO,CAAC,cAAc;CAavB"}
|
|
@@ -18,15 +18,18 @@ 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 neo4j_service_1 = require("../../core/neo4j/services/neo4j.service");
|
|
21
|
+
const module_permission_gate_1 = require("../../foundations/rbac/services/module-permission.gate");
|
|
21
22
|
const tokens_1 = require("../tokens");
|
|
23
|
+
const session_token_1 = require("./session.token");
|
|
22
24
|
let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
|
|
23
|
-
constructor(cls, reflector, neo4j, systemRoles, authContextHook) {
|
|
25
|
+
constructor(cls, reflector, neo4j, systemRoles, authContextHook, permissionGate) {
|
|
24
26
|
super();
|
|
25
27
|
this.cls = cls;
|
|
26
28
|
this.reflector = reflector;
|
|
27
29
|
this.neo4j = neo4j;
|
|
28
30
|
this.systemRoles = systemRoles;
|
|
29
31
|
this.authContextHook = authContextHook;
|
|
32
|
+
this.permissionGate = permissionGate;
|
|
30
33
|
}
|
|
31
34
|
async canActivate(context) {
|
|
32
35
|
const request = context.switchToHttp().getRequest();
|
|
@@ -36,6 +39,8 @@ let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
|
|
|
36
39
|
const isAuthenticated = (await super.canActivate(context));
|
|
37
40
|
if (isAuthenticated && request.user && this.authContextHook)
|
|
38
41
|
await this.authContextHook.onAuthenticated({ request, context });
|
|
42
|
+
if (isAuthenticated && request.user && this.permissionGate)
|
|
43
|
+
await this.permissionGate.assert({ request, context });
|
|
39
44
|
return isAuthenticated;
|
|
40
45
|
}
|
|
41
46
|
handleRequest(err, user, info, context) {
|
|
@@ -52,17 +57,33 @@ let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
|
|
|
52
57
|
}
|
|
53
58
|
throw new common_1.HttpException("Unauthorised", 401);
|
|
54
59
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
// Only a full session passes: pending-2FA, selection and portal tokens are signed
|
|
61
|
+
// with the same secret and verify, but must never act as a session.
|
|
62
|
+
// Asserted on a local copy: narrowing `user` itself would change the return type
|
|
63
|
+
// away from IAuthGuard's generic `TUser`.
|
|
64
|
+
const session = user;
|
|
65
|
+
(0, session_token_1.assertSessionPayload)(session);
|
|
66
|
+
this._validateRoles(session, context);
|
|
67
|
+
const companyId = (0, session_token_1.resolveSessionCompanyId)({
|
|
68
|
+
payload: session,
|
|
69
|
+
headerCompanyId: request.headers["x-companyid"],
|
|
70
|
+
administratorRole: this.systemRoles?.Administrator,
|
|
71
|
+
});
|
|
72
|
+
this.cls.set("userId", session.userId);
|
|
73
|
+
this.cls.set("companyId", companyId);
|
|
74
|
+
this.cls.set("roles", session.roles);
|
|
59
75
|
this.cls.set("language", request.headers["x-language"]);
|
|
60
76
|
this.cls.set("token", token.startsWith("Bearer ") ? token.slice(7) : token);
|
|
61
77
|
this.cls.set("ipAddress", request.ip);
|
|
62
78
|
return user;
|
|
63
79
|
}
|
|
64
80
|
_validateRoles(user, context) {
|
|
65
|
-
|
|
81
|
+
// Handler AND class: a class-level @Roles was inert while only the handler was read.
|
|
82
|
+
// Copied, because pushing into the array returned by the reflector mutates the
|
|
83
|
+
// decorator metadata for every later request.
|
|
84
|
+
const requiredRoles = [
|
|
85
|
+
...(this.reflector.getAllAndOverride("roles", [context.getHandler(), context.getClass()]) ?? []),
|
|
86
|
+
];
|
|
66
87
|
if (requiredRoles.length > 0) {
|
|
67
88
|
const adminRole = this.systemRoles?.Administrator ?? "administrator";
|
|
68
89
|
if (!requiredRoles.includes(adminRole))
|
|
@@ -76,12 +97,13 @@ exports.JwtAuthGuard = JwtAuthGuard;
|
|
|
76
97
|
exports.JwtAuthGuard = JwtAuthGuard = __decorate([
|
|
77
98
|
(0, common_1.Injectable)(),
|
|
78
99
|
__param(3, (0, common_1.Optional)()),
|
|
79
|
-
__param(3, (0, common_1.Optional)()),
|
|
80
100
|
__param(3, (0, common_1.Inject)(tokens_1.SYSTEM_ROLES)),
|
|
81
101
|
__param(4, (0, common_1.Optional)()),
|
|
82
102
|
__param(4, (0, common_1.Inject)(tokens_1.AUTH_CONTEXT_HOOK)),
|
|
103
|
+
__param(5, (0, common_1.Optional)()),
|
|
104
|
+
__param(5, (0, common_1.Inject)(module_permission_gate_1.ModulePermissionGate)),
|
|
83
105
|
__metadata("design:paramtypes", [nestjs_cls_1.ClsService,
|
|
84
106
|
core_1.Reflector,
|
|
85
|
-
neo4j_service_1.Neo4jService, Object, Object])
|
|
107
|
+
neo4j_service_1.Neo4jService, Object, Object, module_permission_gate_1.ModulePermissionGate])
|
|
86
108
|
], JwtAuthGuard);
|
|
87
109
|
//# sourceMappingURL=jwt.auth.guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.auth.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA+F;AAC/F,uCAAyC;AACzC,+CAA6C;AAC7C,2CAAwC;AACxC,2EAAuE;AACvE,sCAA4G;
|
|
1
|
+
{"version":3,"file":"jwt.auth.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { ExecutionContext } from "@nestjs/common";
|
|
2
2
|
import { Reflector } from "@nestjs/core";
|
|
3
3
|
import { ClsService } from "nestjs-cls";
|
|
4
|
+
import { ModulePermissionGate } from "../../foundations/rbac/services/module-permission.gate";
|
|
4
5
|
import { SystemRolesInterface } from "../tokens";
|
|
5
6
|
declare const OptionalJwtAuthGuard_base: import("@nestjs/passport", { with: { "resolution-mode": "import" } }).Type<import("@nestjs/passport", { with: { "resolution-mode": "import" } }).IAuthGuard>;
|
|
6
7
|
export declare class OptionalJwtAuthGuard extends OptionalJwtAuthGuard_base {
|
|
7
8
|
private readonly cls;
|
|
8
9
|
private reflector;
|
|
9
10
|
private readonly systemRoles?;
|
|
10
|
-
|
|
11
|
+
private readonly permissionGate?;
|
|
12
|
+
constructor(cls: ClsService, reflector: Reflector, systemRoles?: SystemRolesInterface, permissionGate?: ModulePermissionGate);
|
|
11
13
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
12
14
|
handleRequest(err: any, user: any, info: any, context: ExecutionContext): any;
|
|
13
15
|
private _validateRoles;
|
|
@@ -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;;
|
|
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,EAAE,oBAAoB,EAAE,MAAM,wDAAwD,CAAC;AAC9F,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;IAI7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;gBARf,GAAG,EAAE,UAAU,EACxB,SAAS,EAAE,SAAS,EAGX,WAAW,CAAC,EAAE,oBAAoB,EAIlC,cAAc,CAAC,EAAE,oBAAoB;IAKlD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB9D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB;IAsCvE,OAAO,CAAC,cAAc;CAYvB"}
|
|
@@ -17,13 +17,16 @@ const common_1 = require("@nestjs/common");
|
|
|
17
17
|
const core_1 = require("@nestjs/core");
|
|
18
18
|
const passport_1 = require("@nestjs/passport");
|
|
19
19
|
const nestjs_cls_1 = require("nestjs-cls");
|
|
20
|
+
const module_permission_gate_1 = require("../../foundations/rbac/services/module-permission.gate");
|
|
20
21
|
const tokens_1 = require("../tokens");
|
|
22
|
+
const session_token_1 = require("./session.token");
|
|
21
23
|
let OptionalJwtAuthGuard = class OptionalJwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
|
|
22
|
-
constructor(cls, reflector, systemRoles) {
|
|
24
|
+
constructor(cls, reflector, systemRoles, permissionGate) {
|
|
23
25
|
super();
|
|
24
26
|
this.cls = cls;
|
|
25
27
|
this.reflector = reflector;
|
|
26
28
|
this.systemRoles = systemRoles;
|
|
29
|
+
this.permissionGate = permissionGate;
|
|
27
30
|
}
|
|
28
31
|
async canActivate(context) {
|
|
29
32
|
const request = context.switchToHttp().getRequest();
|
|
@@ -31,7 +34,12 @@ let OptionalJwtAuthGuard = class OptionalJwtAuthGuard extends (0, passport_1.Aut
|
|
|
31
34
|
if (!authorizationHeader && request.user) {
|
|
32
35
|
return true;
|
|
33
36
|
}
|
|
34
|
-
|
|
37
|
+
const isAuthenticated = (await super.canActivate(context));
|
|
38
|
+
// Only a caller that authenticated as a session is checked; an anonymous
|
|
39
|
+
// caller (no token) keeps today's behaviour.
|
|
40
|
+
if (isAuthenticated && request.user && this.permissionGate)
|
|
41
|
+
await this.permissionGate.assert({ request, context });
|
|
42
|
+
return isAuthenticated;
|
|
35
43
|
}
|
|
36
44
|
handleRequest(err, user, info, context) {
|
|
37
45
|
const request = context.switchToHttp().getRequest();
|
|
@@ -47,15 +55,29 @@ let OptionalJwtAuthGuard = class OptionalJwtAuthGuard extends (0, passport_1.Aut
|
|
|
47
55
|
}
|
|
48
56
|
return null;
|
|
49
57
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
58
|
+
// A token that is present and verifies but is not a full session (pending-2FA,
|
|
59
|
+
// selection, portal) is refused, not downgraded to anonymous.
|
|
60
|
+
// Asserted on a local copy: narrowing `user` itself would change the return type
|
|
61
|
+
// away from IAuthGuard's generic `TUser`.
|
|
62
|
+
const session = user;
|
|
63
|
+
(0, session_token_1.assertSessionPayload)(session);
|
|
64
|
+
this._validateRoles(session, context);
|
|
65
|
+
const companyId = (0, session_token_1.resolveSessionCompanyId)({
|
|
66
|
+
payload: session,
|
|
67
|
+
headerCompanyId: request.headers["x-companyid"],
|
|
68
|
+
administratorRole: this.systemRoles?.Administrator,
|
|
69
|
+
});
|
|
70
|
+
this.cls.set("userId", session.userId);
|
|
71
|
+
this.cls.set("companyId", companyId);
|
|
53
72
|
this.cls.set("language", request.headers["x-language"]);
|
|
54
|
-
this.cls.set("roles",
|
|
73
|
+
this.cls.set("roles", session.roles);
|
|
55
74
|
return user;
|
|
56
75
|
}
|
|
57
76
|
_validateRoles(user, context) {
|
|
58
|
-
|
|
77
|
+
// Handler AND class, copied so pushing the admin role never mutates the metadata.
|
|
78
|
+
const requiredRoles = [
|
|
79
|
+
...(this.reflector.getAllAndOverride("roles", [context.getHandler(), context.getClass()]) ?? []),
|
|
80
|
+
];
|
|
59
81
|
if (requiredRoles.length > 0) {
|
|
60
82
|
if (!user)
|
|
61
83
|
throw new common_1.HttpException("Unauthorised", 401);
|
|
@@ -72,7 +94,9 @@ exports.OptionalJwtAuthGuard = OptionalJwtAuthGuard = __decorate([
|
|
|
72
94
|
(0, common_1.Injectable)(),
|
|
73
95
|
__param(2, (0, common_1.Optional)()),
|
|
74
96
|
__param(2, (0, common_1.Inject)(tokens_1.SYSTEM_ROLES)),
|
|
97
|
+
__param(3, (0, common_1.Optional)()),
|
|
98
|
+
__param(3, (0, common_1.Inject)(module_permission_gate_1.ModulePermissionGate)),
|
|
75
99
|
__metadata("design:paramtypes", [nestjs_cls_1.ClsService,
|
|
76
|
-
core_1.Reflector, Object])
|
|
100
|
+
core_1.Reflector, Object, module_permission_gate_1.ModulePermissionGate])
|
|
77
101
|
], OptionalJwtAuthGuard);
|
|
78
102
|
//# sourceMappingURL=jwt.auth.optional.guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.auth.optional.guard.js","sourceRoot":"","sources":["../../../src/common/guards/jwt.auth.optional.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA+F;AAC/F,uCAAyC;AACzC,+CAA6C;AAC7C,2CAAwC;AACxC,sCAA+D;
|
|
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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"}
|
package/dist/common/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,WAAW,CAAC;AAG1B,cAAc,UAAU,CAAC;AAGzB,cAAc,WAAW,CAAC;AAG1B,cAAc,cAAc,CAAC;AAG7B,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,YAAY,CAAC;AAG3B,cAAc,UAAU,CAAC;AAGzB,cAAc,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,WAAW,CAAC;AAG1B,cAAc,UAAU,CAAC;AAGzB,cAAc,WAAW,CAAC;AAG1B,cAAc,cAAc,CAAC;AAG7B,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,YAAY,CAAC;AAG3B,cAAc,UAAU,CAAC;AAGzB,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAK5C,cAAc,4BAA4B,CAAC"}
|
package/dist/common/index.js
CHANGED
|
@@ -50,6 +50,7 @@ __exportStar(require("./handlers"), exports);
|
|
|
50
50
|
__exportStar(require("./tokens"), exports);
|
|
51
51
|
// Constants
|
|
52
52
|
__exportStar(require("./constants/system.roles"), exports);
|
|
53
|
+
__exportStar(require("./constants/core-module.ids"), exports);
|
|
53
54
|
// Utils
|
|
54
55
|
// Exported by file, like ./constants/system.roles above: src/common/utils has no
|
|
55
56
|
// barrel of its own and settled.ts is deliberately relative-import only.
|
package/dist/common/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;AAEH,YAAY;AACZ,8CAA4B;AAE5B,WAAW;AACX,6CAA2B;AAE3B,aAAa;AACb,+CAA6B;AAE7B,QAAQ;AACR,0CAAwB;AAExB,UAAU;AACV,4CAA0B;AAE1B,SAAS;AACT,2CAAyB;AAEzB,UAAU;AACV,4CAA0B;AAE1B,aAAa;AACb,+CAA6B;AAE7B,aAAa;AACb,+CAA6B;AAE7B,eAAe;AACf,iDAA+B;AAE/B,aAAa;AACb,+CAA6B;AAE7B,QAAQ;AACR,0CAAwB;AAExB,WAAW;AACX,6CAA2B;AAE3B,iDAAiD;AACjD,2CAAyB;AAEzB,YAAY;AACZ,2DAAyC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;AAEH,YAAY;AACZ,8CAA4B;AAE5B,WAAW;AACX,6CAA2B;AAE3B,aAAa;AACb,+CAA6B;AAE7B,QAAQ;AACR,0CAAwB;AAExB,UAAU;AACV,4CAA0B;AAE1B,SAAS;AACT,2CAAyB;AAEzB,UAAU;AACV,4CAA0B;AAE1B,aAAa;AACb,+CAA6B;AAE7B,aAAa;AACb,+CAA6B;AAE7B,eAAe;AACf,iDAA+B;AAE/B,aAAa;AACb,+CAA6B;AAE7B,QAAQ;AACR,0CAAwB;AAExB,WAAW;AACX,6CAA2B;AAE3B,iDAAiD;AACjD,2CAAyB;AAEzB,YAAY;AACZ,2DAAyC;AACzC,8DAA4C;AAE5C,QAAQ;AACR,iFAAiF;AACjF,yEAAyE;AACzE,6DAA2C"}
|
|
@@ -8,6 +8,14 @@ declare const JwtStrategy_base: new (...args: [opt: import("passport-jwt").Strat
|
|
|
8
8
|
export declare class JwtStrategy extends JwtStrategy_base {
|
|
9
9
|
private readonly cls;
|
|
10
10
|
constructor(cls: ClsService, configService: ConfigService<BaseConfigInterface>);
|
|
11
|
+
/**
|
|
12
|
+
* Accepts every payload signed with `jwt.secret`: full sessions, pending-2FA and
|
|
13
|
+
* selection tokens all share the key, and `AnyScopeAuthGuard` must still see the
|
|
14
|
+
* selection tokens. The token class is enforced by each guard after this runs
|
|
15
|
+
* (`assertSessionPayload` / `isAcceptedScopedPayload` in `guards/session.token.ts`),
|
|
16
|
+
* so a guard built on `AuthGuard("jwt")` must never trust `request.user` without one
|
|
17
|
+
* of those checks.
|
|
18
|
+
*/
|
|
11
19
|
validate(req: Request, payload: any): Promise<any>;
|
|
12
20
|
}
|
|
13
21
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.strategy.d.ts","sourceRoot":"","sources":["../../../src/common/strategies/jwt.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAc,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,yBAAyB,CAAC;;;;AAElF,qBACa,WAAY,SAAQ,gBAA0B;IAEvD,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU,EAChC,aAAa,EAAE,aAAa,CAAC,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"jwt.strategy.d.ts","sourceRoot":"","sources":["../../../src/common/strategies/jwt.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAc,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,yBAAyB,CAAC;;;;AAElF,qBACa,WAAY,SAAQ,gBAA0B;IAEvD,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU,EAChC,aAAa,EAAE,aAAa,CAAC,mBAAmB,CAAC;IAUnD;;;;;;;OAOG;IACG,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG;CAU1C"}
|
|
@@ -25,6 +25,14 @@ let JwtStrategy = class JwtStrategy extends (0, passport_1.PassportStrategy)(pas
|
|
|
25
25
|
});
|
|
26
26
|
this.cls = cls;
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Accepts every payload signed with `jwt.secret`: full sessions, pending-2FA and
|
|
30
|
+
* selection tokens all share the key, and `AnyScopeAuthGuard` must still see the
|
|
31
|
+
* selection tokens. The token class is enforced by each guard after this runs
|
|
32
|
+
* (`assertSessionPayload` / `isAcceptedScopedPayload` in `guards/session.token.ts`),
|
|
33
|
+
* so a guard built on `AuthGuard("jwt")` must never trust `request.user` without one
|
|
34
|
+
* of those checks.
|
|
35
|
+
*/
|
|
28
36
|
async validate(req, payload) {
|
|
29
37
|
const now = new Date();
|
|
30
38
|
const expiration = new Date(payload.expiration);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../../src/common/strategies/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA2D;AAC3D,2CAA+C;AAC/C,+CAAoD;AACpD,2CAAwC;AACxC,+CAAoD;AAI7C,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,IAAA,2BAAgB,EAAC,uBAAQ,CAAC;IACzD,YACmB,GAAe,EAChC,aAAiD;QAEjD,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAqB,KAAK,CAAC,CAAC;QAC/D,KAAK,CAAC;YACJ,cAAc,EAAE,yBAAU,CAAC,2BAA2B,EAAE;YACxD,WAAW,EAAE,SAAS,EAAE,MAAM;YAC9B,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;QARc,QAAG,GAAH,GAAG,CAAY;IASlC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAY,EAAE,OAAY;QACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEhD,IAAI,UAAU,GAAG,GAAG;YAAE,MAAM,IAAI,sBAAa,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QAEpE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAEvC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../../src/common/strategies/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA2D;AAC3D,2CAA+C;AAC/C,+CAAoD;AACpD,2CAAwC;AACxC,+CAAoD;AAI7C,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,IAAA,2BAAgB,EAAC,uBAAQ,CAAC;IACzD,YACmB,GAAe,EAChC,aAAiD;QAEjD,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAqB,KAAK,CAAC,CAAC;QAC/D,KAAK,CAAC;YACJ,cAAc,EAAE,yBAAU,CAAC,2BAA2B,EAAE;YACxD,WAAW,EAAE,SAAS,EAAE,MAAM;YAC9B,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;QARc,QAAG,GAAH,GAAG,CAAY;IASlC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,CAAC,GAAY,EAAE,OAAY;QACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEhD,IAAI,UAAU,GAAG,GAAG;YAAE,MAAM,IAAI,sBAAa,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QAEpE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAEvC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAA;AA/BY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAGa,uBAAU;QACjB,sBAAa;GAHnB,WAAW,CA+BvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.gateway.d.ts","sourceRoot":"","sources":["../../../../src/core/websocket/gateways/event.gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAGL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EAId,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAkB,UAAU,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"event.gateway.d.ts","sourceRoot":"","sources":["../../../../src/core/websocket/gateways/event.gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAGL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EAId,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAkB,UAAU,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAajE,qBASa,aAAc,YAAW,aAAa,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe;IAO1G,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAX/B,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,cAAc,CAAS;gBAGZ,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,iBAAiB,EACzB,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,aAAa;IAG9C,SAAS;IAKH,gBAAgB,CAAC,MAAM,EAAE,MAAM;IA8C/B,gBAAgB,CAAC,MAAM,EAAE,MAAM;IA8B/B,eAAe;IAKf,eAAe,CAAoB,MAAM,EAAE,MAAM;;;;;;IASvD,aAAa,CACI,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,EAChC,MAAM,EAAE,MAAM,GAChC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE;IAU/B,OAAO,CAAC,yBAAyB;CAelC"}
|
|
@@ -19,6 +19,7 @@ const jwt_1 = require("@nestjs/jwt");
|
|
|
19
19
|
const websockets_1 = require("@nestjs/websockets");
|
|
20
20
|
const nestjs_cls_1 = require("nestjs-cls");
|
|
21
21
|
const socket_io_1 = require("socket.io");
|
|
22
|
+
const session_token_1 = require("../../../common/guards/session.token");
|
|
22
23
|
const logging_service_1 = require("../../logging/services/logging.service");
|
|
23
24
|
const neo4j_service_1 = require("../../neo4j/services/neo4j.service");
|
|
24
25
|
const presence_service_1 = require("../services/presence.service");
|
|
@@ -56,10 +57,20 @@ let EventsGateway = class EventsGateway {
|
|
|
56
57
|
else {
|
|
57
58
|
try {
|
|
58
59
|
const payload = this.jwtService.verify(token);
|
|
60
|
+
// Pending-2FA, selection and portal tokens verify with the same secret but are
|
|
61
|
+
// not sessions: such a socket stays anonymous, exactly like an invalid token.
|
|
62
|
+
if (!(0, session_token_1.isSessionPayload)(payload)) {
|
|
63
|
+
this.logger.error(`[PRESENCE] Non-session token refused for client: ${client.id}`);
|
|
64
|
+
client.data.user = { userId: null };
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
59
67
|
client.data.user = payload;
|
|
60
68
|
this.webSocketService.addClient(payload.userId, client);
|
|
61
69
|
// Set user as online
|
|
62
|
-
|
|
70
|
+
// `userName` is what `SecurityService.signJwt` writes; `name` is the legacy key
|
|
71
|
+
// read since the first release, kept for tokens an app signs itself.
|
|
72
|
+
const displayName = payload.userName || (typeof payload.name === "string" ? payload.name : undefined);
|
|
73
|
+
await this.presenceService.setUserOnline(payload.userId, displayName, client.id);
|
|
63
74
|
// Presence goes to the user's company only, never to every socket.
|
|
64
75
|
const presencePayload = {
|
|
65
76
|
userId: payload.userId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.gateway.js","sourceRoot":"","sources":["../../../../src/core/websocket/gateways/event.gateway.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAkE;AAClE,yDAAsD;AACtD,qCAAyC;AACzC,mDAS4B;AAC5B,2CAAwD;AACxD,yCAA2C;AAC3C,4EAA2E;AAC3E,sEAAkE;AAClE,mEAA+D;AAC/D,qEAAiE;AAEjE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAE5D;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,KAAa;IAC1C,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACtE,CAAC;AAWM,IAAM,aAAa,GAAnB,MAAM,aAAa;IAMxB,YACmB,gBAAkC,EAClC,UAAsB,EACtB,GAAe,EACf,KAAmB,EACnB,MAAyB,EACzB,eAAgC,EAChC,YAA2B;QAN3B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,eAAU,GAAV,UAAU,CAAY;QACtB,QAAG,GAAH,GAAG,CAAY;QACf,UAAK,GAAL,KAAK,CAAc;QACnB,WAAM,GAAN,MAAM,CAAmB;QACzB,oBAAe,GAAf,eAAe,CAAiB;QAChC,iBAAY,GAAZ,YAAY,CAAe;QATtC,mBAAc,GAAG,KAAK,CAAC;IAU5B,CAAC;IAEJ,SAAS;QACP,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"event.gateway.js","sourceRoot":"","sources":["../../../../src/core/websocket/gateways/event.gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.jwt.auth.guard.d.ts","sourceRoot":"","sources":["../../../../src/core/websocket/guards/ws.jwt.auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAc,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ws.jwt.auth.guard.d.ts","sourceRoot":"","sources":["../../../../src/core/websocket/guards/ws.jwt.auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAc,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,qBACa,UAAW,YAAW,WAAW;IAE1C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAFL,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY;IAGhC,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB9D,OAAO,CAAC,yBAAyB;CAiBlC"}
|