Skip to content

fix: remove database isolate #660

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 33 additions & 7 deletions integration_test/test_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ import 'package:my_wit_wallet/theme/colors.dart';
import 'package:my_wit_wallet/util/extensions/string_extensions.dart';
import 'package:my_wit_wallet/util/get_localization.dart';
import 'package:my_wit_wallet/util/storage/database/wallet.dart';
import 'package:my_wit_wallet/util/storage/path_provider_interface.dart';
import 'package:my_wit_wallet/widgets/buttons/custom_btn.dart';
import 'package:my_wit_wallet/widgets/buttons/icon_btn.dart';
import 'package:my_wit_wallet/widgets/labeled_checkbox.dart';
import 'package:my_wit_wallet/widgets/select.dart';
import 'package:my_wit_wallet/main.dart' as myWitWallet;
import 'package:my_wit_wallet/globals.dart' as globals;
import 'package:integration_test/integration_test.dart';
part 'e2e_auth_preferences_test.dart';
part 'e2e_export_node_xprv_test.dart';
part 'e2e_export_hd_xprv_test.dart';
Expand Down Expand Up @@ -62,10 +64,21 @@ Finder widgetByIcon(IconData icon) => find.byIcon(icon);
Finder widgetByLabel(String label) => find.bySemanticsLabel(label);

Future<void> initializeTest(WidgetTester tester) async {
myWitWallet.main();
await tester.pumpAndSettle();
WidgetsFlutterBinding.ensureInitialized();
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
await dotenv.load(fileName: ".env");
String deleteStorageFlag = dotenv.env['DELETE_TEST_STORAGE'] ?? 'false';

Locator.setup();
await Locator.initialize();

globals.testingDeleteStorage = deleteStorageFlag.toBoolean();
if (globals.testingDeleteStorage) {
await deleteDB();
}

myWitWallet.main();
await tester.pumpAndSettle();
await tester.pumpAndSettle(Duration(seconds: initializeDelay));
}

Expand Down Expand Up @@ -233,15 +246,28 @@ Future<bool> scrollUntilVisible(
return true;
}

Future<void> deleteDB() async {
ApiDatabase apiDatabase = Locator.instance<ApiDatabase>();

PathProviderInterface interface = PathProviderInterface();
// 💣 Delete old DB before running tests
final dbFilePath = interface.getDbWalletsPath();
final dbFile = File(dbFilePath);
if (dbFile.existsSync()) {
await dbFile.delete();
}
bool isDeleted = await apiDatabase.deleteAllWallets();
if (isDeleted) {
await apiDatabase.openDatabase();
globals.firstRun = false;
}
}

