URI: 
       tallow spaces in private keys (fix #1602) - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit ac5929684699a458b4599b8c6e2dc65519ba94f7
   DIR parent 23c8684448f59af48581549b5442ff0f4c50d0ae
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Sat, 22 Oct 2016 10:06:51 +0200
       
       allow spaces in private keys (fix #1602)
       
       Diffstat:
         M gui/qt/installwizard.py             |       8 ++++----
         M gui/qt/main_window.py               |       7 +++----
         M gui/qt/seed_dialog.py               |      21 ++++++++++++++++++++-
         M gui/qt/util.py                      |       6 ------
         M lib/keystore.py                     |      13 +++++++++----
       
       5 files changed, 36 insertions(+), 19 deletions(-)
       ---
   DIR diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py
       t@@ -11,7 +11,7 @@ from electrum.util import UserCancelled
        from electrum.base_wizard import BaseWizard
        from electrum.i18n import _
        
       -from seed_dialog import SeedLayout
       +from seed_dialog import SeedLayout, KeysLayout
        from network_dialog import NetworkChoiceLayout
        from util import *
        from password_dialog import PasswordLayout, PW_NEW
       t@@ -240,9 +240,9 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard):
                self.config.remove_from_recently_open(filename)
        
            def text_input(self, title, message, is_valid):
       -        slayout = SeedLayout(parent=self, title=message, is_seed=is_valid, icon=False)
       -        self.set_main_layout(slayout.layout(), title, next_enabled=False)
       -        return slayout.get_seed()
       +        slayout = KeysLayout(parent=self, title=message, is_valid=is_valid)
       +        self.set_main_layout(slayout, title, next_enabled=False)
       +        return slayout.get_text()
        
            def seed_input(self, title, message, is_seed, options):
                slayout = SeedLayout(title=message, is_seed=is_seed, options=options, parent=self)
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -41,8 +41,8 @@ import PyQt4.QtCore as QtCore
        
        import icons_rc
        
       +from electrum import keystore
        from electrum.bitcoin import COIN, is_valid, TYPE_ADDRESS
       -from electrum.keystore import is_private_key
        from electrum.plugins import run_hook
        from electrum.i18n import _
        from electrum.util import (block_explorer, block_explorer_info, format_time,
       t@@ -2167,9 +2167,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
                        return addr
        
                def get_pk():
       -            pk = str(keys_e.toPlainText()).strip()
       -            if is_private_key(pk):
       -                return pk.split()
       +            text = str(keys_e.toPlainText())
       +            return keystore.get_private_keys(text)
        
                f = lambda: button.setEnabled(get_address() is not None and get_pk() is not None)
                on_address = lambda text: address_e.setStyleSheet(BLACK_FG if get_address() else RED_FG)
   DIR diff --git a/gui/qt/seed_dialog.py b/gui/qt/seed_dialog.py
       t@@ -133,7 +133,8 @@ class SeedLayout(QVBoxLayout):
                    self.addWidget(WWLabel(msg))
        
            def get_seed(self):
       -        return clean_text(self.seed_e)
       +        text = unicode(self.seed_e.text())
       +        return ' '.join(text.split())
        
            def on_edit(self):
                from electrum.bitcoin import seed_type
       t@@ -146,6 +147,24 @@ class SeedLayout(QVBoxLayout):
        
        
        
       +class KeysLayout(QVBoxLayout):
       +    def __init__(self, parent=None, title=None, is_valid=None):
       +        QVBoxLayout.__init__(self)
       +        self.parent = parent
       +        self.is_valid = is_valid
       +        self.text_e = ScanQRTextEdit()
       +        self.text_e.textChanged.connect(self.on_edit)
       +        self.addWidget(WWLabel(title))
       +        self.addWidget(self.text_e)
       +
       +    def get_text(self):
       +        return unicode(self.text_e.text())
       +
       +    def on_edit(self):
       +        b = self.is_valid(self.get_text())
       +        self.parent.next_button.setEnabled(b)
       +
       +
        class SeedDialog(WindowModalDialog):
        
            def __init__(self, parent, seed, passphrase):
   DIR diff --git a/gui/qt/util.py b/gui/qt/util.py
       t@@ -49,12 +49,6 @@ expiration_values = [
        ]
        
        
       -def clean_text(seed_e):
       -    text = unicode(seed_e.toPlainText()).strip()
       -    text = ' '.join(text.split())
       -    return text
       -
       -
        class Timer(QThread):
            stopped = False
        
   DIR diff --git a/lib/keystore.py b/lib/keystore.py
       t@@ -644,14 +644,19 @@ def is_address_list(text):
            parts = text.split()
            return bool(parts) and all(bitcoin.is_address(x) for x in parts)
        
       -def is_private_key_list(text):
       -    parts = text.split()
       -    return bool(parts) and all(bitcoin.is_private_key(x) for x in parts)
       +def get_private_keys(text):
       +    parts = text.split('\n')
       +    parts = map(lambda x: ''.join(x.split()), parts)
       +    parts = filter(bool, parts)
       +    if bool(parts) and all(bitcoin.is_private_key(x) for x in parts):
       +        return parts
        
       +def is_private_key_list(text):
       +    return bool(get_private_keys(text))
        
        is_mpk = lambda x: is_old_mpk(x) or is_xpub(x)
        is_private = lambda x: is_seed(x) or is_xprv(x) or is_private_key_list(x)
       -is_any_key = lambda x: is_old_mpk(x) or is_xprv(x) or is_xpub(x) or is_address_list(x) or is_private_key_list(x)
       +is_any_key = lambda x: is_old_mpk(x) or is_xprv(x) or is_xpub(x) or is_private_key_list(x)
        is_private_key = lambda x: is_xprv(x) or is_private_key_list(x)
        is_bip32_key = lambda x: is_xprv(x) or is_xpub(x)