X-Git-Url: https://code.delx.au/pymsnt/blobdiff_plain/82f05a91e1d7616a1868268c908b65fe7fa4a8d5..808b684a3ee0ce4f4884432a48a58a82ebd47e9b:/src/disco.py diff --git a/src/disco.py b/src/disco.py index 3fb2fc9..31d071b 100644 --- a/src/disco.py +++ b/src/disco.py @@ -1,15 +1,18 @@ -# Copyright 2004-2005 James Bunton +# Copyright 2004-2006 James Bunton # Licensed for distribution under the GPL version 2, check COPYING for details -import utils -from tlib.xmlw import Element, jid +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 twisted.words.xish.domish import Element +from twisted.words.protocols.jabber.jid import internJID + 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" @@ -61,6 +64,18 @@ class ServerDiscovery: self.addFeature(DISCO, None, config.jid) self.addFeature(DISCO, None, "USER") + self.addFeature(DISCO, None, "ROOM") + + def _makeSearchJID(self, jid): + if jid.find('@') > 0: + if jid.find('%') > 0: + return "USER" + else: + return "ROOM" + elif config.compjid and to == config.compjid: + return config.jid + else: + return jid def sendIq(self, el, timeout=15): """ Used for sending IQ packets. @@ -68,7 +83,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(Exception("Timeout")) del self.deferredIqs[(jid, ID)] jid = el.getAttribute("to") @@ -83,21 +98,21 @@ class ServerDiscovery: return d def addIdentity(self, category, ctype, name, jid): - """ Adds an identity to this JID's discovery profile. If jid == "USER" then MSN users will get this identity. """ + """ Adds an identity to this JID's discovery profile. If jid == "USER" then MSN users will get this identity, jid == "ROOM" is for groupchat rooms. """ LogEvent(INFO) if not self.identities.has_key(jid): self.identities[jid] = [] self.identities[jid].append((category, ctype, name)) def addFeature(self, var, handler, jid): - """ Adds a feature to this JID's discovery profile. If jid == "USER" then MSN users will get this feature. """ + """ Adds a feature to this JID's discovery profile. If jid == "USER" then MSN users will get this feature, jid == "ROOM" is for groupchat rooms. """ LogEvent(INFO) if not self.features.has_key(jid): self.features[jid] = [] self.features[jid].append((var, handler)) def addNode(self, node, handler, name, jid, rootnode): - """ Adds a node to this JID's discovery profile. If jid == "USER" then MSN users will get this node. """ + """ Adds a node to this JID's discovery profile. If jid == "USER" then MSN users will get this node, jid == "ROOM" is for groupchat rooms. """ LogEvent(INFO) if not self.nodes.has_key(jid): self.nodes[jid] = {} @@ -111,9 +126,9 @@ class ServerDiscovery: iqType = el.getAttribute("type") ulang = utils.getLang(el) try: # Stringprep - froj = jid.intern(fro) - to = jid.intern(to).full() - except Exception, e: + froj = internJID(fro) + to = internJID(to).full() + except Exception: LogEvent(WARN, "", "Dropping IQ because of stringprep error") # Check if it's a response to a send IQ @@ -128,7 +143,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,13 +161,7 @@ class ServerDiscovery: self.sendDiscoItemsResponse(to=fro, ID=ID, ulang=ulang, jid=to) return - 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, []): + for (feature, handler) in self.features.get(self._makeSearchJID(to), []): if feature == xmlns and handler: LogEvent(INFO, "Handler found") handler(el) @@ -174,9 +183,8 @@ class ServerDiscovery: query = iq.addElement("query") query.attributes["xmlns"] = DISCO_INFO - searchjid = jid - if jid.find('@') > 0: searchjid = "USER" - if config.compjid and jid == config.compjid: searchjid = config.jid + searchjid = self._makeSearchJID(jid) + # Add any identities for (category, ctype, name) in self.identities.get(searchjid, []): identity = query.addElement("identity") @@ -203,9 +211,7 @@ class ServerDiscovery: query = iq.addElement("query") query.attributes["xmlns"] = DISCO_ITEMS - searchjid = jid - if jid.find('@') > 0: searchjid = "USER" - if config.compjid and jid == config.compjid: searchjid = config.jid + searchjid = self._makeSearchJID(jid) for node in self.nodes.get(searchjid, []): handler, name, rootnode = self.nodes[jid][node] if rootnode: @@ -230,6 +236,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) @@ -274,7 +281,7 @@ class DiscoRequest: return features - def discoFail(self): + def discoFail(self, err): return []