Browse Source
wizard: fix regression: unencrypted wallets were not getting upgraded
fixes #5177
sqlite_db
SomberNight
6 years ago
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
7 changed files with
25 additions and
6 deletions
-
electrum/base_wizard.py
-
electrum/daemon.py
-
electrum/gui/kivy/main_window.py
-
electrum/gui/kivy/uix/dialogs/installwizard.py
-
electrum/gui/qt/installwizard.py
-
electrum/storage.py
-
electrum/wallet.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')) |
|
|
|
|
|
|
|
|
|
@ -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) |
|
|
|
|
|
@ -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: |
|
|
|
|
|
@ -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): |
|
|
|
|
|
@ -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): |
|
|
|
|
|
@ -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): |
|
|
|
|
|
@ -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 |
|
|
|