84 lines
2.1 KiB
Python
Executable file
84 lines
2.1 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
#
|
|
# MMGen Wallet, a terminal-based cryptocurrency wallet
|
|
# Copyright (C)2013-2026 The MMGen Project <mmgen@tuta.io>
|
|
#
|
|
# Project source code repository: https://github.com/mmgen/mmgen-wallet
|
|
# Licensed according to the terms of GPL Version 3. See LICENSE for details.
|
|
|
|
"""
|
|
test.cmdtest_d.include.input: Shared input routines for the cmdtest.py test suite
|
|
"""
|
|
|
|
import time
|
|
from ...include.common import getrand
|
|
from .common import randbool
|
|
|
|
def mnemonic_entry(t, mne, mn):
|
|
p_ok, _ = mne.word_prompt
|
|
for wnum, word in enumerate(mn, 1):
|
|
t.expect(p_ok.format(wnum), word + ' ')
|
|
|
|
def stealth_mnemonic_entry(t, mne, mn, entry_mode, pad_entry=False):
|
|
|
|
def pad_mnemonic(mn, ss_len):
|
|
def get_pad_chars(n):
|
|
ret = ''
|
|
for _ in range(n):
|
|
m = int.from_bytes(getrand(1), 'big') % 32
|
|
ret += r'123579!@#$%^&*()_+-=[]{}"?/,.<>|'[m]
|
|
return ret
|
|
ret = []
|
|
for w in mn:
|
|
if entry_mode == 'short':
|
|
w = w[:ss_len]
|
|
if len(w) < ss_len:
|
|
npc = 3
|
|
w = w[0] + get_pad_chars(npc) + w[1:]
|
|
if pad_entry:
|
|
w += '%' * (1 + mne.em.pad_max - npc)
|
|
else:
|
|
w += '\n'
|
|
else:
|
|
w = get_pad_chars(1) + w[0] + get_pad_chars(1) + w[1:]
|
|
elif len(w) > (3, 5)[ss_len==12]:
|
|
w = w + '\n'
|
|
else:
|
|
w = (
|
|
get_pad_chars(2 if randbool() and entry_mode != 'short' else 0)
|
|
+ w[0] + get_pad_chars(2) + w[1:]
|
|
+ get_pad_chars(9))
|
|
w = w[:ss_len+1]
|
|
ret.append(w)
|
|
return ret
|
|
|
|
match entry_mode:
|
|
case 'fixed':
|
|
mn = ['bkr'] + mn[:5] + ['nfb'] + mn[5:]
|
|
ssl = mne.uniq_ss_len
|
|
def gen_mn():
|
|
for w in mn:
|
|
if len(w) >= ssl:
|
|
yield w[:ssl]
|
|
else:
|
|
yield w[0] + 'z\b' + '#' * (ssl-len(w)) + w[1:]
|
|
mn = list(gen_mn())
|
|
case 'full' | 'short':
|
|
mn = ['fzr'] + mn[:5] + ['grd', 'grdbxm'] + mn[5:]
|
|
mn = pad_mnemonic(mn, mne.em.ss_len)
|
|
mn[10] = '@#$%*##' + mn[10]
|
|
|
|
wnum = 1
|
|
p_ok, p_err = mne.word_prompt
|
|
for w in mn:
|
|
ret = t.expect((p_ok.format(wnum), p_err.format(wnum-1)))
|
|
if ret == 0:
|
|
wnum += 1
|
|
for char in w:
|
|
t.send(char)
|
|
time.sleep(0.005)
|
|
|
|
def user_dieroll_entry(t, data):
|
|
for s in data:
|
|
t.expect(r'Enter die roll #.+: ', s, regex=True)
|
|
time.sleep(0.005)
|