]> jfr.im git - irc/quakenet/qwebirc.git/blobdiff - qwebirc/engines/ajaxengine.py
Remove some more QuakeNet-isms from qwebirc.
[irc/quakenet/qwebirc.git] / qwebirc / engines / ajaxengine.py
index 2b679600be8f2d4f5bcdd71da8fd6b574f3fb007..5fab9cf4c4f00c95d4cce6869be941e4211c141f 100644 (file)
@@ -1,4 +1,4 @@
-from twisted.web import resource, server, static
+from twisted.web import resource, server, static, error as http_error
 from twisted.names import client
 from twisted.internet import reactor, error
 from authgateengine import login_optional, getSessionData
@@ -21,6 +21,9 @@ class AJAXException(Exception):
 class IDGenerationException(Exception):
   pass
 
+class PassthruException(Exception):
+  pass
+  
 NOT_DONE_YET = None
 
 def jsondump(fn):
@@ -32,6 +35,8 @@ def jsondump(fn):
       x = (True, x)
     except AJAXException, e:
       x = (False, e[0])
+    except PassthruException, e:
+      return str(e)
       
     return simplejson.dumps(x)
   return decorator
@@ -115,7 +120,7 @@ class IRCSession:
     bufferlen = sum(map(len, self.buffer))
     if bufferlen + len(data) > config.MAXBUFLEN:
       self.buffer = []
-      self.client.error("Buffer overflow")
+      self.client.error("Buffer overflow.")
       return
 
     self.buffer.append(data)
@@ -165,23 +170,24 @@ class AJAXEngine(resource.Resource):
       handler = self.COMMANDS.get(path[1:])
       if handler is not None:
         return handler(self, request)
-    raise AJAXException("404")
+        
+    raise PassthruException, http_error.NoResource().render(request)
 
-#  def render_GET(self, request):
-#    return self.render_POST(request)
+  #def render_GET(self, request):
+    #return self.render_POST(request)
   
   def newConnection(self, request):
     ticket = login_optional(request)
     
     _, ip, port = request.transport.getPeer()
 
-    nick, ident, realname = request.args.get("nick"), "webchat", config.REALNAME
-    
+    nick = request.args.get("nick")
     if not nick:
-      raise AJAXException("Nickname not supplied")
-      
-    nick = nick[0]
+      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):
@@ -195,7 +201,9 @@ class AJAXEngine(resource.Resource):
     if qticket is None:
       perform = None
     else:
-      perform = ["PRIVMSG %s :TICKETAUTH %s" % (config.QBOT, qticket)]
+      service_mask = config.AUTH_SERVICE
+      msg_mask = service_mask.split("!")[0] + "@" + service_mask.split("@", 1)[1]
+      perform = ["PRIVMSG %s :TICKETAUTH %s" % (msg_mask, qticket)]
 
     self.__connect_hit()
     client = ircclient.createIRC(session, nick=nick, ident=ident, ip=ip, realname=realname, perform=perform)
@@ -206,48 +214,45 @@ class AJAXEngine(resource.Resource):
     return id
   
   def getSession(self, request):
+    bad_session_message = "Invalid session, this most likely means the server has restarted; close this dialog and then try refreshing the page."
+    
     sessionid = request.args.get("s")
     if sessionid is None:
-      raise AJAXException("Bad session ID")
+      raise AJAXException, bad_session_message
       
     session = Sessions.get(sessionid[0])
     if not session:
-      raise AJAXException("Bad session ID")
+      raise AJAXException, bad_session_message
     return session
     
   def subscribe(self, request):
-    request.channel._savedTimeOut = None # HACK
+    request.channel.cancelTimeout()
     self.getSession(request).subscribe(SingleUseChannel(request), request.notifyFinish())
     return NOT_DONE_YET
 
   def push(self, request):
     command = request.args.get("c")
     if command is None:
-      raise AJAXException("No command specified")
+      raise AJAXException, "No command specified."
     self.__total_hit()
     
-    command = command[0]
+    decoded = ircclient.irc_decode(command[0])
     
     session = self.getSession(request)
 
-    try:
-      decoded = command.decode("utf-8")
-    except UnicodeDecodeError:
-      decoded = command.decode("iso-8859-1", "ignore")
-
     if len(decoded) > config.MAXLINELEN:
       session.disconnect()
-      raise AJAXException("Line too long")
+      raise AJAXException, "Line too long."
 
     try:
       session.push(decoded)
     except AttributeError: # occurs when we haven't noticed an error
       session.disconnect()
-      raise AJAXException("Connection closed by server.")
+      raise AJAXException, "Connection closed by server; try reconnecting by reloading the page."
     except Exception, e: # catch all
       session.disconnect()        
       traceback.print_exc(file=sys.stderr)
-      raise AJAXException("Unknown error.")
+      raise AJAXException, "Unknown error."
   
     return True