diff --git a/gajim/common/connection_handlers_events.py b/gajim/common/connection_handlers_events.py index 6e467fc44..785e4c408 100644 --- a/gajim/common/connection_handlers_events.py +++ b/gajim/common/connection_handlers_events.py @@ -44,6 +44,7 @@ from common.logger import LOG_DB_PATH from common.pep import SUPPORTED_PERSONAL_USER_EVENTS from common.jingle_transport import JingleTransportSocks5 from common.file_props import FilesProp +from common.nec import NetworkEvent if gajim.HAVE_PYOPENSSL: import OpenSSL.crypto @@ -1037,43 +1038,70 @@ class BeforeChangeShowEvent(nec.NetworkIncomingEvent): class MamMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'mam-message-received' - base_network_events = [] + base_network_events = ['raw-mam-message-received'] - def init(self): + def __init__(self, name, base_event): + ''' + Pre-Generated attributes on self: + + :conn: Connection instance + :stanza: Complete stanza Node + :forwarded: Forwarded Node + :result: Result Node + ''' + self._set_base_event_vars_as_attributes(base_event) self.additional_data = {} self.encrypted = False - + self.groupchat = False + def generate(self): - if not self.stanza: - return - account = self.conn.name - self.msg_ = self.stanza.getTag('message') - # use timestamp of archived message, if available and archive timestamp otherwise - delay = self.stanza.getTag('delay', namespace=nbxmpp.NS_DELAY2) - delay2 = self.msg_.getTag('delay', namespace=nbxmpp.NS_DELAY2) - if delay2: - delay = delay2 - if not delay: - return - tim = delay.getAttr('stamp') - tim = helpers.datetime_tuple(tim) - self.tim = timegm(tim) - to_ = self.msg_.getAttr('to') - if to_: - to_ = gajim.get_jid_without_resource(to_) - else: - to_ = gajim.get_jid_from_account(account) - frm_ = gajim.get_jid_without_resource(self.msg_.getAttr('from')) + archive_jid = self.stanza.getFrom() + own_jid = self.conn.get_own_jid() + if archive_jid and not archive_jid.bareMatch(own_jid): + # MAM Message not from our Archive + log.info('MAM message not from our user archive') + return False + + self.msg_ = self.forwarded.getTag('message') + + if self.msg_.getType() == 'groupchat': + log.info('Received groupchat message from user archive') + return False + self.msgtxt = self.msg_.getTagData('body') - if to_ == gajim.get_jid_from_account(account): - self.with_ = frm_ + self.stanza_id = self.msg_.getID() + self.mam_id = self.result.getID() + self.query_id = self.result.getAttr('queryid') + + # Use timestamp provided by archive, + # Fallback: Use timestamp provided by user and issue a warning + delay = self.forwarded.getTag('delay', namespace=nbxmpp.NS_DELAY2) + if not delay: + log.warning('No timestamp on archive Message, try fallback') + delay = self.msg_.getTag('delay', namespace=nbxmpp.NS_DELAY2) + if not delay: + log.error('Received MAM message without timestamp') + return + + self.timestamp = helpers.parse_delay(delay) + + frm = self.msg_.getFrom() + to = self.msg_.getTo() + + if not to or to.bareMatch(own_jid): + self.with_ = str(frm) self.direction = 'from' - self.resource = gajim.get_resource_from_jid( - self.msg_.getAttr('from')) + self.resource = frm.getResource() else: - self.with_ = to_ + self.with_ = str(to) self.direction = 'to' - self.resource = gajim.get_resource_from_jid(self.msg_.getAttr('to')) + self.resource = to.getResource() + + log_message = \ + 'received: mam-message: ' \ + 'stanza id: {:15} - mam id: {:15} - query id: {}'.format( + self.stanza_id, self.mam_id, self.query_id) + log.debug(log_message) return True class MamDecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): @@ -1087,14 +1115,14 @@ class MamDecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): self.additional_data = self.msg_obj.additional_data self.with_ = self.msg_obj.with_ self.direction = self.msg_obj.direction - self.tim = self.msg_obj.tim + self.timestamp = self.msg_obj.timestamp res = self.msg_obj.resource self.msgtxt = self.msg_obj.msgtxt is_pm = gajim.logger.jid_is_room_jid(self.with_) if msg_.getAttr('type') == 'groupchat': if is_pm == False: log.warn('JID %s is marked as normal contact in database ' - 'but we got a groupchat message from it.') + 'but we got a groupchat message from it.', self.with_) return if is_pm == None: gajim.logger.get_jid_id(self.with_, 'ROOM') @@ -1105,12 +1133,12 @@ class MamDecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): server = gajim.get_server_from_jid(self.with_) if server not in self.conn.mam_awaiting_disco_result: self.conn.mam_awaiting_disco_result[server] = [ - [self.with_, self.direction, self.tim, self.msgtxt, + [self.with_, self.direction, self.timestamp, self.msgtxt, res]] self.conn.discoverInfo(server) else: self.conn.mam_awaiting_disco_result[server].append( - [self.with_, self.direction, self.tim, self.msgtxt, + [self.with_, self.direction, self.timestamp, self.msgtxt, res]) return return True @@ -1218,8 +1246,16 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): nbxmpp.NS_MAM_1, nbxmpp.NS_MAM_2): forwarded = result.getTag('forwarded', namespace=nbxmpp.NS_FORWARD) - gajim.nec.push_incoming_event(MamMessageReceivedEvent(None, - conn=self.conn, stanza=forwarded, query_id=result.getAttr('queryid'))) + if not forwarded: + log.warning('Invalid MAM Message: no forwarded child') + return + + gajim.nec.push_incoming_event( + NetworkEvent('raw-mam-message-received', + conn=self.conn, + stanza=self.stanza, + forwarded=forwarded, + result=result)) return # Mediated invitation? diff --git a/gajim/common/message_archiving.py b/gajim/common/message_archiving.py index 4b7203ac5..a3cfaeef8 100644 --- a/gajim/common/message_archiving.py +++ b/gajim/common/message_archiving.py @@ -22,7 +22,7 @@ import nbxmpp from common import gajim from common import ged from common import helpers -from common.connection_handlers_events import ArchivingReceivedEvent +import common.connection_handlers_events as ev from calendar import timegm from time import localtime @@ -48,6 +48,7 @@ class ConnectionArchive313(ConnectionArchive): self.iq_answer = [] self.mam_query_date = None self.mam_query_id = None + gajim.nec.register_incoming_event(ev.MamMessageReceivedEvent) gajim.ged.register_event_handler('archiving-finished-legacy', ged.CORE, self._nec_result_finished) gajim.ged.register_event_handler('archiving-finished', ged.CORE, @@ -132,7 +133,7 @@ class ConnectionArchive313(ConnectionArchive): def _nec_mam_decrypted_message_received(self, obj): if obj.conn.name != self.name: return - gajim.logger.save_if_not_exists(obj.with_, obj.direction, obj.tim, + gajim.logger.save_if_not_exists(obj.with_, obj.direction, obj.timestamp, msg=obj.msgtxt, nick=obj.nick, additional_data=obj.additional_data) def get_query_id(self): @@ -399,7 +400,7 @@ class ConnectionArchive136(ConnectionArchive): return ['may'] def _ArchiveCB(self, con, iq_obj): - gajim.nec.push_incoming_event(ArchivingReceivedEvent(None, conn=self, + gajim.nec.push_incoming_event(ev.ArchivingReceivedEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed