sys.setdefaultencoding("utf-8")
sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)
+
# Find the best reactor
+selectWarning = "Unable to install any good reactors (kqueue, epoll, poll).\nWe fell back to using select. You may have scalability problems.\nThis reactor will not support more than 1024 connections at a time."
try:
from twisted.internet import epollreactor as bestreactor
-except ImportError:
+except:
try:
from twisted.internet import kqreactor as bestreactor
- except ImportError:
+ except:
try:
from twisted.internet import pollreactor as bestreactor
- except ImportError:
+ except:
try:
- from twisted.internet import default as bestreactor
- print "Unable to install any good reactors (kqueue, epoll, poll)."
- print "We fell back to using select. You may have scalability problems."
- print "This reactor will not support more than 1024 connections at a time."
- except ImportError:
- print "Unable to find a reactor.\nExiting..."
- sys.exit(1)
+ from twisted.internet import selectreactor as bestreactor
+ print selectWarning
+ except:
+ try:
+ from twisted.internet import default as bestreactor
+ print selectWarning
+ except:
+ print "Unable to find a reactor. Please make sure you have Twisted properly installed.\nExiting..."
+ sys.exit(1)
bestreactor.install()
+import twistfix
+twistfix.main()
# Must load config before everything else
from twisted.internet import reactor, task
from twisted.internet.defer import Deferred
-from tlib.xmlw import Element, jid, component
+from twisted.words.xish.domish import Element
+from twisted.words.protocols.jabber import component
+from twisted.words.protocols.jabber.jid import internJID
+
from debug import LogEvent, INFO, WARN, ERROR
import debug
+import svninfo
import utils
import xdb
import avatar
class PyTransport(component.Service):
def __init__(self):
LogEvent(INFO)
+ try:
+ LogEvent(INFO, msg="SVN r" + str(svninfo.getSVNVersion()))
+ except:
+ pass
# Discovery, as well as some builtin features
self.discovery = disco.ServerDiscovery(self)
- self.discovery.addIdentity("gateway", legacy.id, legacy.name, config.jid)
- self.discovery.addIdentity("conference", "text", legacy.name + " Chatrooms", config.jid)
+ self.discovery.addIdentity("gateway", legacy.id, config.discoName, config.jid)
+ self.discovery.addIdentity("conference", "text", config.discoName + " Chatrooms", config.jid)
self.discovery.addFeature(disco.XCONFERENCE, None, config.jid) # So that clients know you can create groupchat rooms on the server
self.discovery.addFeature("jabber:iq:conference", None, config.jid) # We don't actually support this, but Psi has a bug where it looks for this instead of the above
self.discovery.addIdentity("client", "pc", "MSN Messenger", "USER")
def onMessage(self, el):
fro = el.getAttribute("from")
try:
- froj = jid.intern(fro)
+ froj = internJID(fro)
except Exception, e:
LogEvent(WARN, "", "Failed stringprep.")
return
mtype = el.getAttribute("type")
s = self.sessions.get(froj.userhost(), None)
if mtype == "error" and s:
+ LogEvent(INFO, s.jabberID, "Removing session because of message type=error")
s.removeMe()
elif s:
s.onMessage(el)
- else:
+ elif mtype != "error":
to = el.getAttribute("to")
ulang = utils.getLang(el)
body = None
body = child.__str__()
LogEvent(INFO, "", "Sending error response to a message outside of session.")
jabw.sendErrorMessage(self, fro, to, "auth", "not-authorized", lang.get(ulang).notLoggedIn, body)
+ jabw.sendPresence(self, fro, to, ptype="unavailable")
def onPresence(self, el):
fro = el.getAttribute("from")
to = el.getAttribute("to")
try:
- froj = jid.intern(fro)
- toj = jid.intern(to)
+ froj = internJID(fro)
+ toj = internJID(to)
except Exception, e:
LogEvent(WARN, "", "Failed stringprep.")
return
+ ptype = el.getAttribute("type")
s = self.sessions.get(froj.userhost())
- if s:
+ if ptype == "error" and s:
+ LogEvent(INFO, s.jabberID, "Removing session because of message type=error")
+ s.removeMe()
+ elif s:
s.onPresence(el)
else:
ulang = utils.getLang(el)
elif el.getAttribute("type") != "error":
LogEvent(INFO, "", "Sending unavailable presence to non-logged in user.")
- pres = Element((None, "presence"))
- pres.attributes["from"] = to
- pres.attributes["to"] = fro
- pres.attributes["type"] = "unavailable"
- self.send(pres)
+ jabw.sendPresence(self, fro, to, ptype="unavailable")
return
elif ptype and (ptype.startswith("subscribe") or ptype.startswith("unsubscribe")):
# They haven't logged in, and are trying to change subscription to a user
+ # No, lets not log them in. Lets send an error :)
+ jabw.sendPresence(self, fro, to, ptype="error")
+
# Lets log them in and then do it
- LogEvent(INFO, "", "Attempting to create a session to do subscription stuff.")
- s = session.makeSession(self, froj.userhost(), ulang)
- if s:
- self.sessions[froj.userhost()] = s
- LogEvent(INFO, "", "New session created.")
- # Tell the session there's a new resource
- s.handleResourcePresence(froj.userhost(), froj.resource, toj.userhost(), toj.resource, 0, None, None, None)
- # Send this subscription
- s.onPresence(el)
+ #LogEvent(INFO, "", "Attempting to create a session to do subscription stuff.")
+ #s = session.makeSession(self, froj.userhost(), ulang)
+ #if s:
+ # self.sessions[froj.userhost()] = s
+ # LogEvent(INFO, "", "New session created.")
+ # # Tell the session there's a new resource
+ # s.handleResourcePresence(froj.userhost(), froj.resource, toj.userhost(), toj.resource, 0, None, None, None)
+ # # Send this subscription
+ # s.onPresence(el)
class App: