@lenne.tech/nest-server 11.41.2 → 11.41.4

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 (103) hide show
  1. package/.claude/rules/architecture.md +1 -0
  2. package/.claude/rules/configurable-features.md +1 -0
  3. package/.claude/rules/role-system.md +15 -1
  4. package/.claude/rules/testing.md +16 -4
  5. package/CLAUDE.md +2 -1
  6. package/FRAMEWORK-API.md +4 -1
  7. package/dist/core/common/helpers/graceful-shutdown.helper.js.map +1 -1
  8. package/dist/core/common/helpers/logging.helper.js +2 -0
  9. package/dist/core/common/helpers/logging.helper.js.map +1 -1
  10. package/dist/core/common/helpers/process-diagnostics.helper.js.map +1 -1
  11. package/dist/core/common/interfaces/server-options.interface.d.ts +20 -0
  12. package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.d.ts +2 -2
  13. package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js +46 -6
  14. package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js.map +1 -1
  15. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +7 -1
  16. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -1
  17. package/dist/core/modules/api-token/core-api-token.constants.d.ts +6 -0
  18. package/dist/core/modules/api-token/core-api-token.constants.js +11 -0
  19. package/dist/core/modules/api-token/core-api-token.constants.js.map +1 -0
  20. package/dist/core/modules/api-token/core-api-token.decorators.d.ts +1 -0
  21. package/dist/core/modules/api-token/core-api-token.decorators.js +8 -0
  22. package/dist/core/modules/api-token/core-api-token.decorators.js.map +1 -0
  23. package/dist/core/modules/api-token/core-api-token.helpers.d.ts +127 -0
  24. package/dist/core/modules/api-token/core-api-token.helpers.js +398 -0
  25. package/dist/core/modules/api-token/core-api-token.helpers.js.map +1 -0
  26. package/dist/core/modules/api-token/core-api-token.middleware.d.ts +10 -0
  27. package/dist/core/modules/api-token/core-api-token.middleware.js +58 -0
  28. package/dist/core/modules/api-token/core-api-token.middleware.js.map +1 -0
  29. package/dist/core/modules/api-token/core-api-token.model.d.ts +20 -0
  30. package/dist/core/modules/api-token/core-api-token.model.js +199 -0
  31. package/dist/core/modules/api-token/core-api-token.model.js.map +1 -0
  32. package/dist/core/modules/api-token/core-api-token.module.d.ts +11 -0
  33. package/dist/core/modules/api-token/core-api-token.module.js +39 -0
  34. package/dist/core/modules/api-token/core-api-token.module.js.map +1 -0
  35. package/dist/core/modules/api-token/core-api-token.registry.d.ts +9 -0
  36. package/dist/core/modules/api-token/core-api-token.registry.js +17 -0
  37. package/dist/core/modules/api-token/core-api-token.registry.js.map +1 -0
  38. package/dist/core/modules/api-token/core-api-token.service.d.ts +104 -0
  39. package/dist/core/modules/api-token/core-api-token.service.js +550 -0
  40. package/dist/core/modules/api-token/core-api-token.service.js.map +1 -0
  41. package/dist/core/modules/auth/guards/roles.guard.js +17 -1
  42. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  43. package/dist/core/modules/better-auth/better-auth-roles.guard.js +12 -2
  44. package/dist/core/modules/better-auth/better-auth-roles.guard.js.map +1 -1
  45. package/dist/core/modules/better-auth/core-better-auth.middleware.js +4 -0
  46. package/dist/core/modules/better-auth/core-better-auth.middleware.js.map +1 -1
  47. package/dist/core/modules/better-auth/core-better-auth.module.d.ts +4 -0
  48. package/dist/core/modules/better-auth/core-better-auth.module.js +18 -0
  49. package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
  50. package/dist/core/modules/tenant/core-tenant-guard.registry.d.ts +2 -0
  51. package/dist/core/modules/tenant/core-tenant-guard.registry.js +19 -0
  52. package/dist/core/modules/tenant/core-tenant-guard.registry.js.map +1 -0
  53. package/dist/core/modules/tenant/core-tenant.guard.d.ts +1 -0
  54. package/dist/core/modules/tenant/core-tenant.guard.js +28 -12
  55. package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
  56. package/dist/core/modules/tenant/core-tenant.helpers.d.ts +1 -0
  57. package/dist/core/modules/tenant/core-tenant.helpers.js +19 -0
  58. package/dist/core/modules/tenant/core-tenant.helpers.js.map +1 -1
  59. package/dist/core/modules/tenant/core-tenant.module.d.ts +5 -2
  60. package/dist/core/modules/tenant/core-tenant.module.js +8 -0
  61. package/dist/core/modules/tenant/core-tenant.module.js.map +1 -1
  62. package/dist/core/modules/user/core-user.service.js +7 -0
  63. package/dist/core/modules/user/core-user.service.js.map +1 -1
  64. package/dist/core.module.js +6 -0
  65. package/dist/core.module.js.map +1 -1
  66. package/dist/index.d.ts +7 -0
  67. package/dist/index.js +7 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/tsconfig.build.tsbuildinfo +1 -1
  70. package/docs/REQUEST-LIFECYCLE.md +49 -1
  71. package/docs/security-overrides.md +16 -10
  72. package/migration-guides/11.41.3-to-11.41.4.md +172 -0
  73. package/package.json +38 -37
  74. package/src/core/common/helpers/graceful-shutdown.helper.ts +9 -0
  75. package/src/core/common/helpers/logging.helper.ts +7 -0
  76. package/src/core/common/helpers/process-diagnostics.helper.ts +4 -0
  77. package/src/core/common/interfaces/server-options.interface.ts +110 -0
  78. package/src/core/modules/ai/INTEGRATION-CHECKLIST.md +17 -10
  79. package/src/core/modules/ai/README.md +9 -1
  80. package/src/core/modules/ai/helpers/ai-mcp-oauth.helper.ts +74 -7
  81. package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +13 -1
  82. package/src/core/modules/api-token/INTEGRATION-CHECKLIST.md +121 -0
  83. package/src/core/modules/api-token/README.md +212 -0
  84. package/src/core/modules/api-token/core-api-token.constants.ts +27 -0
  85. package/src/core/modules/api-token/core-api-token.decorators.ts +29 -0
  86. package/src/core/modules/api-token/core-api-token.helpers.ts +711 -0
  87. package/src/core/modules/api-token/core-api-token.middleware.ts +57 -0
  88. package/src/core/modules/api-token/core-api-token.model.ts +193 -0
  89. package/src/core/modules/api-token/core-api-token.module.ts +48 -0
  90. package/src/core/modules/api-token/core-api-token.registry.ts +53 -0
  91. package/src/core/modules/api-token/core-api-token.service.ts +822 -0
  92. package/src/core/modules/auth/guards/roles.guard.ts +23 -2
  93. package/src/core/modules/better-auth/better-auth-roles.guard.ts +18 -4
  94. package/src/core/modules/better-auth/core-better-auth.middleware.ts +8 -0
  95. package/src/core/modules/better-auth/core-better-auth.module.ts +33 -0
  96. package/src/core/modules/tenant/README.md +17 -0
  97. package/src/core/modules/tenant/core-tenant-guard.registry.ts +36 -0
  98. package/src/core/modules/tenant/core-tenant.guard.ts +52 -12
  99. package/src/core/modules/tenant/core-tenant.helpers.ts +30 -0
  100. package/src/core/modules/tenant/core-tenant.module.ts +19 -2
  101. package/src/core/modules/user/core-user.service.ts +14 -0
  102. package/src/core.module.ts +12 -0
  103. package/src/index.ts +12 -0
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CoreApiTokenModel = void 0;
13
+ const graphql_1 = require("@nestjs/graphql");
14
+ const mongoose_1 = require("@nestjs/mongoose");
15
+ const restricted_decorator_1 = require("../../common/decorators/restricted.decorator");
16
+ const unified_field_decorator_1 = require("../../common/decorators/unified-field.decorator");
17
+ const role_enum_1 = require("../../common/enums/role.enum");
18
+ const access_denied_exception_1 = require("../../common/exceptions/access-denied.exception");
19
+ const core_persistence_model_1 = require("../../common/models/core-persistence.model");
20
+ const config_service_1 = require("../../common/services/config.service");
21
+ const request_context_service_1 = require("../../common/services/request-context.service");
22
+ const core_tenant_helpers_1 = require("../tenant/core-tenant.helpers");
23
+ const core_api_token_constants_1 = require("./core-api-token.constants");
24
+ const core_api_token_helpers_1 = require("./core-api-token.helpers");
25
+ let CoreApiTokenModel = class CoreApiTokenModel extends core_persistence_model_1.CorePersistenceModel {
26
+ createdBy = undefined;
27
+ description = undefined;
28
+ expiresAt = undefined;
29
+ kind = undefined;
30
+ lastUsedAt = undefined;
31
+ maxTenantRole = undefined;
32
+ name = undefined;
33
+ publicId = undefined;
34
+ revokedAt = undefined;
35
+ scopes = undefined;
36
+ secretHash = undefined;
37
+ signingKeyEncrypted = undefined;
38
+ tenant = undefined;
39
+ updatedBy = undefined;
40
+ user = undefined;
41
+ securityCheck(user, force) {
42
+ if (force)
43
+ return this;
44
+ if (!user)
45
+ throw (0, access_denied_exception_1.accessDeniedException)(user);
46
+ if ((0, core_api_token_helpers_1.getApiTokenContext)(user))
47
+ throw (0, access_denied_exception_1.accessDeniedException)(user);
48
+ if (this.kind === core_api_token_constants_1.ApiTokenKind.USER && user.id === this.user)
49
+ return this;
50
+ const adminBypass = config_service_1.ConfigService.configFastButReadOnly?.multiTenancy?.adminBypass !== false;
51
+ if (adminBypass && user.hasRole?.([role_enum_1.RoleEnum.ADMIN]))
52
+ return this;
53
+ const context = request_context_service_1.RequestContext.get();
54
+ if (this.kind === core_api_token_constants_1.ApiTokenKind.TENANT &&
55
+ context?.tenantId === this.tenant &&
56
+ context?.tenantRole &&
57
+ (0, core_tenant_helpers_1.checkRoleAccess)([(0, core_api_token_helpers_1.getApiTokenManageRole)()], undefined, context.tenantRole)) {
58
+ return this;
59
+ }
60
+ throw (0, access_denied_exception_1.accessDeniedException)(user);
61
+ }
62
+ };
63
+ exports.CoreApiTokenModel = CoreApiTokenModel;
64
+ __decorate([
65
+ (0, unified_field_decorator_1.UnifiedField)({
66
+ description: 'ID of the creating user',
67
+ isOptional: true,
68
+ mongoose: { type: String },
69
+ roles: role_enum_1.RoleEnum.S_USER,
70
+ }),
71
+ __metadata("design:type", String)
72
+ ], CoreApiTokenModel.prototype, "createdBy", void 0);
73
+ __decorate([
74
+ (0, unified_field_decorator_1.UnifiedField)({ description: 'Description', isOptional: true, mongoose: { type: String }, roles: role_enum_1.RoleEnum.S_USER }),
75
+ __metadata("design:type", String)
76
+ ], CoreApiTokenModel.prototype, "description", void 0);
77
+ __decorate([
78
+ (0, unified_field_decorator_1.UnifiedField)({
79
+ description: 'Expiry date',
80
+ isOptional: true,
81
+ mongoose: { default: null, type: Date },
82
+ roles: role_enum_1.RoleEnum.S_USER,
83
+ type: Date,
84
+ }),
85
+ __metadata("design:type", Date)
86
+ ], CoreApiTokenModel.prototype, "expiresAt", void 0);
87
+ __decorate([
88
+ (0, unified_field_decorator_1.UnifiedField)({
89
+ description: 'Token kind',
90
+ mongoose: { enum: Object.values(core_api_token_constants_1.ApiTokenKind), required: true, type: String },
91
+ roles: role_enum_1.RoleEnum.S_USER,
92
+ type: () => String,
93
+ }),
94
+ __metadata("design:type", String)
95
+ ], CoreApiTokenModel.prototype, "kind", void 0);
96
+ __decorate([
97
+ (0, unified_field_decorator_1.UnifiedField)({
98
+ description: 'Last use',
99
+ isOptional: true,
100
+ mongoose: { default: null, type: Date },
101
+ roles: role_enum_1.RoleEnum.S_USER,
102
+ type: Date,
103
+ }),
104
+ __metadata("design:type", Date)
105
+ ], CoreApiTokenModel.prototype, "lastUsedAt", void 0);
106
+ __decorate([
107
+ (0, unified_field_decorator_1.UnifiedField)({
108
+ description: 'Maximum tenant role',
109
+ isOptional: true,
110
+ mongoose: { type: String },
111
+ roles: role_enum_1.RoleEnum.S_USER,
112
+ }),
113
+ __metadata("design:type", String)
114
+ ], CoreApiTokenModel.prototype, "maxTenantRole", void 0);
115
+ __decorate([
116
+ (0, unified_field_decorator_1.UnifiedField)({ description: 'Name', mongoose: { required: true, type: String }, roles: role_enum_1.RoleEnum.S_USER }),
117
+ __metadata("design:type", String)
118
+ ], CoreApiTokenModel.prototype, "name", void 0);
119
+ __decorate([
120
+ (0, unified_field_decorator_1.UnifiedField)({
121
+ description: 'Public token id',
122
+ mongoose: { required: true, type: String, unique: true },
123
+ roles: role_enum_1.RoleEnum.S_USER,
124
+ }),
125
+ __metadata("design:type", String)
126
+ ], CoreApiTokenModel.prototype, "publicId", void 0);
127
+ __decorate([
128
+ (0, unified_field_decorator_1.UnifiedField)({
129
+ description: 'Revocation date',
130
+ isOptional: true,
131
+ mongoose: { default: null, type: Date },
132
+ roles: role_enum_1.RoleEnum.S_USER,
133
+ type: Date,
134
+ }),
135
+ __metadata("design:type", Date)
136
+ ], CoreApiTokenModel.prototype, "revokedAt", void 0);
137
+ __decorate([
138
+ (0, unified_field_decorator_1.UnifiedField)({
139
+ description: 'Scopes',
140
+ isArray: true,
141
+ mongoose: { default: [], type: [String] },
142
+ roles: role_enum_1.RoleEnum.S_USER,
143
+ type: () => String,
144
+ }),
145
+ __metadata("design:type", Array)
146
+ ], CoreApiTokenModel.prototype, "scopes", void 0);
147
+ __decorate([
148
+ (0, restricted_decorator_1.Restricted)(role_enum_1.RoleEnum.S_NO_ONE),
149
+ (0, unified_field_decorator_1.UnifiedField)({
150
+ description: 'Secret hash',
151
+ isOptional: true,
152
+ mongoose: { select: false, type: String },
153
+ roles: role_enum_1.RoleEnum.S_NO_ONE,
154
+ }),
155
+ __metadata("design:type", String)
156
+ ], CoreApiTokenModel.prototype, "secretHash", void 0);
157
+ __decorate([
158
+ (0, restricted_decorator_1.Restricted)(role_enum_1.RoleEnum.S_NO_ONE),
159
+ (0, unified_field_decorator_1.UnifiedField)({
160
+ description: 'Encrypted signing key',
161
+ isOptional: true,
162
+ mongoose: { select: false, type: String },
163
+ roles: role_enum_1.RoleEnum.S_NO_ONE,
164
+ }),
165
+ __metadata("design:type", String)
166
+ ], CoreApiTokenModel.prototype, "signingKeyEncrypted", void 0);
167
+ __decorate([
168
+ (0, unified_field_decorator_1.UnifiedField)({
169
+ description: 'Tenant ID',
170
+ isOptional: true,
171
+ mongoose: { index: true, type: String },
172
+ roles: role_enum_1.RoleEnum.S_USER,
173
+ }),
174
+ __metadata("design:type", String)
175
+ ], CoreApiTokenModel.prototype, "tenant", void 0);
176
+ __decorate([
177
+ (0, unified_field_decorator_1.UnifiedField)({
178
+ description: 'ID of the last updating user',
179
+ isOptional: true,
180
+ mongoose: { type: String },
181
+ roles: role_enum_1.RoleEnum.S_USER,
182
+ }),
183
+ __metadata("design:type", String)
184
+ ], CoreApiTokenModel.prototype, "updatedBy", void 0);
185
+ __decorate([
186
+ (0, unified_field_decorator_1.UnifiedField)({
187
+ description: 'Owning user ID',
188
+ isOptional: true,
189
+ mongoose: { index: true, type: String },
190
+ roles: role_enum_1.RoleEnum.S_USER,
191
+ }),
192
+ __metadata("design:type", String)
193
+ ], CoreApiTokenModel.prototype, "user", void 0);
194
+ exports.CoreApiTokenModel = CoreApiTokenModel = __decorate([
195
+ (0, graphql_1.ObjectType)({ description: 'API token', isAbstract: true }),
196
+ (0, restricted_decorator_1.Restricted)(role_enum_1.RoleEnum.S_USER),
197
+ (0, mongoose_1.Schema)({ timestamps: true })
198
+ ], CoreApiTokenModel);
199
+ //# sourceMappingURL=core-api-token.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-api-token.model.js","sourceRoot":"","sources":["../../../../src/core/modules/api-token/core-api-token.model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { DynamicModule, MiddlewareConsumer, NestModule, Type } from '@nestjs/common';
2
+ import { CoreApiTokenModel } from './core-api-token.model';
3
+ import { CoreApiTokenService } from './core-api-token.service';
4
+ export interface CoreApiTokenModuleOptions {
5
+ model?: Type<CoreApiTokenModel>;
6
+ service?: Type<CoreApiTokenService>;
7
+ }
8
+ export declare class CoreApiTokenModule implements NestModule {
9
+ static forRoot(options?: CoreApiTokenModuleOptions): DynamicModule;
10
+ configure(consumer: MiddlewareConsumer): void;
11
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var CoreApiTokenModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CoreApiTokenModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const mongoose_1 = require("@nestjs/mongoose");
13
+ const core_api_token_constants_1 = require("./core-api-token.constants");
14
+ const core_api_token_middleware_1 = require("./core-api-token.middleware");
15
+ const core_api_token_model_1 = require("./core-api-token.model");
16
+ const core_api_token_service_1 = require("./core-api-token.service");
17
+ let CoreApiTokenModule = CoreApiTokenModule_1 = class CoreApiTokenModule {
18
+ static forRoot(options = {}) {
19
+ const schema = mongoose_1.SchemaFactory.createForClass(options.model || core_api_token_model_1.CoreApiTokenModel);
20
+ schema.index({ kind: 1, tenant: 1 });
21
+ schema.index({ kind: 1, user: 1 });
22
+ return {
23
+ exports: [core_api_token_service_1.CoreApiTokenService],
24
+ global: true,
25
+ imports: [mongoose_1.MongooseModule.forFeature([{ name: core_api_token_constants_1.API_TOKEN_MODEL_TOKEN, schema }])],
26
+ module: CoreApiTokenModule_1,
27
+ providers: [{ provide: core_api_token_service_1.CoreApiTokenService, useClass: options.service || core_api_token_service_1.CoreApiTokenService }],
28
+ };
29
+ }
30
+ configure(consumer) {
31
+ consumer.apply(core_api_token_middleware_1.CoreApiTokenMiddleware).forRoutes('*');
32
+ }
33
+ };
34
+ exports.CoreApiTokenModule = CoreApiTokenModule;
35
+ exports.CoreApiTokenModule = CoreApiTokenModule = CoreApiTokenModule_1 = __decorate([
36
+ (0, common_1.Global)(),
37
+ (0, common_1.Module)({})
38
+ ], CoreApiTokenModule);
39
+ //# sourceMappingURL=core-api-token.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-api-token.module.js","sourceRoot":"","sources":["../../../../src/core/modules/api-token/core-api-token.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAqG;AACrG,+CAAiE;AAEjE,yEAAmE;AACnE,2EAAqE;AACrE,iEAA2D;AAC3D,qEAA+D;AAsBxD,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAC7B,MAAM,CAAC,OAAO,CAAC,UAAqC,EAAE;QACpD,MAAM,MAAM,GAAG,wBAAa,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,wCAAiB,CAAC,CAAC;QAEhF,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAEnC,OAAO;YACL,OAAO,EAAE,CAAC,4CAAmB,CAAC;YAC9B,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,yBAAc,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,gDAAqB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/E,MAAM,EAAE,oBAAkB;YAC1B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,4CAAmB,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,4CAAmB,EAAE,CAAC;SAChG,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,QAAQ,CAAC,KAAK,CAAC,kDAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AAnBY,gDAAkB;6BAAlB,kBAAkB;IAF9B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,kBAAkB,CAmB9B"}
@@ -0,0 +1,9 @@
1
+ export interface ApiTokenOwnerIdentity {
2
+ email?: string;
3
+ iamId?: string;
4
+ userId?: string;
5
+ }
6
+ type ApiTokenRevoker = (identity: ApiTokenOwnerIdentity) => Promise<number>;
7
+ export declare function setApiTokenRevoker(fn: ApiTokenRevoker | undefined): () => void;
8
+ export declare function revokeApiTokensOfUser(identity: ApiTokenOwnerIdentity): Promise<number>;
9
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setApiTokenRevoker = setApiTokenRevoker;
4
+ exports.revokeApiTokensOfUser = revokeApiTokensOfUser;
5
+ let revoker;
6
+ function setApiTokenRevoker(fn) {
7
+ revoker = fn;
8
+ return () => {
9
+ if (revoker === fn) {
10
+ revoker = undefined;
11
+ }
12
+ };
13
+ }
14
+ async function revokeApiTokensOfUser(identity) {
15
+ return revoker ? revoker(identity) : 0;
16
+ }
17
+ //# sourceMappingURL=core-api-token.registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-api-token.registry.js","sourceRoot":"","sources":["../../../../src/core/modules/api-token/core-api-token.registry.ts"],"names":[],"mappings":";;AAmCA,gDAOC;AAQD,sDAEC;AAzBD,IAAI,OAAoC,CAAC;AAQzC,SAAgB,kBAAkB,CAAC,EAA+B;IAChE,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,GAAG,EAAE;QACV,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAQM,KAAK,UAAU,qBAAqB,CAAC,QAA+B;IACzE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
2
+ import { Connection, Model, Types } from 'mongoose';
3
+ import { CoreRedisService } from '../../common/services/core-redis.service';
4
+ import { RateLimitStore } from '../../common/services/rate-limit-store';
5
+ import { CoreTenantService } from '../tenant/core-tenant.service';
6
+ import { ApiTokenKind } from './core-api-token.constants';
7
+ import { IApiTokenContext, IApiTokenCredential, IResolvedApiTokenConfig } from './core-api-token.helpers';
8
+ import { CoreApiTokenModel } from './core-api-token.model';
9
+ import { ApiTokenOwnerIdentity } from './core-api-token.registry';
10
+ export interface ICreateUserApiTokenInput {
11
+ [projectField: string]: unknown;
12
+ description?: string;
13
+ expiresAt?: Date | null | string;
14
+ maxTenantRole?: null | string;
15
+ name: string;
16
+ scopes?: string[];
17
+ tenantId?: null | string;
18
+ }
19
+ export interface ICreateTenantApiTokenInput {
20
+ [projectField: string]: unknown;
21
+ description?: string;
22
+ expiresAt?: Date | null | string;
23
+ name: string;
24
+ scopes: string[];
25
+ }
26
+ export interface IUpdateApiTokenInput {
27
+ [projectField: string]: unknown;
28
+ description?: null | string;
29
+ expiresAt?: Date | null | string;
30
+ maxTenantRole?: null | string;
31
+ name?: string;
32
+ scopes?: string[];
33
+ tenantId?: null | string;
34
+ }
35
+ export type ApiTokenInfo = Omit<CoreApiTokenModel, 'secretHash' | 'securityCheck' | 'signingKeyEncrypted'> & {
36
+ [projectField: string]: unknown;
37
+ };
38
+ export interface ICreatedApiToken {
39
+ apiToken: ApiTokenInfo;
40
+ signingKey: string;
41
+ token: string;
42
+ }
43
+ export declare class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
44
+ protected readonly apiTokenModel: Model<CoreApiTokenModel>;
45
+ protected readonly connection?: Connection;
46
+ protected readonly tenantService?: CoreTenantService;
47
+ protected readonly redisService?: CoreRedisService;
48
+ protected readonly logger: Logger;
49
+ protected readonly lastUsedWrites: Map<string, number>;
50
+ protected rateLimitStore?: RateLimitStore;
51
+ private warnedAboutDevelopmentKey;
52
+ private disposeRevoker?;
53
+ protected static readonly LAST_USED_INTERVAL_MS = 60000;
54
+ protected static readonly LAST_USED_MAX_ENTRIES = 5000;
55
+ constructor(apiTokenModel: Model<CoreApiTokenModel>, connection?: Connection, tenantService?: CoreTenantService, redisService?: CoreRedisService);
56
+ onModuleInit(): void;
57
+ onModuleDestroy(): void;
58
+ authenticate(credential: IApiTokenCredential): Promise<null | object>;
59
+ consumeRateLimit(tokenId: string): Promise<undefined | {
60
+ retryAfter: number;
61
+ }>;
62
+ touchLastUsed(tokenId: string): void;
63
+ protected findUsableToken(publicId: string, config: IResolvedApiTokenConfig): Promise<CoreApiTokenModel | null>;
64
+ protected buildRequestUser(token: CoreApiTokenModel, assertion?: IApiTokenContext['assertion']): Promise<null | object>;
65
+ protected loadTokenUser(userId: string): Promise<null | Record<string, any>>;
66
+ protected getRateLimitStore(): RateLimitStore;
67
+ createUserToken(input: ICreateUserApiTokenInput, currentUser: any): Promise<ICreatedApiToken>;
68
+ findUserTokens(currentUser: any): Promise<ApiTokenInfo[]>;
69
+ updateUserToken(tokenId: string, input: IUpdateApiTokenInput, currentUser: any): Promise<ApiTokenInfo>;
70
+ revokeUserToken(tokenId: string, currentUser: any): Promise<ApiTokenInfo>;
71
+ deleteUserToken(tokenId: string, currentUser: any): Promise<ApiTokenInfo>;
72
+ revokeAllForUser(userId: string): Promise<number>;
73
+ revokeAllForOwner(identity: ApiTokenOwnerIdentity): Promise<number>;
74
+ deleteAllForUser(userId: string): Promise<number>;
75
+ createTenantToken(tenantId: string, input: ICreateTenantApiTokenInput, currentUser: any): Promise<ICreatedApiToken>;
76
+ findTenantTokens(tenantId: string, currentUser: any): Promise<ApiTokenInfo[]>;
77
+ updateTenantToken(tenantId: string, tokenId: string, input: IUpdateApiTokenInput, currentUser: any): Promise<ApiTokenInfo>;
78
+ revokeTenantToken(tenantId: string, tokenId: string, currentUser: any): Promise<ApiTokenInfo>;
79
+ deleteTenantToken(tenantId: string, tokenId: string, currentUser: any): Promise<ApiTokenInfo>;
80
+ deleteAllForTenant(tenantId: string): Promise<number>;
81
+ assertCanManageTenant(tenantId: string, currentUser: any, config?: IResolvedApiTokenConfig): Promise<void>;
82
+ protected encryptSigningKey(plain: string): string;
83
+ protected decryptSigningKey(stored: string): string;
84
+ protected getEncryptionKey(): Buffer;
85
+ protected requireKind(kind: ApiTokenKind): IResolvedApiTokenConfig;
86
+ protected assertPerson(currentUser: any): void;
87
+ protected issue(document: Record<string, unknown>, currentUser: any): Promise<ICreatedApiToken>;
88
+ protected list(filter: Record<string, unknown>): Promise<ApiTokenInfo[]>;
89
+ protected applyUpdate(filter: Record<string, unknown>, $set: Record<string, unknown>, currentUser: any): Promise<ApiTokenInfo>;
90
+ protected applyRevoke(filter: Record<string, unknown>, currentUser: any): Promise<ApiTokenInfo>;
91
+ protected applyDelete(filter: Record<string, unknown>): Promise<ApiTokenInfo>;
92
+ protected userTokenFilter(tokenId: string, currentUser: any): Record<string, unknown>;
93
+ protected tenantTokenFilter(tenantId: string, tokenId: string): Record<string, unknown>;
94
+ protected objectId(tokenId: string): Types.ObjectId;
95
+ protected commonUpdate(input: IUpdateApiTokenInput, config: IResolvedApiTokenConfig): Record<string, unknown>;
96
+ protected projectFields(input: Record<string, unknown> | undefined): Record<string, unknown>;
97
+ protected validateName(name: unknown): string;
98
+ protected validateDescription(description: unknown): null | string;
99
+ protected validateExpiry(expiresAt: unknown): Date | null;
100
+ protected validateScopes(scopes: unknown, config: IResolvedApiTokenConfig): string[];
101
+ protected validateUserTokenTenant(tenantId: unknown, currentUser: any, config: IResolvedApiTokenConfig): Promise<null | string>;
102
+ protected validateMaxTenantRole(role: unknown, config: IResolvedApiTokenConfig): null | string;
103
+ protected toInfo(document: Record<string, any>): ApiTokenInfo;
104
+ }