Change in pysim[master]: shell: Move dir, tree, export from ISO7816 to pySim commands

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

laforge gerrit-no-reply at lists.osmocom.org
Tue Apr 6 16:03:30 UTC 2021


laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/23599 )

Change subject: shell: Move dir,tree,export from ISO7816 to pySim commands
......................................................................

shell: Move dir,tree,export from ISO7816 to pySim commands

pySim has the notion of command categories.  The ISO7816 category
should only contain commands such as SELECT or CHV management
which really is ISO7816.  Custom commands like 'tree' or 'export'
are pySim specific and hence go into a different category.

Change-Id: Id38c8190c6279d037fe266c586065f1507a02932
---
M pySim-shell.py
1 file changed, 101 insertions(+), 96 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved
  fixeria: Looks good to me, but someone else must approve



diff --git a/pySim-shell.py b/pySim-shell.py
index ef76cb2..ae8a5a2 100755
--- a/pySim-shell.py
+++ b/pySim-shell.py
@@ -55,7 +55,7 @@
 class PysimApp(cmd2.Cmd):
 	CUSTOM_CATEGORY = 'pySim Commands'
 	def __init__(self, card, rs, script = None):
-		basic_commands = [Iso7816Commands()]
+		basic_commands = [Iso7816Commands(), PySimCommands()]
 		super().__init__(persistent_history_file='~/.pysim_shell_history', allow_cli_args=False,
 				 use_ipython=True, auto_load_commands=False, command_sets=basic_commands, startup_script=script)
 		self.intro = style('Welcome to pySim-shell!', fg=fg.red)
@@ -118,104 +118,11 @@
 		else:
 			self.poutput("no description available")
 
-
- at with_default_category('ISO7816 Commands')
-class Iso7816Commands(CommandSet):
+ at with_default_category('pySim Commands')
+class PySimCommands(CommandSet):
 	def __init__(self):
 		super().__init__()
 
