From 70a638a7c3cb81f3a6e2c0fae3c9aeb9fdad28d5 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 28 Apr 2014 17:30:48 +0200 Subject: [PATCH] more robust install wizard --- gui/qt/__init__.py | 28 +++++++++----------- gui/qt/installwizard.py | 58 +++++++++++++++++++++++++++-------------- lib/wallet.py | 30 ++++++++++++--------- 3 files changed, 67 insertions(+), 49 deletions(-) diff --git a/gui/qt/__init__.py b/gui/qt/__init__.py index c3c7da75..b2bb524e 100644 --- a/gui/qt/__init__.py +++ b/gui/qt/__init__.py @@ -151,24 +151,20 @@ class ElectrumGui: def main(self, url): storage = WalletStorage(self.config) - if not storage.file_exists: - import installwizard - wizard = installwizard.InstallWizard(self.config, self.network, storage) - wallet = wizard.run() - if not wallet: - exit() - - elif storage.get('wallet_type') in ['2of3'] and storage.get('seed') is None: - import installwizard - wizard = installwizard.InstallWizard(self.config, self.network, storage) - wallet = wizard.run(action= 'create2of3') - if not wallet: - exit() - - else: + if storage.file_exists: wallet = Wallet(storage) + action = wallet.get_action() + else: + action = 'new' + + if action is not None: + import installwizard + wizard = installwizard.InstallWizard(self.config, self.network, storage) + wallet = wizard.run(action) + if not wallet: + exit() + else: wallet.start_threads(self.network) - # init tray self.dark_icon = self.config.get("dark_icon", False) diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py index 314af07a..2fe9b3a6 100644 --- a/gui/qt/installwizard.py +++ b/gui/qt/installwizard.py @@ -275,9 +275,9 @@ class InstallWizard(QDialog): return '2of3' - def run(self, action = None): + def run(self, action): - if action is None: + if action == 'new': action = self.restore_or_create() if action is None: @@ -289,32 +289,53 @@ class InstallWizard(QDialog): return if t == '2of3': - run_hook('create_cold_seed', self.storage, self) - return - - - if action in ['create', 'create2of3']: + action = 'create_cold' + + if action in ['create', 'create_cold', 'create_hot', 'create_remote']: wallet = Wallet(self.storage) + + if action == 'create': seed = wallet.make_seed() - sid = 'hot' if action == 'create2of3' else None - if not self.show_seed(seed, sid): + if not self.show_seed(seed, None): return - if not self.verify_seed(seed, sid): + if not self.verify_seed(seed, None): return password = self.password_dialog() wallet.add_seed(seed, password) - - if action == 'create2of3': - run_hook('create_third_key', wallet, self) - if not wallet.master_public_keys.get("remote/"): - return - wallet.create_accounts(password) # generate first addresses offline self.waiting_dialog(wallet.synchronize) - elif action == 'restore': + + if action == 'create_cold': + run_hook('create_cold_seed', self.storage, self) + return + + + if action == 'create_hot': + msg = _('You are about to create the hot seed of a multisig wallet') + if not self.question(msg): + return + seed = wallet.make_seed() + if not self.show_seed(seed, 'hot'): + return + if not self.verify_seed(seed, 'hot'): + return + password = self.password_dialog() + wallet.add_seed(seed, password) + action = 'create_remote' + + + if action == 'create_remote': + run_hook('create_remote_key', wallet, self) + if not wallet.master_public_keys.get("remote/"): + return + wallet.create_account() + self.waiting_dialog(wallet.synchronize) + + + if action == 'restore': t = self.choose_wallet_type() if not t: return @@ -362,9 +383,6 @@ class InstallWizard(QDialog): raise - - - else: raise #if not self.config.get('server'): if self.network: diff --git a/lib/wallet.py b/lib/wallet.py index 5aae676a..bc94861d 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -237,6 +237,10 @@ class NewWallet: for tx2 in self.transactions.values(): tx2.add_extra_addresses({h:tx}) + + def get_action(self): + pass + def can_create_accounts(self): return not self.is_watching_only() @@ -1482,7 +1486,7 @@ class Wallet_2of2(NewWallet): def can_create_accounts(self): return False - def make_account(self, account_id, password): + def create_account(self, account_id): """Creates and saves the master keys, but does not save the account""" xpub1 = self.master_public_keys.get("m/") xpub2 = self.master_public_keys.get("cold/") @@ -1495,17 +1499,6 @@ class Wallet_2of2(NewWallet): return {'hot':xpub1, 'cold':xpub2} - def add_cold_seed(self, cold_seed, password): - seed_version, cold_seed = self.prepare_seed(cold_seed) - hex_seed = mnemonic_to_seed(cold_seed,'').encode('hex') - xpriv, xpub = bip32_root(hex_seed) - - if password: - cold_seed = pw_encode( cold_seed, password) - self.storage.put('cold_seed', cold_seed, True) - - self.add_master_public_key('cold/', xpub) - self.add_master_private_key('cold/', xpriv, password) class Wallet_2of3(Wallet_2of2): @@ -1514,7 +1507,7 @@ class Wallet_2of3(Wallet_2of2): NewWallet.__init__(self, storage) self.storage.put('wallet_type', '2of3', True) - def create_accounts(self, password): + def create_account(self): xpub1 = self.master_public_keys.get("m/") xpub2 = self.master_public_keys.get("cold/") xpub3 = self.master_public_keys.get("remote/") @@ -1527,6 +1520,17 @@ class Wallet_2of3(Wallet_2of2): xpub3 = self.master_public_keys.get("remote/") return {'hot':xpub1, 'cold':xpub2, 'remote':xpub3} + def get_action(self): + xpub1 = self.master_public_keys.get("m/") + xpub2 = self.master_public_keys.get("cold/") + xpub3 = self.master_public_keys.get("remote/") + if xpub2 is None: + return 'create_cold' + if xpub1 is None: + return 'create_hot' + if xpub3 is None: + return 'create_remote' + class WalletSynchronizer(threading.Thread):