diff --git a/lib/store/code_store.dart b/lib/store/code_store.dart index a20296c32..f20de1f02 100644 --- a/lib/store/code_store.dart +++ b/lib/store/code_store.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:typed_data'; import 'package:collection/collection.dart'; import 'package:ente_auth/core/configuration.dart'; @@ -9,7 +8,6 @@ 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 { @@ -48,7 +46,7 @@ class CodeStore { return codes; } - Future addCode( + Future addCode( Code code, { bool shouldSync = true, AccountMode? accountMode, @@ -59,13 +57,15 @@ class CodeStore { for (final existingCode in codes) { if (existingCode == code) { _logger.info("Found duplicate code, skipping add"); - return; + return AddResult.duplicate; } else if (existingCode.generatedID == code.generatedID) { isExistingCode = true; break; } } + late AddResult result; if (isExistingCode) { + result = AddResult.updateCode; await _authenticatorService.updateEntry( code.generatedID!, jsonEncode(code.rawData), @@ -73,6 +73,7 @@ class CodeStore { mode, ); } else { + result = AddResult.newCode; code.generatedID = await _authenticatorService.addEntry( jsonEncode(code.rawData), shouldSync, @@ -80,6 +81,7 @@ class CodeStore { ); } Bus.instance.fire(CodesUpdatedEvent()); + return result; } Future removeCode(Code code, {AccountMode? accountMode}) async { @@ -89,6 +91,7 @@ class CodeStore { } Future importOfflineCodes() async { + Logger logger = Logger('importOfflineCodes'); try { Configuration config = Configuration.instance; if (!config.hasConfiguredAccount() || @@ -96,26 +99,48 @@ class CodeStore { config.getOfflineSecretKey() == null) { return; } - _logger.info('starting offline imports'); + logger.info('start import'); - List offlineCodes = - await CodeStore.instance.getAllCodes(accountMode: AccountMode.offline); - if(offlineCodes.isEmpty) { + 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"); + if (!isOnlineSyncDone) { + logger.info("skip as online sync is not done"); return; } + final List onlineCodes = + await CodeStore.instance.getAllCodes(accountMode: AccountMode.online); + logger.info( + 'importing ${offlineCodes.length} offline codes with ${onlineCodes.length} online codes', + ); for (Code eachCode in offlineCodes) { - await CodeStore.instance.addCode( - eachCode, - accountMode: AccountMode.online, - shouldSync: false, + bool alreadyPresent = onlineCodes.any( + (oc) => + oc.issuer == eachCode.issuer && + oc.account == eachCode.account && + oc.secret == eachCode.secret, ); + int? generatedID = eachCode.generatedID!; + logger.info( + 'importingCode: genID ${eachCode.generatedID} & isAlreadyPresent $alreadyPresent', + ); + if (!alreadyPresent) { + // Avoid conflict with generatedID of online codes + eachCode.generatedID = null; + final AddResult result = await CodeStore.instance.addCode( + eachCode, + accountMode: AccountMode.online, + shouldSync: false, + ); + logger.info( + 'importedCode: genID ${eachCode.generatedID} result: ${result.name}', + ); + } await OfflineAuthenticatorDB.instance.deleteByIDs( - generatedIDs: [eachCode.generatedID!], + generatedIDs: [generatedID], ); } AuthenticatorService.instance.onlineSync().ignore(); @@ -124,3 +149,9 @@ class CodeStore { } } } + +enum AddResult { + newCode, + duplicate, + updateCode, +} diff --git a/lib/ui/home_page.dart b/lib/ui/home_page.dart index c6f3c73c9..e8f9305d0 100644 --- a/lib/ui/home_page.dart +++ b/lib/ui/home_page.dart @@ -66,10 +66,9 @@ class _HomePageState extends State { }); _initDeepLinks(); Future.delayed( - const Duration(seconds: 0), - () => CodeStore.instance.importOfflineCodes(), + const Duration(seconds: 1), + () async => await CodeStore.instance.importOfflineCodes(), ); - } void _loadCodes() { diff --git a/pubspec.yaml b/pubspec.yaml index 6eab8b01c..97df72e18 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: ente_auth description: ente two-factor authenticator -version: 1.0.57+57 +version: 1.0.58+58 publish_to: none environment: