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()
--
To view, visit
https://gerrit.osmocom.org/c/pysim/+/37774?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Ie6f37d13af880d24a9c7a8a95cef436b603587c7
Gerrit-Change-Number: 37774
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <pmaier(a)sysmocom.de>