Merge branch 'master' of https://github.com/spesmilo/electrum
authorEagle[TM] <eagletm@mpex.net>
Sun, 6 Jan 2013 09:36:07 +0000 (10:36 +0100)
committerEagle[TM] <eagletm@mpex.net>
Sun, 6 Jan 2013 09:36:07 +0000 (10:36 +0100)
electrum
lib/gui.py
lib/gui_android.py
lib/gui_qt.py
lib/wallet.py

index 1489345..9ee2d1d 100755 (executable)
--- a/electrum
+++ b/electrum
@@ -388,7 +388,7 @@ if __name__ == '__main__':
                 exit(1)
             # check password
             try:
-                wallet.pw_decode( wallet.seed, password)
+                seed = wallet.decode_seed(password)
             except:
                 print_msg("Error: This password does not decode this wallet.")
                 exit(1)
@@ -419,7 +419,6 @@ if __name__ == '__main__':
             print_msg(known_commands[cmd2])
 
     elif cmd == 'seed':
-        seed = wallet.pw_decode( wallet.seed, password)
         print_msg(seed + ' "' + ' '.join(mnemonic_encode(seed)) + '"')
 
     elif cmd == 'deseed':
@@ -622,11 +621,6 @@ if __name__ == '__main__':
         print_msg(h)
 
     elif cmd == 'password':
-        try:
-            seed = wallet.pw_decode( wallet.seed, password)
-        except ValueError:
-            sys.exit("Error: Password does not decrypt this wallet.")
-
         new_password = prompt_password('New password:')
         wallet.update_password(seed, password, new_password)
 
index ab25ec2..766ac81 100644 (file)
@@ -65,7 +65,7 @@ def show_seed_dialog(wallet, password, parent):
         show_message("No seed")
         return
     try:
-        seed = wallet.pw_decode( wallet.seed, password)
+        seed = wallet.decode_seed(password)
     except:
         show_message("Incorrect password")
         return
@@ -477,7 +477,7 @@ def change_password_dialog(wallet, parent, icon):
         return
 
     try:
-        seed = wallet.pw_decode( wallet.seed, password)
+        seed = wallet.decode_seed(password)
     except:
         show_message("Incorrect password")
         return
index aee85d5..77832f5 100644 (file)
@@ -709,7 +709,7 @@ def seed_dialog():
         password = None
     
     try:
-        seed = wallet.pw_decode( wallet.seed, password)
+        seed = wallet.decode_seed(password)
     except:
         modal_dialog('error','incorrect password')
         return
@@ -725,7 +725,7 @@ def change_password_dialog():
         password = None
 
     try:
-        seed = wallet.pw_decode( wallet.seed, password)
+        seed = wallet.decode_seed(password)
     except:
         modal_dialog('error','incorrect password')
         return
index 8babe3c..2afea6b 100644 (file)
@@ -1170,10 +1170,9 @@ class ElectrumWindow(QMainWindow):
             password = None
             
         try:
-            seed = wallet.pw_decode(wallet.seed, password)
+            seed = wallet.decode_seed(password)
         except:
-            QMessageBox.warning(parent, _('Error'),
-                                _('Incorrect Password'), _('OK'))
+            QMessageBox.warning(parent, _('Error'), _('Incorrect Password'), _('OK'))
             return
 
         dialog = QDialog(None)
@@ -1454,7 +1453,7 @@ class ElectrumWindow(QMainWindow):
         new_password2 = unicode(conf_pw.text())
 
         try:
-            seed = wallet.pw_decode( wallet.seed, password)
+            seed = wallet.decode_seed(password)
         except:
             QMessageBox.warning(parent, _('Error'), _('Incorrect Password'), _('OK'))
             return
@@ -1549,7 +1548,13 @@ class ElectrumWindow(QMainWindow):
         csv_transaction(self.wallet)
 
     def do_import_privkey(self):
-        text, ok = QInputDialog.getText(self, _('Import private key'), _('Key') + ':')
+        if not self.wallet.imported_keys:
+            r = QMessageBox.question(None, _('Warning'), _('Warning: Imported keys are not recoverable from seed.') + ' ' \
+                                         + _('If you ever need to restore your wallet from its seed, these keys will be lost.') + '\n\n' \
+                                         + _('Are you sure you understand what you are doing?'), 3, 4)
+            if r == 4: return
+
+        text, ok = QInputDialog.getText(self, _('Import private key'), _('Private Key') + ':')
         if not ok: return
         sec = str(text)
         if self.wallet.use_encryption:
@@ -1713,9 +1718,7 @@ class ElectrumWindow(QMainWindow):
 
         grid_io.addWidget(QLabel(_('Private key')), 3, 0)
         grid_io.addWidget(EnterButton(_("Import"), self.do_import_privkey), 3, 2)
-        grid_io.addWidget(HelpButton('Import private key' + '\n' \
-                                         + _('Warning: Imported keys are not recoverable with your seed.') + '\n' \
-                                         + _('If you import keys, you will need to do backups of your wallet.')), 3, 3)
+        grid_io.addWidget(HelpButton('Import private key'), 3, 3)
 
         grid_io.setRowStretch(4,1)
         vbox.addLayout(ok_cancel_buttons(d))
index 5824866..e5583df 100644 (file)
@@ -115,7 +115,7 @@ class Wallet:
     def import_key(self, sec, password):
         # try password
         try:
-            seed = self.pw_decode( self.seed, password)
+            seed = self.decode_seed(password)
         except:
             raise BaseException("Invalid password")
 
@@ -194,7 +194,6 @@ class Wallet:
         if address in self.imported_keys.keys():
             sec = self.pw_decode( self.imported_keys[address], password )
             if not sec: return None, None
-
             pkey = regenerate_key(sec)
             compressed = is_compressed(sec)
             secexp = pkey.secret
@@ -208,14 +207,19 @@ class Wallet:
                 for_change = True
             else:
                 raise BaseException("unknown address")
-            try:
-                seed = self.pw_decode( self.seed, password)
-            except:
-                raise BaseException("Invalid password")
+
+            seed = self.pw_decode( self.seed, password)
             if not seed: return None
             secexp = self.stretch_key(seed)
             secexp = ( secexp + self.get_sequence(n,for_change) ) % order
             compressed = False
+            pkey = EC_KEY(secexp)
+
+        public_key = GetPubKey(pkey, compressed)
+        addr = public_key_to_bc_address(public_key)
+        if addr != address:
+            print_error('Invalid password with correct decoding')
+            raise BaseException('Invalid password')
 
         return secexp, compressed
 
@@ -636,16 +640,21 @@ class Wallet:
     def pw_decode(self, s, password):
         if password is not None:
             secret = Hash(password)
-            d = DecodeAES(secret, s)
-            if s == self.seed:
-                try:
-                    d.decode('hex')
-                except:
-                    raise ValueError("Invalid password")
+            try:
+                d = DecodeAES(secret, s)
+            except:
+                raise BaseException('Invalid password')
             return d
         else:
             return s
 
+    def decode_seed(self, password):
+        # test password on an address
+        addr = self.all_addresses()[0]
+        self.get_private_key(addr, password)
+        # return seed
+        return self.pw_decode(self.seed, password)
+
 
     def get_history(self, address):
         with self.lock: