dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/pysim/+/37774?usp=email )
Change subject: runtime: integrate escape route for applications without ADF support ......................................................................
runtime: integrate escape route for applications without ADF support
the select_parent method in RuntimeLchan currently implements a way to escape from an application that has no filesystem support. However, this escape route can be integrated directly into the select_file method. This will give us the benefit that it will work transparently in all code locations.
(This also means we can get ri of the select_parent method again)
Related: OS#6120 Change-Id: Ie6f37d13af880d24a9c7a8a95cef436b603587c7 --- M pySim-shell.py M pySim/runtime.py 2 files changed, 20 insertions(+), 32 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/74/37774/1
diff --git a/pySim-shell.py b/pySim-shell.py index 3d6853a..76f0102 100755 --- a/pySim-shell.py +++ b/pySim-shell.py @@ -543,7 +543,7 @@ # below, so we must not move up. if skip_df == False: self.walk(indent + 1, action_ef, action_df, context, **kwargs) - self._cmd.lchan.select_parent(self._cmd) + self._cmd.lchan.select_file(self._cmd.lchan.selected_file.parent, self._cmd)
elif action_ef: self.__walk_action(action_ef, f, context, **kwargs) @@ -589,7 +589,7 @@ # When reading the file is done, make sure the parent file is selected again. This will be the usual case, # however we need to check before since we must not select the parent file twice if df != self._cmd.lchan.selected_file: - self._cmd.lchan.select_parent(self._cmd) + self._cmd.lchan.select_file(self._cmd.lchan.selected_file.parent, self._cmd)
self._cmd.poutput("#")
diff --git a/pySim/runtime.py b/pySim/runtime.py index a90128d..08371ae 100644 --- a/pySim/runtime.py +++ b/pySim/runtime.py @@ -320,6 +320,24 @@ file : CardFile [or derived class] instance cmd_app : Command Application State (for unregistering old file commands) """ + + if not isinstance(file, CardADF) and self.selected_adf and self.selected_adf.has_fs == False: + # Not every application that may be present on a GlobalPlatform card will support the SELECT + # command as we know it from ETSI TS 102 221, section 11.1.1. In fact the only subset of + # SELECT we may rely on is the OPEN SELECT command as specified in GlobalPlatform Card + # Specification, section 11.9. Unfortunately the OPEN SELECT command only supports the + # "select by name" method, which means we can only select an application and not a file. + # The consequence of this is that we may get trapped in an application that does not have + # ISIM/USIM like file system support and the only way to leave that application is to select + # an ISIM/USIM application in order to get the file system access back. + # + # To automate this escape-route we will first select an arbitrary ADF that has file system support first + # and then continue normally. + for selectable in self.rs.mf.get_selectables().items(): + if isinstance(selectable[1], CardADF) and selectable[1].has_fs == True: + self.select(selectable[1].name, cmd_app) + break + # we need to find a path from our self.selected_file to the destination inter_path = self.selected_file.build_select_path_to(file) if not inter_path: @@ -394,36 +412,6 @@
return self.selected_file_fcp
- def select_parent(self, cmd_app=None): - """Select the parent file of the currently selected file. This method also works in case the currently selected - file is an ADF without UICC file system support and can be used to exit those ADFs. - """ - parent = self.selected_file.parent - df = self.selected_file - adf = self.selected_adf - if adf and adf.has_fs == False: - # Not every application that may be present on a GlobalPlatform card will support the SELECT - # command as we know it from ETSI TS 102 221, section 11.1.1. In fact the only subset of - # SELECT we may rely on is the OPEN SELECT command as specified in GlobalPlatform Card - # Specification, section 11.9. Unfortunately the OPEN SELECT command only supports the - # "select by name" method, which means we can only select an application and not a file. - # The consequence of this is that we may get trapped in an application that does not have - # ISIM/USIM like file system support and the only way to leave that application is to select - # an ISIM/USIM application in order to get the file system access back. - # - # To automate this escape-route while traversing the file system we will check whether - # the parent file is the MF. When this is the case and the selected ADF has no file system - # support, we will select an arbitrary ADF that has file system support first and from there - # we will then select the MF. - for selectable in parent.get_selectables().items(): - if isinstance(selectable[1], CardADF) and selectable[1].has_fs == True: - self.select(selectable[1].name, cmd_app) - break - self.select_file(parent, cmd_app) - - # Select the parent file normally - self.select_file(parent, cmd_app) - def status(self): """Request STATUS (current selected file FCP) from card.""" (data, _sw) = self.scc.status()