diff --git a/pantalaimon/client.py b/pantalaimon/client.py index f68a3f0..486fbb9 100644 --- a/pantalaimon/client.py +++ b/pantalaimon/client.py @@ -193,6 +193,25 @@ class PanClient(AsyncClient): self.task = task return task + async def start_sas(self, message, device): + try: + await self.start_key_verification(device) + await self.send_message( + DaemonResponse( + message.message_id, + self.user_id, + "m.ok", + "Successfully started the key verification request" + )) + except ClientConnectionError as e: + await self.send_message( + DaemonResponse( + message.message_id, + self.user_id, + "m.connection_error", + e + )) + async def accept_sas(self, message): user_id = message.user_id device_id = message.device_id @@ -237,6 +256,43 @@ class PanClient(AsyncClient): e )) + async def cancel_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_message( + DaemonResponse( + message.message_id, + self.user_id, + Sas._txid_error[0], + Sas._txid_error[1] + ) + + ) + return + + try: + await self.cancel_key_verification(sas.transaction_id) + await self.send_message( + DaemonResponse( + message.message_id, + self.user_id, + "m.ok", + "Successfully canceled the key verification request" + )) + except ClientConnectionError as e: + await self.send_message( + DaemonResponse( + message.message_id, + self.user_id, + "m.connection_error", + 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 4e3af51..536047b 100755 --- a/pantalaimon/daemon.py +++ b/pantalaimon/daemon.py @@ -18,11 +18,12 @@ from pantalaimon.client import PanClient from pantalaimon.log import logger from pantalaimon.store import ClientInfo, PanStore from pantalaimon.thread_messages import (AcceptSasMessage, DaemonResponse, - DeviceConfirmSasMessage, + ConfirmSasMessage, DeviceUnverifyMessage, DeviceVerifyMessage, ExportKeysMessage, ImportKeysMessage, - SasMessage) + SasMessage, StartSasMessage, + CancelSasMessage) @attr.s @@ -121,7 +122,7 @@ class ProxyDaemon: if isinstance( message, - (DeviceVerifyMessage, DeviceUnverifyMessage) + (DeviceVerifyMessage, DeviceUnverifyMessage, StartSasMessage) ): device = client.device_store[message.user_id].get( @@ -145,12 +146,16 @@ class ProxyDaemon: await self._verify_device(message.message_id, client, device) elif isinstance(message, DeviceUnverifyMessage): await self._unverify_device(message.message_id, client, device) + elif isinstance(message, StartSasMessage): + await client.start_sas(message, device) elif isinstance(message, SasMessage): if isinstance(message, AcceptSasMessage): await client.accept_sas(message) - elif isinstance(message, DeviceConfirmSasMessage): + elif isinstance(message, ConfirmSasMessage): await client.confirm_sas(message) + elif isinstance(message, CancelSasMessage): + await client.cancel_sas(message) elif isinstance(message, ExportKeysMessage): path = os.path.abspath(os.path.expanduser(message.file_path)) diff --git a/pantalaimon/panctl.py b/pantalaimon/panctl.py index a2e92d7..b96ee2c 100644 --- a/pantalaimon/panctl.py +++ b/pantalaimon/panctl.py @@ -50,6 +50,11 @@ class PanctlParser(): start.add_argument("user_id", type=str) start.add_argument("device_id", type=str) + cancel = subparsers.add_parser("cancel-verification") + cancel.add_argument("pan_user", type=str) + cancel.add_argument("user_id", type=str) + cancel.add_argument("device_id", type=str) + accept = subparsers.add_parser("accept-verification") accept.add_argument("pan_user", type=str) accept.add_argument("user_id", type=str) @@ -262,6 +267,7 @@ class PanCtl: "verify-device", "unverify-device", "start-verification", + "cancel-verification", "accept-verification", "confirm-verification" ] @@ -412,6 +418,22 @@ class PanCtl: elif command == "list-devices": self.list_devices(args) + elif command == "start-verification": + self.own_message_ids.append( + self.devices.StartKeyVerification( + args.pan_user, + args.user_id, + args.device_id + )) + + elif command == "cancel-verification": + self.own_message_ids.append( + self.devices.CancelKeyVerification( + args.pan_user, + args.user_id, + args.device_id + )) + elif command == "accept-verification": self.own_message_ids.append( self.devices.AcceptKeyVerification( diff --git a/pantalaimon/thread_messages.py b/pantalaimon/thread_messages.py index 48f21bc..c19c2f6 100644 --- a/pantalaimon/thread_messages.py +++ b/pantalaimon/thread_messages.py @@ -62,7 +62,17 @@ class SasMessage(_VerificationMessage): @attr.s -class DeviceConfirmSasMessage(SasMessage): +class StartSasMessage(SasMessage): + pass + + +@attr.s +class CancelSasMessage(SasMessage): + pass + + +@attr.s +class ConfirmSasMessage(SasMessage): pass @@ -79,11 +89,6 @@ class _SasSignal: transaction_id = attr.ib() -@attr.s -class StartSasSignal(_SasSignal): - pass - - @attr.s class InviteSasSignal(_SasSignal): pass diff --git a/pantalaimon/ui.py b/pantalaimon/ui.py index 33a98e4..c60c587 100644 --- a/pantalaimon/ui.py +++ b/pantalaimon/ui.py @@ -9,12 +9,13 @@ from pydbus.generic import signal from pantalaimon.log import logger from pantalaimon.store import PanStore from pantalaimon.thread_messages import (AcceptSasMessage, DaemonResponse, - DeviceConfirmSasMessage, + ConfirmSasMessage, DevicesMessage, DeviceUnverifyMessage, DeviceVerifyMessage, ExportKeysMessage, ImportKeysMessage, InviteSasSignal, SasDoneSignal, - ShowSasSignal) + ShowSasSignal, StartSasMessage, + CancelSasMessage) class IdCounter: @@ -111,6 +112,20 @@ class Devices: + + + + + + + + + + + + + + @@ -202,41 +217,51 @@ class Devices: def Verify(self, pan_user, user_id, device_id): message = DeviceVerifyMessage( - pan_user, - user_id, - device_id - ) - self.queue.put(message) - return - - def UnVerify(self, pan_user, user_id, device_id): - message = DeviceUnverifyMessage( - pan_user, - user_id, - device_id - ) - self.queue.put(message) - return - - def StartSas(self, pan_user, user_id, device_id): - device_store = self.device_list.get(pan_user) - - if not device_store: - logger.info(f"Not verifying device, no store found for user " - f"{user_id}") - return - - logger.info(f"Verifying device {user_id} {device_id}") - return - - def ConfirmKeyVerification(self, pan_user, user_id, device_id): - message = DeviceConfirmSasMessage( self.message_id, pan_user, user_id, device_id ) - print("HEEEELOOO {}".format(message.message_id)) + self.queue.put(message) + return message.message_id + + def UnVerify(self, pan_user, user_id, device_id): + message = DeviceUnverifyMessage( + self.message_id, + pan_user, + user_id, + device_id + ) + self.queue.put(message) + return message.message_id + + def StartKeyVerification(self, pan_user, user_id, device_id): + message = StartSasMessage( + self.message_id, + pan_user, + user_id, + device_id + ) + self.queue.put(message) + return message.message_id + + def CancelKeyVerification(self, pan_user, user_id, device_id): + message = CancelSasMessage( + self.message_id, + pan_user, + user_id, + device_id + ) + self.queue.put(message) + return message.message_id + + def ConfirmKeyVerification(self, pan_user, user_id, device_id): + message = ConfirmSasMessage( + self.message_id, + pan_user, + user_id, + device_id + ) self.queue.put(message) return message.message_id