# HG changeset patch # User souliane # Date 1387201708 -3600 # Node ID 192b804ee44699cd34743f820a87f9b19704b374 # Parent a0f4a80a65369b99e87aa7cf65629ca8eedcea62 plugin XEP-0033: bug fix for sending messages with the addressing feature to several servers diff -r a0f4a80a6536 -r 192b804ee446 src/plugins/plugin_xep_0033.py --- a/src/plugins/plugin_xep_0033.py Mon Dec 16 14:36:38 2013 +0100 +++ b/src/plugins/plugin_xep_0033.py Mon Dec 16 14:48:28 2013 +0100 @@ -29,10 +29,11 @@ from wokkel.subprotocols import XMPPHandler from threading import Timer from twisted.words.xish import domish -from twisted.internet import defer +from twisted.internet import defer, threads from sat.core.sat_main import MessageSentAndStored, AbortSendMessage from sat.tools.misc import TriggerManager +from time import time # TODO: fix Prosody "addressing" plugin to leave the concerned bcc according to the spec: # @@ -69,6 +70,7 @@ def __init__(self, host): logging.info(_("Extended Stanza Addressing plugin initialization")) self.host = host + self.internal_data = {} host.trigger.add("sendMessage", self.sendMessageTrigger, TriggerManager.MIN_PRIORITY) host.trigger.add("MessageReceived", self.messageReceivedTrigger) @@ -119,10 +121,9 @@ new_data['to'] = JID(to_jid) new_data['xml']['to'] = to_jid if entity: - if 'address' in mess_data['extra']: + if entity not in self.internal_data[timestamp]: self.host.sendAndStoreMessage(mess_data, False, profile) - # just to remember that the message has been sent - del mess_data['extra']['address'] + self.internal_data[timestamp].append(entity) # we still need to fill the history and signal the echo... self.host.sendAndStoreMessage(new_data, True, profile) else: @@ -132,11 +133,17 @@ def errback(failure, to_jid): discoCallback(None, to_jid) + timestamp = time() + self.internal_data[timestamp] = [] + defer_list = [] for type_, jid_ in entries: d = defer.Deferred() d.addCallback(self.host.requestServerDisco, JID(JID(jid_).host), profile_key=profile) d.addCallbacks(discoCallback, errback, callbackArgs=[jid_], errbackArgs=[jid_]) d.callback(NS_ADDRESS) + defer_list.append(d) + d = defer.Deferred().addCallback(lambda dummy: self.internal_data.pop(timestamp)) + defer.DeferredList(defer_list).chainDeferred(d) raise MessageSentAndStored("XEP-0033 took over")