n8n 1.119.1 → 1.120.1

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 (148) hide show
  1. package/dist/auth/auth.service.js +1 -0
  2. package/dist/auth/auth.service.js.map +1 -1
  3. package/dist/build.tsbuildinfo +1 -1
  4. package/dist/controller.registry.d.ts +1 -0
  5. package/dist/controller.registry.js +37 -12
  6. package/dist/controller.registry.js.map +1 -1
  7. package/dist/controllers/auth.controller.js +3 -1
  8. package/dist/controllers/auth.controller.js.map +1 -1
  9. package/dist/events/maps/relay.event-map.d.ts +1 -1
  10. package/dist/middlewares/list-query/dtos/workflow.filter.dto.d.ts +1 -1
  11. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js +1 -1
  12. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js.map +1 -1
  13. package/dist/middlewares/list-query/dtos/workflow.select.dto.js +1 -0
  14. package/dist/middlewares/list-query/dtos/workflow.select.dto.js.map +1 -1
  15. package/dist/modules/breaking-changes/breaking-changes.controller.d.ts +7 -3
  16. package/dist/modules/breaking-changes/breaking-changes.controller.js +39 -6
  17. package/dist/modules/breaking-changes/breaking-changes.controller.js.map +1 -1
  18. package/dist/modules/breaking-changes/breaking-changes.service.d.ts +9 -6
  19. package/dist/modules/breaking-changes/breaking-changes.service.js +67 -38
  20. package/dist/modules/breaking-changes/breaking-changes.service.js.map +1 -1
  21. package/dist/modules/breaking-changes/rules/v2/file-access.rule.d.ts +5 -4
  22. package/dist/modules/breaking-changes/rules/v2/file-access.rule.js +4 -3
  23. package/dist/modules/breaking-changes/rules/v2/file-access.rule.js.map +1 -1
  24. package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.d.ts +5 -4
  25. package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.js +11 -13
  26. package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.js.map +1 -1
  27. package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.d.ts +5 -4
  28. package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.js +4 -3
  29. package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.js.map +1 -1
  30. package/dist/modules/breaking-changes/types/detection.types.d.ts +9 -10
  31. package/dist/modules/breaking-changes/types/rule.types.d.ts +9 -48
  32. package/dist/modules/breaking-changes/types/rule.types.js +1 -14
  33. package/dist/modules/breaking-changes/types/rule.types.js.map +1 -1
  34. package/dist/modules/insights/database/repositories/insights-by-period-query.helper.d.ts +9 -2
  35. package/dist/modules/insights/database/repositories/insights-by-period-query.helper.js +28 -64
  36. package/dist/modules/insights/database/repositories/insights-by-period-query.helper.js.map +1 -1
  37. package/dist/modules/insights/insights.controller.js +1 -1
  38. package/dist/modules/mcp/database/entities/oauth-access-token.entity.d.ts +9 -0
  39. package/dist/modules/mcp/database/entities/oauth-access-token.entity.js +44 -0
  40. package/dist/modules/mcp/database/entities/oauth-access-token.entity.js.map +1 -0
  41. package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.d.ts +15 -0
  42. package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.js +69 -0
  43. package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.js.map +1 -0
  44. package/dist/modules/mcp/database/entities/oauth-client.entity.d.ts +18 -0
  45. package/dist/modules/mcp/database/entities/oauth-client.entity.js +65 -0
  46. package/dist/modules/mcp/database/entities/oauth-client.entity.js.map +1 -0
  47. package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.d.ts +10 -0
  48. package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.js +49 -0
  49. package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.js.map +1 -0
  50. package/dist/modules/mcp/database/entities/oauth-user-consent.entity.d.ts +10 -0
  51. package/dist/modules/mcp/database/entities/oauth-user-consent.entity.js +49 -0
  52. package/dist/modules/mcp/database/entities/oauth-user-consent.entity.js.map +1 -0
  53. package/dist/modules/mcp/database/repositories/oauth-access-token.repository.d.ts +5 -0
  54. package/dist/modules/mcp/database/repositories/oauth-access-token.repository.js +26 -0
  55. package/dist/modules/mcp/database/repositories/oauth-access-token.repository.js.map +1 -0
  56. package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.d.ts +5 -0
  57. package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.js +26 -0
  58. package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.js.map +1 -0
  59. package/dist/modules/mcp/database/repositories/oauth-client.repository.d.ts +5 -0
  60. package/dist/modules/mcp/database/repositories/oauth-client.repository.js +26 -0
  61. package/dist/modules/mcp/database/repositories/oauth-client.repository.js.map +1 -0
  62. package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.d.ts +5 -0
  63. package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.js +26 -0
  64. package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.js.map +1 -0
  65. package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.d.ts +6 -0
  66. package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.js +33 -0
  67. package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.js.map +1 -0
  68. package/dist/modules/mcp/dto/approve-consent-request.dto.d.ts +8 -0
  69. package/dist/modules/mcp/dto/approve-consent-request.dto.js +11 -0
  70. package/dist/modules/mcp/dto/approve-consent-request.dto.js.map +1 -0
  71. package/dist/modules/mcp/mcp-api-key.service.d.ts +6 -9
  72. package/dist/modules/mcp/mcp-api-key.service.js +32 -61
  73. package/dist/modules/mcp/mcp-api-key.service.js.map +1 -1
  74. package/dist/modules/mcp/mcp-oauth-authorization-code.service.d.ts +11 -0
  75. package/dist/modules/mcp/mcp-oauth-authorization-code.service.js +76 -0
  76. package/dist/modules/mcp/mcp-oauth-authorization-code.service.js.map +1 -0
  77. package/dist/modules/mcp/mcp-oauth-consent.service.d.ts +20 -0
  78. package/dist/modules/mcp/mcp-oauth-consent.service.js +87 -0
  79. package/dist/modules/mcp/mcp-oauth-consent.service.js.map +1 -0
  80. package/dist/modules/mcp/mcp-oauth-service.d.ts +31 -0
  81. package/dist/modules/mcp/mcp-oauth-service.js +164 -0
  82. package/dist/modules/mcp/mcp-oauth-service.js.map +1 -0
  83. package/dist/modules/mcp/mcp-oauth-token.service.d.ts +28 -0
  84. package/dist/modules/mcp/mcp-oauth-token.service.js +182 -0
  85. package/dist/modules/mcp/mcp-oauth-token.service.js.map +1 -0
  86. package/dist/modules/mcp/mcp-oauth.helpers.d.ts +4 -0
  87. package/dist/modules/mcp/mcp-oauth.helpers.js +24 -0
  88. package/dist/modules/mcp/mcp-oauth.helpers.js.map +1 -0
  89. package/dist/modules/mcp/mcp-server-middleware.service.d.ts +18 -0
  90. package/dist/modules/mcp/mcp-server-middleware.service.js +95 -0
  91. package/dist/modules/mcp/mcp-server-middleware.service.js.map +1 -0
  92. package/dist/modules/mcp/mcp.auth.consent.controller.d.ts +17 -0
  93. package/dist/modules/mcp/mcp.auth.consent.controller.js +120 -0
  94. package/dist/modules/mcp/mcp.auth.consent.controller.js.map +1 -0
  95. package/dist/modules/mcp/mcp.controller.d.ts +4 -2
  96. package/dist/modules/mcp/mcp.controller.js +25 -3
  97. package/dist/modules/mcp/mcp.controller.js.map +1 -1
  98. package/dist/modules/mcp/mcp.module.d.ts +1 -0
  99. package/dist/modules/mcp/mcp.module.js +11 -0
  100. package/dist/modules/mcp/mcp.module.js.map +1 -1
  101. package/dist/modules/mcp/mcp.oauth-clients.controller.d.ts +12 -0
  102. package/dist/modules/mcp/mcp.oauth-clients.controller.js +93 -0
  103. package/dist/modules/mcp/mcp.oauth-clients.controller.js.map +1 -0
  104. package/dist/modules/mcp/mcp.oauth.controller.d.ts +13 -0
  105. package/dist/modules/mcp/mcp.oauth.controller.js +124 -0
  106. package/dist/modules/mcp/mcp.oauth.controller.js.map +1 -0
  107. package/dist/modules/mcp/mcp.types.d.ts +1 -2
  108. package/dist/modules/mcp/oauth-session.service.d.ts +16 -0
  109. package/dist/modules/mcp/oauth-session.service.js +48 -0
  110. package/dist/modules/mcp/oauth-session.service.js.map +1 -0
  111. package/dist/modules/mcp/tools/search-workflows.tool.d.ts +2 -3
  112. package/dist/modules/mcp/tools/search-workflows.tool.js +11 -10
  113. package/dist/modules/mcp/tools/search-workflows.tool.js.map +1 -1
  114. package/dist/modules/provisioning.ee/provisioning.service.ee.d.ts +4 -2
  115. package/dist/modules/provisioning.ee/provisioning.service.ee.js +20 -1
  116. package/dist/modules/provisioning.ee/provisioning.service.ee.js.map +1 -1
  117. package/dist/public-api/v1/handlers/users/users.service.ee.d.ts +6 -2
  118. package/dist/public-api/v1/handlers/users/users.service.ee.js +10 -3
  119. package/dist/public-api/v1/handlers/users/users.service.ee.js.map +1 -1
  120. package/dist/public-api/v1/openapi.yml +1 -1
  121. package/dist/services/import.service.js +0 -5
  122. package/dist/services/import.service.js.map +1 -1
  123. package/dist/services/jwt.service.d.ts +1 -1
  124. package/dist/services/jwt.service.js.map +1 -1
  125. package/dist/sso.ee/oidc/oidc.service.ee.js +6 -4
  126. package/dist/sso.ee/oidc/oidc.service.ee.js.map +1 -1
  127. package/dist/sso.ee/saml/routes/saml.controller.ee.d.ts +2 -10
  128. package/dist/sso.ee/saml/routes/saml.controller.ee.js +2 -9
  129. package/dist/sso.ee/saml/routes/saml.controller.ee.js.map +1 -1
  130. package/dist/sso.ee/saml/saml-helpers.d.ts +4 -1
  131. package/dist/sso.ee/saml/saml-helpers.js +10 -3
  132. package/dist/sso.ee/saml/saml-helpers.js.map +1 -1
  133. package/dist/sso.ee/saml/saml.service.ee.d.ts +4 -1
  134. package/dist/sso.ee/saml/saml.service.ee.js +20 -12
  135. package/dist/sso.ee/saml/saml.service.ee.js.map +1 -1
  136. package/dist/sso.ee/saml/types.d.ts +2 -2
  137. package/dist/telemetry/index.js +17 -3
  138. package/dist/telemetry/index.js.map +1 -1
  139. package/dist/utils/validate-database-type.d.ts +3 -1
  140. package/dist/utils/validate-database-type.js +26 -4
  141. package/dist/utils/validate-database-type.js.map +1 -1
  142. package/dist/workflows/workflow-finder.service.d.ts +1 -0
  143. package/dist/workflows/workflow.request.d.ts +1 -0
  144. package/dist/workflows/workflow.service.d.ts +2 -1
  145. package/dist/workflows/workflow.service.js +1 -0
  146. package/dist/workflows/workflow.service.js.map +1 -1
  147. package/dist/workflows/workflows.controller.d.ts +4 -0
  148. package/package.json +26 -26
