decode PGP messages in MAM response. Fixes #8103
This commit is contained in:
parent
2260314509
commit
476aca3ea0
|
@ -893,6 +893,8 @@ class ConnectionHandlersBase:
|
||||||
self._nec_gc_presence_received)
|
self._nec_gc_presence_received)
|
||||||
gajim.ged.register_event_handler('message-received', ged.CORE,
|
gajim.ged.register_event_handler('message-received', ged.CORE,
|
||||||
self._nec_message_received)
|
self._nec_message_received)
|
||||||
|
gajim.ged.register_event_handler('mam-message-received', ged.CORE,
|
||||||
|
self._nec_mam_message_received)
|
||||||
gajim.ged.register_event_handler('decrypted-message-received', ged.CORE,
|
gajim.ged.register_event_handler('decrypted-message-received', ged.CORE,
|
||||||
self._nec_decrypted_message_received)
|
self._nec_decrypted_message_received)
|
||||||
|
|
||||||
|
@ -905,6 +907,8 @@ class ConnectionHandlersBase:
|
||||||
self._nec_gc_presence_received)
|
self._nec_gc_presence_received)
|
||||||
gajim.ged.remove_event_handler('message-received', ged.CORE,
|
gajim.ged.remove_event_handler('message-received', ged.CORE,
|
||||||
self._nec_message_received)
|
self._nec_message_received)
|
||||||
|
gajim.ged.remove_event_handler('mam-message-received', ged.CORE,
|
||||||
|
self._nec_mam_message_received)
|
||||||
gajim.ged.remove_event_handler('decrypted-message-received', ged.CORE,
|
gajim.ged.remove_event_handler('decrypted-message-received', ged.CORE,
|
||||||
self._nec_decrypted_message_received)
|
self._nec_decrypted_message_received)
|
||||||
|
|
||||||
|
@ -1116,14 +1120,46 @@ class ConnectionHandlersBase:
|
||||||
gajim.nec.push_incoming_event(DecryptedMessageReceivedEvent(None,
|
gajim.nec.push_incoming_event(DecryptedMessageReceivedEvent(None,
|
||||||
conn=self, msg_obj=obj))
|
conn=self, msg_obj=obj))
|
||||||
|
|
||||||
|
def _nec_mam_message_received(self, obj):
|
||||||
|
if obj.conn.name != self.name:
|
||||||
|
return
|
||||||
|
if obj.enc_tag and self.USE_GPG:
|
||||||
|
encmsg = obj.enc_tag.getData()
|
||||||
|
|
||||||
|
keyID = gajim.config.get_per('accounts', self.name, 'keyid')
|
||||||
|
if keyID:
|
||||||
|
self.gpg_messages_to_decrypt.append([encmsg, keyID, obj])
|
||||||
|
if len(self.gpg_messages_to_decrypt) == 1:
|
||||||
|
gajim.thread_interface(self.decrypt_thread, [encmsg, keyID,
|
||||||
|
obj], self._on_mam_message_decrypted, [obj])
|
||||||
|
return
|
||||||
|
gajim.nec.push_incoming_event(MamDecryptedMessageReceivedEvent(None,
|
||||||
|
conn=self, msg_obj=obj))
|
||||||
|
|
||||||
def _on_message_decrypted(self, output, obj):
|
def _on_message_decrypted(self, output, obj):
|
||||||
if len(self.gpg_messages_to_decrypt):
|
if len(self.gpg_messages_to_decrypt):
|
||||||
encmsg, keyID, obj2 = self.gpg_messages_to_decrypt[0]
|
encmsg, keyID, obj2 = self.gpg_messages_to_decrypt[0]
|
||||||
|
if type(obj2) == MessageReceivedEvent:
|
||||||
|
cb = self._on_message_decrypted
|
||||||
|
else:
|
||||||
|
cb = self._on_mam_message_decrypted
|
||||||
gajim.thread_interface(self.decrypt_thread, [encmsg, keyID, obj2],
|
gajim.thread_interface(self.decrypt_thread, [encmsg, keyID, obj2],
|
||||||
self._on_message_decrypted, [obj2])
|
cb, [obj2])
|
||||||
gajim.nec.push_incoming_event(DecryptedMessageReceivedEvent(None,
|
gajim.nec.push_incoming_event(DecryptedMessageReceivedEvent(None,
|
||||||
conn=self, msg_obj=obj))
|
conn=self, msg_obj=obj))
|
||||||
|
|
||||||
|
def _on_mam_message_decrypted(self, output, obj):
|
||||||
|
if len(self.gpg_messages_to_decrypt):
|
||||||
|
encmsg, keyID, obj2 = self.gpg_messages_to_decrypt[0]
|
||||||
|
if type(obj2) == MessageReceivedEvent:
|
||||||
|
cb = self._on_message_decrypted
|
||||||
|
else:
|
||||||
|
cb = self._on_mam_message_decrypted
|
||||||
|
gajim.thread_interface(self.decrypt_thread, [encmsg, keyID, obj2],
|
||||||
|
cb, [obj2])
|
||||||
|
gajim.nec.push_incoming_event(MamDecryptedMessageReceivedEvent(None,
|
||||||
|
conn=self, msg_obj=obj))
|
||||||
|
|
||||||
def _nec_decrypted_message_received(self, obj):
|
def _nec_decrypted_message_received(self, obj):
|
||||||
if obj.conn.name != self.name:
|
if obj.conn.name != self.name:
|
||||||
return
|
return
|
||||||
|
|
|
@ -1011,6 +1011,77 @@ class BeforeChangeShowEvent(nec.NetworkIncomingEvent):
|
||||||
name = 'before-change-show'
|
name = 'before-change-show'
|
||||||
base_network_events = []
|
base_network_events = []
|
||||||
|
|
||||||
|
class MamMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
|
name = 'mam-message-received'
|
||||||
|
base_network_events = []
|
||||||
|
|
||||||
|
def generate(self):
|
||||||
|
if not self.stanza:
|
||||||
|
return
|
||||||
|
account = self.conn.name
|
||||||
|
delay = self.stanza.getTag('delay', namespace=nbxmpp.NS_DELAY2)
|
||||||
|
if not delay:
|
||||||
|
return
|
||||||
|
tim = delay.getAttr('stamp')
|
||||||
|
tim = helpers.datetime_tuple(tim)
|
||||||
|
self.tim = localtime(timegm(tim))
|
||||||
|
self.msg_ = self.stanza.getTag('message')
|
||||||
|
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'))
|
||||||
|
self.msgtxt = self.msg_.getTagData('body')
|
||||||
|
if to_ == gajim.get_jid_from_account(account):
|
||||||
|
self.with_ = frm_
|
||||||
|
self.direction = 'from'
|
||||||
|
self.resource = gajim.get_resource_from_jid(
|
||||||
|
self.msg_.getAttr('from'))
|
||||||
|
else:
|
||||||
|
self.with_ = to_
|
||||||
|
self.direction = 'to'
|
||||||
|
self.resource = gajim.get_resource_from_jid(self.msg_.getAttr('to'))
|
||||||
|
self.enc_tag = self.msg_.getTag('x', namespace=nbxmpp.NS_ENCRYPTED)
|
||||||
|
return True
|
||||||
|
|
||||||
|
class MamDecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
|
name = 'mam-decrypted-message-received'
|
||||||
|
base_network_events = []
|
||||||
|
|
||||||
|
def generate(self):
|
||||||
|
self.nick = None
|
||||||
|
msg_ = self.msg_obj.msg_
|
||||||
|
self.with_ = self.msg_obj.with_
|
||||||
|
self.direction = self.msg_obj.direction
|
||||||
|
self.tim = self.msg_obj.tim
|
||||||
|
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.')
|
||||||
|
return
|
||||||
|
if is_pm == None:
|
||||||
|
gajim.logger.get_jid_id(self.with_, 'ROOM')
|
||||||
|
self.nick = res
|
||||||
|
else:
|
||||||
|
if is_pm == None:
|
||||||
|
# we don't know this JID, we need to disco it.
|
||||||
|
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,
|
||||||
|
res]]
|
||||||
|
self.conn.discoverInfo(server)
|
||||||
|
else:
|
||||||
|
self.conn.mam_awaiting_disco_result[server].append(
|
||||||
|
[self.with_, self.direction, self.tim, self.msgtxt,
|
||||||
|
res])
|
||||||
|
return
|
||||||
|
return True
|
||||||
|
|
||||||
class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
name = 'message-received'
|
name = 'message-received'
|
||||||
base_network_events = ['raw-message-received']
|
base_network_events = ['raw-message-received']
|
||||||
|
@ -1092,55 +1163,8 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
result = self.stanza.getTag('result', namespace=nbxmpp.NS_MAM)
|
result = self.stanza.getTag('result', namespace=nbxmpp.NS_MAM)
|
||||||
if result:
|
if result:
|
||||||
forwarded = result.getTag('forwarded', namespace=nbxmpp.NS_FORWARD)
|
forwarded = result.getTag('forwarded', namespace=nbxmpp.NS_FORWARD)
|
||||||
if not forwarded:
|
gajim.nec.push_incoming_event(MamMessageReceivedEvent(None,
|
||||||
return
|
conn=self.conn, stanza=forwarded))
|
||||||
delay = forwarded.getTag('delay', namespace=nbxmpp.NS_DELAY2)
|
|
||||||
if not delay:
|
|
||||||
return
|
|
||||||
tim = delay.getAttr('stamp')
|
|
||||||
tim = helpers.datetime_tuple(tim)
|
|
||||||
tim = localtime(timegm(tim))
|
|
||||||
msg_ = forwarded.getTag('message')
|
|
||||||
to_ = 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(msg_.getAttr('from'))
|
|
||||||
nick = None
|
|
||||||
msg_txt = msg_.getTagData('body')
|
|
||||||
if to_ == gajim.get_jid_from_account(account):
|
|
||||||
with_ = frm_
|
|
||||||
direction = 'from'
|
|
||||||
res = gajim.get_resource_from_jid(msg_.getAttr('from'))
|
|
||||||
else:
|
|
||||||
with_ = to_
|
|
||||||
direction = 'to'
|
|
||||||
res = gajim.get_resource_from_jid(msg_.getAttr('to'))
|
|
||||||
is_pm = gajim.logger.jid_is_room_jid(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.')
|
|
||||||
return
|
|
||||||
if is_pm == None:
|
|
||||||
gajim.logger.get_jid_id(with_, 'ROOM')
|
|
||||||
nick = res
|
|
||||||
else:
|
|
||||||
if is_pm == None:
|
|
||||||
# we don't know this JID, we need to disco it.
|
|
||||||
server = gajim.get_server_from_jid(with_)
|
|
||||||
if server not in self.conn.mam_awaiting_disco_result:
|
|
||||||
self.conn.mam_awaiting_disco_result[server] = [
|
|
||||||
[with_, direction, tim, msg_txt, res]]
|
|
||||||
self.conn.discoverInfo(server)
|
|
||||||
else:
|
|
||||||
self.conn.mam_awaiting_disco_result[server].append(
|
|
||||||
[with_, direction, tim, msg_txt, res])
|
|
||||||
return
|
|
||||||
|
|
||||||
gajim.logger.save_if_not_exists(with_, direction, tim,
|
|
||||||
msg=msg_txt, nick=nick)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
self.enc_tag = self.stanza.getTag('x', namespace=nbxmpp.NS_ENCRYPTED)
|
self.enc_tag = self.stanza.getTag('x', namespace=nbxmpp.NS_ENCRYPTED)
|
||||||
|
|
|
@ -47,10 +47,18 @@ class ConnectionArchive313(ConnectionArchive):
|
||||||
self._nec_agent_info_error)
|
self._nec_agent_info_error)
|
||||||
gajim.ged.register_event_handler('agent-info-received', ged.CORE,
|
gajim.ged.register_event_handler('agent-info-received', ged.CORE,
|
||||||
self._nec_agent_info)
|
self._nec_agent_info)
|
||||||
|
gajim.ged.register_event_handler('mam-decrypted-message-received',
|
||||||
|
ged.CORE, self._nec_mam_decrypted_message_received)
|
||||||
|
|
||||||
def cleanup(self):
|
def cleanup(self):
|
||||||
gajim.ged.remove_event_handler('raw-message-received', ged.CORE,
|
gajim.ged.remove_event_handler('raw-message-received', ged.CORE,
|
||||||
self._nec_raw_message_313_received)
|
self._nec_raw_message_313_received)
|
||||||
|
gajim.ged.remove_event_handler('agent-info-error-received', ged.CORE,
|
||||||
|
self._nec_agent_info_error)
|
||||||
|
gajim.ged.remove_event_handler('agent-info-received', ged.CORE,
|
||||||
|
self._nec_agent_info)
|
||||||
|
gajim.ged.remove_event_handler('mam-decrypted-message-received',
|
||||||
|
ged.CORE, self._nec_mam_decrypted_message_received)
|
||||||
|
|
||||||
def _nec_agent_info_error(self, obj):
|
def _nec_agent_info_error(self, obj):
|
||||||
if obj.jid in self.mam_awaiting_disco_result:
|
if obj.jid in self.mam_awaiting_disco_result:
|
||||||
|
@ -81,7 +89,7 @@ class ConnectionArchive313(ConnectionArchive):
|
||||||
if obj.conn.name != self.name:
|
if obj.conn.name != self.name:
|
||||||
return
|
return
|
||||||
|
|
||||||
fin_ = obj.stanza.getTag('fin', namespace=nbxmpp.NS_MAM)
|
fin_ = obj.stanza.getTag('fin', namespace=nbxmpp.NS_MAM)
|
||||||
if fin_:
|
if fin_:
|
||||||
queryid_ = fin_.getAttr('queryid')
|
queryid_ = fin_.getAttr('queryid')
|
||||||
if queryid_ not in self.awaiting_answers:
|
if queryid_ not in self.awaiting_answers:
|
||||||
|
@ -99,6 +107,14 @@ class ConnectionArchive313(ConnectionArchive):
|
||||||
|
|
||||||
del self.awaiting_answers[queryid_]
|
del self.awaiting_answers[queryid_]
|
||||||
|
|
||||||
|
def _nec_mam_decrypted_message_received(self, obj):
|
||||||
|
if obj.conn.name != self.name:
|
||||||
|
return
|
||||||
|
print 'ici'
|
||||||
|
print obj.msgtxt
|
||||||
|
gajim.logger.save_if_not_exists(obj.with_, obj.direction, obj.tim,
|
||||||
|
msg=obj.msgtxt, nick=obj.nick)
|
||||||
|
|
||||||
def request_archive(self, start=None, end=None, with_=None, after=None,
|
def request_archive(self, start=None, end=None, with_=None, after=None,
|
||||||
max=30):
|
max=30):
|
||||||
iq_ = nbxmpp.Iq('set')
|
iq_ = nbxmpp.Iq('set')
|
||||||
|
|
Loading…
Reference in New Issue