]> jfr.im git - irc/quakenet/qwebirc.git/blame - qwebirc/root.py
Merge.
[irc/quakenet/qwebirc.git] / qwebirc / root.py
CommitLineData
5a767fca 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
23f85e9b 16class ProxyRequest(server.Request):
133b7132 17 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
18 def validIP(self, ip):
19 m = self.ip_re.match(ip)
20 if m is None:
21 return False
133b7132 22 return True
23f85e9b
CP
23
24 def getClientIP(self):
25 real_ip = http.Request.getClientIP(self)
26 if real_ip not in config.FORWARDED_FOR_IPS:
27 return real_ip
28
29 fake_ips = self.getHeader(config.FORWARDED_FOR_HEADER)
30 if fake_ips is None:
31 return real_ip
32
33 fake_ip = fake_ips.split(",")[-1].strip()
34 if not self.validIP(fake_ip):
35 return real_ip
36
37 return fake_ip
5a767fca
CP
38
39class HTTPChannel(http.HTTPChannel):
40 def timeoutConnection(self):
41 self.transport.abortConnection()
42
9e769c12 43class RootSite(server.Site):
5a767fca 44 protocol = HTTPChannel
9463277c 45
23f85e9b
CP
46 if hasattr(config, "FORWARDED_FOR_HEADER"):
47 requestFactory = ProxyRequest
48
5a767fca 49 def __init__(self, path, *args, **kwargs):
d65fe45f 50 root = RootResource()
5a767fca
CP
51 kwargs["timeout"] = config.HTTP_REQUEST_TIMEOUT
52 server.Site.__init__(self, root, *args, **kwargs)
85f01e3f
CP
53 services = {}
54 services["StaticEngine"] = root.primaryChild = engines.StaticEngine(path)
28c8008e 55
85f01e3f
CP
56 def register(service, path, *args, **kwargs):
57 sobj = service("/" + path, *args, **kwargs)
58 services[service.__name__] = sobj
59 root.putChild(path, sobj)
60
61 register(engines.AJAXEngine, "e")
c60795d6
CP
62 try:
63 register(engines.WebSocketEngine, "w")
64 except AttributeError:
65 pass
85f01e3f
CP
66 register(engines.FeedbackEngine, "feedback")
67 register(engines.AuthgateEngine, "auth")
68 register(engines.AdminEngine, "adminengine", services)
69
28c8008e 70mimetypes.types_map[".ico"] = "image/vnd.microsoft.icon"