From eb3fe07ec50cc4aa38f8fcd2c9852914b084eaae Mon Sep 17 00:00:00 2001 From: Jganenok Date: Thu, 14 May 2026 22:58:40 +0700 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B2=D1=85=D0=BE=D0=B4=20=D1=81=202fa=20=D0=B8=20=D1=8D=D0=B2?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D1=8B=20=D0=B8=20=D1=82=D0=B0=D0=BC=20=D0=B5?= =?UTF-8?q?=D1=89=D0=B5=20=D1=87=D0=B5=D1=82=D0=BE=20=D0=B1=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/backend/modules/account.dart | 56 +++++++++---------- .../screens/auth/password_2fa_screen.dart | 4 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/lib/backend/modules/account.dart b/lib/backend/modules/account.dart index 288a097..1a983be 100644 --- a/lib/backend/modules/account.dart +++ b/lib/backend/modules/account.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'dart:convert'; -import 'package:flutter/material.dart' show Locale; import '../api.dart'; import '../../core/protocol/opcode_map.dart'; import '../../core/protocol/packet.dart'; @@ -803,15 +802,18 @@ class AccountModule { }) async { _ensureOnline(); - final resolvedAccountId = + int? resolvedAccountId = accountId ?? await TokenStorage.getActiveAccountId(); - if (resolvedAccountId == null) { - throw StateError('login: нет активного аккаунта'); - } - final authToken = token ?? await TokenStorage.readToken(resolvedAccountId); + String? authToken = token; if (authToken == null) { - throw StateError('login: нет токена для аккаунта $resolvedAccountId'); + if (resolvedAccountId == null) { + throw StateError('login: нет активного аккаунта'); + } + authToken = await TokenStorage.readToken(resolvedAccountId); + if (authToken == null) { + throw StateError('login: нет токена для аккаунта $resolvedAccountId'); + } } final requestPayload = _buildLoginPayload(authToken, syncParams); @@ -827,10 +829,24 @@ class AccountModule { throw Exception('login: неожиданный тип payload: ${data.runtimeType}'); } - final result = await _processLoginResponse( - data.cast(), - resolvedAccountId, - ); + final dataMap = data.cast(); + + if (resolvedAccountId == null) { + final profileMap = dataMap['profile']; + if (profileMap is Map) { + final contact = profileMap['contact']; + if (contact is Map) { + resolvedAccountId = contact['id'] as int?; + } + } + if (resolvedAccountId == null) { + throw Exception('login: не удалось определить accountId из ответа'); + } + await TokenStorage.saveToken(authToken, resolvedAccountId); + await TokenStorage.setActiveAccount(resolvedAccountId); + } + + final result = await _processLoginResponse(dataMap, resolvedAccountId); _loginStatusController.add(LoginStatus.success); return result; } catch (e) { @@ -938,23 +954,7 @@ class AccountModule { throw Exception('checkPassword: отсутствует токен в ответе'); } - final profileData = data['profile']; - int? accountId; - if (profileData is Map) { - final contact = profileData['contact']; - if (contact is Map) { - accountId = contact['id'] as int?; - } - } - - if (accountId != null) { - await TokenStorage.saveToken(loginToken, accountId); - await TokenStorage.setActiveAccount(accountId); - logger.i('2FA пройдена, токен аккаунта $accountId сохранён'); - } else { - logger.w('2FA пройдена, но accountId не получен из ответа'); - } - + logger.i('2FA пройдена, получен login-токен'); return TwoFactorResult(loginToken: loginToken); } diff --git a/lib/frontend/screens/auth/password_2fa_screen.dart b/lib/frontend/screens/auth/password_2fa_screen.dart index 9a99a42..b38171e 100644 --- a/lib/frontend/screens/auth/password_2fa_screen.dart +++ b/lib/frontend/screens/auth/password_2fa_screen.dart @@ -33,14 +33,14 @@ class _Password2FAScreenState extends State { }); try { - await accountModule.checkPassword( + final result = await accountModule.checkPassword( password: _passwordController.text, trackId: widget.trackId, ); if (!mounted) return; - await accountModule.login(); + await accountModule.login(token: result.loginToken); if (!mounted) return;