From 8f1ba610fcc3d81d414cf165166d82350afaf6d1 Mon Sep 17 00:00:00 2001 From: Max Litruv Boonzaayer Date: Thu, 19 Feb 2026 18:07:40 +1100 Subject: [PATCH] feat(auth): include existing device ID in SSO and password login flows --- src/app/pages/auth/SSOLogin.tsx | 6 ++++-- src/app/pages/auth/login/PasswordLoginForm.tsx | 6 ++++++ src/app/pages/auth/login/TokenLogin.tsx | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/app/pages/auth/SSOLogin.tsx b/src/app/pages/auth/SSOLogin.tsx index 3ff1a22..bd6df00 100644 --- a/src/app/pages/auth/SSOLogin.tsx +++ b/src/app/pages/auth/SSOLogin.tsx @@ -14,8 +14,10 @@ export function SSOLogin({ providers, redirectUrl, action, saveScreenSpace }: SS const baseUrl = discovery['m.homeserver'].base_url; const mx = useMemo(() => createClient({ baseUrl }), [baseUrl]); - const getSSOIdUrl = (ssoId?: string): string => - mx.getSsoLoginUrl(redirectUrl, 'sso', ssoId, action); + const getSSOIdUrl = (ssoId?: string): string => { + const existingDeviceId = localStorage.getItem('cinny_device_id') ?? undefined; + return mx.getSsoLoginUrl(redirectUrl, 'sso', ssoId, action, existingDeviceId); + }; const withoutIcon = providers ? providers.find( diff --git a/src/app/pages/auth/login/PasswordLoginForm.tsx b/src/app/pages/auth/login/PasswordLoginForm.tsx index 306e96c..59f93b1 100644 --- a/src/app/pages/auth/login/PasswordLoginForm.tsx +++ b/src/app/pages/auth/login/PasswordLoginForm.tsx @@ -126,6 +126,7 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog useLoginComplete(loginState.status === AsyncStatus.Success ? loginState.data : undefined); const handleUsernameLogin = (username: string, password: string) => { + const existingDeviceId = localStorage.getItem('cinny_device_id') ?? undefined; startLogin(baseUrl, { type: 'm.login.password', identifier: { @@ -133,6 +134,7 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog user: username, }, password, + device_id: existingDeviceId, initial_device_display_name: 'Paarrot', }); }; @@ -144,6 +146,7 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog const getBaseUrl = factoryGetBaseUrl(clientConfig, mxIdServer); + const existingDeviceId = localStorage.getItem('cinny_device_id') ?? undefined; startLogin(getBaseUrl, { type: 'm.login.password', identifier: { @@ -151,10 +154,12 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog user: mxIdUsername, }, password, + device_id: existingDeviceId, initial_device_display_name: 'Paarrot', }); }; const handleEmailLogin = (email: string, password: string) => { + const existingDeviceId = localStorage.getItem('cinny_device_id') ?? undefined; startLogin(baseUrl, { type: 'm.login.password', identifier: { @@ -163,6 +168,7 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog address: email, }, password, + device_id: existingDeviceId, initial_device_display_name: 'Paarrot', }); }; diff --git a/src/app/pages/auth/login/TokenLogin.tsx b/src/app/pages/auth/login/TokenLogin.tsx index 4c0382d..dc21dcc 100644 --- a/src/app/pages/auth/login/TokenLogin.tsx +++ b/src/app/pages/auth/login/TokenLogin.tsx @@ -54,9 +54,11 @@ export function TokenLogin({ token }: TokenLoginProps) { >(useCallback(login, [])); useEffect(() => { + const existingDeviceId = localStorage.getItem('cinny_device_id') ?? undefined; startLogin(baseUrl, { type: 'm.login.token', token, + device_id: existingDeviceId, initial_device_display_name: 'Paarrot', }); }, [baseUrl, token, startLogin]);