@samanhappy/mcphub 1.1.3 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.fr.md +2 -0
- package/README.md +2 -0
- package/README.zh.md +2 -0
- package/dist/controllers/mcpbController.js +6 -2
- package/dist/controllers/mcpbController.js.map +1 -1
- package/dist/controllers/oauthCallbackController.js +11 -16
- package/dist/controllers/oauthCallbackController.js.map +1 -1
- package/dist/controllers/oauthServerController.js +10 -7
- package/dist/controllers/oauthServerController.js.map +1 -1
- package/dist/controllers/personalOAuthController.js +119 -0
- package/dist/controllers/personalOAuthController.js.map +1 -0
- package/dist/controllers/smartRoutingController.js +4 -4
- package/dist/controllers/smartRoutingController.js.map +1 -1
- package/dist/dao/CredentialBindingDao.js +8 -0
- package/dist/dao/CredentialBindingDao.js.map +1 -1
- package/dist/dao/CredentialBindingDaoDbImpl.js +14 -0
- package/dist/dao/CredentialBindingDaoDbImpl.js.map +1 -1
- package/dist/routes/index.js +8 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/services/credentialBindingService.js +14 -8
- package/dist/services/credentialBindingService.js.map +1 -1
- package/dist/services/mcpOAuthProvider.js +40 -24
- package/dist/services/mcpOAuthProvider.js.map +1 -1
- package/dist/services/mcpService.js +66 -35
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/oauthService.js +3 -1
- package/dist/services/oauthService.js.map +1 -1
- package/dist/services/personalOAuthService.js +235 -0
- package/dist/services/personalOAuthService.js.map +1 -0
- package/dist/services/principalRuntimeService.js +67 -45
- package/dist/services/principalRuntimeService.js.map +1 -1
- package/dist/services/serverConfigPresenter.js +11 -1
- package/dist/services/serverConfigPresenter.js.map +1 -1
- package/dist/services/sseService.js +8 -28
- package/dist/services/sseService.js.map +1 -1
- package/dist/services/upstreamOAuthDisconnectService.js +2 -2
- package/dist/services/upstreamOAuthDisconnectService.js.map +1 -1
- package/dist/utils/credentialTemplate.js +37 -6
- package/dist/utils/credentialTemplate.js.map +1 -1
- package/dist/utils/protectedResource.js +44 -0
- package/dist/utils/protectedResource.js.map +1 -0
- package/dist/utils/serverConfigPersistence.js +13 -0
- package/dist/utils/serverConfigPersistence.js.map +1 -1
- package/dist/utils/upstreamError.js +8 -1
- package/dist/utils/upstreamError.js.map +1 -1
- package/frontend/dist/assets/{ActivityPage-Bs0YrAhj.js → ActivityPage-Cmpa6PNN.js} +2 -2
- package/frontend/dist/assets/{ActivityPage-Bs0YrAhj.js.map → ActivityPage-Cmpa6PNN.js.map} +1 -1
- package/frontend/dist/assets/{CopyClientConfigDialog-TcVaJHaV.js → CopyClientConfigDialog-CAqbh1Uh.js} +3 -3
- package/frontend/dist/assets/{CopyClientConfigDialog-TcVaJHaV.js.map → CopyClientConfigDialog-CAqbh1Uh.js.map} +1 -1
- package/frontend/dist/assets/{CredentialsPage-Cnd6MF-3.js → CredentialsPage-Cwr2rAVa.js} +2 -2
- package/frontend/dist/assets/{CredentialsPage-Cnd6MF-3.js.map → CredentialsPage-Cwr2rAVa.js.map} +1 -1
- package/frontend/dist/assets/{Dashboard--skdgzau.js → Dashboard-7XIOjzwF.js} +2 -2
- package/frontend/dist/assets/{Dashboard--skdgzau.js.map → Dashboard-7XIOjzwF.js.map} +1 -1
- package/frontend/dist/assets/EndpointCopy-CZVjSaZJ.js +2 -0
- package/frontend/dist/assets/{EndpointCopy-Dr-iLvMr.js.map → EndpointCopy-CZVjSaZJ.js.map} +1 -1
- package/frontend/dist/assets/{GroupsPage-CSIfAW7V.js → GroupsPage-BpHUw2qs.js} +3 -3
- package/frontend/dist/assets/{GroupsPage-CSIfAW7V.js.map → GroupsPage-BpHUw2qs.js.map} +1 -1
- package/frontend/dist/assets/{LoginPage-DwnZEV5T.js → LoginPage-ClSBXFLy.js} +2 -2
- package/frontend/dist/assets/{LoginPage-DwnZEV5T.js.map → LoginPage-ClSBXFLy.js.map} +1 -1
- package/frontend/dist/assets/{LogsPage-CTstXCQT.js → LogsPage-CVuaA5oX.js} +2 -2
- package/frontend/dist/assets/{LogsPage-CTstXCQT.js.map → LogsPage-CVuaA5oX.js.map} +1 -1
- package/frontend/dist/assets/{MarketPage-IbsIGvoI.js → MarketPage-BveXMx84.js} +2 -2
- package/frontend/dist/assets/{MarketPage-IbsIGvoI.js.map → MarketPage-BveXMx84.js.map} +1 -1
- package/frontend/dist/assets/{OAuthConsentPage-DawUB5r6.js → OAuthConsentPage-B7kOLjXw.js} +2 -2
- package/frontend/dist/assets/{OAuthConsentPage-DawUB5r6.js.map → OAuthConsentPage-B7kOLjXw.js.map} +1 -1
- package/frontend/dist/assets/{PromptsPage-Dim3CdKg.js → PromptsPage-DFH6bLuP.js} +2 -2
- package/frontend/dist/assets/{PromptsPage-Dim3CdKg.js.map → PromptsPage-DFH6bLuP.js.map} +1 -1
- package/frontend/dist/assets/{ResourcesPage-zcP5M9pv.js → ResourcesPage-Dsjlzp3t.js} +2 -2
- package/frontend/dist/assets/{ResourcesPage-zcP5M9pv.js.map → ResourcesPage-Dsjlzp3t.js.map} +1 -1
- package/frontend/dist/assets/ServersPage-BXEDxyLa.js +39 -0
- package/frontend/dist/assets/ServersPage-BXEDxyLa.js.map +1 -0
- package/frontend/dist/assets/{SettingsPage-CoAt9Wha.js → SettingsPage-B1zU66rQ.js} +2 -2
- package/frontend/dist/assets/{SettingsPage-CoAt9Wha.js.map → SettingsPage-B1zU66rQ.js.map} +1 -1
- package/frontend/dist/assets/{StatusDot-nh6JXzfm.js → StatusDot-Cp0G2KUZ.js} +2 -2
- package/frontend/dist/assets/{StatusDot-nh6JXzfm.js.map → StatusDot-Cp0G2KUZ.js.map} +1 -1
- package/frontend/dist/assets/{ToggleGroup-CeiSM3PL.js → ToggleGroup-BoQ324GW.js} +2 -2
- package/frontend/dist/assets/{ToggleGroup-CeiSM3PL.js.map → ToggleGroup-BoQ324GW.js.map} +1 -1
- package/frontend/dist/assets/{UsersPage-DLq5cgUz.js → UsersPage-B27T44p9.js} +2 -2
- package/frontend/dist/assets/{UsersPage-DLq5cgUz.js.map → UsersPage-B27T44p9.js.map} +1 -1
- package/frontend/dist/assets/{clipboard-CmkeMDp6.js → clipboard-ChKqfVYn.js} +2 -2
- package/frontend/dist/assets/{clipboard-CmkeMDp6.js.map → clipboard-ChKqfVYn.js.map} +1 -1
- package/frontend/dist/assets/{icons-vendor-CEwDZ1lN.js → icons-vendor-CkcU1LMA.js} +2 -2
- package/frontend/dist/assets/{icons-vendor-CEwDZ1lN.js.map → icons-vendor-CkcU1LMA.js.map} +1 -1
- package/frontend/dist/assets/index-dQlYMTl9.js +3 -0
- package/frontend/dist/assets/{index-dacgBASO.js.map → index-dQlYMTl9.js.map} +1 -1
- package/frontend/dist/assets/{resourceService-Nk5qQbQ0.js → resourceService-CmNa5REv.js} +2 -2
- package/frontend/dist/assets/{resourceService-Nk5qQbQ0.js.map → resourceService-CmNa5REv.js.map} +1 -1
- package/frontend/dist/assets/{useCostData-BgXlKVml.js → useCostData-BrV9Dqf7.js} +2 -2
- package/frontend/dist/assets/{useCostData-BgXlKVml.js.map → useCostData-BrV9Dqf7.js.map} +1 -1
- package/frontend/dist/assets/variableDetection-sA1AjKyF.js +16 -0
- package/frontend/dist/assets/variableDetection-sA1AjKyF.js.map +1 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/EndpointCopy-Dr-iLvMr.js +0 -2
- package/frontend/dist/assets/ServersPage-CxucQkR-.js +0 -39
- package/frontend/dist/assets/ServersPage-CxucQkR-.js.map +0 -1
- package/frontend/dist/assets/index-dacgBASO.js +0 -3
- package/frontend/dist/assets/variableDetection-CUnJ5xdC.js +0 -16
- package/frontend/dist/assets/variableDetection-CUnJ5xdC.js.map +0 -1
|
@@ -115,7 +115,7 @@ export const isOAuthEnabled = () => {
|
|
|
115
115
|
export const getServerOAuthToken = async (serverName) => {
|
|
116
116
|
const serverDao = getServerDao();
|
|
117
117
|
const serverConfig = await serverDao.findById(serverName);
|
|
118
|
-
if (!serverConfig?.oauth) {
|
|
118
|
+
if (!serverConfig?.oauth || serverConfig.oauth.identityMode === 'personal') {
|
|
119
119
|
return undefined;
|
|
120
120
|
}
|
|
121
121
|
// If a pre-configured access token exists, use it
|
|
@@ -187,6 +187,8 @@ export const initializeAllOAuthClients = async () => {
|
|
|
187
187
|
logger.log('Initializing OAuth clients for explicitly configured servers...');
|
|
188
188
|
const registrationPromises = [];
|
|
189
189
|
for (const serverConfig of allServers) {
|
|
190
|
+
if (serverConfig.oauth?.identityMode === 'personal')
|
|
191
|
+
continue;
|
|
190
192
|
const serverName = serverConfig.name;
|
|
191
193
|
// Only initialize servers with explicitly enabled dynamic registration
|
|
192
194
|
// Others will be auto-detected and registered on first 401 response
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauthService.js","sourceRoot":"","sources":["../../src/services/oauthService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"oauthService.js","sourceRoot":"","sources":["../../src/services/oauthService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEnG,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,6BAA6B;AAC7B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,8BAA8B,CAAC;AAEtC,IAAI,aAAa,GAAoC,IAAI,CAAC;AAC1D,IAAI,WAAW,GAA0B,IAAI,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,IAAmB,EAAE;IACzD,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,YAAY,EAAE,KAAK,CAAC;IAExC,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,8BAA8B;QAC9B,aAAa,GAAG,IAAI,wBAAwB,CAAC;YAC3C,SAAS,EAAE;gBACT,gBAAgB,EAAE,WAAW,CAAC,SAAS,CAAC,gBAAgB;gBACxD,QAAQ,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ;gBACxC,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,aAAa;aACnD;YACD,iBAAiB,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBACzC,mDAAmD;gBACnD,IAAI,WAAW,CAAC,iBAAiB,EAAE,QAAQ,EAAE,CAAC;oBAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE;wBACnE,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE;4BACP,cAAc,EAAE,kBAAkB;4BAClC,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO;yBACzC;wBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;qBAChC,CAAC,CAAC;oBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjB,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;oBACvE,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACrC,OAAO;wBACL,KAAK;wBACL,QAAQ,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,IAAI,SAAS;wBAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;qBACxD,CAAC;gBACJ,CAAC;gBAED,4DAA4D;gBAC5D,gFAAgF;gBAChF,OAAO;oBACL,KAAK;oBACL,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,WAAW,CAAC,eAAe,IAAI,EAAE;iBAC1C,CAAC;YACJ,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;gBACpC,+BAA+B;gBAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;gBAE1E,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,OAAO;oBACL,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;iBACpC,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/E,WAAW,GAAG,aAAa,CAAC;YAC1B,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,OAAO;YACP,uBAAuB,EAAE,WAAW,CAAC,uBAAuB;gBAC1D,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,uBAAuB,CAAC;gBAC9C,CAAC,CAAC,SAAS;YACb,eAAe,EAAE,WAAW,CAAC,eAAe;SAC7C,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACpD,6EAA6E;QAC7E,MAAM,CAAC,GAAG,CACR,kDAAkD;YAChD,CAAC,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAC9D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,aAAa,GAAG,IAAI,CAAC;QACrB,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAA0B,EAAE;IACxD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAoC,EAAE;IACpE,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAY,EAAE;IAC1C,OAAO,aAAa,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,CAAC;AACxD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,UAAkB,EAA+B,EAAE;IAC3F,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE1D,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC3E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,kDAAkD;IAClD,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACnC,gFAAgF;QAChF,4CAA4C;QAC5C,OAAO,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC;IACxC,CAAC;IAED,qEAAqE;IACrE,IAAI,YAAY,CAAC,KAAK,CAAC,mBAAmB,EAAE,OAAO,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,gEAAgE;YAChE,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAE5E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;gBACrE,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,4DAA4D;YAC5D,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,CAAC,KAAK,CAAC,YAAY,CAChC,CAAC;oBACF,OAAO,MAAM,CAAC,WAAW,CAAC;gBAC5B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;oBAChF,oDAAoD;oBACpD,0EAA0E;oBAC1E,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;YAED,iDAAiD;YACjD,kDAAkD;YAClD,qFAAqF;YACrF,MAAM,CAAC,GAAG,CAAC,mDAAmD,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAChF,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5E,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,IAAI,YAAY,CAAC,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAClE,OAAO,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC;IACxC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,UAAkB,EAClB,OAA+B,EACE,EAAE;IACnC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEpD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,GAAG,OAAO;YACV,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,IAAmB,EAAE;IACjE,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;IAE7C,MAAM,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAE9E,MAAM,oBAAoB,GAAoB,EAAE,CAAC;IAEjD,KAAK,MAAM,YAAY,IAAI,UAAU,EAAE,CAAC;QACtC,IAAI,YAAY,CAAC,KAAK,EAAE,YAAY,KAAK,UAAU;YAAE,SAAS;QAC9D,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC;QAErC,uEAAuE;QACvE,oEAAoE;QACpE,IAAI,YAAY,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC9D,oBAAoB,CAAC,IAAI,CACvB,wBAAwB,CAAC,UAAU,EAAE,YAAY,CAAC;iBAC/C,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;gBACnB,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,CAAC,GAAG,CAAC,wCAAwC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;gBACvE,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE;oBAC5D,UAAU;oBACV,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC,CAAC,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CACR,+CAA+C,oBAAoB,CAAC,MAAM,YAAY,CACvF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { expandServerConfig } from './serverConfigEnvironment.js';
|
|
2
|
+
import { getCredentialBindingDao, getServerDao, getUserDao } from '../dao/DaoFactory.js';
|
|
3
|
+
import { credentialBindingEvents, encryptCredentialValues, decryptCredentialValues, } from './credentialBindingService.js';
|
|
4
|
+
import { authorizationService } from './authorizationService.js';
|
|
5
|
+
import { CredentialBindingError } from '../utils/credentialTemplate.js';
|
|
6
|
+
export const hasPersonalOAuth = (config) => config?.oauth?.identityMode === 'personal';
|
|
7
|
+
export const personalOAuthContexts = new WeakMap();
|
|
8
|
+
const queues = new Map();
|
|
9
|
+
const serialize = async (key, action) => {
|
|
10
|
+
const previous = queues.get(key) || Promise.resolve();
|
|
11
|
+
const next = previous.catch(() => undefined).then(action);
|
|
12
|
+
queues.set(key, next);
|
|
13
|
+
try {
|
|
14
|
+
return await next;
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
if (queues.get(key) === next)
|
|
18
|
+
queues.delete(key);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
export const withPersonalOAuthLock = (serverName, username, action) => serialize(JSON.stringify([serverName, username]), action);
|
|
22
|
+
export const personalAuthorizationRequired = (name) => new CredentialBindingError(`Personal authorization required for '${name}'. Connect in Dashboard → Servers.`);
|
|
23
|
+
// The declaration, not resolved tokens/client registration, binds a flow to its destination.
|
|
24
|
+
const fingerprint = (config, expanded) => {
|
|
25
|
+
// Bindings follow a plain rename; the display name does not change the destination.
|
|
26
|
+
const { name: _, ...declaration } = config;
|
|
27
|
+
return JSON.stringify([declaration, expanded.url, expanded.oauth]);
|
|
28
|
+
};
|
|
29
|
+
export class PersonalOAuthContext {
|
|
30
|
+
constructor(serverName, username, config, declaration) {
|
|
31
|
+
this.serverName = serverName;
|
|
32
|
+
this.username = username;
|
|
33
|
+
this.declaration = declaration;
|
|
34
|
+
const { accessToken: _, refreshToken: __, pendingAuthorization: ___, ...oauth } = config.oauth || {};
|
|
35
|
+
this.config = {
|
|
36
|
+
...config,
|
|
37
|
+
oauth,
|
|
38
|
+
passthroughHeaders: config.passthroughHeaders?.filter((name) => name.toLowerCase() !== 'authorization'),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
static async load(serverName, username, definition) {
|
|
42
|
+
const expanded = await expandServerConfig(definition);
|
|
43
|
+
const context = new PersonalOAuthContext(serverName, username, expanded, fingerprint(definition, expanded));
|
|
44
|
+
const binding = await getCredentialBindingDao().get(serverName, username);
|
|
45
|
+
if (binding) {
|
|
46
|
+
const values = await decryptCredentialValues(binding);
|
|
47
|
+
if (values.oauthDeclaration === context.declaration && values.oauth) {
|
|
48
|
+
context.config.oauth = { ...context.config.oauth, ...JSON.parse(values.oauth) };
|
|
49
|
+
}
|
|
50
|
+
context.revision = binding.encryptedValues;
|
|
51
|
+
}
|
|
52
|
+
personalOAuthContexts.set(context.config, context);
|
|
53
|
+
return context;
|
|
54
|
+
}
|
|
55
|
+
wrapFetch(fetchFn) {
|
|
56
|
+
return async (input, init) => {
|
|
57
|
+
const body = init?.body instanceof URLSearchParams
|
|
58
|
+
? init.body
|
|
59
|
+
: typeof init?.body === 'string'
|
|
60
|
+
? new URLSearchParams(init.body)
|
|
61
|
+
: undefined;
|
|
62
|
+
if (body?.get('grant_type') !== 'refresh_token')
|
|
63
|
+
return fetchFn(input, init);
|
|
64
|
+
const key = JSON.stringify([String(input), body.get('refresh_token')]);
|
|
65
|
+
if (this.refresh?.key !== key) {
|
|
66
|
+
const response = fetchFn(input, init);
|
|
67
|
+
this.refresh = { key, response };
|
|
68
|
+
void response.then(() => {
|
|
69
|
+
// The SDK may reject an HTTP 200 payload without persisting tokens.
|
|
70
|
+
// Bound coalescing so that an unusable response cannot poison retries.
|
|
71
|
+
const timer = setTimeout(() => {
|
|
72
|
+
if (this.refresh?.response === response)
|
|
73
|
+
this.refresh = undefined;
|
|
74
|
+
}, 1000);
|
|
75
|
+
timer.unref?.();
|
|
76
|
+
}, () => {
|
|
77
|
+
if (this.refresh?.response === response)
|
|
78
|
+
this.refresh = undefined;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Briefly share the response until token persistence completes, so concurrent
|
|
82
|
+
// SDK calls do not redeem a rotating refresh token twice.
|
|
83
|
+
const refresh = this.refresh;
|
|
84
|
+
const response = await refresh.response;
|
|
85
|
+
if (!response.ok && this.refresh === refresh)
|
|
86
|
+
this.refresh = undefined;
|
|
87
|
+
return response.clone();
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
get authorizationUrl() {
|
|
91
|
+
const pending = this.config.oauth.pendingAuthorization;
|
|
92
|
+
return pending?.state && pending.createdAt && Date.now() - pending.createdAt < 600000
|
|
93
|
+
? pending.authorizationUrl
|
|
94
|
+
: undefined;
|
|
95
|
+
}
|
|
96
|
+
get version() {
|
|
97
|
+
return this.revision || 'unbound';
|
|
98
|
+
}
|
|
99
|
+
async assertCurrent() {
|
|
100
|
+
const definition = await getServerDao().findById(this.serverName);
|
|
101
|
+
const user = await getUserDao().findByUsername(this.username);
|
|
102
|
+
if (!definition ||
|
|
103
|
+
!user ||
|
|
104
|
+
definition.enabled === false ||
|
|
105
|
+
!hasPersonalOAuth(definition) ||
|
|
106
|
+
fingerprint(definition, await expandServerConfig(definition)) !== this.declaration ||
|
|
107
|
+
!authorizationService.can('server.invoke', definition, { ...user, username: this.username }))
|
|
108
|
+
throw new CredentialBindingError('Personal authorization or server access changed; reconnect');
|
|
109
|
+
}
|
|
110
|
+
async mutate(mutator) {
|
|
111
|
+
return withPersonalOAuthLock(this.serverName, this.username, async () => {
|
|
112
|
+
await this.assertCurrent();
|
|
113
|
+
const dao = getCredentialBindingDao();
|
|
114
|
+
const current = await dao.get(this.serverName, this.username);
|
|
115
|
+
if (current?.encryptedValues !== this.revision)
|
|
116
|
+
throw new CredentialBindingError('Personal authorization changed; reconnect');
|
|
117
|
+
const config = structuredClone(this.config);
|
|
118
|
+
mutator({ serverConfig: config, oauth: config.oauth });
|
|
119
|
+
const encryptedValues = await encryptCredentialValues(this.serverName, this.username, {
|
|
120
|
+
oauthDeclaration: this.declaration,
|
|
121
|
+
oauth: JSON.stringify(config.oauth),
|
|
122
|
+
});
|
|
123
|
+
await this.assertCurrent();
|
|
124
|
+
if (!(await dao.compareAndSave({
|
|
125
|
+
serverName: this.serverName,
|
|
126
|
+
username: this.username,
|
|
127
|
+
encryptedValues,
|
|
128
|
+
updatedAt: new Date().toISOString(),
|
|
129
|
+
}, this.revision)))
|
|
130
|
+
throw new CredentialBindingError('Personal authorization changed; reconnect');
|
|
131
|
+
this.revision = encryptedValues;
|
|
132
|
+
this.config = config;
|
|
133
|
+
personalOAuthContexts.set(config, this);
|
|
134
|
+
return config;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async loadServerConfig(_name) {
|
|
138
|
+
await this.assertCurrent();
|
|
139
|
+
return this.config;
|
|
140
|
+
}
|
|
141
|
+
mutateOAuthSettings(_name, mutator) {
|
|
142
|
+
return this.mutate(mutator);
|
|
143
|
+
}
|
|
144
|
+
persistClientCredentials(_name, credentials) {
|
|
145
|
+
return this.mutate(({ oauth }) => Object.assign(oauth, credentials));
|
|
146
|
+
}
|
|
147
|
+
async persistTokens(_name, tokens) {
|
|
148
|
+
const saved = await this.mutate(({ oauth }) => {
|
|
149
|
+
oauth.accessToken = tokens.accessToken;
|
|
150
|
+
if (tokens.refreshToken !== undefined)
|
|
151
|
+
oauth.refreshToken = tokens.refreshToken || undefined;
|
|
152
|
+
const metadata = oauth.pendingAuthorization?.discoveryState?.authorizationServerMetadata;
|
|
153
|
+
if (metadata &&
|
|
154
|
+
'revocation_endpoint' in metadata &&
|
|
155
|
+
typeof metadata.revocation_endpoint === 'string')
|
|
156
|
+
oauth.revocationEndpoint = metadata.revocation_endpoint;
|
|
157
|
+
if (tokens.clearPendingAuthorization)
|
|
158
|
+
delete oauth.pendingAuthorization;
|
|
159
|
+
});
|
|
160
|
+
this.refresh = undefined;
|
|
161
|
+
return saved;
|
|
162
|
+
}
|
|
163
|
+
updatePendingAuthorization(_name, pending) {
|
|
164
|
+
return this.mutate(({ oauth }) => {
|
|
165
|
+
oauth.pendingAuthorization = {
|
|
166
|
+
...oauth.pendingAuthorization,
|
|
167
|
+
...pending,
|
|
168
|
+
createdAt: pending.createdAt ?? Date.now(),
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
clearOAuthData(_name, scope) {
|
|
173
|
+
return this.mutate(({ oauth }) => {
|
|
174
|
+
if (scope === 'all' || scope === 'tokens') {
|
|
175
|
+
delete oauth.accessToken;
|
|
176
|
+
delete oauth.refreshToken;
|
|
177
|
+
}
|
|
178
|
+
if (scope === 'all' || scope === 'client') {
|
|
179
|
+
delete oauth.clientId;
|
|
180
|
+
delete oauth.clientSecret;
|
|
181
|
+
}
|
|
182
|
+
if (scope === 'all' || scope === 'verifier')
|
|
183
|
+
delete oauth.pendingAuthorization;
|
|
184
|
+
if (scope === 'discovery' && oauth.pendingAuthorization) {
|
|
185
|
+
delete oauth.pendingAuthorization.discoveryState;
|
|
186
|
+
delete oauth.pendingAuthorization.issuer;
|
|
187
|
+
delete oauth.pendingAuthorization.issRequired;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export const resolvePersonalOAuth = async (serverName, username, definition) => {
|
|
193
|
+
const context = await PersonalOAuthContext.load(serverName, username, definition);
|
|
194
|
+
if (!context.config.oauth.accessToken)
|
|
195
|
+
throw personalAuthorizationRequired(serverName);
|
|
196
|
+
return { config: context.config, revision: context.version };
|
|
197
|
+
};
|
|
198
|
+
export const findPersonalOAuthFlow = async (state) => {
|
|
199
|
+
if (!state.startsWith('personal.'))
|
|
200
|
+
return undefined;
|
|
201
|
+
for (const server of await getServerDao().findAll()) {
|
|
202
|
+
if (!hasPersonalOAuth(server))
|
|
203
|
+
continue;
|
|
204
|
+
for (const username of await getCredentialBindingDao().listUsernames(server.name)) {
|
|
205
|
+
let context;
|
|
206
|
+
try {
|
|
207
|
+
context = await PersonalOAuthContext.load(server.name, username, server);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
continue;
|
|
211
|
+
} // One damaged binding must not block another user's callback.
|
|
212
|
+
const pending = context.config.oauth.pendingAuthorization;
|
|
213
|
+
if (pending?.state === state &&
|
|
214
|
+
pending.createdAt &&
|
|
215
|
+
Date.now() - pending.createdAt < 600000) {
|
|
216
|
+
await context.assertCurrent();
|
|
217
|
+
return context;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return undefined;
|
|
222
|
+
};
|
|
223
|
+
export const disconnectPersonalOAuth = async (serverName, username) => {
|
|
224
|
+
await withPersonalOAuthLock(serverName, username, async () => {
|
|
225
|
+
// Retain an encrypted tombstone so even a pre-save, unbound context becomes stale.
|
|
226
|
+
await getCredentialBindingDao().save({
|
|
227
|
+
serverName,
|
|
228
|
+
username,
|
|
229
|
+
encryptedValues: await encryptCredentialValues(serverName, username, {}),
|
|
230
|
+
updatedAt: new Date().toISOString(),
|
|
231
|
+
});
|
|
232
|
+
credentialBindingEvents.emit('invalidate', { serverName, username });
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=personalOAuthService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personalOAuthService.js","sourceRoot":"","sources":["../../src/services/personalOAuthService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { hasPersonalOAuth, resolvePersonalOAuth, personalOAuthContexts, withPersonalOAuthLock, } from './personalOAuthService.js';
|
|
1
2
|
import { getServerDao } from '../dao/DaoFactory.js';
|
|
2
3
|
import { credentialBindingEvents, resolveCredentialBinding } from './credentialBindingService.js';
|
|
3
4
|
import { authorizationService } from './authorizationService.js';
|
|
4
|
-
import { CredentialBindingError,
|
|
5
|
+
import { CredentialBindingError, hasPersonalAuthentication } from '../utils/credentialTemplate.js';
|
|
5
6
|
import { expandServerConfig } from './serverConfigEnvironment.js';
|
|
6
7
|
/** Reuses children across MCP sessions, but never across authenticated principals. */
|
|
7
8
|
export class PrincipalRuntimeService {
|
|
@@ -29,56 +30,77 @@ export class PrincipalRuntimeService {
|
|
|
29
30
|
const definition = await getServerDao().findById(serverName);
|
|
30
31
|
if (!definition ||
|
|
31
32
|
definition.enabled === false ||
|
|
32
|
-
!
|
|
33
|
+
!hasPersonalAuthentication(definition) ||
|
|
33
34
|
!authorizationService.can('server.invoke', definition, principal)) {
|
|
34
35
|
throw new CredentialBindingError('Server not available');
|
|
35
36
|
}
|
|
36
37
|
// These snapshots only detect runtime changes in memory; they are never persisted or logged.
|
|
37
38
|
const definitionSnapshot = JSON.stringify(definition);
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
entry
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
39
|
+
const resolver = hasPersonalOAuth(definition) ? resolvePersonalOAuth : resolveCredentialBinding;
|
|
40
|
+
const prepare = async () => {
|
|
41
|
+
const resolved = await resolver(serverName, principal.username, hasPersonalOAuth(definition) ? definition : await expandServerConfig(definition));
|
|
42
|
+
const revision = JSON.stringify([definitionSnapshot, resolved.revision]);
|
|
43
|
+
const key = JSON.stringify([serverName, principal.username]);
|
|
44
|
+
let entry = this.entries.get(key);
|
|
45
|
+
if (entry && (entry.revision !== revision || entry.info?.status === 'disconnected')) {
|
|
46
|
+
this.invalidate({ serverName, username: principal.username });
|
|
47
|
+
entry = undefined;
|
|
48
|
+
}
|
|
49
|
+
if (!entry) {
|
|
50
|
+
const created = {
|
|
51
|
+
serverName,
|
|
52
|
+
username: principal.username,
|
|
53
|
+
// This context advances only after its own successful CAS writes. External
|
|
54
|
+
// binding changes still differ from its version and invalidate the runtime.
|
|
55
|
+
get revision() {
|
|
56
|
+
return JSON.stringify([
|
|
57
|
+
definitionSnapshot,
|
|
58
|
+
personalOAuthContexts.get(resolved.config)?.version || resolved.revision,
|
|
59
|
+
]);
|
|
60
|
+
},
|
|
61
|
+
valid: true,
|
|
62
|
+
active: 0,
|
|
63
|
+
promise: undefined,
|
|
64
|
+
};
|
|
65
|
+
this.entries.set(key, created);
|
|
66
|
+
created.promise = (async () => {
|
|
67
|
+
let info;
|
|
68
|
+
try {
|
|
69
|
+
info = await this.connect(serverName, resolved.config);
|
|
70
|
+
// A rotation/deletion may have raced the initial read or async handshake.
|
|
71
|
+
const verify = async () => {
|
|
72
|
+
const latest = await resolver(serverName, principal.username, definition);
|
|
73
|
+
const currentDefinition = await getServerDao().findById(serverName);
|
|
74
|
+
if (!created.valid ||
|
|
75
|
+
latest.revision !==
|
|
76
|
+
(personalOAuthContexts.get(resolved.config)?.version || resolved.revision) ||
|
|
77
|
+
JSON.stringify(currentDefinition) !== definitionSnapshot) {
|
|
78
|
+
throw new CredentialBindingError('Personal credentials or server configuration changed; retry the request');
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
if (hasPersonalOAuth(definition))
|
|
82
|
+
await withPersonalOAuthLock(serverName, principal.username, verify);
|
|
83
|
+
else
|
|
84
|
+
await verify();
|
|
85
|
+
created.info = info;
|
|
86
|
+
return info;
|
|
67
87
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (info)
|
|
90
|
+
this.close(info);
|
|
91
|
+
if (this.entries.get(key) === created)
|
|
92
|
+
this.entries.delete(key);
|
|
93
|
+
created.valid = false;
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
})();
|
|
97
|
+
entry = created;
|
|
98
|
+
}
|
|
99
|
+
return entry;
|
|
100
|
+
};
|
|
101
|
+
const entry = hasPersonalOAuth(definition)
|
|
102
|
+
? await withPersonalOAuthLock(serverName, principal.username, prepare)
|
|
103
|
+
: await prepare();
|
|
82
104
|
clearTimeout(entry.timer);
|
|
83
105
|
entry.active += 1;
|
|
84
106
|
const held = entry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"principalRuntimeService.js","sourceRoot":"","sources":["../../src/services/principalRuntimeService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAyB,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,
|
|
1
|
+
{"version":3,"file":"principalRuntimeService.js","sourceRoot":"","sources":["../../src/services/principalRuntimeService.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,8 @@ const presentSafeServerConfig = (config) => {
|
|
|
26
26
|
safe[field] = clone(config[field]);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
if (config.oauth?.identityMode === 'personal')
|
|
30
|
+
safe.oauth = { identityMode: 'personal' };
|
|
29
31
|
if (Array.isArray(config.credentialTemplate)) {
|
|
30
32
|
safe.credentialTemplate = config.credentialTemplate.map(({ target, name, label }) => ({ target, name, ...(label ? { label } : {}) }));
|
|
31
33
|
}
|
|
@@ -75,7 +77,15 @@ export const presentServerInfoForPrincipal = (info, principal) => {
|
|
|
75
77
|
}
|
|
76
78
|
const entry = { ...info };
|
|
77
79
|
if (entry.oauth && typeof entry.oauth === 'object') {
|
|
78
|
-
|
|
80
|
+
const oauth = entry.oauth;
|
|
81
|
+
entry.oauth =
|
|
82
|
+
oauth.identityMode === 'personal'
|
|
83
|
+
? {
|
|
84
|
+
identityMode: 'personal',
|
|
85
|
+
connected: oauth.connected,
|
|
86
|
+
authorizationUrl: oauth.authorizationUrl,
|
|
87
|
+
}
|
|
88
|
+
: presentSafeServerInfoOauth(oauth);
|
|
79
89
|
}
|
|
80
90
|
if (entry.config && typeof entry.config === 'object') {
|
|
81
91
|
entry.config = presentSafeServerConfig(entry.config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serverConfigPresenter.js","sourceRoot":"","sources":["../../src/services/serverConfigPresenter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,2BAA2B,CAAC;AAenF,yEAAyE;AACzE,2EAA2E;AAC3E,2CAA2C;AAC3C,MAAM,yBAAyB,GAAG;IAChC,MAAM;IACN,aAAa;IACb,MAAM;IACN,YAAY;IACZ,OAAO;IACP,SAAS;IACT,OAAO;IACP,SAAS;IACT,WAAW;CACH,CAAC;AAEX,6EAA6E;AAC7E,2EAA2E;AAC3E,MAAM,2BAA2B,GAAG,CAAC,WAAW,EAAE,oBAAoB,CAAU,CAAC;AAEjF,MAAM,KAAK,GAAG,CAAI,KAAQ,EAAK,EAAE,CAC/B,OAAO,eAAe,KAAK,UAAU;IACnC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC;IACxB,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAO,CAAC;AAE/C,MAAM,uBAAuB,GAAG,CAAC,MAAwB,EAAoB,EAAE;IAC7E,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,yBAAyB,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"serverConfigPresenter.js","sourceRoot":"","sources":["../../src/services/serverConfigPresenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import { getBearerAuthHeaderValue, getBearerTokenFromHeaders } from '../utils/be
|
|
|
14
14
|
import { HostedAuthUnavailableError, isHostedApiKey, validateHostedBearer, } from './hostedAuthService.js';
|
|
15
15
|
import { isHostedModeEnabled } from './hostedMode.js';
|
|
16
16
|
import { authenticateForwardAuthToken } from './forwardAuthService.js';
|
|
17
|
+
import { getPublicResourceUrl, getResourceMetadataUrl } from '../utils/protectedResource.js';
|
|
17
18
|
import { logger } from '../utils/logger.js';
|
|
18
19
|
export const transports = {};
|
|
19
20
|
const SESSION_NOT_FOUND_CODE = -32001;
|
|
@@ -435,29 +436,7 @@ const attachUserContextFromBearer = (result, res) => {
|
|
|
435
436
|
const escapeHeaderValue = (value) => {
|
|
436
437
|
return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
437
438
|
};
|
|
438
|
-
const
|
|
439
|
-
const forwardedProto = req.headers['x-forwarded-proto']
|
|
440
|
-
?.split(',')[0]
|
|
441
|
-
?.trim();
|
|
442
|
-
const protocol = forwardedProto || req.protocol || 'http';
|
|
443
|
-
const forwardedHost = req.headers['x-forwarded-host']
|
|
444
|
-
?.split(',')[0]
|
|
445
|
-
?.trim();
|
|
446
|
-
const host = forwardedHost ||
|
|
447
|
-
req.headers.host ||
|
|
448
|
-
req.headers[':authority'];
|
|
449
|
-
if (!host) {
|
|
450
|
-
return undefined;
|
|
451
|
-
}
|
|
452
|
-
const origin = `${protocol}://${host}`;
|
|
453
|
-
const basePath = config.basePath || '';
|
|
454
|
-
if (!basePath || basePath === '/') {
|
|
455
|
-
return `${origin}/.well-known/oauth-protected-resource`;
|
|
456
|
-
}
|
|
457
|
-
const normalizedBasePath = `${basePath.startsWith('/') ? '' : '/'}${basePath}`.replace(/\/+$/, '');
|
|
458
|
-
return `${origin}/.well-known/oauth-protected-resource${normalizedBasePath}`;
|
|
459
|
-
};
|
|
460
|
-
const sendBearerAuthError = (req, res, reason) => {
|
|
439
|
+
const sendBearerAuthError = async (req, res, reason) => {
|
|
461
440
|
if (reason === 'forbidden') {
|
|
462
441
|
res.status(403).json({
|
|
463
442
|
error: 'forbidden',
|
|
@@ -474,7 +453,8 @@ const sendBearerAuthError = (req, res, reason) => {
|
|
|
474
453
|
return;
|
|
475
454
|
}
|
|
476
455
|
const errorDescription = reason === 'missing' ? 'No authorization provided' : 'Invalid bearer token';
|
|
477
|
-
const
|
|
456
|
+
const systemConfig = await getSystemConfigDao().get();
|
|
457
|
+
const resourceMetadataUrl = getResourceMetadataUrl(getPublicResourceUrl(req, systemConfig));
|
|
478
458
|
const headerParts = [
|
|
479
459
|
'error="invalid_token"',
|
|
480
460
|
`error_description="${escapeHeaderValue(errorDescription)}"`,
|
|
@@ -501,7 +481,7 @@ export const handleSseConnection = async (req, res) => {
|
|
|
501
481
|
// Check bearer auth using filtered settings
|
|
502
482
|
const bearerAuthResult = await validateBearerAuth(req);
|
|
503
483
|
if (!bearerAuthResult.valid) {
|
|
504
|
-
sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
484
|
+
await sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
505
485
|
return;
|
|
506
486
|
}
|
|
507
487
|
attachUserContextFromBearer(bearerAuthResult, res);
|
|
@@ -564,7 +544,7 @@ export const handleSseMessage = async (req, res) => {
|
|
|
564
544
|
// Check bearer auth using filtered settings
|
|
565
545
|
const bearerAuthResult = await validateBearerAuth(req);
|
|
566
546
|
if (!bearerAuthResult.valid) {
|
|
567
|
-
sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
547
|
+
await sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
568
548
|
return;
|
|
569
549
|
}
|
|
570
550
|
attachUserContextFromBearer(bearerAuthResult, res);
|
|
@@ -674,7 +654,7 @@ export const handleMcpPostRequest = async (req, res) => {
|
|
|
674
654
|
// Check bearer auth using filtered settings
|
|
675
655
|
const bearerAuthResult = await validateBearerAuth(req);
|
|
676
656
|
if (!bearerAuthResult.valid) {
|
|
677
|
-
sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
657
|
+
await sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
678
658
|
return;
|
|
679
659
|
}
|
|
680
660
|
attachUserContextFromBearer(bearerAuthResult, res);
|
|
@@ -843,7 +823,7 @@ export const handleMcpOtherRequest = async (req, res) => {
|
|
|
843
823
|
// Check bearer auth using filtered settings
|
|
844
824
|
const bearerAuthResult = await validateBearerAuth(req);
|
|
845
825
|
if (!bearerAuthResult.valid) {
|
|
846
|
-
sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
826
|
+
await sendBearerAuthError(req, res, bearerAuthResult.reason);
|
|
847
827
|
return;
|
|
848
828
|
}
|
|
849
829
|
attachUserContextFromBearer(bearerAuthResult, res);
|