Browse Source

modified password input routines to allow for input through stdin

283
Julian Tosh 13 years ago
parent
commit
b615fe0c8c
  1. 31
      electrum
  2. 2
      lib/__init__.py
  3. 22
      lib/wallet.py

31
electrum

@ -16,7 +16,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import re, sys, getpass import re, sys
try: try:
import ecdsa import ecdsa
@ -31,9 +31,9 @@ except:
sys.exit(1) sys.exit(1)
try: try:
from lib import Wallet, WalletSynchronizer, format_satoshis, mnemonic from lib import Wallet, WalletSynchronizer, format_satoshis, mnemonic, prompt_password
except ImportError: 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 optparse import OptionParser
from decimal import Decimal from decimal import Decimal
@ -178,14 +178,7 @@ if __name__ == '__main__':
if wallet.file_exists: if wallet.file_exists:
print "remove the existing wallet first!" print "remove the existing wallet first!"
sys.exit(0) sys.exit(0)
password = getpass.getpass("Password (hit return if you do not wish to encrypt your wallet):") password = prompt_password("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
w_host, w_port, w_protocol = wallet.server.split(':') w_host, w_port, w_protocol = wallet.server.split(':')
host = raw_input("server (default:%s):"%w_host) host = raw_input("server (default:%s):"%w_host)
@ -269,12 +262,12 @@ if __name__ == '__main__':
# commands needing password # commands needing password
if cmd in protected_commands or ( cmd=='addresses' and options.show_keys): 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 # check password
try: try:
wallet.pw_decode( wallet.seed, password) wallet.pw_decode( wallet.seed, password)
except: except:
print "invalid password" print "Error: This password does not decode this wallet."
exit(1) exit(1)
if cmd == 'import': if cmd == 'import':
@ -435,7 +428,7 @@ if __name__ == '__main__':
elif cmd in ['payto', 'mktx']: elif cmd in ['payto', 'mktx']:
if from_addr and is_temporary: if from_addr and is_temporary:
if from_addr.find(":") == -1: if from_addr.find(":") == -1:
keypair = from_addr + ":" + getpass.getpass('Private key:') keypair = from_addr + ":" + prompt_password('Private key:', False)
else: else:
keypair = from_addr keypair = from_addr
from_addr = keypair.split(':')[0] from_addr = keypair.split(':')[0]
@ -484,13 +477,11 @@ if __name__ == '__main__':
try: try:
seed = wallet.pw_decode( wallet.seed, password) seed = wallet.pw_decode( wallet.seed, password)
except: except:
print "sorry" print "Error: Password does not decrypt this wallet."
sys.exit(1) sys.exit(1)
new_password = getpass.getpass('New password:')
if new_password == getpass.getpass('Confirm new password:'): new_password = prompt_password('New password:')
wallet.update_password(seed, password, new_password) wallet.update_password(seed, password, new_password)
else:
print "error: mismatch"
elif cmd == 'signmessage': elif cmd == 'signmessage':
address = args[1] address = args[1]

2
lib/__init__.py

@ -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 WalletSynchronizer
from interface import TcpStratumInterface from interface import TcpStratumInterface

22
lib/wallet.py

@ -17,7 +17,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # 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 import aes, ecdsa
from ecdsa.util import string_to_number, number_to_string from ecdsa.util import string_to_number, number_to_string
@ -147,6 +147,26 @@ def ASecretToSecret(key):
########### end pywallet functions ####################### ########### 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 # URL decode
_ud = re.compile('%([0-9a-hA-H]{2})', re.MULTILINE) _ud = re.compile('%([0-9a-hA-H]{2})', re.MULTILINE)
urldecode = lambda x: _ud.sub(lambda m: chr(int(m.group(1), 16)), x) urldecode = lambda x: _ud.sub(lambda m: chr(int(m.group(1), 16)), x)

Loading…
Cancel
Save