buffer: Print out a warning prefix if the event was encrypted but not verified.

This commit is contained in:
Damir Jelić 2018-09-24 15:27:39 +02:00
parent 8a73f2c119
commit 6cf275e871
2 changed files with 60 additions and 27 deletions

View file

@ -102,6 +102,10 @@ def matrix_bar_item_buffer_modes(data, item, window, buffer, extra_info):
if room.encrypted: if room.encrypted:
modes.append("🔐") modes.append("🔐")
if (server.client
and server.client.room_contains_unverified(room.room_id)):
modes.append("⚠️ ")
if room_buffer.backlog_pending: if room_buffer.backlog_pending:
modes.append("") modes.append("")

View file

@ -38,7 +38,8 @@ from nio import (
RoomMessageUnknown, RoomMessageUnknown,
RoomNameEvent, RoomNameEvent,
RoomTopicEvent, RoomTopicEvent,
MegolmEvent MegolmEvent,
Event
) )
from . import globals as G from . import globals as G
@ -471,11 +472,12 @@ class WeechatChannelBuffer(object):
# A message from a non joined user # A message from a non joined user
return WeechatUser(nick) return WeechatUser(nick)
def _print_message(self, user, message, date, tags): def _print_message(self, user, message, date, tags, extra_prefix=""):
prefix_string = ( prefix_string = (
"" extra_prefix
if not user.prefix if not user.prefix
else "{}{}{}".format( else "{}{}{}{}".format(
extra_prefix,
W.color(self._get_prefix_color(user.prefix)), W.color(self._get_prefix_color(user.prefix)),
user.prefix, user.prefix,
W.color("reset"), W.color("reset"),
@ -492,18 +494,18 @@ class WeechatChannelBuffer(object):
self.print_date_tags(data, date, tags) self.print_date_tags(data, date, tags)
def message(self, nick, message, date, extra_tags=None): def message(self, nick, message, date, extra_tags=None, extra_prefix=""):
# type: (str, str, int, List[str]) -> None # type: (str, str, int, List[str], str) -> None
user = self._get_user(nick) user = self._get_user(nick)
tags_type = "message_private" if self.type == "private" else "message" tags_type = "message_private" if self.type == "private" else "message"
tags = self._message_tags(user, tags_type) + (extra_tags or []) tags = self._message_tags(user, tags_type) + (extra_tags or [])
self._print_message(user, message, date, tags) self._print_message(user, message, date, tags, extra_prefix)
user.update_speaking_time(date) user.update_speaking_time(date)
self.unmask_smart_filtered_nick(nick) self.unmask_smart_filtered_nick(nick)
def notice(self, nick, message, date, extra_tags=None): def notice(self, nick, message, date, extra_tags=None, extra_prefix=""):
# type: (str, str, int, Optional[List[str]]) -> None # type: (str, str, int, Optional[List[str]], str) -> None
user = self._get_user(nick) user = self._get_user(nick)
user_prefix = ( user_prefix = (
"" ""
@ -520,10 +522,11 @@ class WeechatChannelBuffer(object):
) )
data = ( data = (
"{prefix}{color}Notice" "{extra_prefix}{prefix}{color}Notice"
"{del_color}({ncolor}{user}{del_color}){ncolor}" "{del_color}({ncolor}{user}{del_color}){ncolor}"
": {message}" ": {message}"
).format( ).format(
extra_prefix=extra_prefix,
prefix=W.prefix("network"), prefix=W.prefix("network"),
color=W.color("irc.color.notice"), color=W.color("irc.color.notice"),
del_color=W.color("chat_delimiters"), del_color=W.color("chat_delimiters"),
@ -538,7 +541,7 @@ class WeechatChannelBuffer(object):
user.update_speaking_time(date) user.update_speaking_time(date)
self.unmask_smart_filtered_nick(nick) self.unmask_smart_filtered_nick(nick)
def _print_action(self, user, message, date, tags): def _print_action(self, user, message, date, tags, extra_prefix):
nick_prefix = ( nick_prefix = (
"" ""
if not user.prefix if not user.prefix
@ -550,8 +553,9 @@ class WeechatChannelBuffer(object):
) )
data = ( data = (
"{prefix}{nick_prefix}{nick_color}{author}" "{ncolor} {msg}" "{extra_prefix}{prefix}{nick_prefix}{nick_color}{author}"
).format( "{ncolor} {msg}").format(
extra_prefix=extra_prefix,
prefix=W.prefix("action"), prefix=W.prefix("action"),
nick_prefix=nick_prefix, nick_prefix=nick_prefix,
nick_color=W.color(user.color), nick_color=W.color(user.color),
@ -562,12 +566,12 @@ class WeechatChannelBuffer(object):
self.print_date_tags(data, date, tags) self.print_date_tags(data, date, tags)
def action(self, nick, message, date, extra_tags=None): def action(self, nick, message, date, extra_tags=None, extra_prefix=""):
# type: (str, str, int, Optional[List[str]]) -> None # type: (str, str, int, Optional[List[str]], str) -> None
user = self._get_user(nick) user = self._get_user(nick)
tags_type = "action_private" if self.type == "private" else "action" tags_type = "action_private" if self.type == "private" else "action"
tags = self._message_tags(user, tags_type) + (extra_tags or []) tags = self._message_tags(user, tags_type) + (extra_tags or [])
self._print_action(user, message, date, tags) self._print_action(user, message, date, tags, extra_prefix)
user.update_speaking_time(date) user.update_speaking_time(date)
self.unmask_smart_filtered_nick(nick) self.unmask_smart_filtered_nick(nick)
@ -807,6 +811,10 @@ class RoomBuffer(object):
self._backlog_pending = value self._backlog_pending = value
W.bar_item_update("buffer_modes") W.bar_item_update("buffer_modes")
@property
def warning_prefix(self):
return "⚠️ "
def find_nick(self, user_id): def find_nick(self, user_id):
# type: (str) -> str # type: (str) -> str
"""Find a suitable nick from a user_id""" """Find a suitable nick from a user_id"""
@ -1006,7 +1014,12 @@ class RoomBuffer(object):
@staticmethod @staticmethod
def get_event_tags(event): def get_event_tags(event):
return ["matrix_id_{}".format(event.event_id)] # type: (Event) -> List[str]
tags = [SCRIPT_NAME + "_id_{}".format(event.event_id)]
if event.sender_key:
tags.append(SCRIPT_NAME + "_senderkey_{}".format(event.sender_key))
return tags
def _handle_power_level(self, _): def _handle_power_level(self, _):
for user_id in self.room.power_levels.users: for user_id in self.room.power_levels.users:
@ -1067,8 +1080,13 @@ class RoomBuffer(object):
elif isinstance(event, RoomMessageEmote): elif isinstance(event, RoomMessageEmote):
nick = self.find_nick(event.sender) nick = self.find_nick(event.sender)
date = server_ts_to_weechat(event.server_timestamp) date = server_ts_to_weechat(event.server_timestamp)
extra_prefix = (self.warning_prefix if event.decrypted
and not event.verified else "")
self.weechat_buffer.action( self.weechat_buffer.action(
nick, event.body, date, self.get_event_tags(event) nick, event.body, date, self.get_event_tags(event),
extra_prefix
) )
elif isinstance(event, RoomMessageText): elif isinstance(event, RoomMessageText):
@ -1080,16 +1098,23 @@ class RoomBuffer(object):
data = formatted.to_weechat() if formatted else event.body data = formatted.to_weechat() if formatted else event.body
extra_prefix = (self.warning_prefix if event.decrypted
and not event.verified else "")
date = server_ts_to_weechat(event.server_timestamp) date = server_ts_to_weechat(event.server_timestamp)
self.weechat_buffer.message( self.weechat_buffer.message(
nick, data, date, self.get_event_tags(event) nick, data, date, self.get_event_tags(event), extra_prefix
) )
elif isinstance(event, RoomMessageNotice): elif isinstance(event, RoomMessageNotice):
nick = self.find_nick(event.sender) nick = self.find_nick(event.sender)
date = server_ts_to_weechat(event.server_timestamp) date = server_ts_to_weechat(event.server_timestamp)
extra_prefix = (self.warning_prefix if event.decrypted
and not event.verified else "")
self.weechat_buffer.notice( self.weechat_buffer.notice(
nick, event.body, date, self.get_event_tags(event) nick, event.body, date, self.get_event_tags(event),
extra_prefix
) )
elif isinstance(event, RoomMessageMedia): elif isinstance(event, RoomMessageMedia):
@ -1101,16 +1126,22 @@ class RoomBuffer(object):
description = "/{}".format(event.body) if event.body else "" description = "/{}".format(event.body) if event.body else ""
data = "{url}{desc}".format(url=url, desc=description) data = "{url}{desc}".format(url=url, desc=description)
extra_prefix = (self.warning_prefix if event.decrypted
and not event.verified else "")
self.weechat_buffer.message( self.weechat_buffer.message(
nick, data, date, self.get_event_tags(event) nick, data, date, self.get_event_tags(event), extra_prefix
) )
elif isinstance(event, RoomMessageUnknown): elif isinstance(event, RoomMessageUnknown):
nick = self.find_nick(event.sender) nick = self.find_nick(event.sender)
date = server_ts_to_weechat(event.server_timestamp) date = server_ts_to_weechat(event.server_timestamp)
data = ("Unknown message of type {t}").format(t=event.type) data = ("Unknown message of type {t}").format(t=event.type)
extra_prefix = (self.warning_prefix if event.decrypted
and not event.verified else "")
self.weechat_buffer.message( self.weechat_buffer.message(
nick, data, date, self.get_event_tags(event) nick, data, date, self.get_event_tags(event), extra_prefix
) )
elif isinstance(event, RedactionEvent): elif isinstance(event, RedactionEvent):
@ -1133,9 +1164,7 @@ class RoomBuffer(object):
elif isinstance(event, MegolmEvent): elif isinstance(event, MegolmEvent):
nick = self.find_nick(event.sender) nick = self.find_nick(event.sender)
date = server_ts_to_weechat(event.server_timestamp) date = server_ts_to_weechat(event.server_timestamp)
"{del_color}<{log_color}Message redacted by: "
"{censor}{log_color}{reason}{del_color}>"
"{ncolor}"
data = ("{del_color}<{log_color}Unable to decrypt: " data = ("{del_color}<{log_color}Unable to decrypt: "
"The sender's device has not sent us " "The sender's device has not sent us "
"the keys for this message{del_color}>{ncolor}").format( "the keys for this message{del_color}>{ncolor}").format(
@ -1159,7 +1188,7 @@ class RoomBuffer(object):
# type: (OwnMessage) -> None # type: (OwnMessage) -> None
nick = self.find_nick(self.room.own_user_id) nick = self.find_nick(self.room.own_user_id)
data = message.formatted_message.to_weechat() data = message.formatted_message.to_weechat()
tags = self.get_event_tags(message) tags = [SCRIPT_NAME + "_id_{}".format(message.event_id)]
date = message.age date = message.age
self.weechat_buffer.self_message(nick, data, date, tags) self.weechat_buffer.self_message(nick, data, date, tags)
@ -1168,7 +1197,7 @@ class RoomBuffer(object):
# type: (OwnMessage) -> None # type: (OwnMessage) -> None
nick = self.find_nick(self.room.own_user_id) nick = self.find_nick(self.room.own_user_id)
date = message.age date = message.age
tags = self.get_event_tags(message) tags = [SCRIPT_NAME + "_id_{}".format(message.event_id)]
self.weechat_buffer.self_action( self.weechat_buffer.self_action(
nick, message.formatted_message.to_weechat(), date, tags nick, message.formatted_message.to_weechat(), date, tags