From dc0d425f61a807d306263d84196caaa1d6e6207f Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Sun, 1 Feb 2026 15:02:47 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(matrix-web):=20handle=20Matr?= =?UTF-8?q?ix=20SSO=20loginToken=20callback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add loginWithLoginToken function to exchange Matrix SSO loginToken for credentials. The app layout now detects the loginToken URL parameter and completes the SSO flow. Co-Authored-By: Claude Opus 4.5 --- apps/matrix/apps/web/src/lib/matrix/client.ts | 52 +++ apps/matrix/apps/web/src/lib/matrix/index.ts | 1 + .../apps/web/src/routes/(app)/+layout.svelte | 42 ++- packages/bot-services/package.json | 4 + .../bot-services/src/credit/credit.module.ts | 61 ++++ .../bot-services/src/credit/credit.service.ts | 316 ++++++++++++++++++ packages/bot-services/src/credit/index.ts | 10 + packages/bot-services/src/credit/types.ts | 75 +++++ packages/bot-services/src/index.ts | 10 + .../matrix-calendar-bot/src/bot/bot.module.ts | 4 +- .../src/bot/matrix.service.ts | 104 +++++- .../matrix-chat-bot/src/bot/bot.module.ts | 3 +- .../matrix-chat-bot/src/bot/matrix.service.ts | 58 +++- .../matrix-chat-bot/src/chat/chat.service.ts | 9 +- .../matrix-clock-bot/src/bot/bot.module.ts | 4 +- .../src/bot/matrix.service.ts | 118 +++++-- .../src/config/configuration.ts | 6 +- .../matrix-contacts-bot/src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 63 +++- .../matrix-mana-bot/src/bot/bot.module.ts | 9 +- .../src/bot/command-router.service.ts | 12 + .../matrix-mana-bot/src/bot/matrix.service.ts | 5 +- .../src/config/configuration.ts | 5 + .../src/handlers/handlers.module.ts | 3 +- .../src/handlers/help.handler.ts | 53 ++- .../matrix-manadeck-bot/src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 44 ++- .../matrix-nutriphi-bot/src/bot/bot.module.ts | 4 +- .../src/bot/matrix.service.ts | 44 ++- .../matrix-ollama-bot/src/bot/bot.module.ts | 4 +- .../src/bot/matrix.service.ts | 30 +- .../matrix-picture-bot/src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 54 ++- .../matrix-planta-bot/src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 41 ++- .../matrix-presi-bot/src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 38 ++- .../src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 84 ++++- .../src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 46 ++- .../src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 38 ++- .../matrix-stats-bot/src/bot/bot.module.ts | 4 +- .../src/bot/matrix.service.ts | 80 ++++- .../matrix-storage-bot/src/bot/bot.module.ts | 3 +- .../src/bot/matrix.service.ts | 38 ++- .../matrix-todo-bot/src/bot/bot.module.ts | 9 +- .../matrix-todo-bot/src/bot/matrix.service.ts | 102 +++++- services/matrix-tts-bot/src/bot/bot.module.ts | 4 +- .../matrix-tts-bot/src/bot/matrix.service.ts | 17 +- .../matrix-zitare-bot/src/bot/bot.module.ts | 4 +- .../src/bot/matrix.service.ts | 41 ++- 53 files changed, 1550 insertions(+), 230 deletions(-) create mode 100644 packages/bot-services/src/credit/credit.module.ts create mode 100644 packages/bot-services/src/credit/credit.service.ts create mode 100644 packages/bot-services/src/credit/index.ts create mode 100644 packages/bot-services/src/credit/types.ts diff --git a/apps/matrix/apps/web/src/lib/matrix/client.ts b/apps/matrix/apps/web/src/lib/matrix/client.ts index 321e64d6a..d73c969c8 100644 --- a/apps/matrix/apps/web/src/lib/matrix/client.ts +++ b/apps/matrix/apps/web/src/lib/matrix/client.ts @@ -148,6 +148,58 @@ export async function checkHomeserver( } } +/** + * Login with a Matrix SSO login token (for SSO/OAuth callback) + * This exchanges the loginToken from SSO redirect for proper credentials + */ +export async function loginWithLoginToken( + homeserver: string, + loginToken: string +): Promise { + // Load polyfills first + await import('./polyfills'); + const { createClient } = await import('matrix-js-sdk'); + + // Normalize homeserver URL + let baseUrl = homeserver.trim(); + if (!baseUrl.startsWith('http://') && !baseUrl.startsWith('https://')) { + baseUrl = `https://${baseUrl}`; + } + // Remove trailing slash + baseUrl = baseUrl.replace(/\/$/, ''); + + const tempClient = createClient({ baseUrl }); + + try { + const response = await tempClient.login('m.login.token', { + token: loginToken, + initial_device_display_name: 'Manalink', + }); + + return { + success: true, + credentials: { + homeserver: baseUrl, + accessToken: response.access_token, + userId: response.user_id, + deviceId: response.device_id, + }, + }; + } catch (err) { + const message = err instanceof Error ? err.message : 'Login failed'; + + // Provide more helpful error messages + if (message.includes('M_UNKNOWN_TOKEN') || message.includes('M_FORBIDDEN')) { + return { success: false, error: 'Login token expired or invalid. Please try again.' }; + } + if (message.includes('Failed to fetch') || message.includes('NetworkError')) { + return { success: false, error: 'Could not connect to homeserver' }; + } + + return { success: false, error: message }; + } +} + /** * Register a new account (if registration is open) */ diff --git a/apps/matrix/apps/web/src/lib/matrix/index.ts b/apps/matrix/apps/web/src/lib/matrix/index.ts index fc4e979d4..971c9cd11 100644 --- a/apps/matrix/apps/web/src/lib/matrix/index.ts +++ b/apps/matrix/apps/web/src/lib/matrix/index.ts @@ -3,6 +3,7 @@ export { matrixStore } from './store.svelte'; export { loginWithPassword, loginWithToken, + loginWithLoginToken, discoverHomeserver, checkHomeserver, register, diff --git a/apps/matrix/apps/web/src/routes/(app)/+layout.svelte b/apps/matrix/apps/web/src/routes/(app)/+layout.svelte index 8277829b1..1a030f209 100644 --- a/apps/matrix/apps/web/src/routes/(app)/+layout.svelte +++ b/apps/matrix/apps/web/src/routes/(app)/+layout.svelte @@ -1,5 +1,5 @@