URI: 
       twizard: fix regression: unencrypted wallets were not getting upgraded - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 12b98fa251f451712a607124466012bec1cfa132
   DIR parent bf1c1c2a11d9ca91bcda2a826d44d9e251da0692
  HTML 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:
         M electrum/base_wizard.py             |       7 +++++--
         M electrum/daemon.py                  |       2 ++
         M electrum/gui/kivy/main_window.py    |      10 +++++++++-
         M electrum/gui/kivy/uix/dialogs/inst… |       5 +++--
         M electrum/gui/qt/installwizard.py    |       2 +-
         M electrum/storage.py                 |       2 ++
         M electrum/wallet.py                  |       3 +++
       
       7 files changed, 25 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/electrum/base_wizard.py b/electrum/base_wizard.py
       t@@ -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
       t@@ -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():
       t@@ -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'))
        
   DIR diff --git a/electrum/daemon.py b/electrum/daemon.py
       t@@ -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)
   DIR diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py
       t@@ -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:
   DIR diff --git a/electrum/gui/kivy/uix/dialogs/installwizard.py b/electrum/gui/kivy/uix/dialogs/installwizard.py
       t@@ -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):
   DIR diff --git a/electrum/gui/qt/installwizard.py b/electrum/gui/qt/installwizard.py
       t@@ -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):
   DIR diff --git a/electrum/storage.py b/electrum/storage.py
       t@@ -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):
   DIR diff --git a/electrum/wallet.py b/electrum/wallet.py
       t@@ -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