From fd4efd46ea00a247759f2dcb6cd86555b57f79fd Mon Sep 17 00:00:00 2001 From: M Date: Wed, 23 Dec 2020 14:48:04 +0200 Subject: [PATCH 1/4] Fixes for 'std::bad_alloc' issue. --- cw_monero/ios/Classes/monero_api.cpp | 16 ++++++++++++++-- .../exceptions/wallet_loading_exception.dart | 8 ++++++++ cw_monero/lib/signatures.dart | 4 +++- cw_monero/lib/types.dart | 4 +++- cw_monero/lib/wallet_manager.dart | 13 +++++++++++-- ios/Runner.xcodeproj/project.pbxproj | 6 +++--- lib/monero/monero_wallet_service.dart | 17 ++++++++++++++++- 7 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 cw_monero/lib/exceptions/wallet_loading_exception.dart diff --git a/cw_monero/ios/Classes/monero_api.cpp b/cw_monero/ios/Classes/monero_api.cpp index 2dfd8a0ae..efe8c49f1 100644 --- a/cw_monero/ios/Classes/monero_api.cpp +++ b/cw_monero/ios/Classes/monero_api.cpp @@ -294,14 +294,26 @@ extern "C" return true; } - void load_wallet(char *path, char *password, int32_t nettype) + bool load_wallet(char *path, char *password, int32_t nettype) { nice(19); Monero::NetworkType networkType = static_cast(nettype); - Monero::Wallet *wallet = Monero::WalletManagerFactory::getWalletManager()->openWallet(std::string(path), std::string(password), networkType); + Monero::WalletManager *walletManager = Monero::WalletManagerFactory::getWalletManager(); + Monero::Wallet *wallet = walletManager->openWallet(std::string(path), std::string(password), networkType); + int status; + std::string errorString; + + wallet->statusWithErrorString(status, errorString); change_current_wallet(wallet); + + return !(status != Monero::Wallet::Status_Ok || !errorString.empty()); } + char *error_string() { + return strdup(get_current_wallet()->errorString().c_str()); + } + + bool is_wallet_exist(char *path) { return Monero::WalletManagerFactory::getWalletManager()->walletExists(std::string(path)); diff --git a/cw_monero/lib/exceptions/wallet_loading_exception.dart b/cw_monero/lib/exceptions/wallet_loading_exception.dart new file mode 100644 index 000000000..b0594c6e5 --- /dev/null +++ b/cw_monero/lib/exceptions/wallet_loading_exception.dart @@ -0,0 +1,8 @@ +class WalletLoadingException implements Exception { + WalletLoadingException({this.message}); + + final String message; + + @override + String toString() => message; +} \ No newline at end of file diff --git a/cw_monero/lib/signatures.dart b/cw_monero/lib/signatures.dart index 5e9c4fa9d..0f75288e7 100644 --- a/cw_monero/lib/signatures.dart +++ b/cw_monero/lib/signatures.dart @@ -14,7 +14,9 @@ typedef restore_wallet_from_keys = Int8 Function(Pointer, Pointer, typedef is_wallet_exist = Int8 Function(Pointer); -typedef load_wallet = Void Function(Pointer, Pointer, Int8); +typedef load_wallet = Int8 Function(Pointer, Pointer, Int8); + +typedef error_string = Pointer Function(); typedef get_filename = Pointer Function(); diff --git a/cw_monero/lib/types.dart b/cw_monero/lib/types.dart index 602a33572..1cc1a6055 100644 --- a/cw_monero/lib/types.dart +++ b/cw_monero/lib/types.dart @@ -14,7 +14,9 @@ typedef RestoreWalletFromKeys = int Function(Pointer, Pointer, typedef IsWalletExist = int Function(Pointer); -typedef LoadWallet = void Function(Pointer, Pointer, int); +typedef LoadWallet = int Function(Pointer, Pointer, int); + +typedef ErrorString = Pointer Function(); typedef GetFilename = Pointer Function(); diff --git a/cw_monero/lib/wallet_manager.dart b/cw_monero/lib/wallet_manager.dart index 07f534c97..ad2087361 100644 --- a/cw_monero/lib/wallet_manager.dart +++ b/cw_monero/lib/wallet_manager.dart @@ -7,6 +7,7 @@ import 'package:cw_monero/signatures.dart'; import 'package:cw_monero/types.dart'; import 'package:cw_monero/monero_api.dart'; import 'package:cw_monero/exceptions/wallet_creation_exception.dart'; +import 'package:cw_monero/exceptions/wallet_loading_exception.dart'; import 'package:cw_monero/exceptions/wallet_restore_from_keys_exception.dart'; import 'package:cw_monero/exceptions/wallet_restore_from_seed_exception.dart'; @@ -32,6 +33,10 @@ final loadWalletNative = moneroApi .lookup>('load_wallet') .asFunction(); +final errorStringNative = moneroApi + .lookup>('error_string') + .asFunction(); + void createWalletSync( {String path, String password, String language, int nettype = 0}) { final pathPointer = Utf8.toUtf8(path); @@ -136,10 +141,14 @@ void restoreWalletFromKeysSync( void loadWallet({String path, String password, int nettype = 0}) { final pathPointer = Utf8.toUtf8(path); final passwordPointer = Utf8.toUtf8(password); - - loadWalletNative(pathPointer, passwordPointer, nettype); + final loaded = loadWalletNative(pathPointer, passwordPointer, nettype) != 0; free(pathPointer); free(passwordPointer); + + if (!loaded) { + throw WalletLoadingException( + message: convertUTF8ToString(pointer: errorStringNative())); + } } void _createWallet(Map args) { diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 99a1c5f3c..a77e4e4c8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -371,7 +371,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.91; + MARKETING_VERSION = 4.0.92; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -511,7 +511,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.91; + MARKETING_VERSION = 4.0.92; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -545,7 +545,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.91; + MARKETING_VERSION = 4.0.92; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/lib/monero/monero_wallet_service.dart b/lib/monero/monero_wallet_service.dart index 191b340e4..fb1bdb4c4 100644 --- a/lib/monero/monero_wallet_service.dart +++ b/lib/monero/monero_wallet_service.dart @@ -3,6 +3,7 @@ import 'package:cake_wallet/core/wallet_base.dart'; import 'package:hive/hive.dart'; import 'package:cw_monero/wallet_manager.dart' as monero_wallet_manager; import 'package:cw_monero/wallet.dart' as monero_wallet; +import 'package:cw_monero/exceptions/wallet_loading_exception.dart'; import 'package:cake_wallet/monero/monero_wallet.dart'; import 'package:cake_wallet/core/wallet_credentials.dart'; import 'package:cake_wallet/core/wallet_service.dart'; @@ -55,6 +56,15 @@ class MoneroWalletService extends WalletService< final Box walletInfoSource; + static void _removeCache(String name) async { + final path = await pathForWallet(name: name, type: WalletType.monero); + final cacheFile = File(path); + + if (cacheFile.existsSync()) { + cacheFile.deleteSync(); + } + } + @override Future create(MoneroNewWalletCredentials credentials) async { try { @@ -126,7 +136,12 @@ class MoneroWalletService extends WalletService< return wallet; } catch (e) { // TODO: Implement Exception for wallet list service. - print('MoneroWalletsManager Error: $e'); + + if (e.message == 'std::bad_alloc') { + _removeCache(name); + return openWallet(name, password); + } + rethrow; } } From 647577497d819fddeffa8b1834fa067ffd399e61 Mon Sep 17 00:00:00 2001 From: M Date: Wed, 23 Dec 2020 14:51:58 +0200 Subject: [PATCH 2/4] Changed android project version to 4.0.92 (23). --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 656f9b6b2..3e680b605 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: Cake Wallet. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 4.0.91+22 +version: 4.0.92+23 environment: sdk: ">=2.7.0 <3.0.0" From 84ad97c0b01b1da850d43f0f87edc11ee9ac2448 Mon Sep 17 00:00:00 2001 From: M Date: Tue, 29 Dec 2020 18:55:58 +0200 Subject: [PATCH 3/4] Fixes for 4.0.94. Changed version for 4.0.94. --- .../exceptions/wallet_loading_exception.dart | 8 ----- .../exceptions/wallet_opening_exception.dart | 8 +++++ cw_monero/lib/wallet_manager.dart | 4 +-- lib/monero/monero_wallet_service.dart | 33 +++++++++---------- pubspec.yaml | 2 +- 5 files changed, 26 insertions(+), 29 deletions(-) delete mode 100644 cw_monero/lib/exceptions/wallet_loading_exception.dart create mode 100644 cw_monero/lib/exceptions/wallet_opening_exception.dart diff --git a/cw_monero/lib/exceptions/wallet_loading_exception.dart b/cw_monero/lib/exceptions/wallet_loading_exception.dart deleted file mode 100644 index b0594c6e5..000000000 --- a/cw_monero/lib/exceptions/wallet_loading_exception.dart +++ /dev/null @@ -1,8 +0,0 @@ -class WalletLoadingException implements Exception { - WalletLoadingException({this.message}); - - final String message; - - @override - String toString() => message; -} \ No newline at end of file diff --git a/cw_monero/lib/exceptions/wallet_opening_exception.dart b/cw_monero/lib/exceptions/wallet_opening_exception.dart new file mode 100644 index 000000000..8d84b0f7e --- /dev/null +++ b/cw_monero/lib/exceptions/wallet_opening_exception.dart @@ -0,0 +1,8 @@ +class WalletOpeningException implements Exception { + WalletOpeningException({this.message}); + + final String message; + + @override + String toString() => message; +} \ No newline at end of file diff --git a/cw_monero/lib/wallet_manager.dart b/cw_monero/lib/wallet_manager.dart index ad2087361..e48055cf9 100644 --- a/cw_monero/lib/wallet_manager.dart +++ b/cw_monero/lib/wallet_manager.dart @@ -1,4 +1,5 @@ import 'dart:ffi'; +import 'package:cw_monero/exceptions/wallet_opening_exception.dart'; import 'package:cw_monero/wallet.dart'; import 'package:ffi/ffi.dart'; import 'package:flutter/foundation.dart'; @@ -7,7 +8,6 @@ import 'package:cw_monero/signatures.dart'; import 'package:cw_monero/types.dart'; import 'package:cw_monero/monero_api.dart'; import 'package:cw_monero/exceptions/wallet_creation_exception.dart'; -import 'package:cw_monero/exceptions/wallet_loading_exception.dart'; import 'package:cw_monero/exceptions/wallet_restore_from_keys_exception.dart'; import 'package:cw_monero/exceptions/wallet_restore_from_seed_exception.dart'; @@ -146,7 +146,7 @@ void loadWallet({String path, String password, int nettype = 0}) { free(passwordPointer); if (!loaded) { - throw WalletLoadingException( + throw WalletOpeningException( message: convertUTF8ToString(pointer: errorStringNative())); } } diff --git a/lib/monero/monero_wallet_service.dart b/lib/monero/monero_wallet_service.dart index fb1bdb4c4..d964f0232 100644 --- a/lib/monero/monero_wallet_service.dart +++ b/lib/monero/monero_wallet_service.dart @@ -3,7 +3,7 @@ import 'package:cake_wallet/core/wallet_base.dart'; import 'package:hive/hive.dart'; import 'package:cw_monero/wallet_manager.dart' as monero_wallet_manager; import 'package:cw_monero/wallet.dart' as monero_wallet; -import 'package:cw_monero/exceptions/wallet_loading_exception.dart'; +import 'package:cw_monero/exceptions/wallet_opening_exception.dart'; import 'package:cake_wallet/monero/monero_wallet.dart'; import 'package:cake_wallet/core/wallet_credentials.dart'; import 'package:cake_wallet/core/wallet_service.dart'; @@ -56,7 +56,7 @@ class MoneroWalletService extends WalletService< final Box walletInfoSource; - static void _removeCache(String name) async { + static Future _removeCache(String name) async { final path = await pathForWallet(name: name, type: WalletType.monero); final cacheFile = File(path); @@ -65,6 +65,9 @@ class MoneroWalletService extends WalletService< } } + static bool walletFilesExist(String path) => + !File(path).existsSync() && !File('$path.keys').existsSync(); + @override Future create(MoneroNewWalletCredentials credentials) async { try { @@ -104,7 +107,7 @@ class MoneroWalletService extends WalletService< try { final path = await pathForWallet(name: name, type: WalletType.monero); - if (!File(path).existsSync()) { + if (walletFilesExist(path)) { await repairOldAndroidWallet(name); } @@ -118,17 +121,9 @@ class MoneroWalletService extends WalletService< final isValid = wallet.validate(); if (!isValid) { - // if (wallet.seed?.isNotEmpty ?? false) { - // let restore from seed in this case; - // final seed = wallet.seed; - // final credentials = MoneroRestoreWalletFromSeedCredentials( - // name: name, password: password, mnemonic: seed, height: 2000000) - // ..walletInfo = walletInfo; - // await remove(name); - // return restoreFromSeed(credentials); - // } - - throw MoneroWalletLoadingException(); + await _removeCache(name); + wallet.close(); + return openWallet(name, password); } await wallet.init(); @@ -137,8 +132,11 @@ class MoneroWalletService extends WalletService< } catch (e) { // TODO: Implement Exception for wallet list service. - if (e.message == 'std::bad_alloc') { - _removeCache(name); + if (e.toString().contains('bad_alloc') || + (e is WalletOpeningException && + (e.message == 'std::bad_alloc' || + e.message.contains('bad_alloc')))) { + await _removeCache(name); return openWallet(name, password); } @@ -219,7 +217,7 @@ class MoneroWalletService extends WalletService< final dir = Directory(oldAndroidWalletDirPath); if (!dir.existsSync()) { - throw MoneroWalletLoadingException(); + return; } final newWalletDirPath = @@ -238,7 +236,6 @@ class MoneroWalletService extends WalletService< }); } catch (e) { print(e.toString()); - throw MoneroWalletLoadingException(); } } } diff --git a/pubspec.yaml b/pubspec.yaml index 3e680b605..851dec206 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: Cake Wallet. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 4.0.92+23 +version: 4.0.94+25 environment: sdk: ">=2.7.0 <3.0.0" From 1c2b8c20236db078d7e953e78cebb061b4b5ff5b Mon Sep 17 00:00:00 2001 From: M Date: Tue, 29 Dec 2020 19:22:22 +0200 Subject: [PATCH 4/4] Changed iOS project version to 4.0.94. --- ios/Runner.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a77e4e4c8..4d74d0752 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -371,7 +371,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.92; + MARKETING_VERSION = 4.0.94; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -511,7 +511,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.92; + MARKETING_VERSION = 4.0.94; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -545,7 +545,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.92; + MARKETING_VERSION = 4.0.94; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";