URI: 
       tfix #1494 - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 052d8b236edd1fa151e71ef2ef8f88c7a0e7fbe5
   DIR parent 94ac0db91fd66afba646450f0fcdec6081f99f7d
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed, 28 Oct 2015 10:36:44 +0100
       
       fix #1494
       
       Diffstat:
         M electrum                            |      28 +++++++---------------------
         M gui/qt/installwizard.py             |       3 ++-
         M lib/commands.py                     |       9 ++++++++-
         M lib/wallet.py                       |      55 +++++++++++++------------------
       
       4 files changed, 40 insertions(+), 55 deletions(-)
       ---
   DIR diff --git a/electrum b/electrum
       t@@ -142,26 +142,12 @@ def init_cmdline(config):
        
                if cmd.name == 'restore':
                    text = config.get('text')
       +            password = password_dialog() if Wallet.is_seed(text) or Wallet.is_xprv(text) or Wallet.is_private_key(text) else None
                    try:
       -                wallet = Wallet.from_text(text, password_dialog, storage)
       +                wallet = Wallet.from_text(text, password, storage)
                    except BaseException as e:
                        sys.exit(str(e))
       -
       -            if not config.get('offline'):
       -                network = Network(config)
       -                network.start()
       -                wallet.start_threads(network)
       -                print_msg("Recovering wallet...")
       -                wallet.restore(lambda x: x)
       -                wallet.synchronize()
       -                if wallet.is_found():
       -                    print_msg("Recovery successful")
       -                else:
       -                    print_msg("Warning: Found no history for this wallet")
       -            else:
       -                wallet.synchronize()
       -                print_msg("Warning: This wallet was restored offline. It may contain more addresses than displayed.")
       -
       +            wallet.synchronize()
                else:
                    password = password_dialog()
                    wallet = Wallet(storage)
       t@@ -174,8 +160,6 @@ def init_cmdline(config):
                    print_msg("Please keep it in a safe place; if you lose it, you will not be able to restore your wallet.")
        
                print_msg("Wallet saved in '%s'" % wallet.storage.path)
       -        # terminate
       -        sys.exit(0)
        
            if cmd.name not in ['create', 'restore'] and cmd.requires_wallet and not storage.file_exists:
                print_msg("Error: Wallet file not found.")
       t@@ -248,6 +232,9 @@ def run_command(config, network, password):
            storage = WalletStorage(config.get_wallet_path())
            # create wallet instance
            wallet = Wallet(storage) if cmd.requires_wallet else None
       +    # start threads
       +    if network:
       +        wallet.start_threads(network)
            # arguments passed to function
            args = map(lambda x: config.get(x), cmd.params)
            # decode json arguments
       t@@ -264,10 +251,9 @@ def run_command(config, network, password):
            cmd_runner.password = password
            func = getattr(cmd_runner, cmd.name)
            result = func(*args)
       -
       +    # stop threads
            if wallet:
                wallet.stop_threads()
       -
            return result
        
        
   DIR diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py
       t@@ -565,7 +565,8 @@ class InstallWizard(QDialog):
                    text = self.enter_seed_dialog(MSG_ENTER_ANYTHING, None)
                    if not text:
                        return
       -            wallet = Wallet.from_text(text, self.password_dialog, self.storage)
       +            password = self.password_dialog() if Wallet.is_seed(text) or Wallet.is_xprv(text) or Wallet.is_private_key(text) else None
       +            wallet = Wallet.from_text(text, password, self.storage)
                elif re.match('(\d+)of(\d+)', t):
                    n = int(re.match('(\d+)of(\d+)', t).group(2))
                    key_list = self.multi_seed_dialog(n - 1)
   DIR diff --git a/lib/commands.py b/lib/commands.py
       t@@ -101,13 +101,20 @@ class Commands:
            @command('')
            def create(self):
                """Create a new wallet"""
       +        return True
        
       -    @command('')
       +    @command('wn')
            def restore(self, text):
                """Restore a wallet from text. Text can be a seed phrase, a master
                public key, a master private key, a list of bitcoin addresses
                or bitcoin private keys. If you want to be prompted for your
                seed, type '?' or ':' (concealed) """
       +        self.wallet.restore(lambda x: print_msg(x))
       +        #self.wallet.synchronize()
       +        msg = "Recovery successful" if self.wallet.is_found() else "Warning: Found no history for this wallet"
       +        if not self.network:
       +            msg += "\nWarning: This wallet was restored offline. It may contain more addresses than displayed."
       +        return msg
        
            @command('w')
            def deseed(self):
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -1135,8 +1135,28 @@ class Abstract_Wallet(PrintError):
                    self.verifier = None
                    self.storage.put('stored_height', self.get_local_height(), True)
        
       -    def restore(self, cb):
       -        pass
       +    def restore(self, callback):
       +        from i18n import _
       +        def wait_for_wallet():
       +            self.set_up_to_date(False)
       +            while not self.is_up_to_date():
       +                msg = "%s\n%s %d"%(
       +                    _("Please wait..."),
       +                    _("Addresses generated:"),
       +                    len(self.addresses(True)))
       +                apply(callback, (msg,))
       +                time.sleep(0.1)
       +        def wait_for_network():
       +            while not self.network.is_connected():
       +                msg = "%s \n" % (_("Connecting..."))
       +                apply(callback, (msg,))
       +                time.sleep(0.1)
       +        # wait until we are connected, because the user might have selected another server
       +        if self.network:
       +            wait_for_network()
       +            wait_for_wallet()
       +        else:
       +            self.synchronize()
        
            def get_accounts(self):
                return self.accounts
       t@@ -1509,32 +1529,6 @@ class Deterministic_Wallet(Abstract_Wallet):
                    for account in self.accounts.values():
                        account.synchronize(self)
        
       -    def restore(self, callback):
       -        from i18n import _
       -        def wait_for_wallet():
       -            self.set_up_to_date(False)
       -            while not self.is_up_to_date():
       -                msg = "%s\n%s %d"%(
       -                    _("Please wait..."),
       -                    _("Addresses generated:"),
       -                    len(self.addresses(True)))
       -
       -                apply(callback, (msg,))
       -                time.sleep(0.1)
       -
       -        def wait_for_network():
       -            while not self.network.is_connected():
       -                msg = "%s \n" % (_("Connecting..."))
       -                apply(callback, (msg,))
       -                time.sleep(0.1)
       -
       -        # wait until we are connected, because the user might have selected another server
       -        if self.network:
       -            wait_for_network()
       -            wait_for_wallet()
       -        else:
       -            self.synchronize()
       -
            def is_beyond_limit(self, address, account, is_change):
                if type(account) == ImportedAccount:
                    return False
       t@@ -2089,9 +2083,8 @@ class Wallet(object):
                return self
        
            @classmethod
       -    def from_text(klass, text, password_dialog, storage):
       +    def from_text(klass, text, password, storage):
                if Wallet.is_xprv(text):
       -            password = password_dialog()
                    wallet = klass.from_xprv(text, password, storage)
                elif Wallet.is_old_mpk(text):
                    wallet = klass.from_old_mpk(text, storage)
       t@@ -2100,10 +2093,8 @@ class Wallet(object):
                elif Wallet.is_address(text):
                    wallet = klass.from_address(text, storage)
                elif Wallet.is_private_key(text):
       -            password = password_dialog()
                    wallet = klass.from_private_key(text, password, storage)
                elif Wallet.is_seed(text):
       -            password = password_dialog()
                    wallet = klass.from_seed(text, password, storage)
                else:
                    raise BaseException('Invalid seedphrase or key')