]> code.delx.au - pymsnt/blobdiff - src/disco.py
OOB file sending works.
[pymsnt] / src / disco.py
index a498fc7c027c9a8ef238b34c5c4dc42250468db3..cf5ac6614aebd4ae54040bb8596ded473ddc85f2 100644 (file)
@@ -2,12 +2,7 @@
 # Licensed for distribution under the GPL version 2, check COPYING for details
 
 import utils
-if(utils.checkTwisted()):
-       from twisted.xish.domish import Element
-       from twisted.words.protocols.jabber import jid
-else:
-       from tlib.domish import Element
-       from tlib.jabber import jid
+from tlib.xmlw import Element, jid
 from twisted.internet.defer import Deferred
 from twisted.internet import reactor
 from debug import LogEvent, INFO, WARN, ERROR
@@ -25,11 +20,18 @@ CAPS          = "http://jabber.org/protocol/caps"
 SUBSYNC       = "http://jabber.org/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"
+IBB           = "http://jabber.org/protocol/ibb"
 IQGATEWAY     = "jabber:iq:gateway"
 IQVERSION     = "jabber:iq:version"
 IQREGISTER    = "jabber:iq:register"
 IQROSTER      = "jabber:iq:roster"
 IQAVATAR      = "jabber:iq:avatar"
+IQOOB         = "jabber:iq:oob"
+XOOB          = "jabber:x:oob"
 XCONFERENCE   = "jabber:x:conference"
 XEVENT        = "jabber:x:event"
 XDELAY        = "jabber:x:delay"
@@ -108,8 +110,8 @@ class ServerDiscovery:
                iqType = el.getAttribute("type")
                ulang = utils.getLang(el)
                try: # Stringprep
-                       froj = jid.JID(fro)
-                       to = jid.JID(to).full()
+                       froj = jid.intern(fro)
+                       to = jid.intern(to).full()
                except Exception, e:
                        LogEvent(WARN, "", "Dropping IQ because of stringprep error")
 
@@ -145,6 +147,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, []):
@@ -170,7 +174,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")
@@ -198,7 +203,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:
@@ -226,3 +232,49 @@ class ServerDiscovery:
                self.pytrans.send(el)
 
 
+class DiscoRequest:
+       def __init__(self, pytrans, jid):
+               LogEvent(INFO)
+               self.pytrans, self.jid = pytrans, jid
+       
+       def doDisco(self):
+               ID = self.pytrans.makeMessageID()
+               iq = Element((None, "iq"))
+               iq.attributes["to"] = self.jid
+               iq.attributes["from"] = config.jid
+               iq.attributes["type"] = "get"
+               query = iq.addElement("query")
+               query.attributes["xmlns"] = DISCO_INFO
+
+               d = self.pytrans.discovery.sendIq(iq)
+               d.addCallback(self.discoResponse)
+               d.addErrback(self.discoFail)
+               return d
+       
+       def discoResponse(self, el):
+               iqType = el.getAttribute("type")
+               if iqType != "result":
+                       return []
+
+               fro = el.getAttribute("from")
+
+               features = []
+
+               for child in el.elements():
+                       if child.name == "query":
+                               query = child
+                               break
+               else:
+                       return []
+
+               for child in query.elements():
+                       if child.name == "feature":
+                               features.append(child.getAttribute("var"))
+
+               return features
+       
+       def discoFail(self):
+               return []
+               
+
+