Future<bool> teardownTest() async {
ApiDatabase apiDatabase = Locator.instance<ApiDatabase>();
if (globals.testingActive) {
if (globals.testingDeleteStorage) {
bool isDeleted = await apiDatabase.deleteAllWallets();
if (isDeleted) {
await apiDatabase.openDatabase();
globals.firstRun = false;
}
await deleteDB();
}
await apiDatabase.lockDatabase();
}
Expand Down
25 changes: 21 additions & 4 deletions lib/bloc/crypto/api_crypto.dart
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class ApiCrypto {
) async {
Map<String, List<String>> _signers = {};
// get master key
String key = await db.getKeychain();
String? keychain = await db.keychain().keychain;

/// loop through utxos
for (int i = 0; i < utxos.length; i++) {
Expand Down Expand Up @@ -141,7 +141,7 @@ class ApiCrypto {
List<KeyedSignature> signatures = await cryptoIsolate.send(
method: 'signTransaction',
params: {
'password': key,
'password': keychain,
'signers': _signers,
'transaction_id': transactionId
});
Expand All @@ -155,6 +155,23 @@ class ApiCrypto {
});
}

Future<String> encodeKeychain({required String password}) async {
CryptoIsolate cryptoIsolate = Locator.instance.get<CryptoIsolate>();
return await cryptoIsolate.send(method: 'encodeKeychain', params: {
'password': password,
});
}

Future<String?> decodeKeychain(
{required String encoded, required String password}) async {
CryptoIsolate cryptoIsolate = Locator.instance.get<CryptoIsolate>();
var resp = await cryptoIsolate.send(method: 'decodeKeychain', params: {
'encoded': encoded,
'password': password,
});
return resp;
}

Future<String> encryptXprv(
{required String xprv, required String password}) async {
CryptoIsolate cryptoIsolate = Locator.instance.get<CryptoIsolate>();
Expand Down Expand Up @@ -203,7 +220,7 @@ class ApiCrypto {
}

Future<dynamic> signUnstakeBody(Uint8List unstakeBody, String address) async {
String key = await db.getKeychain();
String? key = await db.getKeychain();

Wallet currentWallet = db.walletStorage.currentWallet;
Account? _account = currentWallet.allAccounts()[address];
Expand All @@ -224,7 +241,7 @@ class ApiCrypto {

Future<Map<String, dynamic>> signMessage(
String message, String address) async {
String key = await db.getKeychain();
String? key = await db.keychain().keychain;

Wallet currentWallet = db.walletStorage.currentWallet;
Account? _account = currentWallet.allAccounts()[address];
Expand Down
5 changes: 3 additions & 2 deletions lib/bloc/crypto/crypto_bloc.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:convert';
import 'dart:isolate';
import 'dart:typed_data';
import 'package:bloc/bloc.dart';
Expand Down Expand Up @@ -236,8 +237,8 @@ class CryptoBloc extends Bloc<CryptoEvent, CryptoState> {
{required CryptoInitializeWalletEvent event}) async {
ApiCrypto apiCrypto = Locator.instance.get<ApiCrypto>();
ApiDatabase db = Locator.instance<ApiDatabase>();
String key = await db.getKeychain();
final masterKey = key != '' ? key : event.password;
String? key = await db.getKeychain();
final String masterKey = key != null ? key : event.password;

apiCrypto.setInitialWalletData(
event.walletName,
Expand Down
47 changes: 47 additions & 0 deletions lib/bloc/crypto/crypto_isolate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ Map<String, Function(Map<String, dynamic>)> _methodMap = {
'signUnstakeBody': _signUnstakeBody,
'signMessage': _signMessage,
'hashPassword': _hashPassword,
'encodeKeychain': _encodeKeychain,
'decodeKeychain': _decodeKeychain,
'encryptXprv': _encryptXprv,
'decryptXprv': _decryptXprv,
'verifySheikahXprv': _verifySheikahXprv,
Expand Down Expand Up @@ -129,6 +131,8 @@ Future<dynamic> _signTransaction(Map<String, dynamic> params) async {

Map<String, KeyedSignature> _sigMap = {};
signers.forEach((encryptedXprv, paths) {
print(encryptedXprv);
print(password);
Xprv masterXprv = Xprv.fromEncryptedXprv(encryptedXprv, password);

paths.forEach((path) {
Expand Down Expand Up @@ -279,6 +283,49 @@ String _hashPassword(Map<String, dynamic> params) {
return Password.hash(params['password']);
}

Uint8List _formatData(Uint8List data, [int length = 128, int padByte = 11]) {
Uint8List _data = Uint8List(length);
int padLength = _data.length - data.length;
Uint8List padding = Uint8List(padLength);
for (int i = 0; i < padLength; i++) {
padding[i] = padByte;
}
_data.setRange(0, data.length, data);
_data.setRange(data.length, _data.length, padding);
return _data;
}

String _encodeKeychain(Map<String, dynamic> params) {
String password = params['password'];
Uint8List data =
Uint8List.fromList('{"WITNET":"${Password.hash(password)}"}'.codeUnits);
Uint8List dat = _formatData(data);
Uint8List _iv = generateIV();
Uint8List _salt = generateSalt();
CodecAES codec = getCodecAES(password, salt: _salt, iv: _iv);
Uint8List encoded = hexToBytes(codec.encode(dat));
Uint8List encodedData = concatBytes([_iv, _salt, encoded]);
return bytesToHex(encodedData);
}

String? _decodeKeychain(Map<String, dynamic> params) {
String _encoded = params['encoded'];
String _password = params['password'];
Uint8List dat = Uint8List.fromList(hexToBytes(_encoded));
Uint8List iv = dat.sublist(0, 16);
Uint8List salt = dat.sublist(16, 48);
Uint8List data = dat.sublist(48);

CodecAES codec = getCodecAES(_password, salt: salt, iv: iv);
Uint8List decoded = codec.decode(bytesToHex(data)) as Uint8List;

try {
return json.decode(utf8.decode(decoded).trim())['WITNET'];
} catch (e) {
return null;
}
}

String _encryptXprv(Map<String, dynamic> params) {
Xprv _xprv = Xprv.fromXprv(params['xprv']);
return _xprv.toEncryptedXprv(password: params['password']);
Expand Down
6 changes: 3 additions & 3 deletions lib/bloc/explorer/explorer_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -578,7 +578,7 @@ class ExplorerBloc extends Bloc<ExplorerEvent, ExplorerState> {
try {
ValueTransferInfo? vtt = await explorer.getVtt(_vtt.txnHash);
if (vtt != null && _vtt.status != vtt.status) {
await database.updateVtt(wallet.id, vtt);
await database.updateVtt(vtt);
}
} catch (e) {
/// If the getVtt method returns null we enter this catch
Expand All @@ -597,7 +597,7 @@ class ExplorerBloc extends Bloc<ExplorerEvent, ExplorerState> {
try {
StakeEntry? stake = await explorer.getStake(_stake.hash);
if (stake != null && _stake.status != stake.status) {
await database.updateStake(wallet.id, stake);
await database.updateStake(stake);
}
} catch (e) {
/// If the getStake method returns null we enter this catch
Expand All @@ -621,7 +621,7 @@ class ExplorerBloc extends Bloc<ExplorerEvent, ExplorerState> {
try {
UnstakeEntry? unstake = await explorer.getUnstake(_unstake.hash);
if (unstake != null && _unstake.status != unstake.status) {
await database.updateUnstake(wallet.id, unstake);
await database.updateUnstake(unstake);
}
} catch (e) {
/// If the getUnstake method returns null we enter this catch
Expand Down
4 changes: 2 additions & 2 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ import 'package:my_wit_wallet/theme/wallet_theme.dart';
import 'package:my_wit_wallet/util/preferences.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await dotenv.load(fileName: ".env");
Locator.setup();
WidgetsFlutterBinding.ensureInitialized();

await Locator.initialize();
if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) {
await windowManager.ensureInitialized();
WindowOptions windowOptions = WindowOptions(
Expand Down
3 changes: 1 addition & 2 deletions lib/screens/create_wallet/encrypt_wallet_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ class EncryptWalletCardState extends State<EncryptWalletCard>
.addPostFrameCallback((_) => widget.nextAction(null));
// set masterKey
Locator.instance<ApiCreateWallet>().setPassword(_password.value);
await Locator.instance<ApiDatabase>()
.setPassword(newPassword: _password.value);
await Locator.instance<ApiDatabase>().setPassword(_password.value);
CreateWalletType type =
BlocProvider.of<CreateWalletBloc>(context).state.createWalletType;
BlocProvider.of<CreateWalletBloc>(context)
Expand Down
2 changes: 0 additions & 2 deletions lib/shared/api_auth.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ class ApiAuth {
try {
final tmp = Locator.instance.get<ApiDatabase>();
return {'result': tmp};
} on DBException catch (e) {
throw AuthException(code: e.code, message: e.message);
} on DatabaseException catch (e) {
throw AuthException(code: e.code, message: e.message);
}
Expand Down
Loading
Loading