diff --git a/lib/services/authenticator_service.dart b/lib/services/authenticator_service.dart index eb450d29a..cdc9a4fb3 100644 --- a/lib/services/authenticator_service.dart +++ b/lib/services/authenticator_service.dart @@ -161,11 +161,11 @@ class AuthenticatorService { } } - Future onlineSync() async { + Future onlineSync() async { try { if(getAccountMode().isOffline) { debugPrint("Skipping sync since account mode is offline"); - return; + return false; } _logger.info("Sync"); await _remoteToLocalSync(); @@ -173,6 +173,7 @@ class AuthenticatorService { await _localToRemoteSync(); _logger.info("local push completed"); Bus.instance.fire(CodesUpdatedEvent()); + return true; } on UnauthorizedError { if ((await _db.removeSyncedData()) > 0) { Bus.instance.fire(CodesUpdatedEvent()); @@ -180,8 +181,10 @@ class AuthenticatorService { debugPrint("Firing logout event"); Bus.instance.fire(TriggerLogoutEvent()); + return false; } catch (e) { _logger.severe("Failed to sync with remote", e); + return false; } } diff --git a/lib/store/code_store.dart b/lib/store/code_store.dart index fbc2d9d6f..a20296c32 100644 --- a/lib/store/code_store.dart +++ b/lib/store/code_store.dart @@ -9,6 +9,7 @@ import 'package:ente_auth/models/authenticator/entity_result.dart'; import 'package:ente_auth/models/code.dart'; import 'package:ente_auth/services/authenticator_service.dart'; import 'package:ente_auth/store/offline_authenticator_db.dart'; +import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; class CodeStore { @@ -90,29 +91,33 @@ class CodeStore { Future importOfflineCodes() async { try { Configuration config = Configuration.instance; - // Account isn't configured yet, so we can't import offline codes - if (!config.hasConfiguredAccount()) { - return; - } - // Never opted for offline mode, so we can't import offline codes - if (!config.hasOptedForOfflineMode()) { - return; - } - Uint8List? hasOfflineKey = config.getOfflineSecretKey(); - if (hasOfflineKey == null) { - // No offline key, so we can't import offline codes + if (!config.hasConfiguredAccount() || + !config.hasOptedForOfflineMode() || + config.getOfflineSecretKey() == null) { return; } + _logger.info('starting offline imports'); + List offlineCodes = await CodeStore.instance.getAllCodes(accountMode: AccountMode.offline); + if(offlineCodes.isEmpty) { + return; + } + bool isOnlineSyncDone = await AuthenticatorService.instance.onlineSync(); + if(!isOnlineSyncDone) { + debugPrint("Skipping offline import since online sync failed"); + return; + } for (Code eachCode in offlineCodes) { await CodeStore.instance.addCode( eachCode, accountMode: AccountMode.online, shouldSync: false, ); + await OfflineAuthenticatorDB.instance.deleteByIDs( + generatedIDs: [eachCode.generatedID!], + ); } - OfflineAuthenticatorDB.instance.clearTable(); AuthenticatorService.instance.onlineSync().ignore(); } catch (e, s) { _logger.severe("error while importing offline codes", e, s); diff --git a/pubspec.yaml b/pubspec.yaml index 1e9485fd1..6eab8b01c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: ente_auth description: ente two-factor authenticator -version: 1.0.56+56 +version: 1.0.57+57 publish_to: none environment: