mn_entry.py: check configured mnemonic entry modes at runtime

This commit is contained in:
The MMGen Project 2023-03-27 10:50:37 +00:00
commit 9eab15dc6e
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
3 changed files with 39 additions and 27 deletions

View file

@ -213,19 +213,6 @@ class MnEntryModeMinimal(MnEntryMode):
if pad > self.pad_max:
return mne.idx(s,'full',lo_idx=lo,hi_idx=hi)
def mn_entry(wl_id,entry_mode=None):
if wl_id == 'words':
wl_id = 'mmgen'
me = MnemonicEntry.get_cls_by_wordlist(wl_id)
import importlib
me.bconv = getattr(importlib.import_module(f'mmgen.{me.modname}'),me.modname)(wl_id)
me.wl = me.bconv.digits
obj = me()
if entry_mode:
import mmgen.mn_entry
obj.em = getattr( mmgen.mn_entry, 'MnEntryMode'+capfirst(entry_mode) )(obj)
return obj
class MnemonicEntry(object):
prompt_info = {
@ -245,6 +232,9 @@ class MnemonicEntry(object):
_sw = None
_usl = None
def __init__(self):
self.set_dfl_entry_mode()
@property
def longest_word(self):
if not self._lw:
@ -394,15 +384,22 @@ class MnemonicEntry(object):
raise ValueError(f'wordlist {wl!r} not recognized (valid choices: {fmt_list(list(d))})')
return d[wl]
@classmethod
def get_cfg_vars(cls):
def set_dfl_entry_mode(self):
"""
In addition to setting the default entry mode for the current wordlist, checks validity
of all user-configured entry modes
"""
for k,v in g.mnemonic_entry_modes.items():
tcls = cls.get_cls_by_wordlist(k)
if v not in tcls.entry_modes:
raise ValueError(
f'entry mode {v!r} not recognized for wordlist {k!r}:' +
f'\n (valid choices: {fmt_list(tcls.entry_modes)})' )
tcls.usr_dfl_entry_mode = v
cls = self.get_cls_by_wordlist(k)
if v not in cls.entry_modes:
errmsg = """
Error in cfg file option 'mnemonic_entry_modes':
Entry mode {!r} not recognized for wordlist {!r}:
Valid choices: {}
""".format( v, k, fmt_list(cls.entry_modes) )
die(2, '\n' + fmt(errmsg,indent=' '))
if cls == type(self):
self.usr_dfl_entry_mode = v
class MnemonicEntryMMGen(MnemonicEntry):
wl_id = 'mmgen'
@ -425,7 +422,14 @@ class MnemonicEntryMonero(MnemonicEntry):
dfl_entry_mode = 'short'
has_chksum = True
try:
MnemonicEntry.get_cfg_vars()
except Exception as e:
die(2, f"Error in cfg file option 'mnemonic_entry_modes':\n {e.args[0]}")
def mn_entry(wl_id,entry_mode=None):
if wl_id == 'words':
wl_id = 'mmgen'
me = MnemonicEntry.get_cls_by_wordlist(wl_id)()
import importlib
me.bconv = getattr(importlib.import_module(f'mmgen.{me.modname}'),me.modname)(wl_id)
me.wl = me.bconv.digits
if entry_mode:
import mmgen.mn_entry
me.em = getattr( mmgen.mn_entry, 'MnEntryMode'+capfirst(entry_mode) )(me)
return me

View file

@ -34,4 +34,8 @@ if cmd_args:
elif cmd_args[0] == 'autoset_opts_cmdline':
assert opt.rpc_backend == 'curl', "opt.rpc_backend != 'curl'"
elif cmd_args[0] == 'mnemonic_entry_modes':
msg( 'mnemonic_entry_modes: {}'.format(g.mnemonic_entry_modes) )
from mmgen.mn_entry import mn_entry
msg('mnemonic_entry_modes: {}\nmmgen: {}\nbip39: {}'.format(
g.mnemonic_entry_modes,
mn_entry('mmgen').usr_dfl_entry_mode,
mn_entry('bip39').usr_dfl_entry_mode ))

View file

@ -236,7 +236,11 @@ class TestSuiteCfgFile(TestSuiteBase):
txt = 'mnemonic_entry_modes mmgen:full bip39:short'
write_to_file(self.path('usr'),txt+'\n')
imsg(yellow(f'Wrote cfg file: {txt!r}'))
return run("{'mmgen': 'full', 'bip39': 'short'}")
t = run("{'mmgen': 'full', 'bip39': 'short'}")
# check that set_dfl_entry_mode() set the mode correctly:
t.expect('mmgen: full')
t.expect('bip39: short')
return t
def chain_names(self):