-	def do_select(self, opts):
-		"""SELECT a File (ADF/DF/EF)"""
-		if len(opts.arg_list) == 0:
-			path_list = self._cmd.rs.selected_file.fully_qualified_path(True)
-			path_list_fid = self._cmd.rs.selected_file.fully_qualified_path(False)
-			self._cmd.poutput("currently selected file: " + '/'.join(path_list) + " (" + '/'.join(path_list_fid) + ")")
-			return
-
-		path = opts.arg_list[0]
-		fcp_dec = self._cmd.rs.select(path, self._cmd)
-		self._cmd.update_prompt()
-		self._cmd.poutput(json.dumps(fcp_dec, indent=4))
-
-	def complete_select(self, text, line, begidx, endidx) -> List[str]:
-		"""Command Line tab completion for SELECT"""
-		index_dict = { 1: self._cmd.rs.selected_file.get_selectable_names() }
-		return self._cmd.index_based_complete(text, line, begidx, endidx, index_dict=index_dict)
-
-	def get_code(self, code):
-		"""Use code either directly or try to get it from external data source"""
-		auto = ('PIN1', 'PIN2', 'PUK1', 'PUK2')
-
-		if str(code).upper() not in auto:
-			return sanitize_pin_adm(code)
-
-		result = card_key_provider_get_field(str(code), key='ICCID', value=self._cmd.iccid)
-		result = sanitize_pin_adm(result)
-		if result:
-			self._cmd.poutput("found %s '%s' for ICCID '%s'" % (code.upper(), result, self._cmd.iccid))
-		else:
-			self._cmd.poutput("cannot find %s for ICCID '%s'" % (code.upper(), self._cmd.iccid))
-		return result
-
-	verify_chv_parser = argparse.ArgumentParser()
-	verify_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	verify_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(verify_chv_parser)
-	def do_verify_chv(self, opts):
-		"""Verify (authenticate) using specified PIN code"""
-		pin = self.get_code(opts.pin_code)
-		(data, sw) = self._cmd.card._scc.verify_chv(opts.pin_nr, h2b(pin))
-		self._cmd.poutput("CHV verfication successful")
-
-	unblock_chv_parser = argparse.ArgumentParser()
-	unblock_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	unblock_chv_parser.add_argument('puk_code', type=str, help='PUK code digits \"PUK1\" or \"PUK2\" to get PUK code from external data source')
-	unblock_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(unblock_chv_parser)
-	def do_unblock_chv(self, opts):
-		"""Unblock PIN code using specified PUK code"""
-		new_pin = self.get_code(opts.new_pin_code)
-		puk = self.get_code(opts.puk_code)
-		(data, sw) = self._cmd.card._scc.unblock_chv(opts.pin_nr, h2b(puk), h2b(new_pin))
-		self._cmd.poutput("CHV unblock successful")
-
-	change_chv_parser = argparse.ArgumentParser()
-	change_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	change_chv_parser.add_argument('pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-	change_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(change_chv_parser)
-	def do_change_chv(self, opts):
-		"""Change PIN code to a new PIN code"""
-		new_pin = self.get_code(opts.new_pin_code)
-		pin = self.get_code(opts.pin_code)
-		(data, sw) = self._cmd.card._scc.change_chv(opts.pin_nr, h2b(pin), h2b(new_pin))
-		self._cmd.poutput("CHV change successful")
-
-	disable_chv_parser = argparse.ArgumentParser()
-	disable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	disable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(disable_chv_parser)
-	def do_disable_chv(self, opts):
-		"""Disable PIN code using specified PIN code"""
-		pin = self.get_code(opts.pin_code)
-		(data, sw) = self._cmd.card._scc.disable_chv(opts.pin_nr, h2b(pin))
-		self._cmd.poutput("CHV disable successful")
-
-	enable_chv_parser = argparse.ArgumentParser()
-	enable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
-	enable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
-
-	@cmd2.with_argparser(enable_chv_parser)
-	def do_enable_chv(self, opts):
-		"""Enable PIN code using specified PIN code"""
-		pin = self.get_code(opts.pin_code)
-		(data, sw) = self._cmd.card._scc.enable_chv(opts.pin_nr, h2b(pin))
-		self._cmd.poutput("CHV enable successful")
-
 	dir_parser = argparse.ArgumentParser()
 	dir_parser.add_argument('--fids', help='Show file identifiers', action='store_true')
 	dir_parser.add_argument('--names', help='Show file names', action='store_true')
@@ -347,6 +254,104 @@
 			raise RuntimeError("unable to export %i file(s)" % context['ERR'])
 
 
+ at with_default_category('ISO7816 Commands')
+class Iso7816Commands(CommandSet):
+	def __init__(self):
+		super().__init__()
+
+	def do_select(self, opts):
+		"""SELECT a File (ADF/DF/EF)"""
+		if len(opts.arg_list) == 0:
+			path_list = self._cmd.rs.selected_file.fully_qualified_path(True)
+			path_list_fid = self._cmd.rs.selected_file.fully_qualified_path(False)
+			self._cmd.poutput("currently selected file: " + '/'.join(path_list) + " (" + '/'.join(path_list_fid) + ")")
+			return
+
+		path = opts.arg_list[0]
+		fcp_dec = self._cmd.rs.select(path, self._cmd)
+		self._cmd.update_prompt()
+		self._cmd.poutput(json.dumps(fcp_dec, indent=4))
+
+	def complete_select(self, text, line, begidx, endidx) -> List[str]:
+		"""Command Line tab completion for SELECT"""
+		index_dict = { 1: self._cmd.rs.selected_file.get_selectable_names() }
+		return self._cmd.index_based_complete(text, line, begidx, endidx, index_dict=index_dict)
+
+	def get_code(self, code):
+		"""Use code either directly or try to get it from external data source"""
+		auto = ('PIN1', 'PIN2', 'PUK1', 'PUK2')
+
+		if str(code).upper() not in auto:
+			return sanitize_pin_adm(code)
+
+		result = card_key_provider_get_field(str(code), key='ICCID', value=self._cmd.iccid)
+		result = sanitize_pin_adm(result)
+		if result:
+			self._cmd.poutput("found %s '%s' for ICCID '%s'" % (code.upper(), result, self._cmd.iccid))
+		else:
+			self._cmd.poutput("cannot find %s for ICCID '%s'" % (code.upper(), self._cmd.iccid))
+		return result
+
+	verify_chv_parser = argparse.ArgumentParser()
+	verify_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	verify_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(verify_chv_parser)
+	def do_verify_chv(self, opts):
+		"""Verify (authenticate) using specified PIN code"""
+		pin = self.get_code(opts.pin_code)
+		(data, sw) = self._cmd.card._scc.verify_chv(opts.pin_nr, h2b(pin))
+		self._cmd.poutput("CHV verfication successful")
+
+	unblock_chv_parser = argparse.ArgumentParser()
+	unblock_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	unblock_chv_parser.add_argument('puk_code', type=str, help='PUK code digits \"PUK1\" or \"PUK2\" to get PUK code from external data source')
+	unblock_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(unblock_chv_parser)
+	def do_unblock_chv(self, opts):
+		"""Unblock PIN code using specified PUK code"""
+		new_pin = self.get_code(opts.new_pin_code)
+		puk = self.get_code(opts.puk_code)
+		(data, sw) = self._cmd.card._scc.unblock_chv(opts.pin_nr, h2b(puk), h2b(new_pin))
+		self._cmd.poutput("CHV unblock successful")
+
+	change_chv_parser = argparse.ArgumentParser()
+	change_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PUK Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	change_chv_parser.add_argument('pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+	change_chv_parser.add_argument('new_pin_code', type=str, help='PIN code digits \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(change_chv_parser)
+	def do_change_chv(self, opts):
+		"""Change PIN code to a new PIN code"""
+		new_pin = self.get_code(opts.new_pin_code)
+		pin = self.get_code(opts.pin_code)
+		(data, sw) = self._cmd.card._scc.change_chv(opts.pin_nr, h2b(pin), h2b(new_pin))
+		self._cmd.poutput("CHV change successful")
+
+	disable_chv_parser = argparse.ArgumentParser()
+	disable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	disable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(disable_chv_parser)
+	def do_disable_chv(self, opts):
+		"""Disable PIN code using specified PIN code"""
+		pin = self.get_code(opts.pin_code)
+		(data, sw) = self._cmd.card._scc.disable_chv(opts.pin_nr, h2b(pin))
+		self._cmd.poutput("CHV disable successful")
+
+	enable_chv_parser = argparse.ArgumentParser()
+	enable_chv_parser.add_argument('--pin-nr', type=int, default=1, help='PIN Number, 1=PIN1, 2=PIN2 or custom value (decimal)')
+	enable_chv_parser.add_argument('pin_code', type=str, help='PIN code digits, \"PIN1\" or \"PIN2\" to get PIN code from external data source')
+
+	@cmd2.with_argparser(enable_chv_parser)
+	def do_enable_chv(self, opts):
+		"""Enable PIN code using specified PIN code"""
+		pin = self.get_code(opts.pin_code)
+		(data, sw) = self._cmd.card._scc.enable_chv(opts.pin_nr, h2b(pin))
+		self._cmd.poutput("CHV enable successful")
+
+
 def parse_options():
 
 	parser = OptionParser(usage="usage: %prog [options]")

-- 
To view, visit https://gerrit.osmocom.org/c/pysim/+/23599
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Id38c8190c6279d037fe266c586065f1507a02932
Gerrit-Change-Number: 23599
Gerrit-PatchSet: 3
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier at sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210406/6d071ede/attachment.htm>


More information about the gerrit-log mailing list