Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions nitrokeyapp/device_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ def __init__(self, device: TrussedBase, using_ccid: bool) -> None:
self._device = device
self._using_ccid = using_ccid

if isinstance(self._device, TrussedDevice):
self._status = self._device.admin.status()
self._uuid = self._device.uuid()
self._version = self._device.admin.version()

def __repr__(self) -> str:
fields = {
"path": self.path,
Expand Down
30 changes: 29 additions & 1 deletion nitrokeyapp/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
from types import TracebackType
from typing import Dict, Optional, Type

from nitrokey import _VID_NITROKEY
from nitrokey.trussed import Model
from PySide6 import QtWidgets
from PySide6.QtCore import QEvent, Qt, QTimer, Signal, Slot
from PySide6.QtGui import QCursor
from usbmonitor import USBMonitor
from usbmonitor.attributes import ID_USB_INTERFACES, ID_VENDOR_ID

from nitrokeyapp.device_data import DeviceData
from nitrokeyapp.device_manager import DeviceManager
Expand Down Expand Up @@ -48,7 +50,15 @@ def __init__(self, qt_app: QtWidgets.QApplication, log_file: str):
QtUtilsMixIn.__init__(self)

# start monitoring usb
monitor = USBMonitor()
nk_vid = f"{_VID_NITROKEY:04x}"
device_filter = (
{ID_VENDOR_ID: nk_vid.upper()},
{ID_VENDOR_ID: nk_vid.lower()},
{ID_VENDOR_ID: f"0x{nk_vid.upper()}"},
{ID_VENDOR_ID: f"0x{nk_vid.lower()}"},
{ID_VENDOR_ID: str(_VID_NITROKEY)},
)
monitor = USBMonitor(filter_devices=device_filter)
monitor.start_monitoring(
on_connect=self.detect_added_devices, on_disconnect=self.detect_removed_devices
)
Expand Down Expand Up @@ -165,6 +175,24 @@ def toggle_update_btn(self) -> None:
def detect_added_devices(
self, device_id: Optional[str] = None, device_info: Optional[Dict[str, str]] = None
) -> None:
interfaces = device_info.get(ID_USB_INTERFACES, ()) if device_info else ()
ccid_classes = ("0b0000", "class_0b", "0x0b", "IOUSBHostFamily.kext")
hid_classes = ("030000", "class_03", "0x03", "IOUSBHostFamily.kext")

filter_success = False
filter_class = ccid_classes if should_use_ccid() else hid_classes

for interface in interfaces:
if filter_success:
break
for f in filter_class:
if f in interface.lower():
filter_success = True
break

if not filter_success and interfaces:
return

# retry for up to 2secs
for _tries in range(8):
devs = self.device_manager.add()
Expand Down