mirror of
https://github.com/Yubico/yubioath-flutter.git
synced 2024-12-23 10:11:52 +03:00
Merge PR #1477
This commit is contained in:
commit
80f359e191
@ -62,11 +62,15 @@ def _is_admin():
|
|||||||
|
|
||||||
|
|
||||||
class ConnectionException(RpcException):
|
class ConnectionException(RpcException):
|
||||||
def __init__(self, connection, exc_type):
|
def __init__(self, device, connection, exc_type):
|
||||||
super().__init__(
|
super().__init__(
|
||||||
"connection-error",
|
"connection-error",
|
||||||
f"Error connecting to {connection} interface",
|
f"Error connecting to {connection} interface",
|
||||||
dict(connection=connection, exc_type=type(exc_type).__name__),
|
dict(
|
||||||
|
device=device,
|
||||||
|
connection=connection,
|
||||||
|
exc_type=type(exc_type).__name__,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -182,12 +186,22 @@ class DevicesNode(RpcNode):
|
|||||||
self._list_state = 0
|
self._list_state = 0
|
||||||
self._devices = {}
|
self._devices = {}
|
||||||
self._device_mapping = {}
|
self._device_mapping = {}
|
||||||
|
self._failing_connection = {}
|
||||||
|
self._retries = 0
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
with self._get_state:
|
with self._get_state:
|
||||||
try:
|
try:
|
||||||
return super().__call__(*args, **kwargs)
|
return super().__call__(*args, **kwargs)
|
||||||
except ConnectionException as e:
|
except ConnectionException as e:
|
||||||
|
if self._failing_connection == e.body:
|
||||||
|
self._retries += 1
|
||||||
|
else:
|
||||||
|
self._failing_connection = e.body
|
||||||
|
self._retries = 0
|
||||||
|
if self._retries > 2:
|
||||||
|
raise
|
||||||
|
logger.debug("Connection failed, attempt to recover", exc_info=True)
|
||||||
raise ChildResetException(f"{e}")
|
raise ChildResetException(f"{e}")
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
@ -295,7 +309,7 @@ class UsbDeviceNode(AbstractDeviceNode):
|
|||||||
return self._create_connection(SmartCardConnection)
|
return self._create_connection(SmartCardConnection)
|
||||||
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("ccid", e)
|
raise ConnectionException(self._device.fingerprint, "ccid", e)
|
||||||
|
|
||||||
@child(condition=lambda self: self._supports_connection(OtpConnection))
|
@child(condition=lambda self: self._supports_connection(OtpConnection))
|
||||||
def otp(self):
|
def otp(self):
|
||||||
@ -303,7 +317,7 @@ class UsbDeviceNode(AbstractDeviceNode):
|
|||||||
return self._create_connection(OtpConnection)
|
return self._create_connection(OtpConnection)
|
||||||
except (ValueError, OSError) as e:
|
except (ValueError, OSError) as e:
|
||||||
logger.warning("Error opening connection", exc_info=True)
|
logger.warning("Error opening connection", exc_info=True)
|
||||||
raise ConnectionException("otp", e)
|
raise ConnectionException(self._device.fingerprint, "otp", e)
|
||||||
|
|
||||||
@child(condition=lambda self: self._supports_connection(FidoConnection))
|
@child(condition=lambda self: self._supports_connection(FidoConnection))
|
||||||
def fido(self):
|
def fido(self):
|
||||||
@ -311,7 +325,7 @@ class UsbDeviceNode(AbstractDeviceNode):
|
|||||||
return self._create_connection(FidoConnection)
|
return self._create_connection(FidoConnection)
|
||||||
except (ValueError, OSError) as e:
|
except (ValueError, OSError) as e:
|
||||||
logger.warning("Error opening connection", exc_info=True)
|
logger.warning("Error opening connection", exc_info=True)
|
||||||
raise ConnectionException("fido", e)
|
raise ConnectionException(self._device.fingerprint, "fido", e)
|
||||||
|
|
||||||
|
|
||||||
class _ReaderObserver(CardObserver):
|
class _ReaderObserver(CardObserver):
|
||||||
@ -370,7 +384,7 @@ class ReaderDeviceNode(AbstractDeviceNode):
|
|||||||
return ConnectionNode(self._device, connection, info)
|
return ConnectionNode(self._device, connection, 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("ccid", e)
|
raise ConnectionException(self._device.fingerprint, "ccid", e)
|
||||||
|
|
||||||
@child
|
@child
|
||||||
def fido(self):
|
def fido(self):
|
||||||
@ -381,7 +395,7 @@ class ReaderDeviceNode(AbstractDeviceNode):
|
|||||||
return ConnectionNode(self._device, connection, info)
|
return ConnectionNode(self._device, connection, 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("fido", e)
|
raise ConnectionException(self._device.fingerprint, "fido", e)
|
||||||
|
|
||||||
|
|
||||||
class ConnectionNode(RpcNode):
|
class ConnectionNode(RpcNode):
|
||||||
|
Loading…
Reference in New Issue
Block a user