electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 12b98fa251f451712a607124466012bec1cfa132
parent bf1c1c2a11d9ca91bcda2a826d44d9e251da0692
Author: SomberNight <somber.night@protonmail.com>
Date:   Mon,  4 Mar 2019 17:23:43 +0100

wizard: fix regression: unencrypted wallets were not getting upgraded

fixes #5177

Diffstat:
Melectrum/base_wizard.py | 7+++++--
Melectrum/daemon.py | 2++
Melectrum/gui/kivy/main_window.py | 10+++++++++-
Melectrum/gui/kivy/uix/dialogs/installwizard.py | 5+++--
Melectrum/gui/qt/installwizard.py | 2+-
Melectrum/storage.py | 2++
Melectrum/wallet.py | 3+++
7 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/electrum/base_wizard.py b/electrum/base_wizard.py @@ -28,7 +28,7 @@ import sys import copy import traceback from functools import partial -from typing import List, TYPE_CHECKING, Tuple, NamedTuple, Any, Dict +from typing import List, TYPE_CHECKING, Tuple, NamedTuple, Any, Dict, Optional from . import bitcoin from . import keystore @@ -137,7 +137,7 @@ class BaseWizard(object): exc = None def on_finished(): if exc is None: - self.terminate() + self.terminate(storage=storage) else: raise exc def do_upgrade(): @@ -571,6 +571,9 @@ class BaseWizard(object): storage.load_plugins() return storage + def terminate(self, *, storage: Optional[WalletStorage] = None): + raise NotImplementedError() # implemented by subclasses + def show_xpub_and_add_cosigners(self, xpub): self.show_xpub_dialog(xpub=xpub, run_next=lambda x: self.run('choose_keystore')) diff --git a/electrum/daemon.py b/electrum/daemon.py @@ -251,6 +251,8 @@ class Daemon(DaemonThread): storage.decrypt(password) if storage.requires_split(): return + if storage.requires_upgrade(): + return if storage.get_action(): return wallet = Wallet(storage) diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py @@ -557,7 +557,15 @@ class ElectrumWindow(App): wizard = Factory.InstallWizard(self.electrum_config, self.plugins) wizard.path = path wizard.bind(on_wizard_complete=self.on_wizard_complete) - wizard.run('new') + storage = WalletStorage(path, manual_upgrades=True) + if not storage.file_exists(): + wizard.run('new') + elif storage.is_encrypted(): + raise Exception("Kivy GUI does not support encrypted wallet files.") + elif storage.requires_upgrade(): + wizard.upgrade_storage(storage) + else: + raise Exception("unexpected storage file situation") if not ask_if_wizard: launch_wizard() else: diff --git a/electrum/gui/kivy/uix/dialogs/installwizard.py b/electrum/gui/kivy/uix/dialogs/installwizard.py @@ -971,8 +971,9 @@ class InstallWizard(BaseWizard, Widget): t = threading.Thread(target = target) t.start() - def terminate(self, **kwargs): - storage = self.create_storage(self.path) + def terminate(self, *, storage=None): + if storage is None: + storage = self.create_storage(self.path) self.dispatch('on_wizard_complete', storage) def choice_dialog(self, **kwargs): diff --git a/electrum/gui/qt/installwizard.py b/electrum/gui/qt/installwizard.py @@ -479,7 +479,7 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard): def action_dialog(self, action, run_next): self.run(action) - def terminate(self): + def terminate(self, **kwargs): self.accept_signal.emit() def waiting_dialog(self, task, msg, on_finished=None): diff --git a/electrum/storage.py b/electrum/storage.py @@ -219,6 +219,8 @@ class WalletStorage(PrintError): self.db.set_modified(True) def requires_upgrade(self): + if not self.is_past_initial_decryption(): + raise Exception("storage not yet decrypted!") return self.db.requires_upgrade() def upgrade(self): diff --git a/electrum/wallet.py b/electrum/wallet.py @@ -192,6 +192,9 @@ class Abstract_Wallet(AddressSynchronizer): verbosity_filter = 'w' def __init__(self, storage: WalletStorage): + if storage.requires_upgrade(): + raise Exception("storage must be upgraded before constructing wallet") + AddressSynchronizer.__init__(self, storage) # saved fields