from twisted.names import client
from twisted.internet import reactor, error
from authgateengine import login_optional, getSessionData
-import simplejson, md5, sys, os, time, config, weakref, traceback
+import simplejson, md5, sys, os, time, config, weakref, traceback, socket
import qwebirc.ircclient as ircclient
from adminengine import AdminEngineAction
from qwebirc.util import HitCounter
-
+import qwebirc.dns as qdns
Sessions = {}
def get_session_id():
self.id = id
self.subscriptions = []
self.buffer = []
+ self.buflen = 0
self.throttle = 0
self.schedule = None
self.closed = False
encdata = simplejson.dumps(self.buffer)
self.buffer = []
-
+ self.buflen = 0
+
newsubs = []
for x in self.subscriptions:
if x.write(encdata):
cleanupSession(self.id)
def event(self, data):
- bufferlen = sum(map(len, self.buffer))
- if bufferlen + len(data) > config.MAXBUFLEN:
+ newbuflen = self.buflen + len(data)
+ if newbuflen > config.MAXBUFLEN:
self.buffer = []
self.client.error("Buffer overflow.")
return
self.buffer.append(data)
+ self.buflen = newbuflen
self.flush()
def push(self, data):
reactor.callLater(5, cleanupSession, self.id)
+# DANGER! Breach of encapsulation!
+def connect_notice(line):
+ return "c", "NOTICE", "", ("AUTH", "*** (qwebirc) %s" % line)
+
class Channel:
def __init__(self, request):
self.request = request
raise PassthruException, http_error.NoResource().render(request)
- #def render_GET(self, request):
- #return self.render_POST(request)
-
def newConnection(self, request):
ticket = login_optional(request)
raise AJAXException, "Nickname not supplied."
nick = ircclient.irc_decode(nick[0])
- ident, realname = "webchat", config.REALNAME
-
for i in xrange(10):
id = get_session_id()
if not Sessions.get(id):
msg_mask = service_mask.split("!")[0] + "@" + service_mask.split("@", 1)[1]
perform = ["PRIVMSG %s :TICKETAUTH %s" % (msg_mask, qticket)]
+ ident, realname = config.IDENT, config.REALNAME
+ if ident is None:
+ ident = socket.inet_aton(ip).encode("hex")
+
self.__connect_hit()
- client = ircclient.createIRC(session, nick=nick, ident=ident, ip=ip, realname=realname, perform=perform)
- session.client = client
-
+
+ def proceed(hostname):
+ client = ircclient.createIRC(session, nick=nick, ident=ident, ip=ip, realname=realname, perform=perform, hostname=hostname)
+ session.client = client
+
+ if config.WEBIRC_MODE != "hmac":
+ notice = lambda x: session.event(connect_notice(x))
+ notice("Looking up your hostname...")
+ def callback(hostname):
+ notice("Found your hostname.")
+ proceed(hostname)
+ def errback(failure):
+ notice("Couldn't look up your hostname!")
+ proceed(ip)
+ qdns.lookupAndVerifyPTR(ip, timeout=[config.DNS_TIMEOUT]).addCallbacks(callback, errback)
+ else:
+ proceed(None) # hmac doesn't care
+
Sessions[id] = session
return id
}
COMMANDS = dict(p=push, n=newConnection, s=subscribe)
-
\ No newline at end of file
+