@samanhappy/mcphub 0.10.6 → 0.11.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.
- package/README.fr.md +36 -152
- package/README.md +34 -255
- package/README.zh.md +33 -212
- package/dist/config/DaoConfigService.js +3 -3
- package/dist/config/DaoConfigService.js.map +1 -1
- package/dist/controllers/authController.js +2 -2
- package/dist/controllers/authController.js.map +1 -1
- package/dist/controllers/configController.js +32 -5
- package/dist/controllers/configController.js.map +1 -1
- package/dist/controllers/groupController.js +24 -24
- package/dist/controllers/groupController.js.map +1 -1
- package/dist/controllers/oauthClientController.js +13 -13
- package/dist/controllers/oauthClientController.js.map +1 -1
- package/dist/controllers/oauthDynamicRegistrationController.js +9 -9
- package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -1
- package/dist/controllers/oauthServerController.js +1 -1
- package/dist/controllers/oauthServerController.js.map +1 -1
- package/dist/controllers/openApiController.js +1 -1
- package/dist/controllers/openApiController.js.map +1 -1
- package/dist/controllers/serverController.js +134 -96
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/controllers/userController.js +22 -21
- package/dist/controllers/userController.js.map +1 -1
- package/dist/dao/DaoFactory.js +43 -0
- package/dist/dao/DaoFactory.js.map +1 -1
- package/dist/dao/DatabaseDaoFactory.js +86 -0
- package/dist/dao/DatabaseDaoFactory.js.map +1 -0
- package/dist/dao/GroupDaoDbImpl.js +131 -0
- package/dist/dao/GroupDaoDbImpl.js.map +1 -0
- package/dist/dao/OAuthClientDao.js +100 -0
- package/dist/dao/OAuthClientDao.js.map +1 -0
- package/dist/dao/OAuthClientDaoDbImpl.js +83 -0
- package/dist/dao/OAuthClientDaoDbImpl.js.map +1 -0
- package/dist/dao/OAuthTokenDao.js +161 -0
- package/dist/dao/OAuthTokenDao.js.map +1 -0
- package/dist/dao/OAuthTokenDaoDbImpl.js +92 -0
- package/dist/dao/OAuthTokenDaoDbImpl.js.map +1 -0
- package/dist/dao/ServerDaoDbImpl.js +109 -0
- package/dist/dao/ServerDaoDbImpl.js.map +1 -0
- package/dist/dao/SystemConfigDaoDbImpl.js +56 -0
- package/dist/dao/SystemConfigDaoDbImpl.js.map +1 -0
- package/dist/dao/UserConfigDaoDbImpl.js +61 -0
- package/dist/dao/UserConfigDaoDbImpl.js.map +1 -0
- package/dist/dao/UserDaoDbImpl.js +90 -0
- package/dist/dao/UserDaoDbImpl.js.map +1 -0
- package/dist/dao/index.js +11 -0
- package/dist/dao/index.js.map +1 -1
- package/dist/db/entities/Group.js +49 -0
- package/dist/db/entities/Group.js.map +1 -0
- package/dist/db/entities/OAuthClient.js +66 -0
- package/dist/db/entities/OAuthClient.js.map +1 -0
- package/dist/db/entities/OAuthToken.js +66 -0
- package/dist/db/entities/OAuthToken.js.map +1 -0
- package/dist/db/entities/Server.js +93 -0
- package/dist/db/entities/Server.js.map +1 -0
- package/dist/db/entities/SystemConfig.js +66 -0
- package/dist/db/entities/SystemConfig.js.map +1 -0
- package/dist/db/entities/User.js +45 -0
- package/dist/db/entities/User.js.map +1 -0
- package/dist/db/entities/UserConfig.js +45 -0
- package/dist/db/entities/UserConfig.js.map +1 -0
- package/dist/db/entities/index.js +18 -2
- package/dist/db/entities/index.js.map +1 -1
- package/dist/db/repositories/GroupRepository.js +81 -0
- package/dist/db/repositories/GroupRepository.js.map +1 -0
- package/dist/db/repositories/OAuthClientRepository.js +68 -0
- package/dist/db/repositories/OAuthClientRepository.js.map +1 -0
- package/dist/db/repositories/OAuthTokenRepository.js +159 -0
- package/dist/db/repositories/OAuthTokenRepository.js.map +1 -0
- package/dist/db/repositories/ServerRepository.js +80 -0
- package/dist/db/repositories/ServerRepository.js.map +1 -0
- package/dist/db/repositories/SystemConfigRepository.js +64 -0
- package/dist/db/repositories/SystemConfigRepository.js.map +1 -0
- package/dist/db/repositories/UserConfigRepository.js +69 -0
- package/dist/db/repositories/UserConfigRepository.js.map +1 -0
- package/dist/db/repositories/UserRepository.js +68 -0
- package/dist/db/repositories/UserRepository.js.map +1 -0
- package/dist/db/repositories/index.js +8 -1
- package/dist/db/repositories/index.js.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/middlewares/auth.js +2 -2
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/middlewares/userContext.js +1 -1
- package/dist/middlewares/userContext.js.map +1 -1
- package/dist/models/OAuth.js +90 -122
- package/dist/models/OAuth.js.map +1 -1
- package/dist/models/User.js +29 -48
- package/dist/models/User.js.map +1 -1
- package/dist/routes/index.js +2 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/scripts/migrate-to-database.js +5 -0
- package/dist/scripts/migrate-to-database.js.map +1 -0
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/services/groupService.js +87 -113
- package/dist/services/groupService.js.map +1 -1
- package/dist/services/keepAliveService.js +58 -0
- package/dist/services/keepAliveService.js.map +1 -0
- package/dist/services/mcpOAuthProvider.js +22 -28
- package/dist/services/mcpOAuthProvider.js.map +1 -1
- package/dist/services/mcpService.js +73 -92
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/oauthServerService.js +26 -20
- package/dist/services/oauthServerService.js.map +1 -1
- package/dist/services/oauthService.js +11 -10
- package/dist/services/oauthService.js.map +1 -1
- package/dist/services/oauthSettingsStore.js +17 -12
- package/dist/services/oauthSettingsStore.js.map +1 -1
- package/dist/services/openApiGeneratorService.js +6 -7
- package/dist/services/openApiGeneratorService.js.map +1 -1
- package/dist/services/sseService.js +20 -62
- package/dist/services/sseService.js.map +1 -1
- package/dist/services/userService.js +38 -45
- package/dist/services/userService.js.map +1 -1
- package/dist/utils/migration.js +235 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/oauthBearer.js +4 -4
- package/dist/utils/oauthBearer.js.map +1 -1
- package/frontend/dist/assets/index-BiA4eB7l.js +251 -0
- package/frontend/dist/assets/index-BiA4eB7l.js.map +1 -0
- package/frontend/dist/index.html +1 -1
- package/mcp_settings.json +23 -1
- package/package.json +1 -1
- package/frontend/dist/assets/index-DDht0WYq.js +0 -251
- package/frontend/dist/assets/index-DDht0WYq.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import AppServer from './server.js';
|
|
3
|
+
import { initializeDatabaseMode } from './utils/migration.js';
|
|
3
4
|
const appServer = new AppServer();
|
|
4
5
|
async function boot() {
|
|
5
6
|
try {
|
|
7
|
+
// Check if database mode is enabled
|
|
8
|
+
// If USE_DB is explicitly set, use its value; otherwise, auto-detect based on DB_URL presence
|
|
9
|
+
const useDatabase = process.env.USE_DB !== undefined ? process.env.USE_DB === 'true' : !!process.env.DB_URL;
|
|
10
|
+
if (useDatabase) {
|
|
11
|
+
console.log('Database mode enabled, initializing...');
|
|
12
|
+
const dbInitialized = await initializeDatabaseMode();
|
|
13
|
+
if (!dbInitialized) {
|
|
14
|
+
console.error('Failed to initialize database mode');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
6
18
|
await appServer.initialize();
|
|
7
19
|
appServer.start();
|
|
8
20
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,SAAS,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAElC,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,oCAAoC;QACpC,8FAA8F;QAC9F,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1F,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,MAAM,aAAa,GAAG,MAAM,sBAAsB,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;QAC7B,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC;AAEP,eAAe,SAAS,CAAC,MAAM,EAAE,CAAC"}
|
package/dist/middlewares/auth.js
CHANGED
|
@@ -54,11 +54,11 @@ export const auth = async (req, res, next) => {
|
|
|
54
54
|
const authHeader = req.headers.authorization;
|
|
55
55
|
if (authHeader && authHeader.startsWith('Bearer ') && isOAuthServerEnabled()) {
|
|
56
56
|
const accessToken = authHeader.substring(7);
|
|
57
|
-
const oauthToken = getToken(accessToken);
|
|
57
|
+
const oauthToken = await getToken(accessToken);
|
|
58
58
|
if (oauthToken && oauthToken.accessToken === accessToken) {
|
|
59
59
|
// Valid OAuth token - look up user to get admin status
|
|
60
60
|
const { findUserByUsername } = await import('../models/User.js');
|
|
61
|
-
const user = findUserByUsername(oauthToken.username);
|
|
61
|
+
const user = await findUserByUsername(oauthToken.username);
|
|
62
62
|
// Set user context with proper admin status
|
|
63
63
|
req.user = {
|
|
64
64
|
username: oauthToken.username,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middlewares/auth.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAE,aAAkB,EAAW,EAAE;IACvE,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,aAAa,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,cAAc,CAAC,CAAC;AAE5C,MAAM,aAAa,GAAG,CAAC,GAAY,EAAW,EAAE;IAC9C,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC;AAC9B,CAAC,CAAC;AAEF,uCAAuC;AACvC,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAiB,EAAE;IAC3F,MAAM,CAAC,GAAI,GAAW,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,MAAM,aAAa,GAAG,YAAY,EAAE,CAAC,YAAY,EAAE,OAAO,IAAI;QAC5D,iBAAiB,EAAE,IAAI;QACvB,oBAAoB,EAAE,IAAI;QAC1B,gBAAgB,EAAE,KAAK;QACvB,aAAa,EAAE,EAAE;QACjB,QAAQ,EAAE,KAAK;KAChB,CAAC;IAEF,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,kDAAkD;IAClD,IAAI,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,uDAAuD;IACvD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC7E,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middlewares/auth.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAE,aAAkB,EAAW,EAAE;IACvE,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,aAAa,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,cAAc,CAAC,CAAC;AAE5C,MAAM,aAAa,GAAG,CAAC,GAAY,EAAW,EAAE;IAC9C,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC;AAC9B,CAAC,CAAC;AAEF,uCAAuC;AACvC,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAiB,EAAE;IAC3F,MAAM,CAAC,GAAI,GAAW,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,MAAM,aAAa,GAAG,YAAY,EAAE,CAAC,YAAY,EAAE,OAAO,IAAI;QAC5D,iBAAiB,EAAE,IAAI;QACvB,oBAAoB,EAAE,IAAI;QAC1B,gBAAgB,EAAE,KAAK;QACvB,aAAa,EAAE,EAAE;QACjB,QAAQ,EAAE,KAAK;KAChB,CAAC;IAEF,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,kDAAkD;IAClD,IAAI,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,uDAAuD;IACvD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7C,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC7E,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE/C,IAAI,UAAU,IAAI,UAAU,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;YACzD,uDAAuD;YACvD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAE3D,4CAA4C;YAC3C,GAAW,CAAC,IAAI,GAAG;gBAClB,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK;aAChC,CAAC;YACD,GAAW,CAAC,UAAU,GAAG,UAAU,CAAC;YACrC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,KAAe,CAAC;IAC7C,MAAM,KAAK,GAAG,WAAW,IAAI,UAAU,CAAC;IAExC,oBAAoB;IACpB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAE9C,mCAAmC;QAClC,GAAW,CAAC,IAAI,GAAI,OAAe,CAAC,IAAI,CAAC;QAC1C,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -61,7 +61,7 @@ export const sseUserContextMiddleware = async (req, res, next) => {
|
|
|
61
61
|
const rawAuthHeader = Array.isArray(req.headers.authorization)
|
|
62
62
|
? req.headers.authorization[0]
|
|
63
63
|
: req.headers.authorization;
|
|
64
|
-
const bearerUser = resolveOAuthUserFromAuthHeader(rawAuthHeader);
|
|
64
|
+
const bearerUser = await resolveOAuthUserFromAuthHeader(rawAuthHeader);
|
|
65
65
|
if (bearerUser) {
|
|
66
66
|
userContextService.setCurrentUser(bearerUser);
|
|
67
67
|
attachCleanupHandlers();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userContext.js","sourceRoot":"","sources":["../../src/middlewares/userContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,GAAY,EACZ,GAAa,EACb,IAAkB,EACH,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,WAAW,GAAI,GAAW,CAAC,IAAa,CAAC;QAE/C,IAAI,WAAW,EAAE,CAAC;YAChB,mBAAmB;YACnB,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;YAC5D,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAE/C,2CAA2C;YAC3C,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACpB,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;gBAC5D,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAC3C,GAAY,EACZ,GAAa,EACb,IAAkB,EACH,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,SAAS,GAAG,IAAI,CAAC;YACjB,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;QACxC,CAAC,CAAC;QACF,MAAM,qBAAqB,GAAG,GAAG,EAAE;YACjC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,+CAA+C;YAC/C,sEAAsE;YACtE,6BAA6B;YAC7B,MAAM,IAAI,GAAU;gBAClB,QAAQ;gBACR,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,KAAK,EAAE,+CAA+C;aAChE,CAAC;YAEF,kBAAkB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACxC,qBAAqB,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;gBAC5D,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC9B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;YAC9B,MAAM,UAAU,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"userContext.js","sourceRoot":"","sources":["../../src/middlewares/userContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,GAAY,EACZ,GAAa,EACb,IAAkB,EACH,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,WAAW,GAAI,GAAW,CAAC,IAAa,CAAC;QAE/C,IAAI,WAAW,EAAE,CAAC;YAChB,mBAAmB;YACnB,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;YAC5D,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAE/C,2CAA2C;YAC3C,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACpB,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;gBAC5D,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAC3C,GAAY,EACZ,GAAa,EACb,IAAkB,EACH,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,SAAS,GAAG,IAAI,CAAC;YACjB,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;QACxC,CAAC,CAAC;QACF,MAAM,qBAAqB,GAAG,GAAG,EAAE;YACjC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,+CAA+C;YAC/C,sEAAsE;YACtE,6BAA6B;YAC7B,MAAM,IAAI,GAAU;gBAClB,QAAQ;gBACR,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,KAAK,EAAE,+CAA+C;aAChE,CAAC;YAEF,kBAAkB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACxC,qBAAqB,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;gBAC5D,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC9B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;YAC9B,MAAM,UAAU,GAAG,MAAM,8BAA8B,CAAC,aAAa,CAAC,CAAC;YAEvE,IAAI,UAAU,EAAE,CAAC;gBACf,kBAAkB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBAC9C,qBAAqB,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,gDAAgD,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAWF,MAAM,OAAO,2BAA2B;IAC9B,qBAAqB;QAC3B,OAAO,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,OAAO,kBAAkB,CAAC,cAAc,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,QAAgB;QAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,kBAAkB,CAAC,cAAc,EAAE,CAAC;QAEjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,mBAAmB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnE,kDAAkD;QAClD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,+BAA+B;gBACrC,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,8BAA8B;gBACpC,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,MAAM,EAAE,SAAS;aAClB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,OAAO,kBAAkB,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;CACF"}
|
package/dist/models/OAuth.js
CHANGED
|
@@ -1,96 +1,74 @@
|
|
|
1
1
|
import crypto from 'crypto';
|
|
2
|
-
import {
|
|
3
|
-
// In-memory storage for authorization codes
|
|
4
|
-
// Authorization codes are short-lived and kept in memory only.
|
|
5
|
-
// Tokens are mirrored to settings (mcp_settings.json) for persistence.
|
|
2
|
+
import { getOAuthClientDao, getOAuthTokenDao } from '../dao/index.js';
|
|
3
|
+
// In-memory storage for authorization codes (short-lived, no persistence needed)
|
|
6
4
|
const authorizationCodes = new Map();
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
// In-memory cache for tokens (also persisted via DAO)
|
|
6
|
+
const tokensCache = new Map();
|
|
7
|
+
// Flag to track if we've initialized from DAO
|
|
8
|
+
let initialized = false;
|
|
9
|
+
/**
|
|
10
|
+
* Initialize token cache from DAO (async)
|
|
11
|
+
*/
|
|
12
|
+
const initializeTokenCache = async () => {
|
|
13
|
+
if (initialized)
|
|
14
|
+
return;
|
|
15
|
+
initialized = true;
|
|
10
16
|
try {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
refreshTokenExpiresAt: stored.refreshTokenExpiresAt
|
|
18
|
-
? new Date(stored.refreshTokenExpiresAt)
|
|
19
|
-
: undefined,
|
|
20
|
-
};
|
|
21
|
-
tokens.set(token.accessToken, token);
|
|
22
|
-
if (token.refreshToken) {
|
|
23
|
-
tokens.set(token.refreshToken, token);
|
|
24
|
-
}
|
|
17
|
+
const tokenDao = getOAuthTokenDao();
|
|
18
|
+
const allTokens = await tokenDao.findAll();
|
|
19
|
+
for (const token of allTokens) {
|
|
20
|
+
tokensCache.set(token.accessToken, token);
|
|
21
|
+
if (token.refreshToken) {
|
|
22
|
+
tokensCache.set(token.refreshToken, token);
|
|
25
23
|
}
|
|
26
24
|
}
|
|
27
25
|
}
|
|
28
26
|
catch (error) {
|
|
29
|
-
console.error('Failed to initialize OAuth tokens from
|
|
27
|
+
console.error('Failed to initialize OAuth tokens from DAO:', error);
|
|
30
28
|
}
|
|
31
|
-
}
|
|
29
|
+
};
|
|
30
|
+
// Initialize on module load (fire and forget for backward compatibility)
|
|
31
|
+
initializeTokenCache().catch(console.error);
|
|
32
32
|
/**
|
|
33
33
|
* Get all OAuth clients from configuration
|
|
34
34
|
*/
|
|
35
|
-
export const getOAuthClients = () => {
|
|
36
|
-
const
|
|
37
|
-
return
|
|
35
|
+
export const getOAuthClients = async () => {
|
|
36
|
+
const clientDao = getOAuthClientDao();
|
|
37
|
+
return clientDao.findAll();
|
|
38
38
|
};
|
|
39
39
|
/**
|
|
40
40
|
* Find OAuth client by client ID
|
|
41
41
|
*/
|
|
42
|
-
export const findOAuthClientById = (clientId) => {
|
|
43
|
-
const
|
|
44
|
-
|
|
42
|
+
export const findOAuthClientById = async (clientId) => {
|
|
43
|
+
const clientDao = getOAuthClientDao();
|
|
44
|
+
const client = await clientDao.findByClientId(clientId);
|
|
45
|
+
return client || undefined;
|
|
45
46
|
};
|
|
46
47
|
/**
|
|
47
48
|
* Create a new OAuth client
|
|
48
49
|
*/
|
|
49
|
-
export const createOAuthClient = (client) => {
|
|
50
|
-
const
|
|
51
|
-
if (!settings.oauthClients) {
|
|
52
|
-
settings.oauthClients = [];
|
|
53
|
-
}
|
|
50
|
+
export const createOAuthClient = async (client) => {
|
|
51
|
+
const clientDao = getOAuthClientDao();
|
|
54
52
|
// Check if client already exists
|
|
55
|
-
const existing =
|
|
53
|
+
const existing = await clientDao.findByClientId(client.clientId);
|
|
56
54
|
if (existing) {
|
|
57
55
|
throw new Error(`OAuth client with ID ${client.clientId} already exists`);
|
|
58
56
|
}
|
|
59
|
-
|
|
60
|
-
saveSettings(settings);
|
|
61
|
-
return client;
|
|
57
|
+
return clientDao.create(client);
|
|
62
58
|
};
|
|
63
59
|
/**
|
|
64
60
|
* Update an existing OAuth client
|
|
65
61
|
*/
|
|
66
|
-
export const updateOAuthClient = (clientId, updates) => {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
const index = settings.oauthClients.findIndex((c) => c.clientId === clientId);
|
|
72
|
-
if (index === -1) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
settings.oauthClients[index] = { ...settings.oauthClients[index], ...updates };
|
|
76
|
-
saveSettings(settings);
|
|
77
|
-
return settings.oauthClients[index];
|
|
62
|
+
export const updateOAuthClient = async (clientId, updates) => {
|
|
63
|
+
const clientDao = getOAuthClientDao();
|
|
64
|
+
return clientDao.update(clientId, updates);
|
|
78
65
|
};
|
|
79
66
|
/**
|
|
80
67
|
* Delete an OAuth client
|
|
81
68
|
*/
|
|
82
|
-
export const deleteOAuthClient = (clientId) => {
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
const index = settings.oauthClients.findIndex((c) => c.clientId === clientId);
|
|
88
|
-
if (index === -1) {
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
settings.oauthClients.splice(index, 1);
|
|
92
|
-
saveSettings(settings);
|
|
93
|
-
return true;
|
|
69
|
+
export const deleteOAuthClient = async (clientId) => {
|
|
70
|
+
const clientDao = getOAuthClientDao();
|
|
71
|
+
return clientDao.delete(clientId);
|
|
94
72
|
};
|
|
95
73
|
/**
|
|
96
74
|
* Generate a secure random token
|
|
@@ -135,7 +113,7 @@ export const revokeAuthorizationCode = (code) => {
|
|
|
135
113
|
/**
|
|
136
114
|
* Save access token and optionally refresh token
|
|
137
115
|
*/
|
|
138
|
-
export const saveToken = (tokenData, accessTokenLifetime = 3600, refreshTokenLifetime) => {
|
|
116
|
+
export const saveToken = async (tokenData, accessTokenLifetime = 3600, refreshTokenLifetime) => {
|
|
139
117
|
const accessToken = generateToken();
|
|
140
118
|
const accessTokenExpiresAt = new Date(Date.now() + accessTokenLifetime * 1000);
|
|
141
119
|
let refreshToken;
|
|
@@ -151,36 +129,42 @@ export const saveToken = (tokenData, accessTokenLifetime = 3600, refreshTokenLif
|
|
|
151
129
|
refreshTokenExpiresAt,
|
|
152
130
|
...tokenData,
|
|
153
131
|
};
|
|
154
|
-
|
|
132
|
+
// Update cache
|
|
133
|
+
tokensCache.set(accessToken, token);
|
|
155
134
|
if (refreshToken) {
|
|
156
|
-
|
|
135
|
+
tokensCache.set(refreshToken, token);
|
|
157
136
|
}
|
|
158
|
-
// Persist
|
|
137
|
+
// Persist to DAO
|
|
159
138
|
try {
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
const filtered = existing.filter((t) => t.accessToken !== token.accessToken && t.refreshToken !== token.refreshToken);
|
|
163
|
-
const updated = [
|
|
164
|
-
...filtered,
|
|
165
|
-
{
|
|
166
|
-
...token,
|
|
167
|
-
accessTokenExpiresAt: token.accessTokenExpiresAt,
|
|
168
|
-
refreshTokenExpiresAt: token.refreshTokenExpiresAt,
|
|
169
|
-
},
|
|
170
|
-
];
|
|
171
|
-
settings.oauthTokens = updated;
|
|
172
|
-
saveSettings(settings);
|
|
139
|
+
const tokenDao = getOAuthTokenDao();
|
|
140
|
+
await tokenDao.create(token);
|
|
173
141
|
}
|
|
174
142
|
catch (error) {
|
|
175
|
-
console.error('Failed to persist OAuth token to
|
|
143
|
+
console.error('Failed to persist OAuth token to DAO:', error);
|
|
176
144
|
}
|
|
177
145
|
return token;
|
|
178
146
|
};
|
|
179
147
|
/**
|
|
180
148
|
* Get token by access token or refresh token
|
|
181
149
|
*/
|
|
182
|
-
export const getToken = (token) => {
|
|
183
|
-
|
|
150
|
+
export const getToken = async (token) => {
|
|
151
|
+
// First check cache
|
|
152
|
+
let tokenData = tokensCache.get(token);
|
|
153
|
+
// If not in cache, try DAO
|
|
154
|
+
if (!tokenData) {
|
|
155
|
+
const tokenDao = getOAuthTokenDao();
|
|
156
|
+
tokenData =
|
|
157
|
+
(await tokenDao.findByAccessToken(token)) ||
|
|
158
|
+
(await tokenDao.findByRefreshToken(token)) ||
|
|
159
|
+
undefined;
|
|
160
|
+
// Update cache if found
|
|
161
|
+
if (tokenData) {
|
|
162
|
+
tokensCache.set(tokenData.accessToken, tokenData);
|
|
163
|
+
if (tokenData.refreshToken) {
|
|
164
|
+
tokensCache.set(tokenData.refreshToken, tokenData);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
184
168
|
if (!tokenData) {
|
|
185
169
|
return undefined;
|
|
186
170
|
}
|
|
@@ -199,30 +183,27 @@ export const getToken = (token) => {
|
|
|
199
183
|
/**
|
|
200
184
|
* Revoke token (both access and refresh tokens)
|
|
201
185
|
*/
|
|
202
|
-
export const revokeToken = (token) => {
|
|
203
|
-
const tokenData =
|
|
186
|
+
export const revokeToken = async (token) => {
|
|
187
|
+
const tokenData = tokensCache.get(token);
|
|
204
188
|
if (tokenData) {
|
|
205
|
-
|
|
189
|
+
tokensCache.delete(tokenData.accessToken);
|
|
206
190
|
if (tokenData.refreshToken) {
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
-
// Also remove from persisted settings
|
|
210
|
-
try {
|
|
211
|
-
const settings = loadSettings();
|
|
212
|
-
if (Array.isArray(settings.oauthTokens)) {
|
|
213
|
-
settings.oauthTokens = settings.oauthTokens.filter((t) => t.accessToken !== tokenData.accessToken && t.refreshToken !== tokenData.refreshToken);
|
|
214
|
-
saveSettings(settings);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
catch (error) {
|
|
218
|
-
console.error('Failed to remove OAuth token from settings:', error);
|
|
191
|
+
tokensCache.delete(tokenData.refreshToken);
|
|
219
192
|
}
|
|
220
193
|
}
|
|
194
|
+
// Also remove from DAO
|
|
195
|
+
try {
|
|
196
|
+
const tokenDao = getOAuthTokenDao();
|
|
197
|
+
await tokenDao.revokeToken(token);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
console.error('Failed to remove OAuth token from DAO:', error);
|
|
201
|
+
}
|
|
221
202
|
};
|
|
222
203
|
/**
|
|
223
204
|
* Clean up expired codes and tokens (should be called periodically)
|
|
224
205
|
*/
|
|
225
|
-
export const cleanupExpired = () => {
|
|
206
|
+
export const cleanupExpired = async () => {
|
|
226
207
|
const now = new Date();
|
|
227
208
|
// Clean up expired authorization codes
|
|
228
209
|
for (const [code, authCode] of authorizationCodes.entries()) {
|
|
@@ -230,9 +211,9 @@ export const cleanupExpired = () => {
|
|
|
230
211
|
authorizationCodes.delete(code);
|
|
231
212
|
}
|
|
232
213
|
}
|
|
233
|
-
// Clean up expired tokens
|
|
214
|
+
// Clean up expired tokens from cache
|
|
234
215
|
const processedTokens = new Set();
|
|
235
|
-
for (const [_key, token] of
|
|
216
|
+
for (const [_key, token] of tokensCache.entries()) {
|
|
236
217
|
// Skip if we've already processed this token
|
|
237
218
|
if (processedTokens.has(token.accessToken)) {
|
|
238
219
|
continue;
|
|
@@ -240,33 +221,18 @@ export const cleanupExpired = () => {
|
|
|
240
221
|
processedTokens.add(token.accessToken);
|
|
241
222
|
const accessExpired = token.accessTokenExpiresAt < now;
|
|
242
223
|
const refreshExpired = token.refreshTokenExpiresAt && token.refreshTokenExpiresAt < now;
|
|
243
|
-
// If both are expired, remove
|
|
224
|
+
// If both are expired, remove from cache
|
|
244
225
|
if (accessExpired && (!token.refreshToken || refreshExpired)) {
|
|
245
|
-
|
|
226
|
+
tokensCache.delete(token.accessToken);
|
|
246
227
|
if (token.refreshToken) {
|
|
247
|
-
|
|
228
|
+
tokensCache.delete(token.refreshToken);
|
|
248
229
|
}
|
|
249
230
|
}
|
|
250
231
|
}
|
|
251
|
-
//
|
|
232
|
+
// Clean up expired tokens from DAO
|
|
252
233
|
try {
|
|
253
|
-
const
|
|
254
|
-
|
|
255
|
-
const validTokens = [];
|
|
256
|
-
for (const stored of settings.oauthTokens) {
|
|
257
|
-
const accessExpiresAt = new Date(stored.accessTokenExpiresAt);
|
|
258
|
-
const refreshExpiresAt = stored.refreshTokenExpiresAt
|
|
259
|
-
? new Date(stored.refreshTokenExpiresAt)
|
|
260
|
-
: undefined;
|
|
261
|
-
const accessExpired = accessExpiresAt < now;
|
|
262
|
-
const refreshExpired = refreshExpiresAt && refreshExpiresAt < now;
|
|
263
|
-
if (!accessExpired || (stored.refreshToken && !refreshExpired)) {
|
|
264
|
-
validTokens.push(stored);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
settings.oauthTokens = validTokens;
|
|
268
|
-
saveSettings(settings);
|
|
269
|
-
}
|
|
234
|
+
const tokenDao = getOAuthTokenDao();
|
|
235
|
+
await tokenDao.cleanupExpired();
|
|
270
236
|
}
|
|
271
237
|
catch (error) {
|
|
272
238
|
console.error('Failed to cleanup persisted OAuth tokens:', error);
|
|
@@ -275,7 +241,9 @@ export const cleanupExpired = () => {
|
|
|
275
241
|
// Run cleanup every 5 minutes in production
|
|
276
242
|
let cleanupIntervalId = null;
|
|
277
243
|
if (process.env.NODE_ENV !== 'test') {
|
|
278
|
-
cleanupIntervalId = setInterval(
|
|
244
|
+
cleanupIntervalId = setInterval(() => {
|
|
245
|
+
cleanupExpired().catch(console.error);
|
|
246
|
+
}, 5 * 60 * 1000);
|
|
279
247
|
// Allow the interval to not keep the process alive
|
|
280
248
|
cleanupIntervalId.unref();
|
|
281
249
|
}
|
package/dist/models/OAuth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuth.js","sourceRoot":"","sources":["../../src/models/OAuth.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"OAuth.js","sourceRoot":"","sources":["../../src/models/OAuth.ts"],"names":[],"mappings":"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"}
|
package/dist/models/User.js
CHANGED
|
@@ -1,50 +1,38 @@
|
|
|
1
1
|
import bcrypt from 'bcryptjs';
|
|
2
|
-
import {
|
|
2
|
+
import { getUserDao } from '../dao/index.js';
|
|
3
3
|
// Get all users
|
|
4
|
-
export const getUsers = () => {
|
|
4
|
+
export const getUsers = async () => {
|
|
5
5
|
try {
|
|
6
|
-
const
|
|
7
|
-
return
|
|
6
|
+
const userDao = getUserDao();
|
|
7
|
+
return await userDao.findAll();
|
|
8
8
|
}
|
|
9
9
|
catch (error) {
|
|
10
|
-
console.error('Error reading users
|
|
10
|
+
console.error('Error reading users:', error);
|
|
11
11
|
return [];
|
|
12
12
|
}
|
|
13
13
|
};
|
|
14
|
-
//
|
|
15
|
-
const
|
|
14
|
+
// Create a new user
|
|
15
|
+
export const createUser = async (userData) => {
|
|
16
16
|
try {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
saveSettings(settings);
|
|
17
|
+
const userDao = getUserDao();
|
|
18
|
+
return await userDao.createWithHashedPassword(userData.username, userData.password, userData.isAdmin);
|
|
20
19
|
}
|
|
21
20
|
catch (error) {
|
|
22
|
-
console.error('Error
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
// Create a new user
|
|
26
|
-
export const createUser = async (userData) => {
|
|
27
|
-
const users = getUsers();
|
|
28
|
-
// Check if username already exists
|
|
29
|
-
if (users.some((user) => user.username === userData.username)) {
|
|
21
|
+
console.error('Error creating user:', error);
|
|
30
22
|
return null;
|
|
31
23
|
}
|
|
32
|
-
// Hash the password
|
|
33
|
-
const salt = await bcrypt.genSalt(10);
|
|
34
|
-
const hashedPassword = await bcrypt.hash(userData.password, salt);
|
|
35
|
-
const newUser = {
|
|
36
|
-
username: userData.username,
|
|
37
|
-
password: hashedPassword,
|
|
38
|
-
isAdmin: userData.isAdmin || false,
|
|
39
|
-
};
|
|
40
|
-
users.push(newUser);
|
|
41
|
-
saveUsers(users);
|
|
42
|
-
return newUser;
|
|
43
24
|
};
|
|
44
25
|
// Find user by username
|
|
45
|
-
export const findUserByUsername = (username) => {
|
|
46
|
-
|
|
47
|
-
|
|
26
|
+
export const findUserByUsername = async (username) => {
|
|
27
|
+
try {
|
|
28
|
+
const userDao = getUserDao();
|
|
29
|
+
const user = await userDao.findByUsername(username);
|
|
30
|
+
return user || undefined;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('Error finding user:', error);
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
48
36
|
};
|
|
49
37
|
// Verify user password
|
|
50
38
|
export const verifyPassword = async (plainPassword, hashedPassword) => {
|
|
@@ -52,28 +40,21 @@ export const verifyPassword = async (plainPassword, hashedPassword) => {
|
|
|
52
40
|
};
|
|
53
41
|
// Update user password
|
|
54
42
|
export const updateUserPassword = async (username, newPassword) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
43
|
+
try {
|
|
44
|
+
const userDao = getUserDao();
|
|
45
|
+
return await userDao.updatePassword(username, newPassword);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error('Error updating password:', error);
|
|
58
49
|
return false;
|
|
59
50
|
}
|
|
60
|
-
// Hash the new password
|
|
61
|
-
const salt = await bcrypt.genSalt(10);
|
|
62
|
-
const hashedPassword = await bcrypt.hash(newPassword, salt);
|
|
63
|
-
// Update the user's password
|
|
64
|
-
users[userIndex].password = hashedPassword;
|
|
65
|
-
saveUsers(users);
|
|
66
|
-
return true;
|
|
67
51
|
};
|
|
68
52
|
// Initialize with default admin user if no users exist
|
|
69
53
|
export const initializeDefaultUser = async () => {
|
|
70
|
-
const
|
|
54
|
+
const userDao = getUserDao();
|
|
55
|
+
const users = await userDao.findAll();
|
|
71
56
|
if (users.length === 0) {
|
|
72
|
-
await
|
|
73
|
-
username: 'admin',
|
|
74
|
-
password: 'admin123',
|
|
75
|
-
isAdmin: true,
|
|
76
|
-
});
|
|
57
|
+
await userDao.createWithHashedPassword('admin', 'admin123', true);
|
|
77
58
|
console.log('Default admin user created');
|
|
78
59
|
}
|
|
79
60
|
};
|
package/dist/models/User.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,gBAAgB;AAChB,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAsB,EAAE;IACnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,OAAO,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,oBAAoB;AACpB,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,QAAe,EAAyB,EAAE;IACzE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,OAAO,MAAM,OAAO,CAAC,wBAAwB,CAC3C,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,OAAO,CACjB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,QAAgB,EAA8B,EAAE;IACvF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO,IAAI,IAAI,SAAS,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,uBAAuB;AACvB,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,aAAqB,EACrB,cAAsB,EACJ,EAAE;IACpB,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,uBAAuB;AACvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,QAAgB,EAChB,WAAmB,EACD,EAAE;IACpB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,OAAO,MAAM,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,uDAAuD;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAAmB,EAAE;IAC7D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC,CAAC"}
|
package/dist/routes/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import { check } from 'express-validator';
|
|
3
3
|
import config from '../config/index.js';
|
|
4
|
-
import { getAllServers, getAllSettings, createServer, updateServer, deleteServer, toggleServer, toggleTool, updateToolDescription, togglePrompt, updatePromptDescription, updateSystemConfig, } from '../controllers/serverController.js';
|
|
4
|
+
import { getAllServers, getAllSettings, getServerConfig, createServer, updateServer, deleteServer, toggleServer, toggleTool, updateToolDescription, togglePrompt, updatePromptDescription, updateSystemConfig, } from '../controllers/serverController.js';
|
|
5
5
|
import { getGroups, getGroup, createNewGroup, updateExistingGroup, deleteExistingGroup, addServerToExistingGroup, removeServerFromExistingGroup, getGroupServers, updateGroupServersBatch, getGroupServerConfigs, getGroupServerConfig, updateGroupServerTools, } from '../controllers/groupController.js';
|
|
6
6
|
import { getUsers, getUser, createUser, updateExistingUser, deleteExistingUser, getUserStats, } from '../controllers/userController.js';
|
|
7
7
|
import { getAllMarketServers, getMarketServer, getAllMarketCategories, getAllMarketTags, searchMarketServersByQuery, getMarketServersByCategory, getMarketServersByTag, } from '../controllers/marketController.js';
|
|
@@ -40,6 +40,7 @@ export const initRoutes = (app) => {
|
|
|
40
40
|
app.delete('/oauth/register/:clientId', deleteClientRegistration); // Delete client registration
|
|
41
41
|
// API routes protected by auth middleware in middlewares/index.ts
|
|
42
42
|
router.get('/servers', getAllServers);
|
|
43
|
+
router.get('/servers/:name', getServerConfig);
|
|
43
44
|
router.get('/settings', getAllSettings);
|
|
44
45
|
router.post('/servers', createServer);
|
|
45
46
|
router.put('/servers/:name', updateServer);
|