From a5ffa69a3eac325dfa38102824abcfe751ffb704 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 12 Oct 2017 07:08:00 +0200 Subject: [PATCH] storage: upgrade format version automatically in load_data() --- gui/qt/installwizard.py | 2 +- lib/daemon.py | 3 +-- lib/storage.py | 20 +++++++++++++++++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py index 897ad8975..e5ca910da 100644 --- a/gui/qt/installwizard.py +++ b/gui/qt/installwizard.py @@ -191,7 +191,7 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard): def on_filename(filename): path = os.path.join(wallet_folder, filename) try: - self.storage = WalletStorage(path) + self.storage = WalletStorage(path, manual_upgrades=True) except IOError: self.storage = None if self.storage: diff --git a/lib/daemon.py b/lib/daemon.py index f6bb2542b..1aa3a07dd 100644 --- a/lib/daemon.py +++ b/lib/daemon.py @@ -210,7 +210,7 @@ class Daemon(DaemonThread): if path in self.wallets: wallet = self.wallets[path] return wallet - storage = WalletStorage(path) + storage = WalletStorage(path, manual_upgrades=True) if not storage.file_exists(): return if storage.is_encrypted(): @@ -220,7 +220,6 @@ class Daemon(DaemonThread): if storage.requires_split(): return if storage.requires_upgrade(): - self.print_error('upgrading wallet format') storage.upgrade() if storage.get_action(): return diff --git a/lib/storage.py b/lib/storage.py index cf5c3dc62..0b6f42de8 100644 --- a/lib/storage.py +++ b/lib/storage.py @@ -62,8 +62,9 @@ def multisig_type(wallet_type): class WalletStorage(PrintError): - def __init__(self, path): + def __init__(self, path, manual_upgrades=False): self.print_error("wallet path", path) + self.manual_upgrades = manual_upgrades self.lock = threading.RLock() self.data = {} self.path = path @@ -74,6 +75,9 @@ class WalletStorage(PrintError): self.raw = f.read() if not self.is_encrypted(): self.load_data(self.raw) + else: + # avoid new wallets getting 'upgraded' + self.put('seed_version', FINAL_SEED_VERSION) def load_data(self, s): try: @@ -99,6 +103,12 @@ class WalletStorage(PrintError): l = plugin_loaders.get(t) if l: l() + if not self.manual_upgrades: + if self.requires_split(): + raise BaseException("This wallet has multiple accounts and must be split") + if self.requires_upgrade(): + self.upgrade() + def is_encrypted(self): try: return base64.b64decode(self.raw)[0:4] == b'BIE1' @@ -155,8 +165,6 @@ class WalletStorage(PrintError): @profiler def write(self): - # this ensures that previous versions of electrum won't open the wallet - self.put('seed_version', FINAL_SEED_VERSION) with self.lock: self._write() @@ -244,10 +252,14 @@ class WalletStorage(PrintError): return self.file_exists() and self.get_seed_version() != FINAL_SEED_VERSION def upgrade(self): + self.print_error('upgrading wallet format') + self.convert_imported() self.convert_wallet_type() self.convert_account() self.convert_version_14() + + self.put('seed_version', FINAL_SEED_VERSION) self.write() def convert_wallet_type(self): @@ -338,6 +350,8 @@ class WalletStorage(PrintError): def convert_version_14(self): # convert imported wallets for 3.0 + if self.get_seed_version() >= 14: + return if self.get('wallet_type') =='imported': addresses = self.get('addresses') if type(addresses) is list: