tmodified password input routines to allow for input through stdin - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit b615fe0c8c91a23d3c723f9d454b96810df8ab7a DIR parent b8c1c0c31704ad3731b88f3acf1dc5573c825194 HTML Author: Julian Tosh <Julian@Tosh.us> Date: Fri, 6 Jul 2012 21:45:57 -0700 modified password input routines to allow for input through stdin Diffstat: M electrum | 31 +++++++++++-------------------- M lib/__init__.py | 2 +- M lib/wallet.py | 22 +++++++++++++++++++++- 3 files changed, 33 insertions(+), 22 deletions(-) --- DIR diff --git a/electrum b/electrum t@@ -16,7 +16,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -import re, sys, getpass +import re, sys try: import ecdsa t@@ -31,9 +31,9 @@ except: sys.exit(1) try: - from lib import Wallet, WalletSynchronizer, format_satoshis, mnemonic + from lib import Wallet, WalletSynchronizer, format_satoshis, mnemonic, prompt_password except ImportError: - from electrum import Wallet, WalletSynchronizer, format_satoshis, mnemonic + from electrum import Wallet, WalletSynchronizer, format_satoshis, mnemonic, prompt_password from optparse import OptionParser from decimal import Decimal t@@ -178,14 +178,7 @@ if __name__ == '__main__': if wallet.file_exists: print "remove the existing wallet first!" sys.exit(0) - password = getpass.getpass("Password (hit return if you do not wish to encrypt your wallet):") - if password: - password2 = getpass.getpass("Confirm password:") - if password != password2: - print "error" - sys.exit(1) - else: - password = None + password = prompt_password("Password (hit return if you do not wish to encrypt your wallet):") w_host, w_port, w_protocol = wallet.server.split(':') host = raw_input("server (default:%s):"%w_host) t@@ -269,12 +262,12 @@ if __name__ == '__main__': # commands needing password if cmd in protected_commands or ( cmd=='addresses' and options.show_keys): - password = getpass.getpass('Password:') if wallet.use_encryption and not is_temporary else None + password = prompt_password('Password:') if wallet.use_encryption and not is_temporary else None # check password try: wallet.pw_decode( wallet.seed, password) except: - print "invalid password" + print "Error: This password does not decode this wallet." exit(1) if cmd == 'import': t@@ -435,7 +428,7 @@ if __name__ == '__main__': elif cmd in ['payto', 'mktx']: if from_addr and is_temporary: if from_addr.find(":") == -1: - keypair = from_addr + ":" + getpass.getpass('Private key:') + keypair = from_addr + ":" + prompt_password('Private key:', False) else: keypair = from_addr from_addr = keypair.split(':')[0] t@@ -484,13 +477,11 @@ if __name__ == '__main__': try: seed = wallet.pw_decode( wallet.seed, password) except: - print "sorry" + print "Error: Password does not decrypt this wallet." sys.exit(1) - new_password = getpass.getpass('New password:') - if new_password == getpass.getpass('Confirm new password:'): - wallet.update_password(seed, password, new_password) - else: - print "error: mismatch" + + new_password = prompt_password('New password:') + wallet.update_password(seed, password, new_password) elif cmd == 'signmessage': address = args[1] DIR diff --git a/lib/__init__.py b/lib/__init__.py t@@ -1,3 +1,3 @@ -from wallet import Wallet, format_satoshis +from wallet import Wallet, format_satoshis, prompt_password from interface import WalletSynchronizer from interface import TcpStratumInterface DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -17,7 +17,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -import sys, base64, os, re, hashlib, copy, operator, ast, threading, random +import sys, base64, os, re, hashlib, copy, operator, ast, threading, random, getpass import aes, ecdsa from ecdsa.util import string_to_number, number_to_string t@@ -147,6 +147,26 @@ def ASecretToSecret(key): ########### end pywallet functions ####################### +# get password routine +def prompt_password(prompt, confirm=True): + if sys.stdin.isatty(): + password = getpass.getpass(prompt) + + if password and confirm: + password2 = getpass.getpass("Confirm: ") + + if password != password2: + print "Error: Passwords do not match." + sys.exit(1) + + else: + password = raw_input(prompt) + + if not password: + password = None + + return password + # URL decode _ud = re.compile('%([0-9a-hA-H]{2})', re.MULTILINE) urldecode = lambda x: _ud.sub(lambda m: chr(int(m.group(1), 16)), x)