mirror of
https://github.com/Yubico/yubioath-flutter.git
synced 2024-11-22 00:12:09 +03:00
Refactor DeviceInfo caching
This commit is contained in:
parent
5a24f57e0b
commit
d8e9cf34c9
@ -271,9 +271,13 @@ class AbstractDeviceNode(RpcNode):
|
|||||||
try:
|
try:
|
||||||
response = super().__call__(*args, **kwargs)
|
response = super().__call__(*args, **kwargs)
|
||||||
if "device_info" in response.flags:
|
if "device_info" in response.flags:
|
||||||
# Clear DeviceInfo cache
|
old_info = self._info
|
||||||
self._info = None
|
# Refresh data, and close any open child
|
||||||
self._data = None
|
self._close_child()
|
||||||
|
self._data = self._refresh_data()
|
||||||
|
if old_info == self._info:
|
||||||
|
# No change to DeviceInfo, further propagation not needed.
|
||||||
|
response.flags.remove("device_info")
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -318,9 +322,17 @@ class UsbDeviceNode(AbstractDeviceNode):
|
|||||||
|
|
||||||
def _create_connection(self, conn_type):
|
def _create_connection(self, conn_type):
|
||||||
connection = self._device.open_connection(conn_type)
|
connection = self._device.open_connection(conn_type)
|
||||||
|
self._data = self._read_data(connection)
|
||||||
return ConnectionNode(self._device, connection, self._info)
|
return ConnectionNode(self._device, connection, self._info)
|
||||||
|
|
||||||
def _refresh_data(self):
|
def _refresh_data(self):
|
||||||
|
# Re-use existing connection if possible
|
||||||
|
if self._child and not self._child.closed:
|
||||||
|
# Make sure to close any open session
|
||||||
|
self._child._close_child()
|
||||||
|
return self._read_data(self._child._connection)
|
||||||
|
|
||||||
|
# New connection
|
||||||
for conn_type in (SmartCardConnection, OtpConnection, FidoConnection):
|
for conn_type in (SmartCardConnection, OtpConnection, FidoConnection):
|
||||||
if self._supports_connection(conn_type):
|
if self._supports_connection(conn_type):
|
||||||
try:
|
try:
|
||||||
@ -398,6 +410,9 @@ class ReaderDeviceNode(AbstractDeviceNode):
|
|||||||
self._data = None
|
self._data = None
|
||||||
return super().get_data()
|
return super().get_data()
|
||||||
|
|
||||||
|
def _read_data(self, conn):
|
||||||
|
return dict(super()._read_data(conn), present=True)
|
||||||
|
|
||||||
def _refresh_data(self):
|
def _refresh_data(self):
|
||||||
card = self._observer.card
|
card = self._observer.card
|
||||||
if card is None:
|
if card is None:
|
||||||
@ -405,7 +420,7 @@ class ReaderDeviceNode(AbstractDeviceNode):
|
|||||||
try:
|
try:
|
||||||
with self._device.open_connection(SmartCardConnection) as conn:
|
with self._device.open_connection(SmartCardConnection) as conn:
|
||||||
try:
|
try:
|
||||||
data = dict(self._read_data(conn), present=True)
|
data = self._read_data(conn)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
# Unknown device, maybe NFC restricted
|
# Unknown device, maybe NFC restricted
|
||||||
try:
|
try:
|
||||||
@ -434,8 +449,8 @@ class ReaderDeviceNode(AbstractDeviceNode):
|
|||||||
def ccid(self):
|
def ccid(self):
|
||||||
try:
|
try:
|
||||||
connection = self._device.open_connection(SmartCardConnection)
|
connection = self._device.open_connection(SmartCardConnection)
|
||||||
info = read_info(connection)
|
self._data = self._read_data(connection)
|
||||||
return ScpConnectionNode(self._device, connection, info)
|
return ScpConnectionNode(self._device, connection, self._info)
|
||||||
except (ValueError, SmartcardException, EstablishContextException) as e:
|
except (ValueError, SmartcardException, EstablishContextException) as e:
|
||||||
logger.warning("Error opening connection", exc_info=True)
|
logger.warning("Error opening connection", exc_info=True)
|
||||||
raise ConnectionException(self._device.fingerprint, "ccid", e)
|
raise ConnectionException(self._device.fingerprint, "ccid", e)
|
||||||
@ -444,9 +459,9 @@ class ReaderDeviceNode(AbstractDeviceNode):
|
|||||||
def fido(self):
|
def fido(self):
|
||||||
try:
|
try:
|
||||||
with self._device.open_connection(SmartCardConnection) as conn:
|
with self._device.open_connection(SmartCardConnection) as conn:
|
||||||
info = read_info(conn)
|
self._data = self._read_data(conn)
|
||||||
connection = self._device.open_connection(FidoConnection)
|
connection = self._device.open_connection(FidoConnection)
|
||||||
return ConnectionNode(self._device, connection, info)
|
return ConnectionNode(self._device, connection, self._info)
|
||||||
except (ValueError, SmartcardException, EstablishContextException) as e:
|
except (ValueError, SmartcardException, EstablishContextException) as e:
|
||||||
logger.warning("Error opening connection", exc_info=True)
|
logger.warning("Error opening connection", exc_info=True)
|
||||||
raise ConnectionException(self._device.fingerprint, "fido", e)
|
raise ConnectionException(self._device.fingerprint, "fido", e)
|
||||||
@ -458,24 +473,11 @@ class ConnectionNode(RpcNode):
|
|||||||
self._device = device
|
self._device = device
|
||||||
self._transport = device.transport
|
self._transport = device.transport
|
||||||
self._connection = connection
|
self._connection = connection
|
||||||
self._info = info or read_info(self._connection, device.pid)
|
self._info = info
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
response = super().__call__(*args, **kwargs)
|
return super().__call__(*args, **kwargs)
|
||||||
if "device_info" in response.flags:
|
|
||||||
# Refresh DeviceInfo
|
|
||||||
info = read_info(self._connection, self._device.pid)
|
|
||||||
if self._info != info:
|
|
||||||
self._info = info
|
|
||||||
# Make sure any child node is re-opened after this,
|
|
||||||
# as enabled applications may have changed
|
|
||||||
self.close()
|
|
||||||
else:
|
|
||||||
# No change to DeviceInfo, further propagation not needed.
|
|
||||||
response.flags.remove("device_info")
|
|
||||||
|
|
||||||
return response
|
|
||||||
except (SmartcardException, OSError) as e:
|
except (SmartcardException, OSError) as e:
|
||||||
logger.exception("Connection error")
|
logger.exception("Connection error")
|
||||||
raise ChildResetException(f"{e}")
|
raise ChildResetException(f"{e}")
|
||||||
@ -504,11 +506,6 @@ class ConnectionNode(RpcNode):
|
|||||||
logger.warning("Error closing connection", exc_info=True)
|
logger.warning("Error closing connection", exc_info=True)
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
if (
|
|
||||||
isinstance(self._connection, SmartCardConnection)
|
|
||||||
or self._transport == TRANSPORT.USB
|
|
||||||
):
|
|
||||||
self._info = read_info(self._connection, self._device.pid)
|
|
||||||
return dict(version=self._info.version, serial=self._info.serial)
|
return dict(version=self._info.version, serial=self._info.serial)
|
||||||
|
|
||||||
def _init_child_node(self, child_cls, capability=CAPABILITY(0)):
|
def _init_child_node(self, child_cls, capability=CAPABILITY(0)):
|
||||||
|
Loading…
Reference in New Issue
Block a user