From 840e568eacf72dd3f1862a76054f80ef880f657b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 10 May 2019 11:21:54 +0200 Subject: [PATCH] client: Don't accept a SAS automatically. --- pantalaimon/client.py | 26 +++++++++++++++++++++++++- pantalaimon/daemon.py | 5 ++++- pantalaimon/panctl.py | 10 +++++++++- pantalaimon/thread_messages.py | 10 ++++++++++ pantalaimon/ui.py | 8 ++++++++ 5 files changed, 56 insertions(+), 3 deletions(-) diff --git a/pantalaimon/client.py b/pantalaimon/client.py index 9a28266..dabc36a 100644 --- a/pantalaimon/client.py +++ b/pantalaimon/client.py @@ -122,8 +122,17 @@ class PanClient(AsyncClient): loop = asyncio.get_event_loop() if isinstance(event, KeyVerificationStart): + logger.info(f"{event.sender} via {event.from_device} has started " + f"a key verification process.") + + message = DeviceStartSasMessage( + self.user_id, + event.sender, + event.from_device + ) + task = loop.create_task( - self.accept_key_verification(event.transaction_id) + self.queue.put(message) ) self.key_verificatins_tasks.append(task) @@ -183,6 +192,21 @@ class PanClient(AsyncClient): self.task = task return task + async def accept_sas(self, message): + user_id = message.user_id + device_id = message.device_id + + sas = self.get_active_sas(user_id, device_id) + + if not sas: + await self.send_info("No such verification process found.") + return + + try: + await self.accept_key_verification(sas.transaction_id) + except (LocalProtocolError, ClientConnectionError) as e: + await self.send_info(f"Error accepting key verification: {e}") + async def confirm_sas(self, message): user_id = message.user_id device_id = message.device_id diff --git a/pantalaimon/daemon.py b/pantalaimon/daemon.py index a1f737a..b1a320a 100755 --- a/pantalaimon/daemon.py +++ b/pantalaimon/daemon.py @@ -24,6 +24,7 @@ from pantalaimon.thread_messages import ( ExportKeysMessage, ImportKeysMessage, DeviceConfirmSasMessage, + DeviceAcceptSasMessage, InfoMessage ) @@ -125,7 +126,7 @@ class ProxyDaemon: if isinstance( message, (DeviceVerifyMessage, DeviceUnverifyMessage, - DeviceConfirmSasMessage) + DeviceConfirmSasMessage, DeviceAcceptSasMessage) ): device = client.device_store[message.user_id].get( @@ -144,6 +145,8 @@ class ProxyDaemon: await self._verify_device(client, device) elif isinstance(message, DeviceUnverifyMessage): await self._unverify_device(client, device) + elif isinstance(message, DeviceAcceptSasMessage): + await client.accept_sas(message) elif isinstance(message, DeviceConfirmSasMessage): await client.confirm_sas(message) diff --git a/pantalaimon/panctl.py b/pantalaimon/panctl.py index 5963bf7..06502dd 100644 --- a/pantalaimon/panctl.py +++ b/pantalaimon/panctl.py @@ -384,6 +384,14 @@ class PanCtl: dbus_interface="org.pantalaimon.devices" ) + def accept_sas(self, args): + self.devices.accept_sas( + args.pan_user, + args.user_id, + args.device_id, + dbus_interface="org.pantalaimon.devices" + ) + def list_devices(self, args): devices = self.devices.list_user_devices( args.pan_user, @@ -439,7 +447,7 @@ class PanCtl: self.import_keys(parsed_args) elif command == "accept-verification": - pass + self.accept_sas(parsed_args) elif command == "list-devices": self.list_devices(parsed_args) diff --git a/pantalaimon/thread_messages.py b/pantalaimon/thread_messages.py index 2c5dbf5..f4c4d51 100644 --- a/pantalaimon/thread_messages.py +++ b/pantalaimon/thread_messages.py @@ -51,6 +51,16 @@ class DeviceUnverifyMessage(_VerificationMessage): pass +@attr.s +class DeviceStartSasMessage(_VerificationMessage): + pass + + +@attr.s +class DeviceAcceptSasMessage(_VerificationMessage): + pass + + @attr.s class DeviceConfirmSasMessage(_VerificationMessage): pass diff --git a/pantalaimon/ui.py b/pantalaimon/ui.py index 397f968..2e92620 100644 --- a/pantalaimon/ui.py +++ b/pantalaimon/ui.py @@ -16,6 +16,7 @@ from pantalaimon.thread_messages import ( DeviceUnverifyMessage, DevicesMessage, InfoMessage, + DeviceAcceptSasMessage, DeviceConfirmSasMessage, DeviceAuthStringMessage, ImportKeysMessage, @@ -113,6 +114,13 @@ class Devices(dbus.service.Object): self.queue.put(message) return + @dbus.service.method("org.pantalaimon.devices", + in_signature="sss") + def accept_sas(self, pan_user, user_id, device_id): + message = DeviceAcceptSasMessage(pan_user, user_id, device_id) + self.queue.put(message) + return + def update_devices(self, message): device_store = self.device_list[message.user_id]