@samanhappy/mcphub 0.10.3 → 0.10.5

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 (40) hide show
  1. package/README.md +39 -1
  2. package/dist/config/index.js +24 -0
  3. package/dist/config/index.js.map +1 -1
  4. package/dist/constants/oauthServerDefaults.js +36 -0
  5. package/dist/constants/oauthServerDefaults.js.map +1 -0
  6. package/dist/controllers/oauthClientController.js +252 -0
  7. package/dist/controllers/oauthClientController.js.map +1 -0
  8. package/dist/controllers/oauthDynamicRegistrationController.js +479 -0
  9. package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -0
  10. package/dist/controllers/oauthServerController.js +449 -0
  11. package/dist/controllers/oauthServerController.js.map +1 -0
  12. package/dist/controllers/openApiController.js +6 -3
  13. package/dist/controllers/openApiController.js.map +1 -1
  14. package/dist/controllers/serverController.js +116 -23
  15. package/dist/controllers/serverController.js.map +1 -1
  16. package/dist/middlewares/auth.js +23 -2
  17. package/dist/middlewares/auth.js.map +1 -1
  18. package/dist/middlewares/userContext.js +27 -11
  19. package/dist/middlewares/userContext.js.map +1 -1
  20. package/dist/models/OAuth.js +291 -0
  21. package/dist/models/OAuth.js.map +1 -0
  22. package/dist/routes/index.js +25 -0
  23. package/dist/routes/index.js.map +1 -1
  24. package/dist/server.js +4 -1
  25. package/dist/server.js.map +1 -1
  26. package/dist/services/dataServicex.js +3 -0
  27. package/dist/services/dataServicex.js.map +1 -1
  28. package/dist/services/oauthServerService.js +339 -0
  29. package/dist/services/oauthServerService.js.map +1 -0
  30. package/dist/services/sseService.js +413 -45
  31. package/dist/services/sseService.js.map +1 -1
  32. package/dist/utils/oauthBearer.js +35 -0
  33. package/dist/utils/oauthBearer.js.map +1 -0
  34. package/frontend/dist/assets/index-qg3ysGil.js +251 -0
  35. package/frontend/dist/assets/index-qg3ysGil.js.map +1 -0
  36. package/frontend/dist/index.html +1 -1
  37. package/mcp_settings.json +23 -1
  38. package/package.json +2 -1
  39. package/frontend/dist/assets/index-BpPaTvxv.js +0 -251
  40. package/frontend/dist/assets/index-BpPaTvxv.js.map +0 -1
