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:
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