server: More SAS work.
This commit is contained in:
parent
ed1b16a4e2
commit
c32a9e34e6
1 changed files with 78 additions and 50 deletions
128
matrix/server.py
128
matrix/server.py
|
@ -70,7 +70,8 @@ from nio import (
|
||||||
KeyVerificationStart,
|
KeyVerificationStart,
|
||||||
KeyVerificationCancel,
|
KeyVerificationCancel,
|
||||||
KeyVerificationKey,
|
KeyVerificationKey,
|
||||||
KeyVerificationMac
|
KeyVerificationMac,
|
||||||
|
KeyVerificationEvent
|
||||||
)
|
)
|
||||||
|
|
||||||
from . import globals as G
|
from . import globals as G
|
||||||
|
@ -368,6 +369,55 @@ class MatrixServer(object):
|
||||||
self.get_session_path(),
|
self.get_session_path(),
|
||||||
extra_path=extra_path
|
extra_path=extra_path
|
||||||
)
|
)
|
||||||
|
self.client.add_to_device_callback(
|
||||||
|
self.key_verification_cb,
|
||||||
|
KeyVerificationEvent
|
||||||
|
)
|
||||||
|
|
||||||
|
def key_verification_cb(self, event):
|
||||||
|
# TODO don't accept the verification automatically.
|
||||||
|
if isinstance(event, KeyVerificationStart):
|
||||||
|
self.info_highlight("{} via {} has started a key verification "
|
||||||
|
"process.".format(
|
||||||
|
event.sender,
|
||||||
|
event.from_device
|
||||||
|
))
|
||||||
|
try:
|
||||||
|
self.accept_key_verification(event)
|
||||||
|
except LocalProtocolError as e:
|
||||||
|
self.info(e)
|
||||||
|
|
||||||
|
elif isinstance(event, KeyVerificationKey):
|
||||||
|
sas = self.client.key_verifications.get(event.transaction_id, None)
|
||||||
|
if not sas:
|
||||||
|
return
|
||||||
|
|
||||||
|
emoji = sas.get_emoji()
|
||||||
|
|
||||||
|
emojies = [x[0] for x in emoji]
|
||||||
|
descriptions = [x[1] for x in emoji]
|
||||||
|
device = sas.other_olm_device
|
||||||
|
|
||||||
|
emoji_str = u"{:^10}{:^10}{:^10}{:^10}{:^10}{:^10}{:^10}".format(
|
||||||
|
*emojies
|
||||||
|
)
|
||||||
|
desc = u"{:^11}{:^11}{:^11}{:^11}{:^11}{:^11}{:^11}".format(
|
||||||
|
*descriptions
|
||||||
|
)
|
||||||
|
short_string = u"\n".join([emoji_str, desc])
|
||||||
|
|
||||||
|
self.info_highlight(u"Short authentication string for {} via {}:\n"
|
||||||
|
u"{}".format(
|
||||||
|
device.user_id,
|
||||||
|
device.id,
|
||||||
|
short_string
|
||||||
|
))
|
||||||
|
|
||||||
|
elif isinstance(event, KeyVerificationMac):
|
||||||
|
try:
|
||||||
|
self.accept_short_auth_string(event.transaction_id)
|
||||||
|
except LocalProtocolError as e:
|
||||||
|
self.info(e)
|
||||||
|
|
||||||
def update_option(self, option, option_name):
|
def update_option(self, option, option_name):
|
||||||
if option_name == "address":
|
if option_name == "address":
|
||||||
|
@ -472,6 +522,14 @@ class MatrixServer(object):
|
||||||
# type: (MatrixServer) -> None
|
# type: (MatrixServer) -> None
|
||||||
self.send_buffer = b""
|
self.send_buffer = b""
|
||||||
|
|
||||||
|
def info_highlight(self, message):
|
||||||
|
buf = ""
|
||||||
|
if self.server_buffer:
|
||||||
|
buf = self.server_buffer
|
||||||
|
|
||||||
|
msg = "{}{}: {}".format(W.prefix("network"), SCRIPT_NAME, message)
|
||||||
|
W.prnt_date_tags(buf, 0, "notify_highlight", msg)
|
||||||
|
|
||||||
def info(self, message):
|
def info(self, message):
|
||||||
buf = ""
|
buf = ""
|
||||||
if self.server_buffer:
|
if self.server_buffer:
|
||||||
|
@ -1211,26 +1269,16 @@ class MatrixServer(object):
|
||||||
room_buffer.replace_undecrypted_line(event)
|
room_buffer.replace_undecrypted_line(event)
|
||||||
|
|
||||||
def accept_key_verification(self, event):
|
def accept_key_verification(self, event):
|
||||||
_, request = self.client.accept_key_verification(event)
|
_, request = self.client.accept_key_verification(event.transaction_id)
|
||||||
self.send_or_queue(request)
|
self.send(request)
|
||||||
|
|
||||||
def send_key_verification_key(self, sas):
|
def to_device(self, message):
|
||||||
_, request = self.client.to_device(
|
_, request = self.client.to_device(message)
|
||||||
"m.key.verification.key",
|
self.send(request)
|
||||||
sas.share_key(),
|
|
||||||
sas.other_user,
|
|
||||||
sas.other_device,
|
|
||||||
)
|
|
||||||
self.send_or_queue(request)
|
|
||||||
|
|
||||||
def send_key_verification_mac(self, sas):
|
def accept_short_auth_string(self, transaction_id):
|
||||||
_, request = self.client.to_device(
|
_, request = self.client.accept_short_auth_string(transaction_id)
|
||||||
"m.key.verification.mac",
|
self.send(request)
|
||||||
sas.get_mac(),
|
|
||||||
sas.other_user,
|
|
||||||
sas.other_device,
|
|
||||||
)
|
|
||||||
self.send_or_queue(request)
|
|
||||||
|
|
||||||
def _handle_sync(self, response):
|
def _handle_sync(self, response):
|
||||||
# we got the same batch again, nothing to do
|
# we got the same batch again, nothing to do
|
||||||
|
@ -1255,37 +1303,6 @@ class MatrixServer(object):
|
||||||
# TODO try to decrypt some cached undecrypted messages with the
|
# TODO try to decrypt some cached undecrypted messages with the
|
||||||
# new key
|
# new key
|
||||||
# self.decrypt_printed_messages(event)
|
# self.decrypt_printed_messages(event)
|
||||||
elif isinstance(event, KeyVerificationStart):
|
|
||||||
self.accept_key_verification(event)
|
|
||||||
# print(event)
|
|
||||||
|
|
||||||
elif isinstance(event, KeyVerificationCancel):
|
|
||||||
print(event)
|
|
||||||
|
|
||||||
elif isinstance(event, KeyVerificationMac):
|
|
||||||
sas = self.client.active_key_verifications.get(
|
|
||||||
event.transaction_id, None
|
|
||||||
)
|
|
||||||
|
|
||||||
if sas:
|
|
||||||
self.send_key_verification_mac(sas)
|
|
||||||
else:
|
|
||||||
print("NO SAS??")
|
|
||||||
print(event)
|
|
||||||
|
|
||||||
elif isinstance(event, KeyVerificationKey):
|
|
||||||
sas = self.client.active_key_verifications.get(
|
|
||||||
event.transaction_id, None
|
|
||||||
)
|
|
||||||
|
|
||||||
if sas:
|
|
||||||
emoji = sas.get_emoji()
|
|
||||||
self.info(" ".join(emoji))
|
|
||||||
self.send_key_verification_key(sas)
|
|
||||||
else:
|
|
||||||
print("NO SAS??")
|
|
||||||
print(event)
|
|
||||||
|
|
||||||
|
|
||||||
# Full sync response handle everything.
|
# Full sync response handle everything.
|
||||||
if isinstance(response, SyncResponse):
|
if isinstance(response, SyncResponse):
|
||||||
|
@ -1701,6 +1718,17 @@ def matrix_timer_cb(server_name, remaining_calls):
|
||||||
server.disconnect()
|
server.disconnect()
|
||||||
return W.WEECHAT_RC_OK
|
return W.WEECHAT_RC_OK
|
||||||
|
|
||||||
|
sent_to_device = []
|
||||||
|
|
||||||
|
for i, message in enumerate(server.client.outgoing_to_device_messages):
|
||||||
|
if i >= 5:
|
||||||
|
break
|
||||||
|
server.to_device(message)
|
||||||
|
sent_to_device.append(message)
|
||||||
|
|
||||||
|
for message in sent_to_device:
|
||||||
|
server.client.mark_to_device_message_as_sent(message)
|
||||||
|
|
||||||
if server.sync_time and current_time > server.sync_time:
|
if server.sync_time and current_time > server.sync_time:
|
||||||
timeout = 0 if server.transport_type == TransportType.HTTP else 30000
|
timeout = 0 if server.transport_type == TransportType.HTTP else 30000
|
||||||
sync_filter = {
|
sync_filter = {
|
||||||
|
|
Loading…
Reference in a new issue