From c82779e15b9a04b2cf8aaa0c461a91ab07357546 Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Fri, 22 May 2026 14:47:01 +0300 Subject: [PATCH] fix: restore telegram mini app auth --- frontend/src/App.svelte | 2 ++ .../src/lib/webapp/stores/accountStore.js | 1 + frontend/src/lib/webapp/webappBoot.js | 10 +++--- .../src/webapp/screens/SettingsScreen.svelte | 13 ++++--- tests/test_webapp_telegram_logout.py | 35 +++++++++++++++++++ 5 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 tests/test_webapp_telegram_logout.py diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index fe4f70a..21bb499 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -397,6 +397,7 @@ $: telegramOAuthClientId = Number(CFG.telegramOAuthClientId || telegramLoginBotId || 0); $: telegramMiniAppInitData = tg?.initData || readTelegramMiniAppInitDataFromLocation(); $: telegramMiniAppAuthAvailable = Boolean(telegramMiniAppInitData); + $: telegramMiniAppContext = hasTelegramLaunchParams(); $: telegramLoginUnavailable = !telegramMiniAppAuthAvailable && !telegramOAuthClientId && telegramSdkStatus !== "loading"; $: telegramLoginChecking = @@ -1407,6 +1408,7 @@ {user} {userAgreementUrl} {userLanguage} + showLogout={!telegramMiniAppContext} linkTelegramAccount={accountStore.linkTelegramAccount} logout={accountStore.logout} {openAdminPanel} diff --git a/frontend/src/lib/webapp/stores/accountStore.js b/frontend/src/lib/webapp/stores/accountStore.js index 34a59eb..0345a02 100644 --- a/frontend/src/lib/webapp/stores/accountStore.js +++ b/frontend/src/lib/webapp/stores/accountStore.js @@ -362,6 +362,7 @@ export function createAccountStore({ } async function logout() { + if (telegramSdk.hasLaunchParams()) return; markManualLogout(); clearToken(); try { diff --git a/frontend/src/lib/webapp/webappBoot.js b/frontend/src/lib/webapp/webappBoot.js index feea227..33e9b23 100644 --- a/frontend/src/lib/webapp/webappBoot.js +++ b/frontend/src/lib/webapp/webappBoot.js @@ -61,11 +61,6 @@ export async function runWebappBoot({ ); } - if (isManuallyLoggedOut()) { - showLogin(); - return; - } - const widgetAuthData = readTelegramLoginWidgetAuthData(); if (widgetAuthData && (await finalizeTelegramAuth(widgetAuthData, "auth_data"))) return; @@ -78,6 +73,11 @@ export async function runWebappBoot({ } } + if (isManuallyLoggedOut()) { + showLogin(); + return; + } + if (getToken() || getCsrfToken()) { try { await loadData(); diff --git a/frontend/src/webapp/screens/SettingsScreen.svelte b/frontend/src/webapp/screens/SettingsScreen.svelte index e056f63..68b70f5 100644 --- a/frontend/src/webapp/screens/SettingsScreen.svelte +++ b/frontend/src/webapp/screens/SettingsScreen.svelte @@ -34,6 +34,7 @@ export let user = {}; export let userAgreementUrl = ""; export let userLanguage = ""; + export let showLogout = true; export let linkTelegramAccount = () => {}; export let logout = () => {}; @@ -187,10 +188,12 @@ {/if} - + {#if showLogout} + + {/if} diff --git a/tests/test_webapp_telegram_logout.py b/tests/test_webapp_telegram_logout.py new file mode 100644 index 0000000..eb5a262 --- /dev/null +++ b/tests/test_webapp_telegram_logout.py @@ -0,0 +1,35 @@ +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] + + +def _read(path: str) -> str: + return (REPO_ROOT / path).read_text(encoding="utf-8") + + +def test_telegram_init_data_login_runs_before_manual_logout_gate(): + source = _read("frontend/src/lib/webapp/webappBoot.js") + + init_data_pos = source.index("const initData = getInitDataForBoot();") + manual_logout_pos = source.index("if (isManuallyLoggedOut())") + + assert init_data_pos < manual_logout_pos + + +def test_logout_button_is_controlled_by_telegram_context(): + app_source = _read("frontend/src/App.svelte") + settings_source = _read("frontend/src/webapp/screens/SettingsScreen.svelte") + + assert "$: telegramMiniAppContext = hasTelegramLaunchParams();" in app_source + assert "showLogout={!telegramMiniAppContext}" in app_source + assert "export let showLogout = true;" in settings_source + assert "{#if showLogout}" in settings_source + + +def test_logout_handler_is_noop_inside_telegram_mini_app(): + source = _read("frontend/src/lib/webapp/stores/accountStore.js") + + guard_pos = source.index("if (telegramSdk.hasLaunchParams()) return;") + mark_logout_pos = source.index("markManualLogout();") + + assert guard_pos < mark_logout_pos