diff --git a/lib/app/app_controller_desktop_runtime_helpers.dart b/lib/app/app_controller_desktop_runtime_helpers.dart index 1a977fdc..b772d0ca 100644 --- a/lib/app/app_controller_desktop_runtime_helpers.dart +++ b/lib/app/app_controller_desktop_runtime_helpers.dart @@ -1207,10 +1207,7 @@ extension AppControllerDesktopRuntimeHelpers on AppController { } Future _resolveManagedBridgeAuthTokenInternal() async { - final accountSyncState = settingsControllerInternal.accountSyncState; - if (settingsControllerInternal.accountSignedIn && - accountSyncState?.syncState.trim().toLowerCase() == 'ready' && - accountSyncState?.tokenConfigured.bridge == true) { + if (settingsControllerInternal.accountSignedIn) { final bridgeToken = (await storeInternal.loadAccountManagedSecret( target: kAccountManagedSecretTargetBridgeAuthToken, ))?.trim(); diff --git a/test/runtime/runtime_controllers_settings_account_test.dart b/test/runtime/runtime_controllers_settings_account_test.dart index b82f5af8..5631e00e 100644 --- a/test/runtime/runtime_controllers_settings_account_test.dart +++ b/test/runtime/runtime_controllers_settings_account_test.dart @@ -82,6 +82,71 @@ void main() { }, ); + test( + 'keeps using managed bridge token after the account sync state is blocked', + () async { + final storeRoot = await Directory.systemTemp.createTemp( + 'xworkmate-account-sync-blocked-token-', + ); + addTearDown(() async { + if (await storeRoot.exists()) { + await storeRoot.delete(recursive: true); + } + }); + + final store = SecureConfigStore( + secretRootPathResolver: () async => '${storeRoot.path}/secrets', + appDataRootPathResolver: () async => '${storeRoot.path}/app-data', + supportRootPathResolver: () async => '${storeRoot.path}/support', + enableSecureStorage: false, + ); + await store.initialize(); + await store.saveSettingsSnapshot( + SettingsSnapshot.defaults().copyWith( + accountBaseUrl: 'https://accounts.svc.plus', + ), + ); + await store.saveAccountSessionToken('session-token'); + await store.saveAccountSessionSummary( + const AccountSessionSummary( + userId: 'user-1', + email: 'review@svc.plus', + name: 'Review User', + role: 'reviewer', + mfaEnabled: true, + ), + ); + await store.saveAccountManagedSecret( + target: kAccountManagedSecretTargetBridgeAuthToken, + value: 'managed-token', + ); + await store.saveAccountSyncState( + AccountSyncState.defaults().copyWith( + syncState: 'blocked', + syncMessage: 'Bridge token expired or rejected.', + tokenConfigured: const AccountTokenConfigured( + bridge: true, + vault: false, + ), + ), + ); + + final controller = AppController( + store: store, + environmentOverride: const {}, + ); + addTearDown(controller.dispose); + await controller.settingsControllerInternal.initialize(); + + final token = await controller.settingsControllerInternal + .loadEffectiveGatewayToken( + profileIndex: kGatewayRemoteProfileIndex, + ); + + expect(token, 'managed-token'); + }, + ); + test( 'updates in-memory blocked state when bridge authorization is unavailable', () async {