Skip to content

Commit

Permalink
Use connect API (to register, recover & connect to a node)
Browse files Browse the repository at this point in the history
- Simplify CredentialsManager
  - Rename CredentialsManager file from credential_manager to credentials_manager
  - Removed GreenlightCredentials related logic from CredentialsManager
- Merge _startNewNode & restoreNode on InitialWalkthroughPage
  • Loading branch information
erdemyerebasmaz committed Jul 10, 2023
1 parent 8f5d11a commit 9a74c24
Show file tree
Hide file tree
Showing 10 changed files with 96 additions and 243 deletions.
13 changes: 4 additions & 9 deletions lib/background/breez_service_initializer.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// ignore_for_file: avoid_print
import 'package:bip39/bip39.dart' as bip39;
import 'package:breez_sdk/breez_bridge.dart';
import 'package:c_breez/bloc/account/credential_manager.dart';
import 'package:c_breez/bloc/account/credentials_manager.dart';
import 'package:c_breez/config.dart';
import 'package:c_breez/services/injector.dart';

Expand All @@ -12,16 +12,11 @@ Future<BreezBridge> initializeBreezServices() async {
print("Is Breez Services initialized: $isBreezInitialized");
if (!isBreezInitialized) {
final credentialsManager = CredentialsManager(keyChain: injector.keychain);
final credentials = await credentialsManager.restoreCredentials();
final seed = bip39.mnemonicToSeed(credentials.mnemonic);
final mnemonic = await credentialsManager.restoreMnemonic();
final seed = bip39.mnemonicToSeed(mnemonic);
print("Retrieved credentials");
await breezLib.initServices(
config: (await Config.instance()).sdkConfig,
seed: seed,
creds: credentials.glCreds,
);
await breezLib.connect(config: (await Config.instance()).sdkConfig, seed: seed);
print("Initialized Services");
await breezLib.startNode();
print("Node has started");
}
await breezLib.syncNode();
Expand Down
74 changes: 14 additions & 60 deletions lib/bloc/account/account_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:bip39/bip39.dart' as bip39;
import 'package:breez_sdk/breez_bridge.dart';
import 'package:breez_sdk/bridge_generated.dart' as sdk;
import 'package:c_breez/bloc/account/account_state.dart';
import 'package:c_breez/bloc/account/credential_manager.dart';
import 'package:c_breez/bloc/account/credentials_manager.dart';
import 'package:c_breez/bloc/account/payment_error.dart';
import 'package:c_breez/bloc/account/payment_filters.dart';
import 'package:c_breez/bloc/account/payment_result.dart';
Expand Down Expand Up @@ -51,7 +51,7 @@ class AccountBloc extends Cubit<AccountState> with HydratedMixin {

_paymentFiltersStreamController.add(state.paymentFilters);

if (!state.initial) _startRegisteredNode();
if (!state.initial) connect();

_listenPaymentResultEvents();
}
Expand All @@ -68,65 +68,17 @@ class AccountBloc extends Cubit<AccountState> with HydratedMixin {
);
}

Future _startRegisteredNode() async {
_log.v("starting registered node");
final credentials = await _credentialsManager.restoreCredentials();
final seed = bip39.mnemonicToSeed(credentials.mnemonic);
await _breezLib.initServices(
config: (await Config.instance()).sdkConfig,
seed: seed,
creds: credentials.glCreds,
);
await _startSdkForever();
}

// startNewNode register a new node and start it
Future startNewNode({
sdk.Network network = sdk.Network.Bitcoin,
required String mnemonic,
}) async {
_log.v("starting new node");
final appConf = await Config.instance();
final seed = bip39.mnemonicToSeed(mnemonic);
final sdk.GreenlightCredentials creds = await _breezLib.registerNode(
config: (await Config.instance()).sdkConfig,
network: network,
seed: seed,
registerCredentials:
sdk.GreenlightCredentials(deviceKey: appConf.glKey!, deviceCert: appConf.glCert!));
_log.i("node registered successfully");
await _credentialsManager.storeCredentials(
glCreds: creds,
mnemonic: mnemonic,
);
emit(state.copyWith(initial: false));
await _startSdkForever();
_log.i("new node started");
}

