forked from platypush/platypush
parent
07dfc19bf5
commit
d77aa0b167
4 changed files with 0 additions and 111 deletions
|
@ -15,7 +15,6 @@ Backends
|
|||
platypush/backend/music.spotify.rst
|
||||
platypush/backend/nodered.rst
|
||||
platypush/backend/redis.rst
|
||||
platypush/backend/scard.rst
|
||||
platypush/backend/sensor.ir.zeroborg.rst
|
||||
platypush/backend/sensor.leap.rst
|
||||
platypush/backend/stt.deepspeech.rst
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
``scard``
|
||||
===========================
|
||||
|
||||
.. automodule:: platypush.backend.scard
|
||||
:members:
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
from platypush.backend import Backend
|
||||
from platypush.message.event.scard import SmartCardDetectedEvent, SmartCardRemovedEvent
|
||||
|
||||
|
||||
class ScardBackend(Backend):
|
||||
"""
|
||||
Generic backend to read smart cards and NFC tags and trigger an event
|
||||
whenever a device is detected.
|
||||
|
||||
Extend this backend to implement more advanced communication with custom
|
||||
smart cards.
|
||||
"""
|
||||
|
||||
def __init__(self, atr=None, *args, **kwargs):
|
||||
"""
|
||||
:param atr: If set, the backend will trigger events only for card(s)
|
||||
with the specified ATR(s). It can be either an ATR string
|
||||
(space-separated hex octects) or a list of ATR strings. Default:
|
||||
none (any card will be detected).
|
||||
"""
|
||||
|
||||
from smartcard.CardType import AnyCardType, ATRCardType
|
||||
|
||||
super().__init__(*args, **kwargs)
|
||||
self.ATRs = []
|
||||
|
||||
if atr:
|
||||
if isinstance(atr, str):
|
||||
self.ATRs = [atr]
|
||||
elif isinstance(atr, list):
|
||||
self.ATRs = atr
|
||||
else:
|
||||
raise RuntimeError(
|
||||
f"Unsupported ATR: \"{atr}\" - type: {type(atr)}, "
|
||||
+ "supported types: string, list"
|
||||
)
|
||||
|
||||
self.cardtype = ATRCardType(*[self._to_bytes(atr) for atr in self.ATRs])
|
||||
else:
|
||||
self.cardtype = AnyCardType()
|
||||
|
||||
@staticmethod
|
||||
def _to_bytes(data) -> bytes:
|
||||
if isinstance(data, str):
|
||||
data = data.encode()
|
||||
return data
|
||||
|
||||
def run(self):
|
||||
from smartcard.CardRequest import CardRequest
|
||||
from smartcard.Exceptions import NoCardException, CardConnectionException
|
||||
from smartcard.util import toHexString
|
||||
|
||||
super().run()
|
||||
|
||||
self.logger.info(
|
||||
'Initialized smart card reader backend - ATR filter: {}'.format(self.ATRs)
|
||||
)
|
||||
|
||||
prev_atr = None
|
||||
reader = None
|
||||
|
||||
while not self.should_stop():
|
||||
try:
|
||||
cardrequest = CardRequest(timeout=None, cardType=self.cardtype)
|
||||
cardservice = cardrequest.waitforcard()
|
||||
cardservice.connection.connect()
|
||||
|
||||
reader = cardservice.connection.getReader()
|
||||
atr = toHexString(cardservice.connection.getATR())
|
||||
|
||||
if atr != prev_atr:
|
||||
self.logger.info(
|
||||
'Smart card detected on reader {}, ATR: {}'.format(reader, atr)
|
||||
)
|
||||
|
||||
self.bus.post(SmartCardDetectedEvent(atr=atr, reader=reader))
|
||||
prev_atr = atr
|
||||
except Exception as e:
|
||||
if isinstance(e, (NoCardException, CardConnectionException)):
|
||||
self.bus.post(SmartCardRemovedEvent(atr=prev_atr, reader=reader))
|
||||
else:
|
||||
self.logger.exception(e)
|
||||
|
||||
prev_atr = None
|
||||
|
||||
|
||||
# vim:sw=4:ts=4:et:
|
|
@ -1,17 +0,0 @@
|
|||
manifest:
|
||||
events:
|
||||
platypush.message.event.scard.SmartCardDetectedEvent: when a smart card is detected
|
||||
platypush.message.event.scard.SmartCardRemovedEvent: when a smart card is removed
|
||||
install:
|
||||
apk:
|
||||
- py3-pyscard
|
||||
apt:
|
||||
- python3-pyscard
|
||||
dnf:
|
||||
- python-pyscard
|
||||
pacman:
|
||||
- python-pyscard
|
||||
pip:
|
||||
- pyscard
|
||||
package: platypush.backend.scard
|
||||
type: backend
|
Loading…
Reference in a new issue