laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/pysim/+/37838?usp=email )

Change subject: pySim-shell: fix CardKeyProvider for chv management commands
......................................................................

pySim-shell: fix CardKeyProvider for chv management commands

The CardKeyProvider support for the commands enable_chv, disable_chv,
verify_chv, change_chv and unblock_chv is broken. The reason for this
is the annotation "type=is_decimal" in the argument parser. This annotation
prevents the usage of string placeholders ("PIN1", "PUK1", etc).

Let's fix this by finding a better solution. We can also replace any
missing PIN/PUK code by checking if it is supplied or not. If not,
we query the CardKeyProvider. This also makes the usage of the *_chv
commands more uniform with the verify_adm command.

Related: OS#6531
Change-Id: I565b56ac608e801c67ca53d337bdec9efa3f3817
---
M pySim-shell.py
1 file changed, 27 insertions(+), 30 deletions(-)

Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified




diff --git a/pySim-shell.py b/pySim-shell.py
index 3a89f2d..78d20e6 100755
--- a/pySim-shell.py
+++ b/pySim-shell.py
@@ -851,67 +851,64 @@
         index_dict = {1: self._cmd.lchan.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:
+    def get_code(self, code, field):
+        """Use code either directly or try to get it from external data source 
using the provided field name"""
+        if code is not None:
             return sanitize_pin_adm(code)
-
         iccid = self._cmd.rs.identity['ICCID']
-        result = card_key_provider_get_field(str(code), key='ICCID', 
value=iccid)
+        result = card_key_provider_get_field(field, key='ICCID', value=iccid)
         result = sanitize_pin_adm(result)
         if result:
-            self._cmd.poutput("found %s '%s' for ICCID '%s'" % (code.upper(), 
result, iccid))
+            self._cmd.poutput("found %s '%s' for ICCID '%s'" % (field, result, 
iccid))
         else:
-            self._cmd.poutput("cannot find %s for ICCID '%s'" % (code.upper(), 
iccid))
+            raise RuntimeError("cannot find %s for ICCID '%s'" % (field, 
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=is_decimal, help='PIN code digits, \"PIN1\" or 
\"PIN2\" to get PIN code from external data source')
+    verify_chv_parser.add_argument('PIN', nargs='?', type=is_decimal,
+                                   help='PIN code value. If none given, CSV 
file will be queried')

     @cmd2.with_argparser(verify_chv_parser)
     def do_verify_chv(self, opts):
         """Verify (authenticate) using specified CHV (PIN) code, which is how 
the specifications
         call it if you authenticate yourself using the specified PIN.  There 
usually is at least PIN1 and
         PIN2."""
-        pin = self.get_code(opts.pin_code)
+        pin = self.get_code(opts.PIN, "PIN" + str(opts.pin_nr))
         (data, sw) = self._cmd.lchan.scc.verify_chv(opts.pin_nr, h2b(pin))
         self._cmd.poutput("CHV verification 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=is_decimal, help='PUK code digits \"PUK1\" or 
\"PUK2\" to get PUK code from external data source')
-    unblock_chv_parser.add_argument(
-        'new_pin_code', type=is_decimal, help='PIN code digits \"PIN1\" or 
\"PIN2\" to get PIN code from external data source')
+    unblock_chv_parser.add_argument('PUK', nargs='?', type=is_decimal,
+                                   help='PUK code value. If none given, CSV 
file will be queried')
+    unblock_chv_parser.add_argument('NEWPIN', nargs='?', type=is_decimal,
+                                   help='PIN code value. If none given, CSV 
file will be queried')

     @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)
+        new_pin = self.get_code(opts.NEWPIN, "PIN" + str(opts.pin_nr))
+        puk = self.get_code(opts.PUK, "PUK" + str(opts.pin_nr))
         (data, sw) = self._cmd.lchan.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('NEWPIN', nargs='?', type=is_decimal,
+                                   help='PIN code value. If none given, CSV 
file will be queried')
+    change_chv_parser.add_argument('PIN', nargs='?', type=is_decimal,
+                                   help='PIN code value. If none given, CSV 
file will be queried')
     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=is_decimal, help='PIN code digits \"PIN1\" or 
\"PIN2\" to get PIN code from external data source')
-    change_chv_parser.add_argument(
-        'new_pin_code', type=is_decimal, 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)
+        new_pin = self.get_code(opts.NEWPIN, "PIN" + str(opts.pin_nr))
+        pin = self.get_code(opts.PIN, "PIN" + str(opts.pin_nr))
         (data, sw) = self._cmd.lchan.scc.change_chv(
             opts.pin_nr, h2b(pin), h2b(new_pin))
         self._cmd.poutput("CHV change successful")
@@ -919,26 +916,26 @@
     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=is_decimal, help='PIN code digits, \"PIN1\" or 
\"PIN2\" to get PIN code from external data source')
+    disable_chv_parser.add_argument('PIN', nargs='?', type=is_decimal,
+                                   help='PIN code value. If none given, CSV 
file will be queried')

     @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)
+        pin = self.get_code(opts.PIN, "PIN" + str(opts.pin_nr))
         (data, sw) = self._cmd.lchan.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=is_decimal, help='PIN code digits, \"PIN1\" or 
\"PIN2\" to get PIN code from external data source')
+    enable_chv_parser.add_argument('PIN', nargs='?', type=is_decimal,
+                                   help='PIN code value. If none given, CSV 
file will be queried')

     @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)
+        pin = self.get_code(opts.PIN, "PIN" + str(opts.pin_nr))
         (data, sw) = self._cmd.lchan.scc.enable_chv(opts.pin_nr, h2b(pin))
         self._cmd.poutput("CHV enable successful")


--
To view, visit https://gerrit.osmocom.org/c/pysim/+/37838?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I565b56ac608e801c67ca53d337bdec9efa3f3817
Gerrit-Change-Number: 37838
Gerrit-PatchSet: 5
Gerrit-Owner: dexter <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>

Reply via email to