aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2023-11-03 11:42:18 +0100
committerHarald Welte <laforge@osmocom.org>2023-12-21 12:33:12 +0100
commitad002797e2bffb8b6a39a839429ba0f8e62b9b79 (patch)
treeb85459b949e081342f8c8dcd2d9e17c7107b8339
parent0f177c1d290202d808c94eb084f45ae6b383da26 (diff)
transport/pcsc: Allow opening PC/SC readers by a regex of their name
Opening PC/SC readers by index/number is very error-prone as the order is never deterministic in any system with multiple (hot-plugged, USB) readers. Instead, let's offer the alternative of specifying a regular expression to match the reader name (similar to remsim-bankd). Change-Id: I983f19c6741904c1adf27749c9801b44a03a5d78
-rw-r--r--pySim/transport/__init__.py2
-rw-r--r--pySim/transport/pcsc.py42
2 files changed, 31 insertions, 13 deletions
diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py
index e0e1e62..d075878 100644
--- a/pySim/transport/__init__.py
+++ b/pySim/transport/__init__.py
@@ -287,7 +287,7 @@ def init_reader(opts, **kwargs) -> LinkBase:
"""
Init card reader driver
"""
- if opts.pcsc_dev is not None:
+ if opts.pcsc_dev is not None or opts.pcsc_regex is not None:
from pySim.transport.pcsc import PcscSimLink
sl = PcscSimLink(opts, **kwargs)
elif opts.osmocon_sock is not None:
diff --git a/pySim/transport/pcsc.py b/pySim/transport/pcsc.py
index 6afcdac..b1c424f 100644
--- a/pySim/transport/pcsc.py
+++ b/pySim/transport/pcsc.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2009-2010 Sylvain Munaut <tnt@246tNt.com>
-# Copyright (C) 2010 Harald Welte <laforge@gnumonks.org>
+# Copyright (C) 2010-2023 Harald Welte <laforge@gnumonks.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,7 +19,8 @@
import argparse
import os
-from typing import Optional
+import re
+from typing import Optional, Union
from smartcard.CardConnection import CardConnection
from smartcard.CardRequest import CardRequest
@@ -36,16 +37,30 @@ class PcscSimLink(LinkBase):
def __init__(self, opts: argparse.Namespace = argparse.Namespace(pcsc_dev=0), **kwargs):
super().__init__(**kwargs)
+ self._reader = None
+ r = readers()
+ if opts.pcsc_dev is not None:
+ # actual reader index number (integer)
+ reader_number = opts.pcsc_dev
+ if reader_number >= len(r):
+ raise ReaderError('No reader found for number %d' % reader_number)
+ self._reader = r[reader_number]
+ else:
+ # reader regex string
+ cre = re.compile(opts.pcsc_regex)
+ for reader in r:
+ if cre.search(reader.name):
+ self._reader = reader
+ break
+ if not self._reader:
+ raise ReaderError('No matching reader found for regex %s' % opts.pcsc_regex)
+
+ self._con = self._reader.createConnection()
+
if os.environ.get('PYSIM_INTEGRATION_TEST') == "1":
print("Using PC/SC reader interface")
else:
- print("Using PC/SC reader number %u" % opts.pcsc_dev)
- r = readers()
- if opts.pcsc_dev >= len(r):
- raise ReaderError('No reader found for number %d' % opts.pcsc_dev)
- self._reader = r[opts.pcsc_dev]
- self._con = self._reader.createConnection()
- self._reader_number = opts.pcsc_dev
+ print("Using PC/SC reader %s" % self)
def __del__(self):
try:
@@ -100,10 +115,13 @@ class PcscSimLink(LinkBase):
return i2h(data), i2h(sw)
def __str__(self) -> str:
- return "PCSC:%u[%s]" % (self._reader_number, self._reader)
+ return "PCSC[%s]" % (self._reader)
@staticmethod
def argparse_add_reader_args(arg_parser: argparse.ArgumentParser):
pcsc_group = arg_parser.add_argument_group('PC/SC Reader')
- pcsc_group.add_argument('-p', '--pcsc-device', type=int, dest='pcsc_dev', metavar='PCSC', default=None,
- help='PC/SC reader number to use for SIM access')
+ dev_group = pcsc_group.add_mutually_exclusive_group()
+ dev_group.add_argument('-p', '--pcsc-device', type=int, dest='pcsc_dev', metavar='PCSC', default=None,
+ help='Number of PC/SC reader to use for SIM access')
+ dev_group.add_argument('--pcsc-regex', type=str, dest='pcsc_regex', metavar='REGEX', default=None,
+ help='Regex matching PC/SC reader to use for SIM access')