URI: 
       tjson_db: exempt keystore from StoredDict conversion - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit a7199696d332eb37b8ba4d8b12e3fa40a09c1fac
   DIR parent 8dc3fadd1398949e602b6548646076963e9840c9
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Fri,  4 Sep 2020 16:11:01 +0200
       
       json_db: exempt keystore from StoredDict conversion
       
       The keystore logic would need to be significantly changed to nicely
       interoperate with StoredDict/json_db logic.
       (just see KeyStore.__init__() and KeyStore.dump())
       For now we exempt the keystore from the recursive StoredDict conversion, as
       it is a smaller change that is also easier to review for correctness.
       
       fixes #6066
       fixes #6401
       
       also reverts 2d3c2eeea9c225af2ec2d1654363c4b75c5b1158 (which was an even hackier workaround for #6066)
       
       Diffstat:
         M electrum/json_db.py                 |       6 +++++-
         M electrum/keystore.py                |       1 -
         M electrum/plugins/bitbox02/bitbox02… |       2 +-
         M electrum/plugins/ledger/ledger.py   |       1 -
         M electrum/wallet_db.py               |       8 ++++++++
       
       5 files changed, 14 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/electrum/json_db.py b/electrum/json_db.py
       t@@ -103,7 +103,8 @@ class StoredDict(dict):
                elif isinstance(v, dict):
                    if self.db:
                        v = self.db._convert_dict(self.path, key, v)
       -            v = StoredDict(v, self.db, self.path + [key])
       +            if not self.db or self.db._should_convert_to_stored_dict(key):
       +                v = StoredDict(v, self.db, self.path + [key])
                # convert_value is called depth-first
                if isinstance(v, dict) or isinstance(v, str):
                    if self.db:
       t@@ -194,3 +195,6 @@ class JsonDB(Logger):
            @locked
            def dump(self):
                return json.dumps(self.data, indent=4, sort_keys=True, cls=JsonDBJsonEncoder)
       +
       +    def _should_convert_to_stored_dict(self, key) -> bool:
       +        return True
   DIR diff --git a/electrum/keystore.py b/electrum/keystore.py
       t@@ -894,7 +894,6 @@ def hardware_keystore(d) -> Hardware_KeyStore:
        
        def load_keystore(db: 'WalletDB', name: str) -> KeyStore:
            d = db.get(name, {})
       -    d = dict(d)  # convert to dict from StoredDict (see #6066)
            t = d.get('type')
            if not t:
                raise WalletFileException(
   DIR diff --git a/electrum/plugins/bitbox02/bitbox02.py b/electrum/plugins/bitbox02/bitbox02.py
       t@@ -521,7 +521,7 @@ class BitBox02_KeyStore(Hardware_KeyStore):
            device = "BitBox02"
            plugin: "BitBox02Plugin"
        
       -    def __init__(self, d: StoredDict):
       +    def __init__(self, d: dict):
                super().__init__(d)
                self.force_watching_only = False
                self.ux_busy = False
   DIR diff --git a/electrum/plugins/ledger/ledger.py b/electrum/plugins/ledger/ledger.py
       t@@ -255,7 +255,6 @@ class Ledger_KeyStore(Hardware_KeyStore):
                self.force_watching_only = False
                self.signing = False
                self.cfg = d.get('cfg', {'mode': 0})
       -        self.cfg = dict(self.cfg)  # convert to dict from StoredDict (see #6066)
        
            def dump(self):
                obj = Hardware_KeyStore.dump(self)
   DIR diff --git a/electrum/wallet_db.py b/electrum/wallet_db.py
       t@@ -1211,6 +1211,14 @@ class WalletDB(JsonDB):
                    v = Outpoint(**v)
                return v
        
       +    def _should_convert_to_stored_dict(self, key) -> bool:
       +        if key == 'keystore':
       +            return False
       +        multisig_keystore_names = [('x%d/' % i) for i in range(1, 16)]
       +        if key in multisig_keystore_names:
       +            return False
       +        return True
       +
            def write(self, storage: 'WalletStorage'):
                with self.lock:
                    self._write(storage)