]> jfr.im git - irc/quakenet/qwebirc.git/blob - qwebirc/root.py
Merge.
[irc/quakenet/qwebirc.git] / qwebirc / root.py
1 from twisted.protocols.policies import TimeoutMixin
2 from twisted.web import resource, server, static, http
3 from twisted.internet import error, reactor
4 import engines
5 import mimetypes
6 import config
7 import sigdebug
8 import re
9
10 class RootResource(resource.Resource):
11 def getChild(self, name, request):
12 if name == "":
13 name = "qui.html"
14 return self.primaryChild.getChild(name, request)
15
16 class ProxyRequest(server.Request):
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)
18 def validIP(self, ip):
19 m = self.ip_re.match(ip)
20 if m is None:
21 return False
22 return True
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
38
39 class HTTPChannel(http.HTTPChannel):
40 def timeoutConnection(self):
41 self.transport.abortConnection()
42
43 class RootSite(server.Site):
44 protocol = HTTPChannel
45
46 if hasattr(config, "FORWARDED_FOR_HEADER"):
47 requestFactory = ProxyRequest
48
49 def __init__(self, path, *args, **kwargs):
50 root = RootResource()
51 kwargs["timeout"] = config.HTTP_REQUEST_TIMEOUT
52 server.Site.__init__(self, root, *args, **kwargs)
53 services = {}
54 services["StaticEngine"] = root.primaryChild = engines.StaticEngine(path)
55
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")
62 try:
63 register(engines.WebSocketEngine, "w")
64 except AttributeError:
65 pass
66 register(engines.FeedbackEngine, "feedback")
67 register(engines.AuthgateEngine, "auth")
68 register(engines.AdminEngine, "adminengine", services)
69
70 mimetypes.types_map[".ico"] = "image/vnd.microsoft.icon"