mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-23 17:47:31 +00:00
storage: replace STO_EV_* ints with IntEnum
This commit is contained in:
parent
54776ca1d9
commit
a42a773d19
5 changed files with 32 additions and 29 deletions
|
@ -37,7 +37,7 @@ from .bip32 import is_bip32_derivation, xpub_type, normalize_bip32_derivation
|
||||||
from .keystore import bip44_derivation, purpose48_derivation
|
from .keystore import bip44_derivation, purpose48_derivation
|
||||||
from .wallet import (Imported_Wallet, Standard_Wallet, Multisig_Wallet,
|
from .wallet import (Imported_Wallet, Standard_Wallet, Multisig_Wallet,
|
||||||
wallet_types, Wallet, Abstract_Wallet)
|
wallet_types, Wallet, Abstract_Wallet)
|
||||||
from .storage import (WalletStorage, STO_EV_USER_PW, STO_EV_XPUB_PW,
|
from .storage import (WalletStorage, StorageEncryptionVersion,
|
||||||
get_derivation_used_for_hw_device_encryption)
|
get_derivation_used_for_hw_device_encryption)
|
||||||
from .i18n import _
|
from .i18n import _
|
||||||
from .util import UserCancelled, InvalidPassword, WalletFileException
|
from .util import UserCancelled, InvalidPassword, WalletFileException
|
||||||
|
@ -541,7 +541,7 @@ class BaseWizard(Logger):
|
||||||
run_next=lambda encrypt_storage: self.on_password(
|
run_next=lambda encrypt_storage: self.on_password(
|
||||||
password,
|
password,
|
||||||
encrypt_storage=encrypt_storage,
|
encrypt_storage=encrypt_storage,
|
||||||
storage_enc_version=STO_EV_XPUB_PW,
|
storage_enc_version=StorageEncryptionVersion.XPUB_PASSWORD,
|
||||||
encrypt_keystore=False))
|
encrypt_keystore=False))
|
||||||
else:
|
else:
|
||||||
# reset stack to disable 'back' button in password dialog
|
# reset stack to disable 'back' button in password dialog
|
||||||
|
@ -551,12 +551,12 @@ class BaseWizard(Logger):
|
||||||
run_next=lambda password, encrypt_storage: self.on_password(
|
run_next=lambda password, encrypt_storage: self.on_password(
|
||||||
password,
|
password,
|
||||||
encrypt_storage=encrypt_storage,
|
encrypt_storage=encrypt_storage,
|
||||||
storage_enc_version=STO_EV_USER_PW,
|
storage_enc_version=StorageEncryptionVersion.USER_PASSWORD,
|
||||||
encrypt_keystore=encrypt_keystore),
|
encrypt_keystore=encrypt_keystore),
|
||||||
force_disable_encrypt_cb=not encrypt_keystore)
|
force_disable_encrypt_cb=not encrypt_keystore)
|
||||||
|
|
||||||
def on_password(self, password, *, encrypt_storage,
|
def on_password(self, password, *, encrypt_storage,
|
||||||
storage_enc_version=STO_EV_USER_PW, encrypt_keystore):
|
storage_enc_version=StorageEncryptionVersion.USER_PASSWORD, encrypt_keystore):
|
||||||
for k in self.keystores:
|
for k in self.keystores:
|
||||||
if k.may_have_password():
|
if k.may_have_password():
|
||||||
k.update_password(None, password)
|
k.update_password(None, password)
|
||||||
|
|
|
@ -2221,8 +2221,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
|
||||||
self.send_button.setVisible(not self.wallet.is_watching_only())
|
self.send_button.setVisible(not self.wallet.is_watching_only())
|
||||||
|
|
||||||
def change_password_dialog(self):
|
def change_password_dialog(self):
|
||||||
from electrum.storage import STO_EV_XPUB_PW
|
from electrum.storage import StorageEncryptionVersion
|
||||||
if self.wallet.get_available_storage_encryption_version() == STO_EV_XPUB_PW:
|
if self.wallet.get_available_storage_encryption_version() == StorageEncryptionVersion.XPUB_PASSWORD:
|
||||||
from .password_dialog import ChangePasswordDialogForHW
|
from .password_dialog import ChangePasswordDialogForHW
|
||||||
d = ChangePasswordDialogForHW(self, self.wallet)
|
d = ChangePasswordDialogForHW(self, self.wallet)
|
||||||
ok, encrypt_file = d.run()
|
ok, encrypt_file = d.run()
|
||||||
|
|
|
@ -45,7 +45,7 @@ from electrum.wallet import Multisig_Wallet, Deterministic_Wallet
|
||||||
from electrum.i18n import _
|
from electrum.i18n import _
|
||||||
from electrum.plugin import BasePlugin, hook
|
from electrum.plugin import BasePlugin, hook
|
||||||
from electrum.util import NotEnoughFunds, UserFacingException
|
from electrum.util import NotEnoughFunds, UserFacingException
|
||||||
from electrum.storage import STO_EV_USER_PW
|
from electrum.storage import StorageEncryptionVersion
|
||||||
from electrum.network import Network
|
from electrum.network import Network
|
||||||
from electrum.base_wizard import BaseWizard
|
from electrum.base_wizard import BaseWizard
|
||||||
from electrum.logging import Logger
|
from electrum.logging import Logger
|
||||||
|
@ -594,7 +594,7 @@ class TrustedCoinPlugin(BasePlugin):
|
||||||
k1.update_password(None, password)
|
k1.update_password(None, password)
|
||||||
wizard.data['x1/'] = k1.dump()
|
wizard.data['x1/'] = k1.dump()
|
||||||
wizard.data['x2/'] = k2.dump()
|
wizard.data['x2/'] = k2.dump()
|
||||||
wizard.pw_args = password, encrypt_storage, STO_EV_USER_PW
|
wizard.pw_args = password, encrypt_storage, StorageEncryptionVersion.USER_PASSWORD
|
||||||
self.go_online_dialog(wizard)
|
self.go_online_dialog(wizard)
|
||||||
|
|
||||||
def restore_wallet(self, wizard):
|
def restore_wallet(self, wizard):
|
||||||
|
@ -642,7 +642,7 @@ class TrustedCoinPlugin(BasePlugin):
|
||||||
xpub3 = make_xpub(get_signing_xpub(xtype), long_user_id)
|
xpub3 = make_xpub(get_signing_xpub(xtype), long_user_id)
|
||||||
k3 = keystore.from_xpub(xpub3)
|
k3 = keystore.from_xpub(xpub3)
|
||||||
wizard.data['x3/'] = k3.dump()
|
wizard.data['x3/'] = k3.dump()
|
||||||
wizard.pw_args = password, encrypt_storage, STO_EV_USER_PW
|
wizard.pw_args = password, encrypt_storage, StorageEncryptionVersion.USER_PASSWORD
|
||||||
wizard.terminate()
|
wizard.terminate()
|
||||||
|
|
||||||
def create_remote_key(self, email, wizard):
|
def create_remote_key(self, email, wizard):
|
||||||
|
|
|
@ -28,6 +28,7 @@ import stat
|
||||||
import hashlib
|
import hashlib
|
||||||
import base64
|
import base64
|
||||||
import zlib
|
import zlib
|
||||||
|
from enum import IntEnum
|
||||||
|
|
||||||
from . import ecc
|
from . import ecc
|
||||||
from .util import profiler, InvalidPassword, WalletFileException, bfh, standardize_path
|
from .util import profiler, InvalidPassword, WalletFileException, bfh, standardize_path
|
||||||
|
@ -42,9 +43,11 @@ def get_derivation_used_for_hw_device_encryption():
|
||||||
"/4541509'" # ascii 'ELE' as decimal ("BIP43 purpose")
|
"/4541509'" # ascii 'ELE' as decimal ("BIP43 purpose")
|
||||||
"/1112098098'") # ascii 'BIE2' as decimal
|
"/1112098098'") # ascii 'BIE2' as decimal
|
||||||
|
|
||||||
# storage encryption version
|
|
||||||
STO_EV_PLAINTEXT, STO_EV_USER_PW, STO_EV_XPUB_PW = range(0, 3)
|
|
||||||
|
|
||||||
|
class StorageEncryptionVersion(IntEnum):
|
||||||
|
PLAINTEXT = 0
|
||||||
|
USER_PASSWORD = 1
|
||||||
|
XPUB_PASSWORD = 2
|
||||||
|
|
||||||
|
|
||||||
class WalletStorage(Logger):
|
class WalletStorage(Logger):
|
||||||
|
@ -67,7 +70,7 @@ class WalletStorage(Logger):
|
||||||
self.db = DB_Class(self.raw, manual_upgrades=manual_upgrades)
|
self.db = DB_Class(self.raw, manual_upgrades=manual_upgrades)
|
||||||
self.load_plugins()
|
self.load_plugins()
|
||||||
else:
|
else:
|
||||||
self._encryption_version = STO_EV_PLAINTEXT
|
self._encryption_version = StorageEncryptionVersion.PLAINTEXT
|
||||||
# avoid new wallets getting 'upgraded'
|
# avoid new wallets getting 'upgraded'
|
||||||
self.db = DB_Class('', manual_upgrades=False)
|
self.db = DB_Class('', manual_upgrades=False)
|
||||||
|
|
||||||
|
@ -128,13 +131,13 @@ class WalletStorage(Logger):
|
||||||
|
|
||||||
def is_encrypted(self):
|
def is_encrypted(self):
|
||||||
"""Return if storage encryption is currently enabled."""
|
"""Return if storage encryption is currently enabled."""
|
||||||
return self.get_encryption_version() != STO_EV_PLAINTEXT
|
return self.get_encryption_version() != StorageEncryptionVersion.PLAINTEXT
|
||||||
|
|
||||||
def is_encrypted_with_user_pw(self):
|
def is_encrypted_with_user_pw(self):
|
||||||
return self.get_encryption_version() == STO_EV_USER_PW
|
return self.get_encryption_version() == StorageEncryptionVersion.USER_PASSWORD
|
||||||
|
|
||||||
def is_encrypted_with_hw_device(self):
|
def is_encrypted_with_hw_device(self):
|
||||||
return self.get_encryption_version() == STO_EV_XPUB_PW
|
return self.get_encryption_version() == StorageEncryptionVersion.XPUB_PASSWORD
|
||||||
|
|
||||||
def get_encryption_version(self):
|
def get_encryption_version(self):
|
||||||
"""Return the version of encryption used for this storage.
|
"""Return the version of encryption used for this storage.
|
||||||
|
@ -151,13 +154,13 @@ class WalletStorage(Logger):
|
||||||
try:
|
try:
|
||||||
magic = base64.b64decode(self.raw)[0:4]
|
magic = base64.b64decode(self.raw)[0:4]
|
||||||
if magic == b'BIE1':
|
if magic == b'BIE1':
|
||||||
return STO_EV_USER_PW
|
return StorageEncryptionVersion.USER_PASSWORD
|
||||||
elif magic == b'BIE2':
|
elif magic == b'BIE2':
|
||||||
return STO_EV_XPUB_PW
|
return StorageEncryptionVersion.XPUB_PASSWORD
|
||||||
else:
|
else:
|
||||||
return STO_EV_PLAINTEXT
|
return StorageEncryptionVersion.PLAINTEXT
|
||||||
except:
|
except:
|
||||||
return STO_EV_PLAINTEXT
|
return StorageEncryptionVersion.PLAINTEXT
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_eckey_from_password(password):
|
def get_eckey_from_password(password):
|
||||||
|
@ -167,9 +170,9 @@ class WalletStorage(Logger):
|
||||||
|
|
||||||
def _get_encryption_magic(self):
|
def _get_encryption_magic(self):
|
||||||
v = self._encryption_version
|
v = self._encryption_version
|
||||||
if v == STO_EV_USER_PW:
|
if v == StorageEncryptionVersion.USER_PASSWORD:
|
||||||
return b'BIE1'
|
return b'BIE1'
|
||||||
elif v == STO_EV_XPUB_PW:
|
elif v == StorageEncryptionVersion.XPUB_PASSWORD:
|
||||||
return b'BIE2'
|
return b'BIE2'
|
||||||
else:
|
else:
|
||||||
raise WalletFileException('no encryption magic for version: %s' % v)
|
raise WalletFileException('no encryption magic for version: %s' % v)
|
||||||
|
@ -211,13 +214,13 @@ class WalletStorage(Logger):
|
||||||
"""Set a password to be used for encrypting this storage."""
|
"""Set a password to be used for encrypting this storage."""
|
||||||
if enc_version is None:
|
if enc_version is None:
|
||||||
enc_version = self._encryption_version
|
enc_version = self._encryption_version
|
||||||
if password and enc_version != STO_EV_PLAINTEXT:
|
if password and enc_version != StorageEncryptionVersion.PLAINTEXT:
|
||||||
ec_key = self.get_eckey_from_password(password)
|
ec_key = self.get_eckey_from_password(password)
|
||||||
self.pubkey = ec_key.get_public_key_hex()
|
self.pubkey = ec_key.get_public_key_hex()
|
||||||
self._encryption_version = enc_version
|
self._encryption_version = enc_version
|
||||||
else:
|
else:
|
||||||
self.pubkey = None
|
self.pubkey = None
|
||||||
self._encryption_version = STO_EV_PLAINTEXT
|
self._encryption_version = StorageEncryptionVersion.PLAINTEXT
|
||||||
# make sure next storage.write() saves changes
|
# make sure next storage.write() saves changes
|
||||||
self.db.set_modified(True)
|
self.db.set_modified(True)
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ from .crypto import sha256d
|
||||||
from . import keystore
|
from . import keystore
|
||||||
from .keystore import load_keystore, Hardware_KeyStore, KeyStore
|
from .keystore import load_keystore, Hardware_KeyStore, KeyStore
|
||||||
from .util import multisig_type
|
from .util import multisig_type
|
||||||
from .storage import STO_EV_PLAINTEXT, STO_EV_USER_PW, STO_EV_XPUB_PW, WalletStorage
|
from .storage import StorageEncryptionVersion, WalletStorage
|
||||||
from . import transaction, bitcoin, coinchooser, paymentrequest, ecc, bip32
|
from . import transaction, bitcoin, coinchooser, paymentrequest, ecc, bip32
|
||||||
from .transaction import Transaction, TxOutput, TxOutputHwInfo
|
from .transaction import Transaction, TxOutput, TxOutputHwInfo
|
||||||
from .plugin import run_hook
|
from .plugin import run_hook
|
||||||
|
@ -1421,16 +1421,16 @@ class Abstract_Wallet(AddressSynchronizer):
|
||||||
def can_have_keystore_encryption(self):
|
def can_have_keystore_encryption(self):
|
||||||
return self.keystore and self.keystore.may_have_password()
|
return self.keystore and self.keystore.may_have_password()
|
||||||
|
|
||||||
def get_available_storage_encryption_version(self):
|
def get_available_storage_encryption_version(self) -> StorageEncryptionVersion:
|
||||||
"""Returns the type of storage encryption offered to the user.
|
"""Returns the type of storage encryption offered to the user.
|
||||||
|
|
||||||
A wallet file (storage) is either encrypted with this version
|
A wallet file (storage) is either encrypted with this version
|
||||||
or is stored in plaintext.
|
or is stored in plaintext.
|
||||||
"""
|
"""
|
||||||
if isinstance(self.keystore, Hardware_KeyStore):
|
if isinstance(self.keystore, Hardware_KeyStore):
|
||||||
return STO_EV_XPUB_PW
|
return StorageEncryptionVersion.XPUB_PASSWORD
|
||||||
else:
|
else:
|
||||||
return STO_EV_USER_PW
|
return StorageEncryptionVersion.USER_PASSWORD
|
||||||
|
|
||||||
def has_keystore_encryption(self):
|
def has_keystore_encryption(self):
|
||||||
"""Returns whether encryption is enabled for the keystore.
|
"""Returns whether encryption is enabled for the keystore.
|
||||||
|
@ -1462,7 +1462,7 @@ class Abstract_Wallet(AddressSynchronizer):
|
||||||
if encrypt_storage:
|
if encrypt_storage:
|
||||||
enc_version = self.get_available_storage_encryption_version()
|
enc_version = self.get_available_storage_encryption_version()
|
||||||
else:
|
else:
|
||||||
enc_version = STO_EV_PLAINTEXT
|
enc_version = StorageEncryptionVersion.PLAINTEXT
|
||||||
self.storage.set_password(new_pw, enc_version)
|
self.storage.set_password(new_pw, enc_version)
|
||||||
|
|
||||||
# note: Encrypting storage with a hw device is currently only
|
# note: Encrypting storage with a hw device is currently only
|
||||||
|
@ -2029,7 +2029,7 @@ class Multisig_Wallet(Deterministic_Wallet):
|
||||||
|
|
||||||
def get_available_storage_encryption_version(self):
|
def get_available_storage_encryption_version(self):
|
||||||
# multisig wallets are not offered hw device encryption
|
# multisig wallets are not offered hw device encryption
|
||||||
return STO_EV_USER_PW
|
return StorageEncryptionVersion.USER_PASSWORD
|
||||||
|
|
||||||
def has_seed(self):
|
def has_seed(self):
|
||||||
return self.keystore.has_seed()
|
return self.keystore.has_seed()
|
||||||
|
|
Loading…
Add table
Reference in a new issue