aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2023-12-23 17:23:52 +0100
committerHarald Welte <laforge@osmocom.org>2023-12-27 22:17:38 +0100
commitdffe7af5789d9a59d6e12c43a449eaf2955f8443 (patch)
tree9ccd2b618863b95155edb79492975f3d47271aef
parent722c11a7e9d509700d781140392110b36887269e (diff)
Fix enumeration of GlobbalPlatformISDR during card_init()
We used __subclasses__(), but this only returns the immediate subclasses and not all further/nested subclasses. Instead, we must use the pySim.utils.all_subclasses() function to really get all of them. The hack to use the method signature of the constructor to determine if it's an intermediate class didn't work, as even GlobbalPlatformISDR has a optional argument for non-default AIDs. So let's introduce an explicit class attribute for that purpose. Change-Id: I7fb1637f8f7a149b536c4d77dac92736c526aa6c
-rw-r--r--pySim/app.py7
-rw-r--r--pySim/global_platform.py1
2 files changed, 4 insertions, 4 deletions
diff --git a/pySim/app.py b/pySim/app.py
index b0df85f..43ef06d 100644
--- a/pySim/app.py
+++ b/pySim/app.py
@@ -14,7 +14,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import inspect
from typing import Tuple
from pySim.transport import LinkBase
@@ -26,6 +25,7 @@ from pySim.runtime import RuntimeState
from pySim.profile import CardProfile
from pySim.cdma_ruim import CardProfileRUIM
from pySim.ts_102_221 import CardProfileUICC
+from pySim.utils import all_subclasses
# we need to import this module so that the SysmocomSJA2 sub-class of
# CardModel is created, which will add the ATR-based matching and
@@ -87,10 +87,9 @@ def init_card(sl: LinkBase) -> Tuple[RuntimeState, SimCardBase]:
# We cannot do it within pySim/profile.py as that would create circular
# dependencies between the individual profiles and profile.py.
if isinstance(profile, CardProfileUICC):
- for app_cls in CardApplication.__subclasses__():
- constr_sig = inspect.signature(app_cls.__init__)
+ for app_cls in all_subclasses(CardApplication):
# skip any intermediary sub-classes such as CardApplicationSD
- if len(constr_sig.parameters) != 1:
+ if hasattr(app_cls, '_' + app_cls.__name__ + '__intermediate'):
continue
profile.add_application(app_cls())
# We have chosen SimCard() above, but we now know it actually is an UICC
diff --git a/pySim/global_platform.py b/pySim/global_platform.py
index 2ed6ee4..0ceb884 100644
--- a/pySim/global_platform.py
+++ b/pySim/global_platform.py
@@ -267,6 +267,7 @@ class ADF_SD(CardADF):
# Card Application of a Security Domain
class CardApplicationSD(CardApplication):
+ __intermediate = True
def __init__(self, aid: str, name: str, desc: str):
super().__init__(name, adf=ADF_SD(aid, name, desc), sw=sw_table)