diff --git a/docs/shell.rst b/docs/shell.rst index 652e5723..06e7f424 100644 --- a/docs/shell.rst +++ b/docs/shell.rst @@ -206,6 +206,24 @@ update_record_decoded :func: LinFixedEF.ShellCommands.upd_rec_dec_parser +edit_record_decoded +~~~~~~~~~~~~~~~~~~~ +.. argparse:: + :module: pySim.filesystem + :func: LinFixedEF.ShellCommands.edit_rec_dec_parser + +This command will read the selected record, decode it to its JSON representation, save +that JSON to a temporary file on your computer, and launch your configured text editor. + +You may then perform whatever modifications to the JSON representation, save + leave your +text editor. + +Afterwards, the modified JSON will be re-encoded to the binary format, and the result written +back to the record on the SIM card. + +This allows for easy interactive modification of records. + + Transparent EF commands ----------------------- @@ -268,6 +286,19 @@ Th below example demonstrates this by modifying the ofm field within EF.AD: } +edit_binary_decoded +~~~~~~~~~~~~~~~~~~~ +This command will read the selected binary EF, decode it to its JSON representation, save +that JSON to a temporary file on your computer, and launch your configured text editor. + +You may then perform whatever modifications to the JSON representation, save + leave your +text editor. + +Afterwards, the modified JSON will be re-encoded to the binary format, and the result written +to the SIM card. + +This allows for easy interactive modification of file contents. + cmd2 settable parameters ------------------------ diff --git a/pySim/filesystem.py b/pySim/filesystem.py index d2b84431..e771f3cd 100644 --- a/pySim/filesystem.py +++ b/pySim/filesystem.py @@ -25,6 +25,7 @@ not the actual contents / runtime state of interacting with a given smart card. # along with this program. If not, see . import code +import tempfile import json import cmd2 @@ -433,6 +434,26 @@ class TransparentEF(CardEF): if data: self._cmd.poutput_json(data) + def do_edit_binary_decoded(self, opts): + """Edit the JSON representation of the EF contents in an editor.""" + (orig_json, sw) = self._cmd.rs.read_binary_dec() + with tempfile.TemporaryDirectory(prefix='pysim_') as dirname: + filename = '%s/file' % dirname + # write existing data as JSON to file + with open(filename, 'w') as text_file: + json.dump(orig_json, text_file, indent=4) + # run a text editor + self._cmd._run_editor(filename) + with open(filename, 'r') as text_file: + edited_json = json.load(text_file) + if edited_json == orig_json: + self._cmd.poutput("Data not modified, skipping write") + else: + (data, sw) = self._cmd.rs.update_binary_dec(edited_json) + if data: + self._cmd.poutput_json(data) + + def __init__(self, fid:str, sfid:str=None, name:str=None, desc:str=None, parent:CardDF=None, size={1,None}): """ @@ -622,6 +643,32 @@ class LinFixedEF(CardEF): if data: self._cmd.poutput(data) + edit_rec_dec_parser = argparse.ArgumentParser() + edit_rec_dec_parser.add_argument('record_nr', type=int, help='Number of record to be edited') + @cmd2.with_argparser(edit_rec_dec_parser) + def do_edit_record_decoded(self, opts): + """Edit the JSON representation of one record in an editor.""" + (orig_json, sw) = self._cmd.rs.read_record_dec(opts.record_nr) + dirname = tempfile.mkdtemp(prefix='pysim_') + try: + filename = '%s/file' % dirname + # write existing data as JSON to file + with open(filename, 'w') as text_file: + json.dump(orig_json, text_file, indent=4) + # run a text editor + self._cmd._run_editor(filename) + with open(filename, 'r') as text_file: + edited_json = json.load(text_file) + if edited_json == orig_json: + self._cmd.poutput("Data not modified, skipping write") + else: + (data, sw) = self._cmd.rs.update_record_dec(opts.record_nr, edited_json) + if data: + self._cmd.poutput_json(data) + finally: + shutil.rmtree(dirname) + + def __init__(self, fid:str, sfid:str=None, name:str=None, desc:str=None, parent:Optional[CardDF]=None, rec_len={1,None}): """