From 1e896f3d8cfbc3c5103a54ec8414f830aee9e5d5 Mon Sep 17 00:00:00 2001 From: Philipp Maier Date: Wed, 10 Mar 2021 17:02:53 +0100 Subject: [PATCH] pySim-shell: add ADF.ISIM / ADF.USIM dynamically currently ADF.ISIM and ADF.USIM are always added regardless if there is a matching application on the card or not. Lets check what applications are actually installed and add ADF.ISIM and ADF.USIM dynamically. Change-Id: I42ee23375f98e6322708c1c4db6d65e1425feecd Related: OS#4963 --- pySim-shell.py | 7 +++---- pySim/cards.py | 3 +++ pySim/filesystem.py | 24 +++++++++++++++++++++++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/pySim-shell.py b/pySim-shell.py index 946b3e57..e7bb7c0e 100755 --- a/pySim-shell.py +++ b/pySim-shell.py @@ -58,8 +58,6 @@ class PysimApp(cmd2.Cmd): self.card = card self.rs = rs self.py_locals = { 'card': self.card, 'rs' : self.rs } - self.card.read_aids() - self.poutput('AIDs on card: %s' % (self.card._aids)) self.numeric_path = False self.add_settable(cmd2.Settable('numeric_path', bool, 'Print File IDs instead of names', onchange_cb=self._onchange_numeric_path)) @@ -254,13 +252,14 @@ if __name__ == '__main__': sys.exit(2) profile = CardProfileUICC() + profile.add_application(ADF_USIM()) + profile.add_application(ADF_ISIM()) + rs = RuntimeState(card, profile) # FIXME: do this dynamically rs.mf.add_file(DF_TELECOM()) rs.mf.add_file(DF_GSM()) - rs.mf.add_application(ADF_USIM()) - rs.mf.add_application(ADF_ISIM()) app = PysimApp(card, rs) rs.select('MF', app) diff --git a/pySim/cards.py b/pySim/cards.py index c640591a..857d0b66 100644 --- a/pySim/cards.py +++ b/pySim/cards.py @@ -207,6 +207,7 @@ class Card(object): # Fetch all the AIDs present on UICC def read_aids(self): + self._aids = [] try: # Find out how many records the EF.DIR has # and store all the AIDs in the UICC @@ -218,6 +219,8 @@ class Card(object): self._aids.append(rec[0][8:8 + int(rec[0][6:8], 16) * 2]) except Exception as e: print("Can't read AIDs from SIM -- %s" % (str(e),)) + self._aids = [] + return self._aids # Select ADF.U/ISIM in the Card using its full AID def select_adf_by_aid(self, adf="usim"): diff --git a/pySim/filesystem.py b/pySim/filesystem.py index 0494df7c..a1bb1275 100644 --- a/pySim/filesystem.py +++ b/pySim/filesystem.py @@ -550,11 +550,33 @@ class RuntimeState(object): self.selected_file = self.mf self.profile = profile # add applications + MF-files from profile - for a in self.profile.applications: + apps = self._match_applications() + for a in apps: self.mf.add_application(a) for f in self.profile.files_in_mf: self.mf.add_file(f) + def _match_applications(self): + """match the applications from the profile with applications on the card""" + apps_profile = self.profile.applications + aids_card = self.card.read_aids() + apps_taken = [] + if aids_card: + aids_taken = [] + print("AIDs on card:") + for a in aids_card: + for f in apps_profile: + if f.aid in a: + print(" %s: %s" % (f.name, a)) + aids_taken.append(a) + apps_taken.append(f) + aids_unknown = set(aids_card) - set(aids_taken) + for a in aids_unknown: + print(" unknown: %s" % a) + else: + print("error: could not determine card applications") + return apps_taken + def get_cwd(self): """Obtain the current working directory.""" if isinstance(self.selected_file, CardDF):