diff --git a/pySim-shell.py b/pySim-shell.py index 7aaa2343..c2bb15c2 100755 --- a/pySim-shell.py +++ b/pySim-shell.py @@ -53,6 +53,7 @@ from pySim.transport import init_reader, ApduTracer, argparse_add_reader_args, P from pySim.cards import card_detect, SimCardBase, UiccCardBase from pySim.utils import h2b, b2h, i2h, swap_nibbles, rpad, JsonEncoder, bertlv_parse_one, sw_match from pySim.utils import sanitize_pin_adm, tabulate_str_list, boxed_heading_str, Hexstr, dec_iccid +from pySim.utils import is_hexstr_or_decimal from pySim.card_handler import CardHandler, CardHandlerAuto from pySim.filesystem import CardDF, CardADF, CardModel, CardApplication @@ -777,7 +778,7 @@ class PySimCommands(CommandSet): self._cmd.poutput("no description available") verify_adm_parser = argparse.ArgumentParser() - verify_adm_parser.add_argument('ADM1', nargs='?', type=str, + verify_adm_parser.add_argument('ADM1', nargs='?', type=is_hexstr_or_decimal, help='ADM1 pin value. If none given, CSV file will be queried') @cmd2.with_argparser(verify_adm_parser) diff --git a/pySim/utils.py b/pySim/utils.py index 7459a3f4..92bf70ff 100644 --- a/pySim/utils.py +++ b/pySim/utils.py @@ -1467,3 +1467,14 @@ class CardCommandSet: def all_subclasses(cls) -> set: """Recursively get all subclasses of a specified class""" return set(cls.__subclasses__()).union([s for c in cls.__subclasses__() for s in all_subclasses(c)]) + +def is_hexstr_or_decimal(instr: str) -> str: + """Method that can be used as 'type' in argparse.add_argument() to validate the value consists of + [hexa]decimal digits only.""" + if instr.isdecimal(): + return instr + if not all(c in string.hexdigits for c in instr): + raise ValueError('Input must be [hexa]decimal') + if len(instr) & 1: + raise ValueError('Input has un-even number of hex digits') + return instr