X-Git-Url: https://code.delx.au/pymsnt/blobdiff_plain/ee826eece78087bad7fcfac045340c57def57801..bea02c52c5c41e4cb49182c8bf972e340e00da2d:/src/disco.py diff --git a/src/disco.py b/src/disco.py index 8dd00cd..f9aac5b 100644 --- a/src/disco.py +++ b/src/disco.py @@ -1,15 +1,17 @@ # Copyright 2004-2005 James Bunton # Licensed for distribution under the GPL version 2, check COPYING for details -import utils -from tlib.xmlw import Element +from debug import LogEvent, INFO, WARN, ERROR + from twisted.internet.defer import Deferred from twisted.internet import reactor -from debug import LogEvent, INFO, WARN, ERROR +from tlib.xmlw import Element, jid + import sys -import config -import legacy + import lang +import utils +import config XMPP_STANZAS = "urn:ietf:params:xml:ns:xmpp-stanzas" DISCO = "http://jabber.org/protocol/disco" @@ -17,9 +19,10 @@ DISCO_ITEMS = DISCO + "#items" DISCO_INFO = DISCO + "#info" COMMANDS = "http://jabber.org/protocol/commands" CAPS = "http://jabber.org/protocol/caps" -SUBSYNC = "http://jabber.org/protocol/roster-subsync" +SUBSYNC = "http://delx.cjb.net/protocol/roster-subsync" MUC = "http://jabber.org/protocol/muc" MUC_USER = MUC + "#user" +FEATURE_NEG = "http://jabber.org/protocol/feature-neg" SI = "http://jabber.org/protocol/si" FT = "http://jabber.org/protocol/si/profile/file-transfer" S5B = "http://jabber.org/protocol/bytestreams" @@ -35,6 +38,7 @@ XCONFERENCE = "jabber:x:conference" XEVENT = "jabber:x:event" XDELAY = "jabber:x:delay" XAVATAR = "jabber:x:avatar" +XDATA = "jabber:x:data" STORAGEAVATAR = "storage:client:avatar" XVCARDUPDATE = "vcard-temp:x:update" VCARDTEMP = "vcard-temp" @@ -66,7 +70,7 @@ class ServerDiscovery: Returns a deferred which will fire with the matching IQ response as it's sole argument. """ def checkDeferred(): if(not d.called): - d.errback() + d.errback("Timeout") del self.deferredIqs[(jid, ID)] jid = el.getAttribute("to") @@ -109,9 +113,9 @@ class ServerDiscovery: iqType = el.getAttribute("type") ulang = utils.getLang(el) try: # Stringprep - froj = utils.jid(fro) - to = utils.jid(to).full() - except Exception, e: + froj = jid.intern(fro) + to = jid.intern(to).full() + except Exception: LogEvent(WARN, "", "Dropping IQ because of stringprep error") # Check if it's a response to a send IQ @@ -126,7 +130,7 @@ class ServerDiscovery: LogEvent(INFO, "", "Looking for handler") for query in el.elements(): - xmlns = query.defaultUri + xmlns = query.uri node = query.getAttribute("node") if xmlns.startswith(DISCO) and node: @@ -146,6 +150,8 @@ class ServerDiscovery: if to.find('@') > 0: searchjid = "USER" + elif config.compjid and to == config.compjid: + searchjid = config.jid else: searchjid = to for (feature, handler) in self.features.get(searchjid, []): @@ -171,7 +177,8 @@ class ServerDiscovery: query.attributes["xmlns"] = DISCO_INFO searchjid = jid - if(jid.find('@') > 0): searchjid = "USER" + if jid.find('@') > 0: searchjid = "USER" + if config.compjid and jid == config.compjid: searchjid = config.jid # Add any identities for (category, ctype, name) in self.identities.get(searchjid, []): identity = query.addElement("identity") @@ -199,7 +206,8 @@ class ServerDiscovery: query.attributes["xmlns"] = DISCO_ITEMS searchjid = jid - if(jid.find('@') > 0): searchjid = "USER" + if jid.find('@') > 0: searchjid = "USER" + if config.compjid and jid == config.compjid: searchjid = config.jid for node in self.nodes.get(searchjid, []): handler, name, rootnode = self.nodes[jid][node] if rootnode: @@ -224,6 +232,7 @@ class ServerDiscovery: error.attributes["type"] = etype error.attributes["code"] = str(utils.errorCodeMap[condition]) cond = error.addElement(condition) + cond.attributes["xmlns"] = XMPP_STANZAS self.pytrans.send(el) @@ -255,8 +264,11 @@ class DiscoRequest: features = [] - query = el.getElement("query") - if not query: + for child in el.elements(): + if child.name == "query": + query = child + break + else: return [] for child in query.elements():