From 21998ac6da70cee68f97fd2cb13efd337bc56640 Mon Sep 17 00:00:00 2001 From: MMGen Date: Tue, 15 Oct 2019 17:12:24 +0000 Subject: [PATCH] AddrList.parse_file(): improve error handling --- mmgen/addr.py | 22 +++++++++++++--------- mmgen/bip39.py | 1 + 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/mmgen/addr.py b/mmgen/addr.py index 8b1e9fc3..4ad2e6f2 100755 --- a/mmgen/addr.py +++ b/mmgen/addr.py @@ -374,6 +374,7 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file has_keys = False ext = 'addrs' chksum_rec_f = lambda foo,e: (str(e.idx), e.addr) + line_ctr = 0 def __init__(self,addrfile='',al_id='',adata=[],seed='',addr_idxs='',src='', addrlist='',keylist='',mmtype=None): @@ -387,6 +388,7 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file self.al_id,src = AddrListID(seed.sid,mmtype),'gen' adata = self.generate(seed,addr_idxs) elif addrfile: # data from MMGen address file + self.infile = addrfile adata = self.parse_file(addrfile) # sets self.al_id elif al_id and adata: # data from tracking wallet self.al_id = al_id @@ -626,8 +628,10 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file def get_line(self,lines): ret = lines.pop(0).split(None,2) + self.line_ctr += 1 if ret[0] == 'orig_hex:': # hacky ret = lines.pop(0).split(None,2) + self.line_ctr += 1 return ret if len(ret) == 3 else ret + [''] def parse_file_body(self,lines): @@ -638,9 +642,8 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file while lines: idx,addr,lbl = self.get_line(lines) - assert is_mmgen_idx(idx), ( - "'{}': invalid address num. in line: '{}'".format(idx,' '.join([idx,addr,lbl]))) - assert self.check_format(addr),"'{}': invalid {}".format(addr,self.data_desc) + assert is_mmgen_idx(idx),'invalid address index {!r}'.format(idx) + self.check_format(addr) a = le(**{ 'idx':int(idx), self.main_attr:addr, 'label':lbl }) @@ -738,7 +741,8 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file data = self.parse_file_body(lines[1:-1]) assert isinstance(data,list),'Invalid file body data' except Exception as e: - m = 'Invalid address list file ({})'.format(e.args[0]) + lcs = ', list item {}'.format(self.line_ctr) if self.line_ctr else '' + m = 'Invalid data in {} list file {!r}{} ({})'.format(self.data_desc,self.infile,lcs,e.args[0]) if exit_on_error: die(3,m) msg(msg) return False @@ -819,6 +823,7 @@ Record this checksum: it will be used to verify the password file in the future self.update_msgs() if infile: + self.infile = infile self.data = self.parse_file(infile) # sets self.pw_id_str,self.pw_fmt,self.pw_len else: if not chk_params_only: @@ -887,11 +892,10 @@ Record this checksum: it will be used to verify the password file in the future def check_format(self,pw): if not self.pw_info[self.pw_fmt].chk_func(pw): - msg('Password is not valid {} data'.format(self.pw_fmt)) - return False - if len(pw) != self.pw_len: - msg('Password has incorrect length ({} != {})'.format(len(pw),self.pw_len)) - return False + raise ValueError('Password is not valid {} data'.format(self.pw_info[self.pw_fmt].desc)) + pwlen = len(pw.split()) if self.pw_fmt == 'bip39' else len(pw) + if pwlen != self.pw_len: + raise ValueError('Password has incorrect length ({} != {})'.format(pwlen,self.pw_len)) return True def scramble_seed(self,seed): diff --git a/mmgen/bip39.py b/mmgen/bip39.py index fc0f0fd6..a91eebcf 100755 --- a/mmgen/bip39.py +++ b/mmgen/bip39.py @@ -2090,6 +2090,7 @@ zoo '224': (7, 21), '256': (8, 24), } + digits = { 'bip39': words } @classmethod def tohex(cls,words,wl_id,pad=None):