From 2435f60b03b13169d98e426c37f844b9500580b6 Mon Sep 17 00:00:00 2001 From: philemon Date: Mon, 16 Oct 2017 19:20:34 +0300 Subject: [PATCH] mmgen-autosign: --coin support, validate that secret is well-formed --- scripts/mmgen-autosign | 57 ++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/scripts/mmgen-autosign b/scripts/mmgen-autosign index 742427d8..75e86ca5 100755 --- a/scripts/mmgen-autosign +++ b/scripts/mmgen-autosign @@ -34,6 +34,7 @@ opts_data = lambda: { -l, --led Use status LED to signal standby, busy and error -s, --stealth-led Stealth LED mode - signal busy and error only, and only after successful authorization. +-v, --verbose Produce more verbose output """, 'notes': """ @@ -90,10 +91,13 @@ tx_dir = os.path.join(mountpoint,'tx') part_label = 'MMGEN_TX' shm_dir = '/dev/shm' secret_fn = 'txsign-secret' -tn_arg = ([],['--testnet=1'])[bool(opt.testnet)] +tn_arg = ['--testnet={}'.format(opt.testnet or '0')] +coin_arg = ['--coin={}'.format(opt.coin or 'btc')] def check_daemon_running(): - try: subprocess.check_output(['mmgen-tool'] + tn_arg + ['getbalance']) + cmd = ['mmgen-tool'] + tn_arg + coin_arg + ['getbalance'] + vmsg('Executing: {}'.format(' '.join(cmd))) + try: subprocess.check_output(cmd) except: die(1,'Daemon not running') def get_wallet_files(): @@ -103,11 +107,13 @@ def get_wallet_files(): return [os.path.join(shm_dir,w) for w in wfs] def get_secret_in_dir(d,on_fail='die'): + fn = os.path.join(d,secret_fn) try: - with open(os.path.join(d,secret_fn)) as f: - return f.read().rstrip() + with open(fn) as f: ret = f.read().rstrip() + assert is_hex_str(ret) and len(ret) == 32 + return ret except: - msg('Unable to read secret file!') + msg("Secret file '{}' non-existent, unreadable or in incorrect format!".format(fn)) if on_fail == 'die': sys.exit(1) else: return None @@ -135,7 +141,8 @@ def sign(): unsigned = [os.path.join(tx_dir,f) for f in raw if f[:-6] not in signed] if unsigned: - cmd = ['mmgen-txsign','--yes','--outdir='+tx_dir] + tn_arg + unsigned + wfs + cmd = ['mmgen-txsign','--yes','--outdir='+tx_dir] + tn_arg + coin_arg + unsigned + wfs + vmsg('Executing: {}'.format(' '.join(cmd))) ret = subprocess.call(cmd) msg('') time.sleep(0.3) @@ -156,7 +163,7 @@ def wipe_existing_secret_files(): msg('\nWiping existing key {}'.format(fn)) subprocess.call(['wipe','-c',fn]) -def create_secret_files(): +def create_secret_files(): from binascii import hexlify secret = hexlify(os.urandom(16)) for d in (tx_dir,shm_dir): @@ -239,7 +246,7 @@ def do_loop(): do_sign() prev_status = status if not n % 10: - msg_r('\r{}\rwaiting'.format(' '*17)) + msg_r('\r{}\rWaiting'.format(' '*17)) time.sleep(1) msg_r('.') n += 1 @@ -262,6 +269,23 @@ def check_wipe_present(): except: die(2,"The 'wipe' utility must be installed before running this program") +def at_exit(nl=True): + if opt.led: + set_led('off') + ev.set() + led_thread.join() + if board == 'rpi': + with open(trigger[board],'w') as f: f.write('mmc0\n') + if nl: msg('') + raise SystemExit + +def handler(a,b): at_exit() + +# main() +if len(cmd_args) == 1 and cmd_args[0] == 'gen_secret': + do_create_secret_files() + sys.exit() + if opt.led: import threading status = { @@ -291,28 +315,11 @@ if opt.led: if board == 'rpi': with open(trigger[board],'w') as f: f.write('none\n') -# main() -if len(cmd_args) == 1 and cmd_args[0] == 'gen_secret': - do_create_secret_files() - sys.exit() - check_wipe_present() wfs = get_wallet_files() secret = get_secret_in_dir(shm_dir,on_fail='die') check_daemon_running() -def at_exit(nl=True): - if opt.led: - set_led('off') - ev.set() - led_thread.join() - if board == 'rpi': - with open(trigger[board],'w') as f: f.write('mmc0\n') - if nl: msg('') - raise SystemExit - -def handler(a,b): at_exit() - signal.signal(signal.SIGTERM,handler) signal.signal(signal.SIGINT,handler)