@memberjunction/server 3.4.0 → 4.1.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.
Files changed (269) hide show
  1. package/README.md +689 -513
  2. package/dist/agents/skip-agent.d.ts +65 -0
  3. package/dist/agents/skip-agent.d.ts.map +1 -1
  4. package/dist/agents/skip-agent.js +63 -5
  5. package/dist/agents/skip-agent.js.map +1 -1
  6. package/dist/agents/skip-sdk.d.ts +163 -0
  7. package/dist/agents/skip-sdk.d.ts.map +1 -1
  8. package/dist/agents/skip-sdk.js +143 -12
  9. package/dist/agents/skip-sdk.js.map +1 -1
  10. package/dist/apolloServer/index.d.ts +0 -1
  11. package/dist/apolloServer/index.d.ts.map +1 -1
  12. package/dist/auth/APIKeyScopeAuth.d.ts +82 -0
  13. package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
  14. package/dist/auth/APIKeyScopeAuth.js +78 -0
  15. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  16. package/dist/auth/AuthProviderFactory.d.ts +35 -0
  17. package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
  18. package/dist/auth/AuthProviderFactory.js +51 -4
  19. package/dist/auth/AuthProviderFactory.js.map +1 -1
  20. package/dist/auth/BaseAuthProvider.d.ts +21 -0
  21. package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
  22. package/dist/auth/BaseAuthProvider.js +24 -9
  23. package/dist/auth/BaseAuthProvider.js.map +1 -1
  24. package/dist/auth/IAuthProvider.d.ts +32 -0
  25. package/dist/auth/IAuthProvider.d.ts.map +1 -1
  26. package/dist/auth/exampleNewUserSubClass.d.ts +5 -1
  27. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  28. package/dist/auth/exampleNewUserSubClass.js +21 -6
  29. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  30. package/dist/auth/index.d.ts +14 -0
  31. package/dist/auth/index.d.ts.map +1 -1
  32. package/dist/auth/index.js +35 -22
  33. package/dist/auth/index.js.map +1 -1
  34. package/dist/auth/initializeProviders.d.ts +3 -0
  35. package/dist/auth/initializeProviders.d.ts.map +1 -1
  36. package/dist/auth/initializeProviders.js +6 -0
  37. package/dist/auth/initializeProviders.js.map +1 -1
  38. package/dist/auth/newUsers.d.ts.map +1 -1
  39. package/dist/auth/newUsers.js +14 -3
  40. package/dist/auth/newUsers.js.map +1 -1
  41. package/dist/auth/providers/Auth0Provider.d.ts +9 -0
  42. package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
  43. package/dist/auth/providers/Auth0Provider.js +10 -0
  44. package/dist/auth/providers/Auth0Provider.js.map +1 -1
  45. package/dist/auth/providers/CognitoProvider.d.ts +9 -0
  46. package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
  47. package/dist/auth/providers/CognitoProvider.js +10 -0
  48. package/dist/auth/providers/CognitoProvider.js.map +1 -1
  49. package/dist/auth/providers/GoogleProvider.d.ts +9 -0
  50. package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
  51. package/dist/auth/providers/GoogleProvider.js +11 -1
  52. package/dist/auth/providers/GoogleProvider.js.map +1 -1
  53. package/dist/auth/providers/MSALProvider.d.ts +9 -0
  54. package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
  55. package/dist/auth/providers/MSALProvider.js +10 -0
  56. package/dist/auth/providers/MSALProvider.js.map +1 -1
  57. package/dist/auth/providers/OktaProvider.d.ts +9 -0
  58. package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
  59. package/dist/auth/providers/OktaProvider.js +10 -0
  60. package/dist/auth/providers/OktaProvider.js.map +1 -1
  61. package/dist/config.d.ts +12 -0
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js +42 -8
  64. package/dist/config.js.map +1 -1
  65. package/dist/context.d.ts +8 -1
  66. package/dist/context.d.ts.map +1 -1
  67. package/dist/context.js +26 -4
  68. package/dist/context.js.map +1 -1
  69. package/dist/directives/Public.js +2 -0
  70. package/dist/directives/Public.js.map +1 -1
  71. package/dist/entitySubclasses/entityPermissions.server.d.ts +7 -2
  72. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  73. package/dist/entitySubclasses/entityPermissions.server.js +26 -8
  74. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  75. package/dist/generated/generated.d.ts +539 -2
  76. package/dist/generated/generated.d.ts.map +1 -1
  77. package/dist/generated/generated.js +9985 -14951
  78. package/dist/generated/generated.js.map +1 -1
  79. package/dist/generic/DeleteOptionsInput.d.ts +3 -0
  80. package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
  81. package/dist/generic/DeleteOptionsInput.js +3 -2
  82. package/dist/generic/DeleteOptionsInput.js.map +1 -1
  83. package/dist/generic/KeyInputOutputTypes.js +0 -6
  84. package/dist/generic/KeyInputOutputTypes.js.map +1 -1
  85. package/dist/generic/KeyValuePairInput.d.ts +4 -0
  86. package/dist/generic/KeyValuePairInput.d.ts.map +1 -1
  87. package/dist/generic/KeyValuePairInput.js +4 -2
  88. package/dist/generic/KeyValuePairInput.js.map +1 -1
  89. package/dist/generic/PushStatusResolver.js +0 -3
  90. package/dist/generic/PushStatusResolver.js.map +1 -1
  91. package/dist/generic/ResolverBase.d.ts +58 -0
  92. package/dist/generic/ResolverBase.d.ts.map +1 -1
  93. package/dist/generic/ResolverBase.js +203 -18
  94. package/dist/generic/ResolverBase.js.map +1 -1
  95. package/dist/generic/RunViewResolver.d.ts +22 -0
  96. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  97. package/dist/generic/RunViewResolver.js +42 -108
  98. package/dist/generic/RunViewResolver.js.map +1 -1
  99. package/dist/index.d.ts +12 -0
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +94 -37
  102. package/dist/index.js.map +1 -1
  103. package/dist/orm.d.ts.map +1 -1
  104. package/dist/orm.js +2 -1
  105. package/dist/orm.js.map +1 -1
  106. package/dist/resolvers/APIKeyResolver.d.ts +74 -0
  107. package/dist/resolvers/APIKeyResolver.d.ts.map +1 -1
  108. package/dist/resolvers/APIKeyResolver.js +49 -10
  109. package/dist/resolvers/APIKeyResolver.js.map +1 -1
  110. package/dist/resolvers/ActionResolver.d.ts +189 -0
  111. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  112. package/dist/resolvers/ActionResolver.js +152 -21
  113. package/dist/resolvers/ActionResolver.js.map +1 -1
  114. package/dist/resolvers/ColorResolver.js +0 -5
  115. package/dist/resolvers/ColorResolver.js.map +1 -1
  116. package/dist/resolvers/ComponentRegistryResolver.d.ts +65 -0
  117. package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
  118. package/dist/resolvers/ComponentRegistryResolver.js +118 -40
  119. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  120. package/dist/resolvers/CreateQueryResolver.d.ts +47 -0
  121. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  122. package/dist/resolvers/CreateQueryResolver.js +92 -116
  123. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  124. package/dist/resolvers/DatasetResolver.js +2 -14
  125. package/dist/resolvers/DatasetResolver.js.map +1 -1
  126. package/dist/resolvers/EntityCommunicationsResolver.d.ts +40 -0
  127. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  128. package/dist/resolvers/EntityCommunicationsResolver.js +2 -36
  129. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  130. package/dist/resolvers/EntityRecordNameResolver.js +0 -7
  131. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  132. package/dist/resolvers/FileCategoryResolver.d.ts +1 -1
  133. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  134. package/dist/resolvers/FileCategoryResolver.js +15 -3
  135. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  136. package/dist/resolvers/FileResolver.d.ts +16 -0
  137. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  138. package/dist/resolvers/FileResolver.js +59 -74
  139. package/dist/resolvers/FileResolver.js.map +1 -1
  140. package/dist/resolvers/GetDataContextDataResolver.d.ts +18 -1
  141. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  142. package/dist/resolvers/GetDataContextDataResolver.js +17 -9
  143. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  144. package/dist/resolvers/GetDataResolver.d.ts +19 -0
  145. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  146. package/dist/resolvers/GetDataResolver.js +35 -35
  147. package/dist/resolvers/GetDataResolver.js.map +1 -1
  148. package/dist/resolvers/InfoResolver.d.ts +2 -2
  149. package/dist/resolvers/InfoResolver.d.ts.map +1 -1
  150. package/dist/resolvers/InfoResolver.js +17 -20
  151. package/dist/resolvers/InfoResolver.js.map +1 -1
  152. package/dist/resolvers/MCPResolver.d.ts +325 -1
  153. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  154. package/dist/resolvers/MCPResolver.js +931 -24
  155. package/dist/resolvers/MCPResolver.js.map +1 -1
  156. package/dist/resolvers/MergeRecordsResolver.js +3 -29
  157. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  158. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
  159. package/dist/resolvers/PotentialDuplicateRecordResolver.js +0 -3
  160. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
  161. package/dist/resolvers/QueryResolver.d.ts +20 -0
  162. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  163. package/dist/resolvers/QueryResolver.js +44 -36
  164. package/dist/resolvers/QueryResolver.js.map +1 -1
  165. package/dist/resolvers/ReportResolver.d.ts +3 -0
  166. package/dist/resolvers/ReportResolver.d.ts.map +1 -1
  167. package/dist/resolvers/ReportResolver.js +9 -10
  168. package/dist/resolvers/ReportResolver.js.map +1 -1
  169. package/dist/resolvers/RunAIAgentResolver.d.ts +54 -0
  170. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  171. package/dist/resolvers/RunAIAgentResolver.js +116 -40
  172. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  173. package/dist/resolvers/RunAIPromptResolver.d.ts +42 -0
  174. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  175. package/dist/resolvers/RunAIPromptResolver.js +95 -22
  176. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  177. package/dist/resolvers/RunTemplateResolver.js +9 -6
  178. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  179. package/dist/resolvers/RunTestResolver.d.ts +12 -0
  180. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  181. package/dist/resolvers/RunTestResolver.js +35 -21
  182. package/dist/resolvers/RunTestResolver.js.map +1 -1
  183. package/dist/resolvers/SqlLoggingConfigResolver.d.ts +312 -0
  184. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  185. package/dist/resolvers/SqlLoggingConfigResolver.js +295 -45
  186. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  187. package/dist/resolvers/SyncDataResolver.d.ts +21 -0
  188. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  189. package/dist/resolvers/SyncDataResolver.js +36 -22
  190. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  191. package/dist/resolvers/SyncRolesUsersResolver.d.ts +14 -0
  192. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  193. package/dist/resolvers/SyncRolesUsersResolver.js +54 -21
  194. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  195. package/dist/resolvers/TaskResolver.d.ts +13 -0
  196. package/dist/resolvers/TaskResolver.d.ts.map +1 -1
  197. package/dist/resolvers/TaskResolver.js +22 -7
  198. package/dist/resolvers/TaskResolver.js.map +1 -1
  199. package/dist/resolvers/TelemetryResolver.d.ts +22 -0
  200. package/dist/resolvers/TelemetryResolver.d.ts.map +1 -1
  201. package/dist/resolvers/TelemetryResolver.js +45 -79
  202. package/dist/resolvers/TelemetryResolver.js.map +1 -1
  203. package/dist/resolvers/TransactionGroupResolver.js +11 -13
  204. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  205. package/dist/resolvers/UserFavoriteResolver.js +3 -12
  206. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  207. package/dist/resolvers/UserResolver.js +10 -0
  208. package/dist/resolvers/UserResolver.js.map +1 -1
  209. package/dist/resolvers/UserViewResolver.js +4 -0
  210. package/dist/resolvers/UserViewResolver.js.map +1 -1
  211. package/dist/resolvers/VersionHistoryResolver.d.ts +39 -0
  212. package/dist/resolvers/VersionHistoryResolver.d.ts.map +1 -0
  213. package/dist/resolvers/VersionHistoryResolver.js +208 -0
  214. package/dist/resolvers/VersionHistoryResolver.js.map +1 -0
  215. package/dist/rest/EntityCRUDHandler.d.ts +19 -0
  216. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  217. package/dist/rest/EntityCRUDHandler.js +55 -0
  218. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  219. package/dist/rest/OAuthCallbackHandler.d.ts +143 -0
  220. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -0
  221. package/dist/rest/OAuthCallbackHandler.js +634 -0
  222. package/dist/rest/OAuthCallbackHandler.js.map +1 -0
  223. package/dist/rest/RESTEndpointHandler.d.ts +120 -0
  224. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  225. package/dist/rest/RESTEndpointHandler.js +213 -24
  226. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  227. package/dist/rest/ViewOperationsHandler.d.ts +19 -0
  228. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  229. package/dist/rest/ViewOperationsHandler.js +39 -0
  230. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  231. package/dist/rest/index.d.ts +1 -0
  232. package/dist/rest/index.d.ts.map +1 -1
  233. package/dist/rest/index.js +1 -0
  234. package/dist/rest/index.js.map +1 -1
  235. package/dist/rest/setupRESTEndpoints.d.ts +35 -0
  236. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  237. package/dist/rest/setupRESTEndpoints.js +15 -1
  238. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  239. package/dist/services/ScheduledJobsService.d.ts +31 -0
  240. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  241. package/dist/services/ScheduledJobsService.js +38 -4
  242. package/dist/services/ScheduledJobsService.js.map +1 -1
  243. package/dist/services/TaskOrchestrator.d.ts +73 -0
  244. package/dist/services/TaskOrchestrator.d.ts.map +1 -1
  245. package/dist/services/TaskOrchestrator.js +137 -15
  246. package/dist/services/TaskOrchestrator.js.map +1 -1
  247. package/dist/types.d.ts +14 -0
  248. package/dist/types.d.ts.map +1 -1
  249. package/dist/types.js +0 -13
  250. package/dist/types.js.map +1 -1
  251. package/dist/util.d.ts +37 -1
  252. package/dist/util.d.ts.map +1 -1
  253. package/dist/util.js +55 -8
  254. package/dist/util.js.map +1 -1
  255. package/package.json +83 -78
  256. package/src/auth/exampleNewUserSubClass.ts +1 -5
  257. package/src/auth/newUsers.ts +4 -2
  258. package/src/entitySubclasses/entityPermissions.server.ts +1 -3
  259. package/src/generated/generated.ts +4707 -2664
  260. package/src/index.ts +73 -62
  261. package/src/resolvers/FileCategoryResolver.ts +1 -1
  262. package/src/resolvers/InfoResolver.ts +10 -6
  263. package/src/resolvers/MCPResolver.ts +910 -10
  264. package/src/resolvers/PotentialDuplicateRecordResolver.ts +0 -4
  265. package/src/resolvers/VersionHistoryResolver.ts +177 -0
  266. package/src/rest/OAuthCallbackHandler.ts +766 -0
  267. package/src/rest/RESTEndpointHandler.ts +58 -35
  268. package/src/rest/index.ts +2 -1
  269. package/src/rest/setupRESTEndpoints.ts +13 -12
