ui: Add support for starting/canceling key verifications.

This commit is contained in:
Damir Jelić 2019-05-15 11:51:33 +02:00
parent 6dc126d03c
commit a114b7b1a9
5 changed files with 155 additions and 42 deletions

View File

@ -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

View File

@ -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))

View File

@ -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(

View File

@ -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

View File

@ -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:
<arg type='aa{ss}' name='devices' direction='out'/>
</method>
<method name='StartKeyVerification'>
<arg type='s' name='pan_user' direction='in'/>
<arg type='s' name='user_id' direction='in'/>
<arg type='s' name='device_id' direction='in'/>
<arg type='u' name='id' direction='out'/>
</method>
<method name='CancelKeyVerification'>
<arg type='s' name='pan_user' direction='in'/>
<arg type='s' name='user_id' direction='in'/>
<arg type='s' name='device_id' direction='in'/>
<arg type='u' name='id' direction='out'/>
</method>
<method name='AcceptKeyVerification'>
<arg type='s' name='pan_user' direction='in'/>
<arg type='s' name='user_id' direction='in'/>
@ -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