]> jfr.im git - irc/quakenet/qwebirc.git/blame - qwebirc/root.py
add support for flash websockets (including flash policy server) -- wss untested
[irc/quakenet/qwebirc.git] / qwebirc / root.py
CommitLineData
1bccb3e6 1from twisted.protocols.policies import TimeoutMixin
1d924d97
CP
2from twisted.web import resource, server, static, http
3from twisted.internet import error, reactor
85f01e3f 4import engines
85f01e3f 5import mimetypes
1d924d97 6import config
e44c9cdc 7import sigdebug
23f85e9b 8import re
9e769c12
CP
9
10class RootResource(resource.Resource):
d65fe45f
CP
11 def getChild(self, name, request):
12 if name == "":
2b8e1a88 13 name = "qui.html"
d65fe45f
CP
14 return self.primaryChild.getChild(name, request)
15
1bccb3e6
CP
16class HTTPChannel(http.HTTPChannel, TimeoutMixin):
17 timeOut = 5
1d924d97 18
23f85e9b 19class ProxyRequest(server.Request):
133b7132 20 ip_re = re.compile(r"^((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})|(::|(([a-fA-F0-9]{1,4}):){7}(([a-fA-F0-9]{1,4}))|(:(:([a-fA-F0-9]{1,4})){1,6})|((([a-fA-F0-9]{1,4}):){1,6}:)|((([a-fA-F0-9]{1,4}):)(:([a-fA-F0-9]{1,4})){1,6})|((([a-fA-F0-9]{1,4}):){2}(:([a-fA-F0-9]{1,4})){1,5})|((([a-fA-F0-9]{1,4}):){3}(:([a-fA-F0-9]{1,4})){1,4})|((([a-fA-F0-9]{1,4}):){4}(:([a-fA-F0-9]{1,4})){1,3})|((([a-fA-F0-9]{1,4}):){5}(:([a-fA-F0-9]{1,4})){1,2})))$", re.IGNORECASE)
23f85e9b
CP
21 def validIP(self, ip):
22 m = self.ip_re.match(ip)
23 if m is None:
24 return False
133b7132 25 return True
23f85e9b
CP
26
27 def getClientIP(self):
28 real_ip = http.Request.getClientIP(self)
29 if real_ip not in config.FORWARDED_FOR_IPS:
30 return real_ip
31
32 fake_ips = self.getHeader(config.FORWARDED_FOR_HEADER)
33 if fake_ips is None:
34 return real_ip
35
36 fake_ip = fake_ips.split(",")[-1].strip()
37 if not self.validIP(fake_ip):
38 return real_ip
39
40 return fake_ip
41
9e769c12 42class RootSite(server.Site):
1bccb3e6 43 protocol = HTTPChannel
1d924d97 44
23f85e9b
CP
45 if hasattr(config, "FORWARDED_FOR_HEADER"):
46 requestFactory = ProxyRequest
47
9e769c12 48 def __init__(self, path, *args, **kwargs):
d65fe45f 49 root = RootResource()
9e769c12 50 server.Site.__init__(self, root, *args, **kwargs)
d65fe45f 51
85f01e3f
CP
52 services = {}
53 services["StaticEngine"] = root.primaryChild = engines.StaticEngine(path)
28c8008e 54
85f01e3f
CP
55 def register(service, path, *args, **kwargs):
56 sobj = service("/" + path, *args, **kwargs)
57 services[service.__name__] = sobj
58 root.putChild(path, sobj)
59
60 register(engines.AJAXEngine, "e")
c60795d6
CP
61 try:
62 register(engines.WebSocketEngine, "w")
63 except AttributeError:
64 pass
85f01e3f
CP
65 register(engines.FeedbackEngine, "feedback")
66 register(engines.AuthgateEngine, "auth")
67 register(engines.AdminEngine, "adminengine", services)
68
28c8008e 69mimetypes.types_map[".ico"] = "image/vnd.microsoft.icon"