class testthread(Thread):
        def __init__(self, obsindex):
            Thread.__init__(self)
            self.readermonitor = ReaderMonitor()
            self.obsindex = obsindex
            self.observer = None

        def run(self):
            # create and register observer
            self.observer = printobserver(self.obsindex)
            self.readermonitor.addObserver(self.observer)
            sleep(20)
            self.readermonitor.deleteObserver(self.observer)
    class testthread(Thread):
        def __init__(self, obsindex):
            Thread.__init__(self)
            self.readermonitor = ReaderMonitor()
            self.obsindex = obsindex
            self.observer = None

        def run(self):
            # create and register observer
            self.observer = printobserver(self.obsindex)
            self.readermonitor.addObserver(self.observer)
            sleep(20)
            self.readermonitor.deleteObserver(self.observer)
class testthread(threading.Thread):
    def __init__(self, obsindex, testcase):
        threading.Thread.__init__(self)
        self.obsindex = obsindex
        self.testcase = testcase
        self.readermonitor = ReaderMonitor()
        self.observer = None

    def run(self):
        # create and register observer
        self.observer = printobserver(self.obsindex, self.testcase)
        self.readermonitor.addObserver(self.observer)
        time.sleep(1)
        self.readermonitor.deleteObserver(self.observer)
class testthread(threading.Thread):

    def __init__(self, obsindex, testcase):
        threading.Thread.__init__(self)
        self.obsindex = obsindex
        self.testcase = testcase
        self.readermonitor = ReaderMonitor()
        self.observer = None

    def run(self):
        # create and register observer
        self.observer = printobserver(self.obsindex, self.testcase)
        self.readermonitor.addObserver(self.observer)
        time.sleep(1)
        self.readermonitor.deleteObserver(self.observer)
Exemple #5
0
def entry_point():        
    print u"Smartcard monitor applet by Lauri Võsandi <*****@*****.**>"
    if not os.path.exists(PCSCD):
        print "Unable to find", PCSCD, "are you sure it is installed"
        
    applet = SmartcardApplet()
    reader_monitor = ReaderMonitor()
    reader_monitor.addObserver(applet.reader_observer)
    card_monitor = CardMonitor()
    card_monitor.addObserver(applet.card_observer)
    try:
        gtk.main()
    except KeyboardInterrupt:
        pass
    card_monitor.deleteObserver(applet.card_observer)
    reader_monitor.deleteObserver(applet.reader_observer)
