From f3e6bf0280fd666b0dd059ee53480318353c692d Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Sun, 3 Jan 2016 09:03:07 +0900 Subject: [PATCH] Passphrase-related fixes Move normalize code to one place on the wallet Passphrases don't have password strength meter --- gui/qt/password_dialog.py | 10 ++++++---- lib/wallet.py | 6 +++++- plugins/trezor/plugin.py | 9 +++------ plugins/trezor/qt_generic.py | 3 ++- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/gui/qt/password_dialog.py b/gui/qt/password_dialog.py index 0858aa8a..3d7c3764 100644 --- a/gui/qt/password_dialog.py +++ b/gui/qt/password_dialog.py @@ -100,9 +100,12 @@ class PasswordDialog(WindowModalDialog): vbox.addLayout(grid) # Password Strength Label - self.pw_strength = QLabel() - grid.addWidget(self.pw_strength, 3, 0, 1, 2) - self.new_pw.textChanged.connect(self.pw_changed) + if kind != self.PW_PASSPHRASE: + self.pw_strength = QLabel() + grid.addWidget(self.pw_strength, 3, 0, 1, 2) + self.new_pw.textChanged.connect(self.pw_changed) + + self.new_pw.textChanged.connect(self.check_OKButton) self.conf_pw.textChanged.connect(self.check_OKButton) self.OKButton = OkButton(self) @@ -121,7 +124,6 @@ class PasswordDialog(WindowModalDialog): else: label = "" self.pw_strength.setText(label) - self.check_OKButton() def check_OKButton(self): self.OKButton.setEnabled(self.new_pw.text() == self.conf_pw.text()) diff --git a/lib/wallet.py b/lib/wallet.py index 9856b13f..3c21b648 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -1738,13 +1738,17 @@ class BIP44_Wallet(BIP32_HD_Wallet): acc_id, (change, address_index) = self.get_address_index(address) return self.address_derivation(acc_id, change, address_index) + @staticmethod + def normalize_passphrase(passphrase): + return normalize('NFKD', unicode(passphrase or '')) + @staticmethod def mnemonic_to_seed(mnemonic, passphrase): # See BIP39 import pbkdf2, hashlib, hmac PBKDF2_ROUNDS = 2048 mnemonic = normalize('NFKD', ' '.join(mnemonic.split())) - passphrase = normalize('NFKD', passphrase) + passphrase = BIP44_Wallet.normalize_passphrase(passphrase) return pbkdf2.PBKDF2(mnemonic, 'mnemonic' + passphrase, iterations = PBKDF2_ROUNDS, macmodule = hmac, digestmodule = hashlib.sha512).read(64) diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py index 968bbad0..0ae43d74 100644 --- a/plugins/trezor/plugin.py +++ b/plugins/trezor/plugin.py @@ -3,7 +3,6 @@ import time from binascii import unhexlify from struct import pack -from unicodedata import normalize from electrum.account import BIP32_Account from electrum.bitcoin import (bc_address_to_hash_160, xpub_from_pubkey, @@ -154,8 +153,10 @@ class TrezorCompatiblePlugin(BasePlugin): @hook def timer_actions(self): + # Scan connected devices every second. The test for libraries + # available is necessary to recover wallets on machines without + # libraries if self.libraries_available: - # Scan connected devices every second now = time.time() if now > self.last_scan + 1: self.last_scan = now @@ -294,10 +295,6 @@ class TrezorCompatiblePlugin(BasePlugin): def is_enabled(self): return self.libraries_available - @staticmethod - def normalize_passphrase(self, passphrase): - return normalize('NFKD', unicode(passphrase or '')) - def on_restore_wallet(self, wallet, wizard): assert isinstance(wallet, self.wallet_class) diff --git a/plugins/trezor/qt_generic.py b/plugins/trezor/qt_generic.py index edd4df01..5cc39bc2 100644 --- a/plugins/trezor/qt_generic.py +++ b/plugins/trezor/qt_generic.py @@ -11,6 +11,7 @@ from plugin import TrezorCompatiblePlugin from electrum.i18n import _ from electrum.plugins import hook from electrum.util import PrintError +from electrum.wallet import BIP44_Wallet # By far the trickiest thing about this handler is the window stack; @@ -75,7 +76,7 @@ class QtHandler(PrintError): PasswordDialog.PW_PASSPHRASE) confirmed, p, passphrase = d.run() if confirmed: - passphrase = TrezorCompatiblePlugin.normalize_passphrase(passphrase) + passphrase = BIP44_Wallet.normalize_passphrase(passphrase) self.passphrase = passphrase self.done.set()