@@ -0,0 +1,339 @@
1
+ import OAuth2Server from '@node-oauth/oauth2-server';
2
+ import { loadSettings } from '../config/index.js';
3
+ import { findUserByUsername, verifyPassword } from '../models/User.js';
4
+ import { findOAuthClientById, saveAuthorizationCode, getAuthorizationCode, revokeAuthorizationCode, saveToken, getToken, revokeToken, } from '../models/OAuth.js';
5
+ import crypto from 'crypto';
6
+ const { Request, Response } = OAuth2Server;
7
+ // OAuth2Server model implementation
8
+ const oauthModel = {
9
+ /**
10
+ * Get client by client ID
11
+ */
12
+ getClient: async (clientId, clientSecret) => {
13
+ const client = findOAuthClientById(clientId);
14
+ if (!client) {
15
+ return false;
16
+ }
17
+ // If client secret is provided, verify it
18
+ if (clientSecret && client.clientSecret) {
19
+ if (client.clientSecret !== clientSecret) {
20
+ return false;
21
+ }
22
+ }
23
+ return {
24
+ id: client.clientId,
25
+ clientId: client.clientId,
26
+ clientSecret: client.clientSecret,
27
+ redirectUris: client.redirectUris,
28
+ grants: client.grants,
29
+ };
30
+ },
31
+ /**
32
+ * Save authorization code
33
+ */
34
+ saveAuthorizationCode: async (code, client, user) => {
35
+ const settings = loadSettings();
36
+ const oauthConfig = settings.systemConfig?.oauthServer;
37
+ const lifetime = oauthConfig?.authorizationCodeLifetime || 300;
38
+ const scopeString = Array.isArray(code.scope) ? code.scope.join(' ') : code.scope;
39
+ const authCode = saveAuthorizationCode({
40
+ redirectUri: code.redirectUri,
41
+ scope: scopeString,
42
+ clientId: client.id,
43
+ username: user.username,
44
+ codeChallenge: code.codeChallenge,
45
+ codeChallengeMethod: code.codeChallengeMethod,
46
+ }, lifetime);
47
+ return {
48
+ authorizationCode: authCode,
49
+ expiresAt: new Date(Date.now() + lifetime * 1000),
50
+ redirectUri: code.redirectUri,
51
+ scope: code.scope,
52
+ client,
53
+ user: {
54
+ username: user.username,
55
+ },
56
+ codeChallenge: code.codeChallenge,
57
+ codeChallengeMethod: code.codeChallengeMethod,
58
+ };
59
+ },
60
+ /**
61
+ * Get authorization code
62
+ */
63
+ getAuthorizationCode: async (authorizationCode) => {
64
+ const code = getAuthorizationCode(authorizationCode);
65
+ if (!code) {
66
+ return false;
67
+ }
68
+ const client = findOAuthClientById(code.clientId);
69
+ if (!client) {
70
+ return false;
71
+ }
72
+ const scopeArray = code.scope ? code.scope.split(' ') : undefined;
73
+ return {
74
+ authorizationCode: code.code,
75
+ expiresAt: code.expiresAt,
76
+ redirectUri: code.redirectUri,
77
+ scope: scopeArray,
78
+ client: {
79
+ id: client.clientId,
80
+ clientId: client.clientId,
81
+ clientSecret: client.clientSecret,
82
+ redirectUris: client.redirectUris,
83
+ grants: client.grants,
84
+ },
85
+ user: {
86
+ username: code.username,
87
+ },
88
+ codeChallenge: code.codeChallenge,
89
+ codeChallengeMethod: code.codeChallengeMethod,
90
+ };
91
+ },
92
+ /**
93
+ * Revoke authorization code
94
+ */
95
+ revokeAuthorizationCode: async (code) => {
96
+ revokeAuthorizationCode(code.authorizationCode);
97
+ return true;
98
+ },
99
+ /**
100
+ * Save access token and refresh token
101
+ */
102
+ saveToken: async (token, client, user) => {
103
+ const settings = loadSettings();
104
+ const oauthConfig = settings.systemConfig?.oauthServer;
105
+ const accessTokenLifetime = oauthConfig?.accessTokenLifetime || 3600;
106
+ const refreshTokenLifetime = oauthConfig?.refreshTokenLifetime || 1209600;
107
+ const scopeString = Array.isArray(token.scope) ? token.scope.join(' ') : token.scope;
108
+ const savedToken = saveToken({
109
+ scope: scopeString,
110
+ clientId: client.id,
111
+ username: user.username,
112
+ }, accessTokenLifetime, refreshTokenLifetime);
113
+ const scopeArray = savedToken.scope ? savedToken.scope.split(' ') : undefined;
114
+ return {
115
+ accessToken: savedToken.accessToken,
116
+ accessTokenExpiresAt: savedToken.accessTokenExpiresAt,
117
+ refreshToken: savedToken.refreshToken,
118
+ refreshTokenExpiresAt: savedToken.refreshTokenExpiresAt,
119
+ scope: scopeArray,
120
+ client,
121
+ user: {
122
+ username: user.username,
123
+ },
124
+ };
125
+ },
126
+ /**
127
+ * Get access token
128
+ */
129
+ getAccessToken: async (accessToken) => {
130
+ const token = getToken(accessToken);
131
+ if (!token) {
132
+ return false;
133
+ }
134
+ const client = findOAuthClientById(token.clientId);
135
+ if (!client) {
136
+ return false;
137
+ }
138
+ const scopeArray = token.scope ? token.scope.split(' ') : undefined;
139
+ return {
140
+ accessToken: token.accessToken,
141
+ accessTokenExpiresAt: token.accessTokenExpiresAt,
142
+ scope: scopeArray,
143
+ client: {
144
+ id: client.clientId,
145
+ clientId: client.clientId,
146
+ clientSecret: client.clientSecret,
147
+ redirectUris: client.redirectUris,
148
+ grants: client.grants,
149
+ },
150
+ user: {
151
+ username: token.username,
152
+ },
153
+ };
154
+ },
155
+ /**
156
+ * Get refresh token
157
+ */
158
+ getRefreshToken: async (refreshToken) => {
159
+ const token = getToken(refreshToken);
160
+ if (!token || token.refreshToken !== refreshToken) {
161
+ return false;
162
+ }
163
+ const client = findOAuthClientById(token.clientId);
164
+ if (!client) {
165
+ return false;
166
+ }
167
+ const scopeArray = token.scope ? token.scope.split(' ') : undefined;
168
+ return {
169
+ refreshToken: token.refreshToken,
170
+ refreshTokenExpiresAt: token.refreshTokenExpiresAt,
171
+ scope: scopeArray,
172
+ client: {
173
+ id: client.clientId,
174
+ clientId: client.clientId,
175
+ clientSecret: client.clientSecret,
176
+ redirectUris: client.redirectUris,
177
+ grants: client.grants,
178
+ },
179
+ user: {
180
+ username: token.username,
181
+ },
182
+ };
183
+ },
184
+ /**
185
+ * Revoke token
186
+ */
187
+ revokeToken: async (token) => {
188
+ const refreshToken = 'refreshToken' in token ? token.refreshToken : undefined;
189
+ if (refreshToken) {
190
+ revokeToken(refreshToken);
191
+ }
192
+ return true;
193
+ },
194
+ /**
195
+ * Verify scope
196
+ */
197
+ verifyScope: async (token, scope) => {
198
+ if (!token.scope) {
199
+ return false;
200
+ }
201
+ const requestedScopes = Array.isArray(scope) ? scope : scope.split(' ');
202
+ const tokenScopes = Array.isArray(token.scope) ? token.scope : token.scope.split(' ');
203
+ return requestedScopes.every((s) => tokenScopes.includes(s));
204
+ },
205
+ /**
206
+ * Validate scope
207
+ */
208
+ validateScope: async (user, client, scope) => {
209
+ const settings = loadSettings();
210
+ const oauthConfig = settings.systemConfig?.oauthServer;
211
+ const allowedScopes = oauthConfig?.allowedScopes || ['read', 'write'];
212
+ if (!scope || scope.length === 0) {
213
+ return allowedScopes;
214
+ }
215
+ const validScopes = scope.filter((s) => allowedScopes.includes(s));
216
+ return validScopes.length > 0 ? validScopes : false;
217
+ },
218
+ };
219
+ // Create OAuth2 server instance
220
+ let oauth = null;
221
+ /**
222
+ * Initialize OAuth server
223
+ */
224
+ export const initOAuthServer = () => {
225
+ const settings = loadSettings();
226
+ const oauthConfig = settings.systemConfig?.oauthServer;
227
+ const requireState = oauthConfig?.requireState === true;
228
+ if (!oauthConfig || !oauthConfig.enabled) {
229
+ console.log('OAuth authorization server is disabled or not configured');
230
+ return;
231
+ }
232
+ try {
233
+ oauth = new OAuth2Server({
234
+ model: oauthModel,
235
+ accessTokenLifetime: oauthConfig.accessTokenLifetime || 3600,
236
+ refreshTokenLifetime: oauthConfig.refreshTokenLifetime || 1209600,
237
+ authorizationCodeLifetime: oauthConfig.authorizationCodeLifetime || 300,
238
+ allowEmptyState: !requireState,
239
+ allowBearerTokensInQueryString: false,
240
+ // When requireClientSecret is false, allow PKCE without client secret
241
+ requireClientAuthentication: oauthConfig.requireClientSecret
242
+ ? { authorization_code: true, refresh_token: true }
243
+ : { authorization_code: false, refresh_token: false },
244
+ });
245
+ console.log('OAuth authorization server initialized successfully');
246
+ }
247
+ catch (error) {
248
+ console.error('Failed to initialize OAuth authorization server:', error);
249
+ oauth = null;
250
+ }
251
+ };
252
+ /**
253
+ * Get OAuth server instance
254
+ */
255
+ export const getOAuthServer = () => {
256
+ return oauth;
257
+ };
258
+ /**
259
+ * Check if OAuth server is enabled
260
+ */
261
+ export const isOAuthServerEnabled = () => {
262
+ return oauth !== null;
263
+ };
264
+ /**
265
+ * Authenticate user for OAuth authorization
266
+ */
267
+ export const authenticateUser = async (username, password) => {
268
+ const user = findUserByUsername(username);
269
+ if (!user) {
270
+ return null;
271
+ }
272
+ const isValid = await verifyPassword(password, user.password);
273
+ if (!isValid) {
274
+ return null;
275
+ }
276
+ return {
277
+ username: user.username,
278
+ isAdmin: user.isAdmin,
279
+ };
280
+ };
281
+ /**
282
+ * Generate PKCE code verifier
283
+ */
284
+ export const generateCodeVerifier = () => {
285
+ return crypto.randomBytes(32).toString('base64url');
286
+ };
287
+ /**
288
+ * Generate PKCE code challenge from verifier
289
+ */
290
+ export const generateCodeChallenge = (verifier) => {
291
+ return crypto.createHash('sha256').update(verifier).digest('base64url');
292
+ };
293
+ /**
294
+ * Verify PKCE code challenge
295
+ */
296
+ export const verifyCodeChallenge = (verifier, challenge, method = 'S256') => {
297
+ if (method === 'plain') {
298
+ return verifier === challenge;
299
+ }
300
+ if (method === 'S256') {
301
+ const computed = generateCodeChallenge(verifier);
302
+ return computed === challenge;
303
+ }
304
+ return false;
305
+ };
306
+ /**
307
+ * Handle OAuth authorize request
308
+ */
309
+ export const handleAuthorizeRequest = async (req, res) => {
310
+ if (!oauth) {
311
+ throw new Error('OAuth server not initialized');
312
+ }
313
+ const request = new Request(req);
314
+ const response = new Response(res);
315
+ return await oauth.authorize(request, response);
316
+ };
317
+ /**
318
+ * Handle OAuth token request
319
+ */
320
+ export const handleTokenRequest = async (req, res) => {
321
+ if (!oauth) {
322
+ throw new Error('OAuth server not initialized');
323
+ }
324
+ const request = new Request(req);
325
+ const response = new Response(res);
326
+ return await oauth.token(request, response);
327
+ };
328
+ /**
329
+ * Handle OAuth authenticate request (validate access token)
330
+ */
331
+ export const handleAuthenticateRequest = async (req, res) => {
332
+ if (!oauth) {
333
+ throw new Error('OAuth server not initialized');
334
+ }
335
+ const request = new Request(req);
336
+ const response = new Response(res);
337
+ return await oauth.authenticate(request, response);
338
+ };
339
+ //# sourceMappingURL=oauthServerService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthServerService.js","sourceRoot":"","sources":["../../src/services/oauthServerService.ts"],"names":[],"mappings":"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"}