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 @@