@@ -0,0 +1,634 @@
1
+ /**
2
+ * @fileoverview OAuth Callback Handler for MCP OAuth flows
3
+ *
4
+ * Handles OAuth authorization callbacks from external authorization servers.
5
+ * This endpoint is unauthenticated since it's called by the auth server after user consent.
6
+ *
7
+ * Endpoints:
8
+ * - GET /api/v1/oauth/callback - Authorization callback
9
+ * - GET /api/v1/oauth/status/:stateParameter - Poll for authorization status (authenticated)
10
+ * - POST /api/v1/oauth/initiate - Initiate OAuth flow (authenticated)
11
+ *
12
+ * @module @memberjunction/server/rest/OAuthCallbackHandler
13
+ */
14
+ import express from 'express';
15
+ import { LogError, LogStatus, RunView } from '@memberjunction/core';
16
+ import { UserCache } from '@memberjunction/sqlserver-dataprovider';
17
+ import { OAuthManager, MCPClientManager } from '@memberjunction/ai-mcp-client';
18
+ /** Entity name for MCP Server Connections */
19
+ const ENTITY_MCP_SERVER_CONNECTIONS = 'MJ: MCP Server Connections';
20
+ /** Entity name for MCP Servers */
21
+ const ENTITY_MCP_SERVERS = 'MJ: MCP Servers';
22
+ /** Entity name for OAuth Authorization States */
23
+ const ENTITY_OAUTH_AUTHORIZATION_STATES = 'MJ: O Auth Authorization States';
24
+ /**
25
+ * Handles OAuth callbacks and related endpoints for MCP server authentication.
26
+ *
27
+ * The callback endpoint is unauthenticated because it's called by external auth servers.
28
+ * It uses the state parameter to look up the authorization context and validate the flow.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const oauthHandler = new OAuthCallbackHandler({
33
+ * publicUrl: 'https://api.example.com'
34
+ * });
35
+ *
36
+ * // Mount unauthenticated callback route
37
+ * app.use('/api/v1/oauth', oauthHandler.getCallbackRouter());
38
+ *
39
+ * // Mount authenticated routes
40
+ * app.use('/api/v1/oauth', authMiddleware, oauthHandler.getAuthenticatedRouter());
41
+ * ```
42
+ */
43
+ export class OAuthCallbackHandler {
44
+ constructor(options) {
45
+ this.options = {
46
+ successRedirectUrl: `${options.publicUrl}/oauth/success`,
47
+ errorRedirectUrl: `${options.publicUrl}/oauth/error`,
48
+ ...options
49
+ };
50
+ this.oauthManager = new OAuthManager();
51
+ this.callbackRouter = express.Router();
52
+ this.authenticatedRouter = express.Router();
53
+ this.setupRoutes();
54
+ }
55
+ /**
56
+ * Sets up all routes for OAuth handling.
57
+ */
58
+ setupRoutes() {
59
+ // Unauthenticated callback route
60
+ this.callbackRouter.get('/callback', this.handleCallback.bind(this));
61
+ // Success and error pages (unauthenticated - user is redirected here after OAuth)
62
+ this.callbackRouter.get('/success', this.handleSuccessPage.bind(this));
63
+ this.callbackRouter.get('/error', this.handleErrorPage.bind(this));
64
+ // Authenticated routes
65
+ this.authenticatedRouter.get('/status/:stateParameter', this.getStatus.bind(this));
66
+ this.authenticatedRouter.post('/initiate', this.initiateFlow.bind(this));
67
+ this.authenticatedRouter.post('/exchange', this.handleExchange.bind(this));
68
+ }
69
+ /**
70
+ * Renders a success page after OAuth authorization completes.
71
+ */
72
+ handleSuccessPage(req, res) {
73
+ const { state, connectionId } = req.query;
74
+ res.status(200).send(`
75
+ <!DOCTYPE html>
76
+ <html lang="en">
77
+ <head>
78
+ <meta charset="UTF-8">
79
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
80
+ <title>Authorization Successful</title>
81
+ <style>
82
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
83
+ .container { background: white; padding: 3rem; border-radius: 1rem; box-shadow: 0 20px 60px rgba(0,0,0,0.3); text-align: center; max-width: 400px; }
84
+ .icon { font-size: 4rem; margin-bottom: 1rem; }
85
+ h1 { color: #22c55e; margin: 0 0 1rem; }
86
+ p { color: #64748b; margin: 0 0 1.5rem; line-height: 1.6; }
87
+ .details { background: #f1f5f9; padding: 1rem; border-radius: 0.5rem; font-size: 0.875rem; color: #475569; word-break: break-all; }
88
+ </style>
89
+ </head>
90
+ <body>
91
+ <div class="container">
92
+ <div class="icon">✅</div>
93
+ <h1>Authorization Successful</h1>
94
+ <p>Your MCP server connection has been authorized. You can close this window and return to MemberJunction.</p>
95
+ ${connectionId ? `<div class="details">Connection ID: ${connectionId}</div>` : ''}
96
+ </div>
97
+ </body>
98
+ </html>
99
+ `);
100
+ }
101
+ /**
102
+ * Renders an error page when OAuth authorization fails.
103
+ */
104
+ handleErrorPage(req, res) {
105
+ const { error, error_description } = req.query;
106
+ const errorCode = error ? String(error) : 'unknown_error';
107
+ const errorMessage = error_description ? String(error_description) : 'An error occurred during authorization.';
108
+ res.status(200).send(`
109
+ <!DOCTYPE html>
110
+ <html lang="en">
111
+ <head>
112
+ <meta charset="UTF-8">
113
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
114
+ <title>Authorization Failed</title>
115
+ <style>
116
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
117
+ .container { background: white; padding: 3rem; border-radius: 1rem; box-shadow: 0 20px 60px rgba(0,0,0,0.3); text-align: center; max-width: 400px; }
118
+ .icon { font-size: 4rem; margin-bottom: 1rem; }
119
+ h1 { color: #ef4444; margin: 0 0 1rem; }
120
+ p { color: #64748b; margin: 0 0 1.5rem; line-height: 1.6; }
121
+ .error-code { background: #fef2f2; color: #991b1b; padding: 0.5rem 1rem; border-radius: 0.5rem; font-family: monospace; display: inline-block; margin-bottom: 1rem; }
122
+ .error-message { background: #f1f5f9; padding: 1rem; border-radius: 0.5rem; font-size: 0.875rem; color: #475569; }
123
+ </style>
124
+ </head>
125
+ <body>
126
+ <div class="container">
127
+ <div class="icon">❌</div>
128
+ <h1>Authorization Failed</h1>
129
+ <div class="error-code">${errorCode}</div>
130
+ <div class="error-message">${errorMessage}</div>
131
+ <p style="margin-top: 1.5rem;">Please close this window and try again.</p>
132
+ </div>
133
+ </body>
134
+ </html>
135
+ `);
136
+ }
137
+ /**
138
+ * Handles the OAuth authorization callback.
139
+ *
140
+ * This endpoint is unauthenticated - the auth server redirects here after user consent.
141
+ * We validate the state parameter and exchange the code for tokens.
142
+ *
143
+ * @param req - Express request
144
+ * @param res - Express response
145
+ */
146
+ async handleCallback(req, res) {
147
+ LogStatus(`[OAuth Callback] Received callback: ${req.originalUrl}`);
148
+ const { code, state, error, error_description } = req.query;
149
+ LogStatus(`[OAuth Callback] Parameters - state: ${state}, code: ${code ? 'present' : 'missing'}, error: ${error || 'none'}`);
150
+ // Validate state parameter is present
151
+ if (!state || typeof state !== 'string') {
152
+ this.redirectToError(res, 'invalid_request', 'Missing state parameter');
153
+ return;
154
+ }
155
+ try {
156
+ // Get system user for initial lookup
157
+ const systemUser = this.getSystemUser();
158
+ if (!systemUser) {
159
+ LogError('[OAuth Callback] System user not available');
160
+ this.redirectToError(res, 'server_error', 'System configuration error');
161
+ return;
162
+ }
163
+ // Look up the authorization state to get the user context
164
+ const authState = await this.loadAuthorizationState(state, systemUser);
165
+ if (!authState) {
166
+ this.redirectToError(res, 'invalid_state', 'Authorization state not found or expired');
167
+ return;
168
+ }
169
+ // Get the actual user from cache
170
+ const contextUser = UserCache.Users.find(u => u.ID === authState.userId);
171
+ if (!contextUser) {
172
+ LogError(`[OAuth Callback] User ${authState.userId} not found in cache`);
173
+ this.redirectToError(res, 'server_error', 'User context not found', authState.frontendReturnUrl);
174
+ return;
175
+ }
176
+ // Handle error from authorization server
177
+ if (error) {
178
+ const errorMessage = error_description ? String(error_description) : 'Authorization denied';
179
+ await this.oauthManager.handleAuthorizationError(state, String(error), errorMessage, contextUser);
180
+ this.redirectToError(res, String(error), errorMessage, authState.frontendReturnUrl);
181
+ return;
182
+ }
183
+ // Validate authorization code is present
184
+ if (!code || typeof code !== 'string') {
185
+ this.redirectToError(res, 'invalid_request', 'Missing authorization code', authState.frontendReturnUrl);
186
+ return;
187
+ }
188
+ // Exchange code for tokens
189
+ const result = await this.oauthManager.completeAuthorizationFlow(state, code, contextUser);
190
+ if (result.success) {
191
+ LogStatus(`[OAuth Callback] Authorization completed for state ${state}`);
192
+ // Notify MCPClientManager that authorization has completed
193
+ MCPClientManager.Instance.notifyOAuthAuthorizationCompleted(authState.connectionId, {
194
+ stateParameter: state,
195
+ completedAt: new Date().toISOString()
196
+ });
197
+ this.redirectToSuccess(res, state, authState.connectionId, authState.frontendReturnUrl);
198
+ }
199
+ else {
200
+ LogError(`[OAuth Callback] Authorization failed: ${result.errorMessage}`);
201
+ this.redirectToError(res, result.errorCode ?? 'authorization_failed', result.errorMessage ?? 'Authorization failed', authState.frontendReturnUrl);
202
+ }
203
+ }
204
+ catch (error) {
205
+ const errorMessage = error instanceof Error ? error.message : String(error);
206
+ LogError(`[OAuth Callback] Unexpected error: ${errorMessage}`);
207
+ this.redirectToError(res, 'server_error', 'An unexpected error occurred');
208
+ }
209
+ }
210
+ /**
211
+ * Gets the status of an OAuth authorization flow.
212
+ *
213
+ * Authenticated endpoint for polling authorization status.
214
+ *
215
+ * @param req - Express request
216
+ * @param res - Express response
217
+ */
218
+ async getStatus(req, res) {
219
+ const stateParam = req.params.stateParameter;
220
+ const stateParameter = Array.isArray(stateParam) ? stateParam[0] : stateParam || '';
221
+ const contextUser = req['mjUser'];
222
+ if (!contextUser) {
223
+ res.status(401).json({
224
+ success: false,
225
+ errorMessage: 'Authentication required'
226
+ });
227
+ return;
228
+ }
229
+ try {
230
+ const authState = await this.loadAuthorizationState(stateParameter, contextUser);
231
+ if (!authState) {
232
+ res.status(404).json({
233
+ success: false,
234
+ errorCode: 'not_found',
235
+ errorMessage: 'Authorization state not found'
236
+ });
237
+ return;
238
+ }
239
+ // Verify user owns this state
240
+ if (authState.userId !== contextUser.ID) {
241
+ res.status(403).json({
242
+ success: false,
243
+ errorCode: 'forbidden',
244
+ errorMessage: 'Access denied'
245
+ });
246
+ return;
247
+ }
248
+ // Map status
249
+ let status;
250
+ switch (authState.status) {
251
+ case 'Pending':
252
+ status = new Date() >= authState.expiresAt ? 'expired' : 'pending';
253
+ break;
254
+ case 'Completed':
255
+ status = 'completed';
256
+ break;
257
+ case 'Failed':
258
+ status = 'failed';
259
+ break;
260
+ case 'Expired':
261
+ status = 'expired';
262
+ break;
263
+ default:
264
+ status = 'pending';
265
+ }
266
+ res.json({
267
+ status,
268
+ connectionId: authState.connectionId,
269
+ completedAt: authState.completedAt?.toISOString(),
270
+ errorCode: authState.errorCode,
271
+ errorMessage: authState.errorDescription,
272
+ isRetryable: status === 'failed' || status === 'expired'
273
+ });
274
+ }
275
+ catch (error) {
276
+ const errorMessage = error instanceof Error ? error.message : String(error);
277
+ LogError(`[OAuth Status] Error: ${errorMessage}`);
278
+ res.status(500).json({
279
+ success: false,
280
+ errorCode: 'server_error',
281
+ errorMessage: 'Failed to get authorization status'
282
+ });
283
+ }
284
+ }
285
+ /**
286
+ * Initiates a new OAuth authorization flow.
287
+ *
288
+ * Authenticated endpoint for starting OAuth authorization.
289
+ *
290
+ * @param req - Express request
291
+ * @param res - Express response
292
+ */
293
+ async initiateFlow(req, res) {
294
+ const { connectionId, additionalScopes, frontendReturnUrl } = req.body;
295
+ const contextUser = req['mjUser'];
296
+ if (!contextUser) {
297
+ res.status(401).json({
298
+ success: false,
299
+ errorMessage: 'Authentication required'
300
+ });
301
+ return;
302
+ }
303
+ if (!connectionId) {
304
+ res.status(400).json({
305
+ success: false,
306
+ errorCode: 'invalid_request',
307
+ errorMessage: 'connectionId is required'
308
+ });
309
+ return;
310
+ }
311
+ try {
312
+ // Load connection and server config
313
+ const config = await this.loadConnectionConfig(connectionId, contextUser);
314
+ if (!config) {
315
+ res.status(404).json({
316
+ success: false,
317
+ errorCode: 'not_found',
318
+ errorMessage: 'Connection not found'
319
+ });
320
+ return;
321
+ }
322
+ // Build OAuth config
323
+ const oauthConfig = {
324
+ OAuthIssuerURL: config.OAuthIssuerURL,
325
+ OAuthScopes: additionalScopes
326
+ ? `${config.OAuthScopes ?? ''} ${additionalScopes}`.trim()
327
+ : config.OAuthScopes,
328
+ OAuthMetadataCacheTTLMinutes: config.OAuthMetadataCacheTTLMinutes,
329
+ OAuthClientID: config.OAuthClientID,
330
+ OAuthClientSecretEncrypted: config.OAuthClientSecretEncrypted,
331
+ OAuthRequirePKCE: config.OAuthRequirePKCE
332
+ };
333
+ if (!oauthConfig.OAuthIssuerURL) {
334
+ res.status(400).json({
335
+ success: false,
336
+ errorCode: 'invalid_configuration',
337
+ errorMessage: 'OAuth is not configured for this server'
338
+ });
339
+ return;
340
+ }
341
+ // Initiate the flow with optional frontend return URL
342
+ const result = await this.oauthManager.initiateAuthorizationFlow(connectionId, config.serverId, oauthConfig, this.options.publicUrl, contextUser, frontendReturnUrl ? { frontendReturnUrl: String(frontendReturnUrl) } : undefined);
343
+ if (result.success) {
344
+ res.json({
345
+ success: true,
346
+ authorizationUrl: result.authorizationUrl,
347
+ stateParameter: result.stateParameter,
348
+ expiresAt: result.expiresAt?.toISOString(),
349
+ message: 'Please redirect the user to the authorization URL'
350
+ });
351
+ }
352
+ else {
353
+ res.status(400).json({
354
+ success: false,
355
+ errorCode: 'initiation_failed',
356
+ errorMessage: result.errorMessage
357
+ });
358
+ }
359
+ }
360
+ catch (error) {
361
+ const errorMessage = error instanceof Error ? error.message : String(error);
362
+ LogError(`[OAuth Initiate] Error: ${errorMessage}`);
363
+ res.status(500).json({
364
+ success: false,
365
+ errorCode: 'server_error',
366
+ errorMessage: 'Failed to initiate OAuth flow'
367
+ });
368
+ }
369
+ }
370
+ /**
371
+ * Exchanges an authorization code for tokens.
372
+ *
373
+ * This endpoint is used when the frontend handles the OAuth callback.
374
+ * The frontend receives the code and state from the OAuth provider redirect,
375
+ * then calls this authenticated endpoint to complete the token exchange.
376
+ *
377
+ * @param req - Express request with { code, state } in body
378
+ * @param res - Express response
379
+ */
380
+ async handleExchange(req, res) {
381
+ const { code, state } = req.body;
382
+ const contextUser = req['mjUser'];
383
+ if (!contextUser) {
384
+ res.status(401).json({
385
+ success: false,
386
+ errorCode: 'unauthorized',
387
+ errorMessage: 'Authentication required'
388
+ });
389
+ return;
390
+ }
391
+ if (!code || typeof code !== 'string') {
392
+ res.status(400).json({
393
+ success: false,
394
+ errorCode: 'invalid_request',
395
+ errorMessage: 'Missing or invalid code parameter'
396
+ });
397
+ return;
398
+ }
399
+ if (!state || typeof state !== 'string') {
400
+ res.status(400).json({
401
+ success: false,
402
+ errorCode: 'invalid_request',
403
+ errorMessage: 'Missing or invalid state parameter'
404
+ });
405
+ return;
406
+ }
407
+ try {
408
+ // Load the authorization state to verify user ownership
409
+ const authState = await this.loadAuthorizationState(state, contextUser);
410
+ if (!authState) {
411
+ res.status(404).json({
412
+ success: false,
413
+ errorCode: 'state_not_found',
414
+ errorMessage: 'Authorization state not found or expired'
415
+ });
416
+ return;
417
+ }
418
+ // Verify the authenticated user owns this authorization state
419
+ if (authState.userId !== contextUser.ID) {
420
+ LogError(`[OAuth Exchange] User ${contextUser.ID} attempted to exchange code for state owned by ${authState.userId}`);
421
+ res.status(403).json({
422
+ success: false,
423
+ errorCode: 'forbidden',
424
+ errorMessage: 'You are not authorized to complete this authorization flow'
425
+ });
426
+ return;
427
+ }
428
+ // Exchange code for tokens using OAuthManager
429
+ const result = await this.oauthManager.completeAuthorizationFlow(state, code, contextUser);
430
+ if (result.success) {
431
+ LogStatus(`[OAuth Exchange] Successfully exchanged code for connection ${authState.connectionId}`);
432
+ // Notify MCPClientManager that authorization has completed
433
+ MCPClientManager.Instance.notifyOAuthAuthorizationCompleted(authState.connectionId, {
434
+ stateParameter: state,
435
+ completedAt: new Date().toISOString()
436
+ });
437
+ res.json({
438
+ success: true,
439
+ connectionId: authState.connectionId
440
+ });
441
+ }
442
+ else {
443
+ LogError(`[OAuth Exchange] Token exchange failed: ${result.errorMessage}`);
444
+ res.status(400).json({
445
+ success: false,
446
+ errorCode: result.errorCode ?? 'exchange_failed',
447
+ errorMessage: result.errorMessage ?? 'Failed to exchange authorization code for tokens',
448
+ isRetryable: result.isRetryable ?? false
449
+ });
450
+ }
451
+ }
452
+ catch (error) {
453
+ const errorMessage = error instanceof Error ? error.message : String(error);
454
+ LogError(`[OAuth Exchange] Unexpected error: ${errorMessage}`);
455
+ res.status(500).json({
456
+ success: false,
457
+ errorCode: 'server_error',
458
+ errorMessage: 'An unexpected error occurred during token exchange'
459
+ });
460
+ }
461
+ }
462
+ // ========================================
463
+ // Helper Methods
464
+ // ========================================
465
+ /**
466
+ * Gets the system user from cache.
467
+ */
468
+ getSystemUser() {
469
+ try {
470
+ return UserCache.Instance.GetSystemUser();
471
+ }
472
+ catch {
473
+ return null;
474
+ }
475
+ }
476
+ /**
477
+ * Loads authorization state from database.
478
+ */
479
+ async loadAuthorizationState(stateParameter, contextUser) {
480
+ try {
481
+ const rv = new RunView();
482
+ const result = await rv.RunView({
483
+ EntityName: ENTITY_OAUTH_AUTHORIZATION_STATES,
484
+ ExtraFilter: `StateParameter='${stateParameter.replace(/'/g, "''")}'`,
485
+ Fields: ['MCPServerConnectionID', 'UserID', 'Status', 'ErrorCode', 'ErrorDescription', 'ExpiresAt', 'CompletedAt', 'FrontendReturnURL'],
486
+ ResultType: 'simple'
487
+ }, contextUser);
488
+ if (!result.Success || !result.Results || result.Results.length === 0) {
489
+ return null;
490
+ }
491
+ const record = result.Results[0];
492
+ return {
493
+ connectionId: record.MCPServerConnectionID,
494
+ userId: record.UserID,
495
+ status: record.Status,
496
+ errorCode: record.ErrorCode ?? undefined,
497
+ errorDescription: record.ErrorDescription ?? undefined,
498
+ expiresAt: new Date(record.ExpiresAt),
499
+ completedAt: record.CompletedAt ? new Date(record.CompletedAt) : undefined,
500
+ frontendReturnUrl: record.FrontendReturnURL ?? undefined
501
+ };
502
+ }
503
+ catch (error) {
504
+ LogError(`[OAuth Callback] Failed to load authorization state: ${error}`);
505
+ return null;
506
+ }
507
+ }
508
+ /**
509
+ * Loads connection and server OAuth configuration.
510
+ */
511
+ async loadConnectionConfig(connectionId, contextUser) {
512
+ try {
513
+ const rv = new RunView();
514
+ // Get connection to get server ID
515
+ const connResult = await rv.RunView({
516
+ EntityName: ENTITY_MCP_SERVER_CONNECTIONS,
517
+ ExtraFilter: `ID='${connectionId}'`,
518
+ Fields: ['MCPServerID'],
519
+ ResultType: 'simple'
520
+ }, contextUser);
521
+ if (!connResult.Success || !connResult.Results || connResult.Results.length === 0) {
522
+ return null;
523
+ }
524
+ const serverId = connResult.Results[0].MCPServerID;
525
+ // Get server OAuth config
526
+ const serverResult = await rv.RunView({
527
+ EntityName: ENTITY_MCP_SERVERS,
528
+ ExtraFilter: `ID='${serverId}'`,
529
+ Fields: [
530
+ 'OAuthIssuerURL', 'OAuthScopes', 'OAuthMetadataCacheTTLMinutes',
531
+ 'OAuthClientID', 'OAuthClientSecretEncrypted', 'OAuthRequirePKCE'
532
+ ],
533
+ ResultType: 'simple'
534
+ }, contextUser);
535
+ if (!serverResult.Success || !serverResult.Results || serverResult.Results.length === 0) {
536
+ return null;
537
+ }
538
+ const server = serverResult.Results[0];
539
+ return {
540
+ serverId,
541
+ OAuthIssuerURL: server.OAuthIssuerURL ?? undefined,
542
+ OAuthScopes: server.OAuthScopes ?? undefined,
543
+ OAuthMetadataCacheTTLMinutes: server.OAuthMetadataCacheTTLMinutes ?? undefined,
544
+ OAuthClientID: server.OAuthClientID ?? undefined,
545
+ OAuthClientSecretEncrypted: server.OAuthClientSecretEncrypted ?? undefined,
546
+ OAuthRequirePKCE: server.OAuthRequirePKCE ?? undefined
547
+ };
548
+ }
549
+ catch (error) {
550
+ LogError(`[OAuth Callback] Failed to load connection config: ${error}`);
551
+ return null;
552
+ }
553
+ }
554
+ /**
555
+ * Redirects to success page with state info.
556
+ * If a frontend return URL is provided, redirects there instead of the default success page.
557
+ */
558
+ redirectToSuccess(res, state, connectionId, frontendReturnUrl) {
559
+ // If frontend return URL is provided, redirect there with success parameters
560
+ if (frontendReturnUrl) {
561
+ try {
562
+ const url = new URL(frontendReturnUrl);
563
+ url.searchParams.set('oauth', 'success');
564
+ url.searchParams.set('state', state);
565
+ url.searchParams.set('connectionId', connectionId);
566
+ LogStatus(`[OAuth Callback] Redirecting to frontend URL: ${url.toString()}`);
567
+ res.redirect(302, url.toString());
568
+ return;
569
+ }
570
+ catch (error) {
571
+ LogError(`[OAuth Callback] Invalid frontend return URL '${frontendReturnUrl}', falling back to default`);
572
+ // Fall through to default redirect
573
+ }
574
+ }
575
+ // Default: redirect to built-in success page
576
+ const url = new URL(this.options.successRedirectUrl);
577
+ url.searchParams.set('state', state);
578
+ url.searchParams.set('connectionId', connectionId);
579
+ res.redirect(302, url.toString());
580
+ }
581
+ /**
582
+ * Redirects to error page with error info.
583
+ * If a frontend return URL is provided, redirects there instead of the default error page.
584
+ */
585
+ redirectToError(res, errorCode, errorMessage, frontendReturnUrl) {
586
+ // If frontend return URL is provided, redirect there with error parameters
587
+ if (frontendReturnUrl) {
588
+ try {
589
+ const url = new URL(frontendReturnUrl);
590
+ url.searchParams.set('oauth', 'error');
591
+ url.searchParams.set('error', errorCode);
592
+ url.searchParams.set('error_description', errorMessage);
593
+ LogStatus(`[OAuth Callback] Redirecting to frontend URL with error: ${url.toString()}`);
594
+ res.redirect(302, url.toString());
595
+ return;
596
+ }
597
+ catch (error) {
598
+ LogError(`[OAuth Callback] Invalid frontend return URL '${frontendReturnUrl}', falling back to default`);
599
+ // Fall through to default redirect
600
+ }
601
+ }
602
+ // Default: redirect to built-in error page
603
+ const url = new URL(this.options.errorRedirectUrl);
604
+ url.searchParams.set('error', errorCode);
605
+ url.searchParams.set('error_description', errorMessage);
606
+ res.redirect(302, url.toString());
607
+ }
608
+ /**
609
+ * Gets the router for unauthenticated callback endpoint.
610
+ */
611
+ getCallbackRouter() {
612
+ return this.callbackRouter;
613
+ }
614
+ /**
615
+ * Gets the router for authenticated OAuth endpoints.
616
+ */
617
+ getAuthenticatedRouter() {
618
+ return this.authenticatedRouter;
619
+ }
620
+ }
621
+ /**
622
+ * Creates and configures the OAuth callback handler.
623
+ *
624
+ * @param options - Handler configuration
625
+ * @returns Object with callback and authenticated routers
626
+ */
627
+ export function createOAuthCallbackHandler(options) {
628
+ const handler = new OAuthCallbackHandler(options);
629
+ return {
630
+ callbackRouter: handler.getCallbackRouter(),
631
+ authenticatedRouter: handler.getAuthenticatedRouter()
632
+ };
633
+ }
634
+ //# sourceMappingURL=OAuthCallbackHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthCallbackHandler.js","sourceRoot":"","sources":["../../src/rest/OAuthCallbackHandler.ts"],"names":[],"mappings":"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"}