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