@@ -0,0 +1,65 @@
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.OAuthClient = void 0;
13
+ const db_1 = require("@n8n/db");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ let OAuthClient = class OAuthClient extends db_1.WithTimestamps {
16
+ };
17
+ exports.OAuthClient = OAuthClient;
18
+ __decorate([
19
+ (0, typeorm_1.Column)({ type: 'varchar', primary: true }),
20
+ __metadata("design:type", String)
21
+ ], OAuthClient.prototype, "id", void 0);
22
+ __decorate([
23
+ (0, typeorm_1.Column)({ type: String }),
24
+ __metadata("design:type", String)
25
+ ], OAuthClient.prototype, "name", void 0);
26
+ __decorate([
27
+ (0, db_1.JsonColumn)(),
28
+ __metadata("design:type", Array)
29
+ ], OAuthClient.prototype, "redirectUris", void 0);
30
+ __decorate([
31
+ (0, db_1.JsonColumn)(),
32
+ __metadata("design:type", Array)
33
+ ], OAuthClient.prototype, "grantTypes", void 0);
34
+ __decorate([
35
+ (0, typeorm_1.Column)({ type: String, default: 'none' }),
36
+ __metadata("design:type", String)
37
+ ], OAuthClient.prototype, "tokenEndpointAuthMethod", void 0);
38
+ __decorate([
39
+ (0, typeorm_1.OneToMany)('AuthorizationCode', 'client'),
40
+ __metadata("design:type", Array)
41
+ ], OAuthClient.prototype, "authorizationCodes", void 0);
42
+ __decorate([
43
+ (0, typeorm_1.OneToMany)('AccessToken', 'client'),
44
+ __metadata("design:type", Array)
45
+ ], OAuthClient.prototype, "accessTokens", void 0);
46
+ __decorate([
47
+ (0, typeorm_1.OneToMany)('RefreshToken', 'client'),
48
+ __metadata("design:type", Array)
49
+ ], OAuthClient.prototype, "refreshTokens", void 0);
50
+ __decorate([
51
+ (0, typeorm_1.OneToMany)('UserConsent', 'client'),
52
+ __metadata("design:type", Array)
53
+ ], OAuthClient.prototype, "userConsents", void 0);
54
+ __decorate([
55
+ (0, typeorm_1.Column)({ type: String, nullable: true }),
56
+ __metadata("design:type", Object)
57
+ ], OAuthClient.prototype, "clientSecret", void 0);
58
+ __decorate([
59
+ (0, typeorm_1.Column)({ type: 'int', nullable: true }),
60
+ __metadata("design:type", Object)
61
+ ], OAuthClient.prototype, "clientSecretExpiresAt", void 0);
62
+ exports.OAuthClient = OAuthClient = __decorate([
63
+ (0, typeorm_1.Entity)('oauth_clients')
64
+ ], OAuthClient);
65
+ //# sourceMappingURL=oauth-client.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-client.entity.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/entities/oauth-client.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAqD;AACrD,0CAAyD;AAQlD,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,mBAAc;CAiC9C,CAAA;AAjCY,kCAAW;AAEvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;uCAChC;AAGX;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yCACZ;AAGb;IADC,IAAA,eAAU,GAAE;;iDACU;AAGvB;IADC,IAAA,eAAU,GAAE;;+CACQ;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;;4DACV;AAGhC;IADC,IAAA,mBAAS,EAAC,mBAAmB,EAAE,QAAQ,CAAC;;uDACD;AAGxC;IADC,IAAA,mBAAS,EAAC,aAAa,EAAE,QAAQ,CAAC;;iDACP;AAG5B;IADC,IAAA,mBAAS,EAAC,cAAc,EAAE,QAAQ,CAAC;;kDACN;AAG9B;IADC,IAAA,mBAAS,EAAC,aAAa,EAAE,QAAQ,CAAC;;iDACP;AAG5B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDACb;AAG5B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0DACH;sBAhCzB,WAAW;IADvB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,WAAW,CAiCvB"}
@@ -0,0 +1,10 @@
1
+ import { User, WithTimestamps } from '@n8n/db';
2
+ import { OAuthClient } from './oauth-client.entity';
3
+ export declare class RefreshToken extends WithTimestamps {
4
+ token: string;
5
+ client: OAuthClient;
6
+ clientId: string;
7
+ user: User;
8
+ userId: string;
9
+ expiresAt: number;
10
+ }
@@ -0,0 +1,49 @@
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.RefreshToken = void 0;
13
+ const db_1 = require("@n8n/db");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_client_entity_1 = require("./oauth-client.entity");
16
+ let RefreshToken = class RefreshToken extends db_1.WithTimestamps {
17
+ };
18
+ exports.RefreshToken = RefreshToken;
19
+ __decorate([
20
+ (0, typeorm_1.Column)({ type: 'varchar', primary: true }),
21
+ __metadata("design:type", String)
22
+ ], RefreshToken.prototype, "token", void 0);
23
+ __decorate([
24
+ (0, typeorm_1.ManyToOne)(() => oauth_client_entity_1.OAuthClient, (client) => client.refreshTokens, { onDelete: 'CASCADE' }),
25
+ __metadata("design:type", oauth_client_entity_1.OAuthClient)
26
+ ], RefreshToken.prototype, "client", void 0);
27
+ __decorate([
28
+ (0, typeorm_1.Index)(),
29
+ (0, typeorm_1.Column)({ type: String }),
30
+ __metadata("design:type", String)
31
+ ], RefreshToken.prototype, "clientId", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.ManyToOne)(() => db_1.User, { onDelete: 'CASCADE' }),
34
+ __metadata("design:type", db_1.User)
35
+ ], RefreshToken.prototype, "user", void 0);
36
+ __decorate([
37
+ (0, typeorm_1.Index)(),
38
+ (0, typeorm_1.Column)({ type: String }),
39
+ __metadata("design:type", String)
40
+ ], RefreshToken.prototype, "userId", void 0);
41
+ __decorate([
42
+ (0, typeorm_1.Index)(),
43
+ (0, typeorm_1.Column)({ type: 'int' }),
44
+ __metadata("design:type", Number)
45
+ ], RefreshToken.prototype, "expiresAt", void 0);
46
+ exports.RefreshToken = RefreshToken = __decorate([
47
+ (0, typeorm_1.Entity)('oauth_refresh_tokens')
48
+ ], RefreshToken);
49
+ //# sourceMappingURL=oauth-refresh-token.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-refresh-token.entity.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/entities/oauth-refresh-token.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAA+C;AAC/C,0CAAgE;AAEhE,+DAAoD;AAG7C,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,mBAAc;CAyB/C,CAAA;AAzBY,oCAAY;AAExB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;2CAC7B;AAOd;IALC,IAAA,mBAAS,EACT,GAAG,EAAE,CAAC,iCAAW,EACjB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAChC,EAAE,QAAQ,EAAE,SAAS,EAAE,CACvB;8BACO,iCAAW;4CAAC;AAIpB;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CACR;AAGjB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,SAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;8BACzC,SAAI;0CAAC;AAIX;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CACV;AAIf;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;+CACN;uBAxBN,YAAY;IADxB,IAAA,gBAAM,EAAC,sBAAsB,CAAC;GAClB,YAAY,CAyBxB"}
@@ -0,0 +1,10 @@
1
+ import { User } from '@n8n/db';
2
+ import { OAuthClient } from './oauth-client.entity';
3
+ export declare class UserConsent {
4
+ id: number;
5
+ user: User;
6
+ userId: string;
7
+ client: OAuthClient;
8
+ clientId: string;
9
+ grantedAt: number;
10
+ }
@@ -0,0 +1,49 @@
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.UserConsent = void 0;
13
+ const db_1 = require("@n8n/db");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_client_entity_1 = require("./oauth-client.entity");
16
+ let UserConsent = class UserConsent {
17
+ };
18
+ exports.UserConsent = UserConsent;
19
+ __decorate([
20
+ (0, typeorm_1.PrimaryGeneratedColumn)(),
21
+ __metadata("design:type", Number)
22
+ ], UserConsent.prototype, "id", void 0);
23
+ __decorate([
24
+ (0, typeorm_1.ManyToOne)(() => db_1.User, { onDelete: 'CASCADE' }),
25
+ __metadata("design:type", db_1.User)
26
+ ], UserConsent.prototype, "user", void 0);
27
+ __decorate([
28
+ (0, typeorm_1.Index)(),
29
+ (0, typeorm_1.Column)({ type: String }),
30
+ __metadata("design:type", String)
31
+ ], UserConsent.prototype, "userId", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.ManyToOne)(() => oauth_client_entity_1.OAuthClient, (client) => client.userConsents, { onDelete: 'CASCADE' }),
34
+ __metadata("design:type", oauth_client_entity_1.OAuthClient)
35
+ ], UserConsent.prototype, "client", void 0);
36
+ __decorate([
37
+ (0, typeorm_1.Index)(),
38
+ (0, typeorm_1.Column)({ type: String }),
39
+ __metadata("design:type", String)
40
+ ], UserConsent.prototype, "clientId", void 0);
41
+ __decorate([
42
+ (0, typeorm_1.Column)({ type: 'bigint' }),
43
+ __metadata("design:type", Number)
44
+ ], UserConsent.prototype, "grantedAt", void 0);
45
+ exports.UserConsent = UserConsent = __decorate([
46
+ (0, typeorm_1.Entity)('oauth_user_consents'),
47
+ (0, typeorm_1.Unique)(['userId', 'clientId'])
48
+ ], UserConsent);
49
+ //# sourceMappingURL=oauth-user-consent.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-user-consent.entity.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/entities/oauth-user-consent.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAA+B;AAC/B,0CAAgG;AAEhG,+DAAoD;AAI7C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAwBvB,CAAA;AAxBY,kCAAW;AAEvB;IADC,IAAA,gCAAsB,GAAE;;uCACd;AAGX;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,SAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;8BACzC,SAAI;yCAAC;AAIX;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;2CACV;AAOf;IALC,IAAA,mBAAS,EACT,GAAG,EAAE,CAAC,iCAAW,EACjB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAC/B,EAAE,QAAQ,EAAE,SAAS,EAAE,CACvB;8BACO,iCAAW;2CAAC;AAIpB;IAFC,IAAA,eAAK,GAAE;IACP,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6CACR;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;8CACT;sBAvBN,WAAW;IAFvB,IAAA,gBAAM,EAAC,qBAAqB,CAAC;IAC7B,IAAA,gBAAM,EAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;GAClB,WAAW,CAwBvB"}
@@ -0,0 +1,5 @@
1
+ import { DataSource, Repository } from '@n8n/typeorm';
2
+ import { AccessToken } from '../entities/oauth-access-token.entity';
3
+ export declare class AccessTokenRepository extends Repository<AccessToken> {
4
+ constructor(dataSource: DataSource);
5
+ }
@@ -0,0 +1,26 @@
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.AccessTokenRepository = void 0;
13
+ const di_1 = require("@n8n/di");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_access_token_entity_1 = require("../entities/oauth-access-token.entity");
16
+ let AccessTokenRepository = class AccessTokenRepository extends typeorm_1.Repository {
17
+ constructor(dataSource) {
18
+ super(oauth_access_token_entity_1.AccessToken, dataSource.manager);
19
+ }
20
+ };
21
+ exports.AccessTokenRepository = AccessTokenRepository;
22
+ exports.AccessTokenRepository = AccessTokenRepository = __decorate([
23
+ (0, di_1.Service)(),
24
+ __metadata("design:paramtypes", [typeorm_1.DataSource])
25
+ ], AccessTokenRepository);
26
+ //# sourceMappingURL=oauth-access-token.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-access-token.repository.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/repositories/oauth-access-token.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,0CAAsD;AAEtD,qFAAoE;AAG7D,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,oBAAuB;IACjE,YAAY,UAAsB;QACjC,KAAK,CAAC,uCAAW,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACD,CAAA;AAJY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,YAAO,GAAE;qCAEe,oBAAU;GADtB,qBAAqB,CAIjC"}
@@ -0,0 +1,5 @@
1
+ import { DataSource, Repository } from '@n8n/typeorm';
2
+ import { AuthorizationCode } from '../entities/oauth-authorization-code.entity';
3
+ export declare class AuthorizationCodeRepository extends Repository<AuthorizationCode> {
4
+ constructor(dataSource: DataSource);
5
+ }
@@ -0,0 +1,26 @@
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.AuthorizationCodeRepository = void 0;
13
+ const di_1 = require("@n8n/di");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_authorization_code_entity_1 = require("../entities/oauth-authorization-code.entity");
16
+ let AuthorizationCodeRepository = class AuthorizationCodeRepository extends typeorm_1.Repository {
17
+ constructor(dataSource) {
18
+ super(oauth_authorization_code_entity_1.AuthorizationCode, dataSource.manager);
19
+ }
20
+ };
21
+ exports.AuthorizationCodeRepository = AuthorizationCodeRepository;
22
+ exports.AuthorizationCodeRepository = AuthorizationCodeRepository = __decorate([
23
+ (0, di_1.Service)(),
24
+ __metadata("design:paramtypes", [typeorm_1.DataSource])
25
+ ], AuthorizationCodeRepository);
26
+ //# sourceMappingURL=oauth-authorization-code.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-authorization-code.repository.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/repositories/oauth-authorization-code.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,0CAAsD;AAEtD,iGAAgF;AAGzE,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,oBAA6B;IAC7E,YAAY,UAAsB;QACjC,KAAK,CAAC,mDAAiB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;CACD,CAAA;AAJY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,YAAO,GAAE;qCAEe,oBAAU;GADtB,2BAA2B,CAIvC"}
@@ -0,0 +1,5 @@
1
+ import { DataSource, Repository } from '@n8n/typeorm';
2
+ import { OAuthClient } from '../entities/oauth-client.entity';
3
+ export declare class OAuthClientRepository extends Repository<OAuthClient> {
4
+ constructor(dataSource: DataSource);
5
+ }
@@ -0,0 +1,26 @@
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.OAuthClientRepository = void 0;
13
+ const di_1 = require("@n8n/di");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_client_entity_1 = require("../entities/oauth-client.entity");
16
+ let OAuthClientRepository = class OAuthClientRepository extends typeorm_1.Repository {
17
+ constructor(dataSource) {
18
+ super(oauth_client_entity_1.OAuthClient, dataSource.manager);
19
+ }
20
+ };
21
+ exports.OAuthClientRepository = OAuthClientRepository;
22
+ exports.OAuthClientRepository = OAuthClientRepository = __decorate([
23
+ (0, di_1.Service)(),
24
+ __metadata("design:paramtypes", [typeorm_1.DataSource])
25
+ ], OAuthClientRepository);
26
+ //# sourceMappingURL=oauth-client.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-client.repository.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/repositories/oauth-client.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,0CAAsD;AAEtD,yEAA8D;AAGvD,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,oBAAuB;IACjE,YAAY,UAAsB;QACjC,KAAK,CAAC,iCAAW,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACD,CAAA;AAJY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,YAAO,GAAE;qCAEe,oBAAU;GADtB,qBAAqB,CAIjC"}
@@ -0,0 +1,5 @@
1
+ import { DataSource, Repository } from '@n8n/typeorm';
2
+ import { RefreshToken } from '../entities/oauth-refresh-token.entity';
3
+ export declare class RefreshTokenRepository extends Repository<RefreshToken> {
4
+ constructor(dataSource: DataSource);
5
+ }
@@ -0,0 +1,26 @@
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.RefreshTokenRepository = void 0;
13
+ const di_1 = require("@n8n/di");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_refresh_token_entity_1 = require("../entities/oauth-refresh-token.entity");
16
+ let RefreshTokenRepository = class RefreshTokenRepository extends typeorm_1.Repository {
17
+ constructor(dataSource) {
18
+ super(oauth_refresh_token_entity_1.RefreshToken, dataSource.manager);
19
+ }
20
+ };
21
+ exports.RefreshTokenRepository = RefreshTokenRepository;
22
+ exports.RefreshTokenRepository = RefreshTokenRepository = __decorate([
23
+ (0, di_1.Service)(),
24
+ __metadata("design:paramtypes", [typeorm_1.DataSource])
25
+ ], RefreshTokenRepository);
26
+ //# sourceMappingURL=oauth-refresh-token.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-refresh-token.repository.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/repositories/oauth-refresh-token.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,0CAAsD;AAEtD,uFAAsE;AAG/D,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,oBAAwB;IACnE,YAAY,UAAsB;QACjC,KAAK,CAAC,yCAAY,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACD,CAAA;AAJY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,YAAO,GAAE;qCAEe,oBAAU;GADtB,sBAAsB,CAIlC"}
@@ -0,0 +1,6 @@
1
+ import { DataSource, Repository } from '@n8n/typeorm';
2
+ import { UserConsent } from '../entities/oauth-user-consent.entity';
3
+ export declare class UserConsentRepository extends Repository<UserConsent> {
4
+ constructor(dataSource: DataSource);
5
+ findByUserWithClient(userId: string): Promise<UserConsent[]>;
6
+ }
@@ -0,0 +1,33 @@
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.UserConsentRepository = void 0;
13
+ const di_1 = require("@n8n/di");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const oauth_user_consent_entity_1 = require("../entities/oauth-user-consent.entity");
16
+ let UserConsentRepository = class UserConsentRepository extends typeorm_1.Repository {
17
+ constructor(dataSource) {
18
+ super(oauth_user_consent_entity_1.UserConsent, dataSource.manager);
19
+ }
20
+ async findByUserWithClient(userId) {
21
+ return await this.find({
22
+ where: { userId },
23
+ relations: ['client'],
24
+ order: { grantedAt: 'DESC' },
25
+ });
26
+ }
27
+ };
28
+ exports.UserConsentRepository = UserConsentRepository;
29
+ exports.UserConsentRepository = UserConsentRepository = __decorate([
30
+ (0, di_1.Service)(),
31
+ __metadata("design:paramtypes", [typeorm_1.DataSource])
32
+ ], UserConsentRepository);
33
+ //# sourceMappingURL=oauth-user-consent.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-user-consent.repository.js","sourceRoot":"","sources":["../../../../../src/modules/mcp/database/repositories/oauth-user-consent.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,0CAAsD;AAEtD,qFAAoE;AAG7D,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,oBAAuB;IACjE,YAAY,UAAsB;QACjC,KAAK,CAAC,uCAAW,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAKD,KAAK,CAAC,oBAAoB,CAAC,MAAc;QACxC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC;YACtB,KAAK,EAAE,EAAE,MAAM,EAAE;YACjB,SAAS,EAAE,CAAC,QAAQ,CAAC;YACrB,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;SAC5B,CAAC,CAAC;IACJ,CAAC;CACD,CAAA;AAfY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,YAAO,GAAE;qCAEe,oBAAU;GADtB,qBAAqB,CAejC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ import { Z } from 'zod-class';
3
+ declare const ApproveConsentRequestDto_base: Z.Class<{
4
+ approved: z.ZodBoolean;
5
+ }>;
6
+ export declare class ApproveConsentRequestDto extends ApproveConsentRequestDto_base {
7
+ }
8
+ export {};
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApproveConsentRequestDto = void 0;
4
+ const zod_1 = require("zod");
5
+ const zod_class_1 = require("zod-class");
6
+ class ApproveConsentRequestDto extends zod_class_1.Z.class({
7
+ approved: zod_1.z.boolean(),
8
+ }) {
9
+ }
10
+ exports.ApproveConsentRequestDto = ApproveConsentRequestDto;
11
+ //# sourceMappingURL=approve-consent-request.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve-consent-request.dto.js","sourceRoot":"","sources":["../../../../src/modules/mcp/dto/approve-consent-request.dto.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,yCAA8B;AAE9B,MAAa,wBAAyB,SAAQ,aAAC,CAAC,KAAK,CAAC;IACrD,QAAQ,EAAE,OAAC,CAAC,OAAO,EAAE;CACrB,CAAC;CAAG;AAFL,4DAEK"}
@@ -1,25 +1,22 @@
1
1
  import { ApiKey, ApiKeyRepository, User, UserRepository } from '@n8n/db';