// recoverNode recovers a node from seed
Future recoverNode({
sdk.Network network = sdk.Network.Bitcoin,
required String mnemonic,
Future connect({
String? mnemonic,
}) async {
_log.v("recovering node");
final seed = bip39.mnemonicToSeed(mnemonic);
final sdk.GreenlightCredentials creds = await _breezLib.recoverNode(
config: (await Config.instance()).sdkConfig,
network: network,
seed: seed,
);
_log.i("node recovered successfully");
await _credentialsManager.storeCredentials(
glCreds: creds,
mnemonic: mnemonic,
);
emit(state.copyWith(
initial: false,
verificationStatus: VerificationStatus.VERIFIED,
));
if (mnemonic != null) {
await _credentialsManager.storeMnemonic(mnemonic: mnemonic);
emit(state.copyWith(
initial: false,
verificationStatus: VerificationStatus.VERIFIED,
));
}
await _startSdkForever();
_log.i("recovered node started");
}

Future _startSdkForever() async {
Expand Down Expand Up @@ -155,7 +107,9 @@ class AccountBloc extends Cubit<AccountState> with HydratedMixin {
_log.v("starting sdk once");
try {
emit(state.copyWith(connectionStatus: ConnectionStatus.CONNECTING));
await _breezLib.startNode();
final mnemonic = await _credentialsManager.restoreMnemonic();
final seed = bip39.mnemonicToSeed(mnemonic);
await _breezLib.connect(config: (await Config.instance()).sdkConfig, seed: seed);
emit(state.copyWith(connectionStatus: ConnectionStatus.CONNECTED));
} catch (e) {
emit(state.copyWith(connectionStatus: ConnectionStatus.DISCONNECTED));
Expand Down
122 changes: 0 additions & 122 deletions lib/bloc/account/credential_manager.dart

This file was deleted.

53 changes: 53 additions & 0 deletions lib/bloc/account/credentials_manager.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import 'dart:io';

import 'package:c_breez/services/keychain.dart';
import 'package:fimber/fimber.dart';
import 'package:path_provider/path_provider.dart';

class CredentialsManager {
final _log = FimberLog("CredentialsManager");
static const String accountMnemonic = "account_mnemonic";

final KeyChain keyChain;

CredentialsManager({required this.keyChain});

Future storeMnemonic({
required String mnemonic,
}) async {
try {
await _storeMnemonic(mnemonic);
_log.i("Stored credentials successfully");
} catch (err) {
throw Exception(err.toString());
}
}

Future<String> restoreMnemonic() async {
try {
String? mnemonicStr = await keyChain.read(accountMnemonic);
_log.i("Restored credentials successfully");
return mnemonicStr!;
} catch (err) {
throw Exception(err.toString());
}
}

// Helper methods
Future<void> _storeMnemonic(String mnemonic) async {
await keyChain.write(accountMnemonic, mnemonic);
}

Future<List<File>> exportCredentials() async {
try {
final Directory tempDir = await getTemporaryDirectory();
var keysDir = tempDir.createTempSync("keys");
final File mnemonicFile = await File('${keysDir.path}/phrase').create(recursive: true);
String mnemonic = await restoreMnemonic();
mnemonicFile.writeAsString(mnemonic);
return [mnemonicFile];
} catch (e) {
throw e.toString();
}
}
}
2 changes: 1 addition & 1 deletion lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'dart:io';
import 'package:c_breez/background/background_task_handler.dart';
import 'package:c_breez/background/breez_message_handler.dart';
import 'package:c_breez/bloc/account/account_bloc.dart';
import 'package:c_breez/bloc/account/credential_manager.dart';
import 'package:c_breez/bloc/account/credentials_manager.dart';
import 'package:c_breez/bloc/backup/backup_bloc.dart';
import 'package:c_breez/bloc/buy_bitcoin/moonpay/moonpay_bloc.dart';
import 'package:c_breez/bloc/connectivity/connectivity_bloc.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:c_breez/bloc/account/account_bloc.dart';
import 'package:c_breez/bloc/account/account_state.dart';
import 'package:c_breez/bloc/account/credential_manager.dart';
import 'package:c_breez/bloc/account/credentials_manager.dart';
import 'package:c_breez/bloc/backup/backup_bloc.dart';
import 'package:c_breez/bloc/backup/backup_state.dart';
import 'package:c_breez/bloc/ext/block_builder_extensions.dart';
Expand Down
41 changes: 10 additions & 31 deletions lib/routes/initial_walkthrough/initial_walkthrough.dart
Original file line number Diff line number Diff line change
Expand Up @@ -148,11 +148,12 @@ class InitialWalkthroughPageState extends State<InitialWalkthroughPage>
return AlphaWarningDialog();
},
);
if (approved) _startNewNode();
if (approved) connect();
}

void _startNewNode() async {
_log.v("Starting new node");
void connect({String? mnemonic}) async {
final isRestore = mnemonic != null;
_log.v("${isRestore ? "Restore" : "Starting new"} node");
final texts = context.texts();
final accountBloc = context.read<AccountBloc>();
final navigator = Navigator.of(context);
Expand All @@ -161,10 +162,12 @@ class InitialWalkthroughPageState extends State<InitialWalkthroughPage>

final themeProvider = ThemeProvider.controllerOf(context);
try {
String mnemonic = bip39.generateMnemonic(strength: 128);
await accountBloc.startNewNode(mnemonic: mnemonic);
await accountBloc.connect(mnemonic: mnemonic ?? bip39.generateMnemonic(strength: 128));
} catch (error) {
_log.i("Failed to register node", ex: error);
_log.i("Failed to ${isRestore ? "restore" : "registe"} node", ex: error);
if (isRestore) {
_restoreNodeFromMnemonicSeed(initialWords: mnemonic.split(" "));
}
showFlushbar(context, message: extractExceptionMessage(error, texts));
return;
} finally {
Expand All @@ -181,7 +184,7 @@ class InitialWalkthroughPageState extends State<InitialWalkthroughPage>
_log.v("Restore node from mnemonic seed");
String? mnemonic = await _getMnemonic(initialWords: initialWords);
if (mnemonic != null) {
restoreNode(mnemonic);
connect(mnemonic: mnemonic);
}
}

Expand All @@ -194,28 +197,4 @@ class InitialWalkthroughPageState extends State<InitialWalkthroughPage>
arguments: initialWords,
);
}

void restoreNode(String mnemonic) async {
_log.v("Restore node");
final texts = context.texts();
final accountBloc = context.read<AccountBloc>();
final navigator = Navigator.of(context);
var loaderRoute = createLoaderRoute(context);
navigator.push(loaderRoute);

final themeProvider = ThemeProvider.controllerOf(context);
try {
await accountBloc.recoverNode(mnemonic: mnemonic);
} catch (error) {
_log.w("Failed to restore node", ex: error);
_restoreNodeFromMnemonicSeed(initialWords: mnemonic.split(" "));
showFlushbar(context, message: extractExceptionMessage(error, texts));
return;
} finally {
navigator.removeRoute(loaderRoute);
}

themeProvider.setTheme('dark');
navigator.pushReplacementNamed('/');
}
}
Loading

0 comments on commit 9a74c24

Please sign in to comment.