Exemple #6
0
class ThaiIDCard:

    status = None

    smart_card_reader_monitor = None
    smart_card_reader_observer = None

    smart_card_monitor = None
    smart_card_observer = None

    #
    # Thailand National ID Card Address
    #

    # Select & Thai MOI
    SELECT = [0x00, 0xA4, 0x04, 0x00, 0x08]

    AID_MOI = [0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01]

    # APDU Type
    APDU_THAILAND_IDCARD_TYPE_01 = [0x00, 0xc0, 0x00, 0x01]
    APDU_THAILAND_IDCARD_TYPE_02 = [0x00, 0xc0, 0x00, 0x00]

    # TH Citizen ID
    CMD_CITIZEN = [0x80, 0xb0, 0x00, 0x04, 0x02, 0x00, 0x0d]
    # TH Full Name
    CMD_THFULLNAME = [0x80, 0xb0, 0x00, 0x11, 0x02, 0x00, 0x64]
    # EN Full Name
    CMD_ENFULLNAME = [0x80, 0xb0, 0x00, 0x75, 0x02, 0x00, 0x64]
    # Date of birth
    CMD_BIRTH = [0x80, 0xb0, 0x00, 0xD9, 0x02, 0x00, 0x08]
    # Gender
    CMD_GENDER = [0x80, 0xb0, 0x00, 0xE1, 0x02, 0x00, 0x01]
    # Card Issuer
    CMD_ISSUER = [0x80, 0xb0, 0x00, 0xF6, 0x02, 0x00, 0x64]
    # Issue Date
    CMD_ISSUE = [0x80, 0xb0, 0x01, 0x67, 0x02, 0x00, 0x08]
    # Expire Date
    CMD_EXPIRE = [0x80, 0xb0, 0x01, 0x6F, 0x02, 0x00, 0x08]
    # Address
    CMD_ADDRESS = [0x80, 0xb0, 0x15, 0x79, 0x02, 0x00, 0x64]

    # Photo_Part1/20
    CMD_PHOTO01 = [0x80, 0xb0, 0x01, 0x7B, 0x02, 0x00, 0xFF]
    # Photo_Part2/20
    CMD_PHOTO02 = [0x80, 0xb0, 0x02, 0x7A, 0x02, 0x00, 0xFF]
    # Photo_Part3/20
    CMD_PHOTO03 = [0x80, 0xb0, 0x03, 0x79, 0x02, 0x00, 0xFF]
    # Photo_Part4/20
    CMD_PHOTO04 = [0x80, 0xb0, 0x04, 0x78, 0x02, 0x00, 0xFF]
    # Photo_Part5/20
    CMD_PHOTO05 = [0x80, 0xb0, 0x05, 0x77, 0x02, 0x00, 0xFF]
    # Photo_Part6/20
    CMD_PHOTO06 = [0x80, 0xb0, 0x06, 0x76, 0x02, 0x00, 0xFF]
    # Photo_Part7/20
    CMD_PHOTO07 = [0x80, 0xb0, 0x07, 0x75, 0x02, 0x00, 0xFF]
    # Photo_Part8/20
    CMD_PHOTO08 = [0x80, 0xb0, 0x08, 0x74, 0x02, 0x00, 0xFF]
    # Photo_Part9/20
    CMD_PHOTO09 = [0x80, 0xb0, 0x09, 0x73, 0x02, 0x00, 0xFF]
    # Photo_Part10/20
    CMD_PHOTO10 = [0x80, 0xb0, 0x0A, 0x72, 0x02, 0x00, 0xFF]
    # Photo_Part11/20
    CMD_PHOTO11 = [0x80, 0xb0, 0x0B, 0x71, 0x02, 0x00, 0xFF]
    # Photo_Part12/20
    CMD_PHOTO12 = [0x80, 0xb0, 0x0C, 0x70, 0x02, 0x00, 0xFF]
    # Photo_Part13/20
    CMD_PHOTO13 = [0x80, 0xb0, 0x0D, 0x6F, 0x02, 0x00, 0xFF]
    # Photo_Part14/20
    CMD_PHOTO14 = [0x80, 0xb0, 0x0E, 0x6E, 0x02, 0x00, 0xFF]
    # Photo_Part15/20
    CMD_PHOTO15 = [0x80, 0xb0, 0x0F, 0x6D, 0x02, 0x00, 0xFF]
    # Photo_Part16/20
    CMD_PHOTO16 = [0x80, 0xb0, 0x10, 0x6C, 0x02, 0x00, 0xFF]
    # Photo_Part17/20
    CMD_PHOTO17 = [0x80, 0xb0, 0x11, 0x6B, 0x02, 0x00, 0xFF]
    # Photo_Part18/20
    CMD_PHOTO18 = [0x80, 0xb0, 0x12, 0x6A, 0x02, 0x00, 0xFF]
    # Photo_Part19/20
    CMD_PHOTO19 = [0x80, 0xb0, 0x13, 0x69, 0x02, 0x00, 0xFF]
    # Photo_Part20/20
    CMD_PHOTO20 = [0x80, 0xb0, 0x14, 0x68, 0x02, 0x00, 0xFF]

    # Expire time of data -- seconds
    _read_expire_time = 5  #

    # Thai Citizen ID
    _citizen = None
    _citizen_t = 0
    # Thai Full Name
    _full_name_th = None
    _full_name_th_t = 0
    # English Full Name
    _full_name_en = None
    _full_name_en_th = 0
    # Date of birth
    _birth = None
    _birth_t = 0
    # Gender
    _gender = None
    _gender_t = 0
    # Card Issuer
    _issuer = None
    _issuer_t = 0
    # Issue Date
    _issue = None
    _issue_t = 0
    # Expire Date
    _expire = None
    _expire_t = 0
    # Address
    _address = None
    _address_t = 0
    # Photo
    _photo = None
    _photo_t = 0

    def __init__(self):
        self.readerList = []

        if (len(self.getReaders()) > 0):
            self.connect(0)

    def readerMonitor(self, reader_added_cb, reader_removed_cb):
        self.reader_added_cb = reader_added_cb
        self.reader_removed_cb = reader_removed_cb
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: Add SmartCard reader observer")
        self.smart_card_reader_monitor = ReaderMonitor()
        self.smart_card_reader_observer = SmartCardReaderObserver(
            reader_added_callback=self.reader_removed_cb,
            reader_removed_callback=self.reader_removed_cb)
        self.smart_card_reader_monitor.addObserver(
            self.smart_card_reader_observer)

    def readerUnmonitor(self):
        try:
            if THAI_ID_CARD_DEBUG:
                print("ThaiIDCard: Remove SmartCard reader observer")
            self.smart_card_reader_monitor.deleteObserver(
                self.smart_card_reader_observer)
        except:
            pass

    def cardMonitor(self, smart_card_insert_cb, smart_card_remove_cb):
        self.smart_card_insert_cb = smart_card_insert_cb
        self.smart_card_remove_cb = smart_card_remove_cb
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: Add SmartCard observer")
        self.smart_card_monitor = CardMonitor()
        self.smart_card_observer = SmartCardObserver(
            card_insert_callback=self.smart_card_insert_cb,
            card_remove_callback=self.smart_card_remove_cb)
        self.smart_card_monitor.addObserver(self.smart_card_observer)

    def cardUnmonitor(self):
        try:
            if THAI_ID_CARD_DEBUG:
                print("ThaiIDCard: Remove SmartCard observer")
            self.smart_card_monitor.deleteObserver(self.smart_card_observer)
        except:
            pass

    # Get SmartCard reader list
    def getReaders(self):
        # Get all the available readers
        self.readerList = smartcard.System.readers()
        #if len(self.readerList) > 0:
        #    print ("Found SmartCard readers:")
        #    for readerIndex,readerItem in enumerate(self.readerList):
        #        print(" - %d, '%s'"%(readerIndex, readerItem))
        #else:
        #    print ("No SmartCard reader")
        self.readerIndex = 0
        return self.readerList

    # Connect to SmartCard reader
    def connect(self, index=0):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: Connecting to SmartCard")
        if len(self.readerList) == 0:
            if len(self.getReaders()) == 0:
                return None

        if index < 0 or index >= len(self.readerList):
            return None

        # Select reader
        self.readerIndex = index
        self.reader = self.readerList[self.readerIndex]
        if THAI_ID_CARD_DEBUG:
            print("Using SmartCard reader:", self.reader)

        try:
            self.connection = self.reader.createConnection()
            self.connection.connect()

            atr = self.connection.getATR()
            if THAI_ID_CARD_DEBUG:
                print(" - Card type: " + toHexString(atr))
            if (atr[0] == 0x3B & atr[1] == 0x67):
                # Corruption Card
                self._apdu = self.APDU_THAILAND_IDCARD_TYPE_01
            else:
                self._apdu = self.APDU_THAILAND_IDCARD_TYPE_02
            if THAI_ID_CARD_DEBUG:
                print(" - Connect to SmartCard success")
            self.status = True
            response, sw1, sw2 = self.selectApplet()
            # [], 61, 0A
            time.sleep(0.1)
            if sw1 == 0x61 and sw2 == 0x0A:
                return True
            self.status = None
            return None
        except:
            if THAI_ID_CARD_DEBUG:
                print(" - Failed to connect to SmartCard")
            self.status = None
            return None

    def disconnect(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: Closing connection from SmartCard")
        try:
            self.connection.disconnect()
        except:
            pass

    # Select MOI Applet
    def selectApplet(self):
        if self.status == None:
            if self.connect(self.readerIndex) == None:
                return [None, None, None]

        response, sw1, sw2 = self.connection.transmit(self.SELECT +
                                                      self.AID_MOI)
        #print ("Select Applet: %02X %02X" % (sw1, sw2))
        return [response, sw1, sw2]

    # Read data from SmartCard
    def read(self, cmd, apdu=None):
        if self.status == None:
            if self.connect(self.readerIndex) == None:
                return [None, None, None]

        if apdu == None:
            apdu = self._apdu

        try:
            response, sw1, sw2 = self.connection.transmit(cmd)
            response, sw1, sw2 = self.connection.transmit(apdu + [cmd[-1]])
            return [response, sw1, sw2]
        except Exception as w:
            return [None, None, None]

    # Read photo from SmartCard
    def readPhoto(self):
        if self.status == None:
            if self.connect(self.readerIndex) == None:
                return None

        photo = self.read(self.CMD_PHOTO01)[0]
        photo += self.read(self.CMD_PHOTO02)[0]
        photo += self.read(self.CMD_PHOTO03)[0]
        photo += self.read(self.CMD_PHOTO04)[0]
        photo += self.read(self.CMD_PHOTO05)[0]
        photo += self.read(self.CMD_PHOTO06)[0]
        photo += self.read(self.CMD_PHOTO07)[0]
        photo += self.read(self.CMD_PHOTO08)[0]
        photo += self.read(self.CMD_PHOTO09)[0]
        photo += self.read(self.CMD_PHOTO10)[0]
        photo += self.read(self.CMD_PHOTO11)[0]
        photo += self.read(self.CMD_PHOTO12)[0]
        photo += self.read(self.CMD_PHOTO13)[0]
        photo += self.read(self.CMD_PHOTO14)[0]
        photo += self.read(self.CMD_PHOTO15)[0]
        photo += self.read(self.CMD_PHOTO16)[0]
        photo += self.read(self.CMD_PHOTO17)[0]
        photo += self.read(self.CMD_PHOTO18)[0]
        photo += self.read(self.CMD_PHOTO19)[0]
        photo += self.read(self.CMD_PHOTO20)[0]
        response = HexListToBinString(photo)
        return response

    def thai2unicode(self, data):
        result = ''
        result = bytes(data).decode('tis-620')
        return result.strip()

    # Citizen ID
    @property
    def citizen(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: citizen=", end=' ')
        if (self._citizen != None):
            if ((time.time() - self._citizen_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._citizen)
                return self._citizen
        response, sw1, sw2 = self.read(self.CMD_CITIZEN)
        if (response != None):
            self._citizen = self.thai2unicode(response)
            self._citizen_t = time.time()
        else:
            self._citizen = None
        if THAI_ID_CARD_DEBUG:
            print(self._citizen)
        return self._citizen

    # Thai Name
    @property
    def full_name_th(self):
        #if THAI_ID_CARD_DEBUG:
        #    print("ThaiIDCard: full_name_th")
        if (self._full_name_th != None):
            if ((time.time() - self._full_name_th_t) < self._read_expire_time):
                return self._full_name_th
        response, sw1, sw2 = self.read(self.CMD_THFULLNAME)
        if (response != None):
            self._full_name_th = self.thai2unicode(response)
            self._full_name_th_t = time.time()
            self._first_name_th, self._last_name_th = self._full_name_th.split(
                '##')
            self._prefix_th, self._first_name_th = self._first_name_th.split(
                '#')
        else:
            self._full_name_th = None
        return self._full_name_th

    @property
    def prefix_th(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: prefix_th=", end=' ')
        if (self._full_name_th != None):
            if ((time.time() - self._full_name_th_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._prefix_th)
                return self._prefix_th
        if (self.full_name_th != None):
            if THAI_ID_CARD_DEBUG:
                print(self._prefix_th)
            return self._prefix_th
        return None

    @property
    def first_name_th(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: first_name_th=", end=' ')
        if (self._full_name_th != None):
            if ((time.time() - self._full_name_th_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._first_name_th)
                return self._first_name_th
        if (self.full_name_th != None):
            if THAI_ID_CARD_DEBUG:
                print(self._first_name_th)
            return self._first_name_th
        return None

    @property
    def last_name_th(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: last_name_th=", end=' ')
        if (self._full_name_th != None):
            if ((time.time() - self._full_name_th_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._last_name_th)
                return self._last_name_th
        if (self.full_name_th != None):
            if THAI_ID_CARD_DEBUG:
                print(self._last_name_th)
            return self._last_name_th
        return None

    # English Name
    @property
    def full_name_en(self):
        #if THAI_ID_CARD_DEBUG:
        #    print("ThaiIDCard: full_name_en")
        if (self._full_name_en != None):
            if ((time.time() - self._full_name_en_t) < self._read_expire_time):
                return self._full_name_en
        response, sw1, sw2 = self.read(self.CMD_ENFULLNAME)
        if (response != None):
            self._full_name_en = self.thai2unicode(response)
            self._full_name_en_t = time.time()
            self._first_name_en, self._last_name_en = self._full_name_en.split(
                '##')
            self._prefix_en, self._first_name_en = self._first_name_en.split(
                '#')
        else:
            self._full_name_en = None
        return self._full_name_en

    @property
    def prefix_en(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: prefix_en=", end=' ')
        if (self._full_name_en != None):
            if ((time.time() - self._full_name_en_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._prefix_en)
                return self._prefix_en
        if (self.full_name_en != None):
            if THAI_ID_CARD_DEBUG:
                print(self._prefix_en)
            return self._prefix_en
        return None

    @property
    def first_name_en(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: first_name_en=", end=' ')
        if (self._full_name_en != None):
            if ((time.time() - self._full_name_en_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._first_name_en)
                return self._first_name_en
        if (self.full_name_en != None):
            if THAI_ID_CARD_DEBUG:
                print(self._first_name_en)
            return self._first_name_en
        return None

    @property
    def last_name_en(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: last_name_en=", end=' ')
        if (self._full_name_en != None):
            if ((time.time() - self._full_name_en_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._last_name_en)
                return self._last_name_en
        if (self.full_name_en != None):
            if THAI_ID_CARD_DEBUG:
                print(self._last_name_en)
            return self._last_name_en
        return None

    # Date of birth
    @property
    def birth(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: birth=", end=' ')
        if (self._birth != None):
            if ((time.time() - self._birth_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._birth)
                return self._birth
        response, sw1, sw2 = self.read(self.CMD_BIRTH)
        if (response != None):
            self._birth = self.thai2unicode(response)
            self._birth_t = time.time()
            self._birth = self._birth[0:4] + '-' + self._birth[
                4:6] + '-' + self._birth[6:8]
        else:
            self._birth = None
        if THAI_ID_CARD_DEBUG:
            print(self._birth)
        return self._birth

    # Gender
    @property
    def gender(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: gender=", end=' ')
        if (self._gender != None):
            if ((time.time() - self._gender_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._gender)
                return self._gender
        response, sw1, sw2 = self.read(self.CMD_GENDER)
        if (response != None):
            self._gender = self.thai2unicode(response)
            self._gender_t = time.time()
        else:
            self._gender = None
        if THAI_ID_CARD_DEBUG:
            print(self._gender)
        return self._gender

    # Issue date
    @property
    def issue(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: issue=", end=' ')
        if (self._issue != None):
            if ((time.time() - self._issue_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._issue)
                return self._issue
        response, sw1, sw2 = self.read(self.CMD_ISSUE)
        if (response != None):
            self._issue = self.thai2unicode(response)
            self._issue_t = time.time()
            self._issue = self._issue[0:4] + '-' + self._issue[
                4:6] + '-' + self._issue[6:8]
        else:
            self._issue = None
        if THAI_ID_CARD_DEBUG:
            print(self._issue)
        return self._issue

    # Expire date
    @property
    def expire(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: expire=", end=' ')
        if (self._expire != None):
            if ((time.time() - self._expire_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._expire)
                return self._expire
        response, sw1, sw2 = self.read(self.CMD_EXPIRE)
        if (response != None):
            self._expire = self.thai2unicode(response)
            self._expire_t = time.time()
            self._expire = self._expire[0:4] + '-' + self._expire[
                4:6] + '-' + self._expire[6:8]
        else:
            self._expire = None
        if THAI_ID_CARD_DEBUG:
            print(self._expire)
        return self._expire

    # Address
    @property
    def address(self):
        #if THAI_ID_CARD_DEBUG:
        #    print("ThaiIDCard: address")
        if (self._address != None):
            if ((time.time() - self._address_t) < self._read_expire_time):
                return self._address
        response, sw1, sw2 = self.read(self.CMD_ADDRESS)
        if (response != None):
            self._address = self.thai2unicode(response)
            self._address_t = time.time()
            #self._address = self._address[0:4]+'-'+self._address[4:6]+'-'+self._address[6:8]
            self._address = re.sub(r'#', ' ', self._address)
            self._address = re.sub(r'  ', ' ', self._address)
            self._address = re.sub(r'  ', ' ', self._address)
            x = self._address.rsplit()
            self._city = x[len(x) - 2]
            self._province = x[len(x) - 1]
        else:
            self._address = None
        return self._address

    @property
    def city(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: city=", end=' ')
        if (self._address != None):
            if ((time.time() - self._address_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._city)
                return self._city
        if (self.address != None):
            if THAI_ID_CARD_DEBUG:
                print(self._city)
            return self._city
        return None

    @property
    def province(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: province=", end=' ')
        if (self._address != None):
            if ((time.time() - self._address_t) < self._read_expire_time):
                if THAI_ID_CARD_DEBUG:
                    print(self._province)
                return self._province
        if (self.address != None):
            if THAI_ID_CARD_DEBUG:
                print(self._province)
            return self._province
        return None

    # Photo
    @property
    def photo(self):
        if THAI_ID_CARD_DEBUG:
            print("ThaiIDCard: photo")
        if (self._photo != None):
            if ((time.time() - self._photo_t) < self._read_expire_time):
                return self._photo
        self._photo = self.readPhoto()
        return self._photo

    # Example code, read all attributes
    def example(self):
        if (len(self.readerList) < 0):
            return None

        # Reader list
        print(self.getReaders())

        print(f'Citizen ID:', self.citizen)
        print(f'Thai Full Name: ' + self.full_name_th)
        print(f'Thai Prefix: ' + self.prefix_th)
        print(f'Thai First Name: ' + self.first_name_th)
        print(f'Thai Last Name: ' + self.last_name_th)
        print(f'English Full Name: ' + self.full_name_en)
        print(f'English Prefix: ' + self.prefix_en)
        print(f'English First Name: ' + self.first_name_en)
        print(f'English Last Name: ' + self.last_name_en)
        print(f'Date of birth: ' + self.birth)
        print(f'Gender: ' + self.gender)
        print(f'Issue date: ' + self.issue)
        print(f'Expire date: ' + self.expire)
        print(f'Address: ' + self.address)
        print(f'City: ' + self.city)
        print(f'Province: ' + self.province)
        #print(f'Photo file size: ' + self.photo)
        return
Exemple #7
0
class CardAndReaderTreePanel(wx.Panel):
    """Panel containing the smart card and reader tree controls."""

    class _CardObserver(CardObserver):
        """Inner CardObserver. Gets notified of card insertion
        removal by the CardMonitor."""

        def __init__(self, cardtreectrl):
            self.cardtreectrl = cardtreectrl

        def update(self, observable, handlers):
            """CardObserver callback that is notified
            when cards are added or removed."""
            addedcards, removedcards = handlers
            self.cardtreectrl.OnRemoveCards(removedcards)
            self.cardtreectrl.OnAddCards(addedcards)

    class _ReaderObserver(ReaderObserver):
        """Inner ReaderObserver. Gets notified of reader insertion/removal
        by the ReaderMonitor."""

        def __init__(self, readertreectrl):
            self.readertreectrl = readertreectrl

        def update(self, observable, handlers):
            """ReaderObserver callback that is notified when
            readers are added or removed."""
            addedcards, removedcards = handlers
            self.readertreectrl.OnRemoveReaders(removedreaders)
            self.readertreectrl.OnAddReaders(addedreaders)

    def __init__(self, parent, appstyle, clientpanel):
        """Constructor. Create a smartcard and reader tree control on the
        left-hand side of the application main frame.
        @param parent: the tree panel parent
        @param appstyle: a combination of the following styles (bitwise or |)
          - TR_SMARTCARD: display a smartcard tree panel
          - TR_READER: display a reader tree panel
          - default is TR_DEFAULT = TR_SMARTCARD
        @param clientpanel: the client panel to notify of smartcard and reader events
        """
        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)

        sizer = wx.BoxSizer(wx.VERTICAL)

        # create the smartcard tree
        if appstyle & smartcard.wx.SimpleSCardApp.TR_SMARTCARD:
            self.cardtreectrl = CardTreeCtrl(self, clientpanel=clientpanel)

            # create the smartcard insertion observer
            self.cardtreecardobserver = self._CardObserver(self.cardtreectrl)

            # register as a CardObserver; we will ge
            # notified of added/removed cards
            self.cardmonitor = CardMonitor()
            self.cardmonitor.addObserver(self.cardtreecardobserver)

            sizer.Add(
                self.cardtreectrl, flag=wx.EXPAND | wx.ALL, proportion=1)

        # create the reader tree
        if appstyle & smartcard.wx.SimpleSCardApp.TR_READER:
            self.readertreectrl = ReaderTreeCtrl(
                                        self, clientpanel=clientpanel)

            # create the reader insertion observer
            self.readertreereaderobserver = self._ReaderObserver(
                                                    self.readertreectrl)

            # register as a ReaderObserver; we will ge
            # notified of added/removed readers
            self.readermonitor = ReaderMonitor()
            self.readermonitor.addObserver(self.readertreereaderobserver)

            # create the smartcard insertion observer
            self.readertreecardobserver = self._CardObserver(
                                                self.readertreectrl)

            # register as a CardObserver; we will get
            # notified of added/removed cards
            self.cardmonitor = CardMonitor()
            self.cardmonitor.addObserver(self.readertreecardobserver)

            sizer.Add(
                self.readertreectrl, flag=wx.EXPAND | wx.ALL, proportion=1)

        self.SetSizer(sizer)
        self.SetAutoLayout(True)

    def OnDestroy(self, event):
        """Called on panel destruction."""
        # deregister observers
        if hasattr(self, 'cardmonitor'):
            self.cardmonitor.deleteObserver(self.cardtreecardobserver)
        if hasattr(self, 'readermonitor'):
            self.readermonitor.deleteObserver(self.readertreereaderobserver)
            self.cardmonitor.deleteObserver(self.readertreecardobserver)
        event.Skip()
    """A simple reader observer that is notified
    when readers are added/removed from the system and
    prints the list of readers
    """

    def update(self, observable, (addedreaders, removedreaders)):
        print "Added readers", addedreaders
        print "Removed readers", removedreaders

try:
    print "Add or remove a smartcard reader to the system."
    print "This program will exit in 10 seconds"
    print ""
    readermonitor = ReaderMonitor()
    readerobserver = printobserver()
    readermonitor.addObserver(readerobserver)

    sleep(10)

    # don't forget to remove observer, or the
    # monitor will poll forever...
    readermonitor.deleteObserver(readerobserver)

    import sys
    if 'win32' == sys.platform:
        print 'press Enter to continue'
        sys.stdin.read(1)

except:
    print exc_info()[0], ':', exc_info()[1]
class Monitor(QRunnable):
    """
    Monitoriza los dispositivos pkcs11 conectados a la computadora.
    Lanza 2 eventos:

    * Dispositivo conectado (signals.USB_CONNECTED)
    * Dispositivo desconectado (signals.USB_DISCONNECTED)

    Un ejemplo de uso puede ser:

    .. code:: python 

        from client_fva.monitor import Monitor
        from client_fva import signals
        class OSDummyClient:
            def __init__(self):
                self.client = Monitor()
                self.client.start()
                self.client.signal.connect(self.token_information_event)

            def token_information_event(self, sender, **kw):

                obj = kw['obj']
                if obj._type == signals.USB_CONNECTED:
                    print("Conectando ", obj._type)
                elif obj._type == signals.USB_DISCONNECTED:
                    print("Desconectando ", obj._type)
                print(obj.data)
                return obj

    No se requiere devolver nada, pero es bueno para seguir con el formato, de otras señales
    """
    connected_device = {}
    lib = None

    def __init__(self, *args, **kwargs):
        self.settings = kwargs.get('settings', UserSettings.getInstance())
        kwargs['settings'] = self.settings
        kwargs['cached'] = False
        self.session_storage = SessionStorage.getInstance()
        self.pkcs11client = PKCS11Client(*args, **kwargs)
        self.session_storage.pkcs11_client = self.pkcs11client
        QRunnable.__init__(self)
        self.setAutoDelete(True)
        self.cardmonitor = None
        self.cardobserver = None
        self.mutex = QMutex()
        self.run_mutex = QMutex()

    @pyqtSlot()
    def run(self):
        logger.info("Iniciando monitor")
        self.readermonitor = ReaderMonitor()
        self.cardmonitor = CardMonitor()
        self.cardobserver = DfvaCardObserver(eventmanager=self)
        self.readerobserver = DFVAReaderObserver(eventmanager=self)
        self.cardmonitor.addObserver(self.cardobserver)
        self.readermonitor.addObserver(self.readerobserver)
        self.run_mutex.lock()
        self.run_mutex.lock()

    def detect_device(self, notify_exception=False):
        """
        Identifica cambios en las tarjetas conectadas, es utilizado 
        normalmente de forma automática con el monitor, pero se puede llamar 
        usando detect_device( notify_exception=True) para que envíe notificaciones 
        de los errores presentados al detectar las tarjetas.
        """
        logger.debug("Monitor: detect device")
        self.mutex.lock()
        tmp_device = []
        added_device = {}
        try:
            for tokeninfo in self.pkcs11client.get_tokens_information():
                slot = tokeninfo['slot']
                serial = tokeninfo['serial']
                if serial in self.connected_device:
                    tmp_device.append(serial)
                else:
                    tmp_device.append(serial)
                    person = self.pkcs11client.get_identification(slot=slot)
                    data = {'slot': slot, 'person': person, 'serial': serial}
                    added_device[serial] = data
                    self.send_add_signal(data)
        except SlotNotFound as notoken:
            pass
        except Exception as noToken:
            if notify_exception:
                signals.send(
                    'notify', {
                        'message':
                        "Un dispositivo ha sido encontrado, pero ninguna tarjeta pudo ser "
                        "leída, por favor verifique que la tarjeta esté correctamente "
                        "insertada"
                    })
            logger.error("%r" % (noToken, ))
            # except Exception as e:
            #     if notify_exception:
            #         signals.result.emit('notify',  {
            #             'message': "Ha ocurrido un error inesperado leyendo alguno de los dispositivos"
            #         })

        self.connected_device.update(added_device)

        for connected_serial in tuple(self.connected_device.keys()):
            if connected_serial not in tmp_device:
                self.send_removed_signal(
                    self.connected_device[connected_serial])
                self.connected_device.pop(connected_serial)
        self.mutex.unlock()

    def send_add_signal(self, data):
        sobj = signals.SignalObject(signals.USB_CONNECTED, data)
        logger.info("Tarjeta conectada %s" % (data['person'], ))
        signals.send('monitor_usb', sobj)

    def send_removed_signal(self, data):
        sobj = signals.SignalObject(signals.USB_DISCONNECTED, data)
        logger.info("Tarjeta desconectada %s" % (data['person'], ))
        signals.send('monitor_usb', sobj)

    def close(self):
        logger.info("Terminando monitor")

        if self.cardmonitor and self.cardobserver:
            self.cardmonitor.deleteObserver(self.cardobserver)

        if self.cardmonitor and self.readermonitor:
            self.readermonitor.deleteObserver(self.readerobserver)

        if self.cardmonitor:
            self.cardmonitor.rmthread.stop()

        self.run_mutex.unlock()
        del self.cardobserver
        del self.readerobserver
        del self.cardmonitor