2
2
  import { EntityManager } from '@n8n/typeorm';
3
- import { NextFunction, Response, Request } from 'express';
4
3
  import { JwtService } from '../../services/jwt.service';
5
- import { Telemetry } from '../../telemetry';
4
+ import { AccessTokenRepository } from './database/repositories/oauth-access-token.repository';
6
5
  export declare class McpServerApiKeyService {
7
6
  private readonly apiKeyRepository;
8
7
  private readonly jwtService;
9
8
  private readonly userRepository;
10
- private readonly telemetry;
11
- constructor(apiKeyRepository: ApiKeyRepository, jwtService: JwtService, userRepository: UserRepository, telemetry: Telemetry);
9
+ private readonly accessTokenRepository;
10
+ constructor(apiKeyRepository: ApiKeyRepository, jwtService: JwtService, userRepository: UserRepository, accessTokenRepository: AccessTokenRepository);
12
11
  createMcpServerApiKey(user: User, trx?: EntityManager): Promise<ApiKey>;
13
12
  findServerApiKeyForUser(user: User, { redact }?: {
14
13
  redact?: boolean | undefined;
15
14
  }): Promise<ApiKey | null>;
16
- private getUserForApiKey;
15
+ getUserForApiKey(apiKey: string): Promise<User | null>;
16
+ verifyApiKey(apiKey: string): Promise<User | null>;
17
+ getUserForAccessToken(token: string): Promise<User | null>;
17
18
  deleteAllMcpApiKeysForUser(user: User, trx?: EntityManager): Promise<void>;
18
19
  private redactApiKey;
19
- private extractAPIKeyFromHeader;
20
- getAuthMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void>;
21
- private responseWithUnauthorized;
22
- private trackUnauthorizedEvent;
23
20
  getOrCreateApiKey(user: User): Promise<ApiKey>;
24
21
  rotateMcpServerApiKey(user: User): Promise<ApiKey>;
25
22
  }
@@ -13,11 +13,8 @@ exports.McpServerApiKeyService = void 0;
13
13
  const db_1 = require("@n8n/db");
14
14
  const di_1 = require("@n8n/di");
15
15
  const crypto_1 = require("crypto");
16
- const mcp_constants_1 = require("./mcp.constants");
17
- const mcp_utils_1 = require("./mcp.utils");
18
- const auth_error_1 = require("../../errors/response-errors/auth.error");
19
16
  const jwt_service_1 = require("../../services/jwt.service");
20
- const telemetry_1 = require("../../telemetry");
17
+ const oauth_access_token_repository_1 = require("./database/repositories/oauth-access-token.repository");
21
18
  const API_KEY_AUDIENCE = 'mcp-server-api';
22
19
  const API_KEY_ISSUER = 'n8n';
23
20
  const REDACT_API_KEY_REVEAL_COUNT = 4;
@@ -25,11 +22,11 @@ const REDACT_API_KEY_MAX_LENGTH = 10;
25
22
  const API_KEY_LABEL = 'MCP Server API Key';
26
23
  const REDACT_API_KEY_MIN_HIDDEN_CHARS = 6;
27
24
  let McpServerApiKeyService = class McpServerApiKeyService {
28
- constructor(apiKeyRepository, jwtService, userRepository, telemetry) {
25
+ constructor(apiKeyRepository, jwtService, userRepository, accessTokenRepository) {
29
26
  this.apiKeyRepository = apiKeyRepository;
30
27
  this.jwtService = jwtService;
31
28
  this.userRepository = userRepository;
32
- this.telemetry = telemetry;
29
+ this.accessTokenRepository = accessTokenRepository;
33
30
  }
34
31
  async createMcpServerApiKey(user, trx) {
35
32
  const manager = trx ?? this.apiKeyRepository.manager;
@@ -72,6 +69,34 @@ let McpServerApiKeyService = class McpServerApiKeyService {
72
69
  relations: ['role'],
73
70
  });
74
71
  }
72
+ async verifyApiKey(apiKey) {
73
+ try {
74
+ this.jwtService.verify(apiKey, {
75
+ issuer: API_KEY_ISSUER,
76
+ audience: API_KEY_AUDIENCE,
77
+ });
78
+ return await this.getUserForApiKey(apiKey);
79
+ }
80
+ catch (error) {
81
+ return null;
82
+ }
83
+ }
84
+ async getUserForAccessToken(token) {
85
+ const accessToken = await this.accessTokenRepository.findOne({
86
+ where: {
87
+ token,
88
+ },
89
+ });
90
+ if (!accessToken) {
91
+ return null;
92
+ }
93
+ return await this.userRepository.findOne({
94
+ where: {
95
+ id: accessToken.userId,
96
+ },
97
+ relations: ['role'],
98
+ });
99
+ }
75
100
  async deleteAllMcpApiKeysForUser(user, trx) {
76
101
  const manager = trx ?? this.apiKeyRepository.manager;
77
102
  await manager.delete(db_1.ApiKey, {
@@ -87,60 +112,6 @@ let McpServerApiKeyService = class McpServerApiKeyService {
87
112
  const redactedPart = '*'.repeat(Math.max(0, REDACT_API_KEY_MAX_LENGTH - REDACT_API_KEY_REVEAL_COUNT));
88
113
  return redactedPart + visiblePart;
89
114
  }
90
- extractAPIKeyFromHeader(headerValue) {
91
- if (!headerValue.startsWith('Bearer')) {
92
- throw new auth_error_1.AuthError('Invalid authorization header format');
93
- }
94
- const apiKeyMatch = headerValue.match(/^Bearer\s+(.+)$/i);
95
- if (apiKeyMatch) {
96
- return apiKeyMatch[1];
97
- }
98
- throw new auth_error_1.AuthError('Invalid authorization header format');
99
- }
100
- getAuthMiddleware() {
101
- return async (req, res, next) => {
102
- const authorizationHeader = req.header('authorization');
103
- if (!authorizationHeader) {
104
- this.responseWithUnauthorized(res, req);
105
- return;
106
- }
107
- const apiKey = this.extractAPIKeyFromHeader(authorizationHeader);
108
- if (!apiKey) {
109
- this.responseWithUnauthorized(res, req);
110
- return;
111
- }
112
- const user = await this.getUserForApiKey(apiKey);
113
- if (!user) {
114
- this.responseWithUnauthorized(res, req);
115
- return;
116
- }
117
- try {
118
- this.jwtService.verify(apiKey, {
119
- issuer: API_KEY_ISSUER,
120
- audience: API_KEY_AUDIENCE,
121
- });
122
- }
123
- catch (e) {
124
- this.responseWithUnauthorized(res, req);
125
- return;
126
- }
127
- req.user = user;
128
- next();
129
- };
130
- }
131
- responseWithUnauthorized(res, req) {
132
- this.trackUnauthorizedEvent(req);
133
- res.status(401).send({ message: mcp_constants_1.UNAUTHORIZED_ERROR_MESSAGE });
134
- }
135
- trackUnauthorizedEvent(req) {
136
- const clientInfo = (0, mcp_utils_1.getClientInfo)(req);
137
- this.telemetry.track(mcp_constants_1.USER_CONNECTED_TO_MCP_EVENT, {
138
- mcp_connection_status: 'error',
139
- error: mcp_constants_1.UNAUTHORIZED_ERROR_MESSAGE,
140
- client_name: clientInfo?.name,
141
- client_version: clientInfo?.version,
142
- });
143
- }
144
115
  async getOrCreateApiKey(user) {
145
116
  const apiKey = await this.apiKeyRepository.findOne({
146
117
  where: {
@@ -167,6 +138,6 @@ exports.McpServerApiKeyService = McpServerApiKeyService = __decorate([
167
138
  __metadata("design:paramtypes", [db_1.ApiKeyRepository,
168
139
  jwt_service_1.JwtService,
169
140
  db_1.UserRepository,
170
- telemetry_1.Telemetry])
141
+ oauth_access_token_repository_1.AccessTokenRepository])
171
142
  ], McpServerApiKeyService);
172
143
  //# sourceMappingURL=mcp-api-key.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-api-key.service.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp-api-key.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-api-key.service.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp-api-key.service.ts"],"names":[],"mappings":"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"}