]> jfr.im git - irc/quakenet/qwebirc.git/blame - qwebirc/root.py
don't increase sequence number when sending empty response... but still send one
[irc/quakenet/qwebirc.git] / qwebirc / root.py
CommitLineData
1d924d97
CP
1from twisted.web import resource, server, static, http
2from twisted.internet import error, reactor
85f01e3f 3import engines
85f01e3f 4import mimetypes
1d924d97 5import config
e44c9cdc 6import sigdebug
23f85e9b 7import re
9e769c12
CP
8
9class RootResource(resource.Resource):
d65fe45f
CP
10 def getChild(self, name, request):
11 if name == "":
2b8e1a88 12 name = "qui.html"
d65fe45f
CP
13 return self.primaryChild.getChild(name, request)
14
23f85e9b 15class ProxyRequest(server.Request):
133b7132 16 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
17 def validIP(self, ip):
18 m = self.ip_re.match(ip)
19 if m is None:
20 return False
133b7132 21 return True
23f85e9b
CP
22
23 def getClientIP(self):
24 real_ip = http.Request.getClientIP(self)
25 if real_ip not in config.FORWARDED_FOR_IPS:
26 return real_ip
27
28 fake_ips = self.getHeader(config.FORWARDED_FOR_HEADER)
29 if fake_ips is None:
30 return real_ip
31
32 fake_ip = fake_ips.split(",")[-1].strip()
33 if not self.validIP(fake_ip):
34 return real_ip
35
36 return fake_ip
37
9e769c12 38class RootSite(server.Site):
9463277c
CP
39 protocol = http.HTTPChannel
40
23f85e9b
CP
41 if hasattr(config, "FORWARDED_FOR_HEADER"):
42 requestFactory = ProxyRequest
43
9463277c 44 def __init__(self, path):
d65fe45f 45 root = RootResource()
9463277c 46 server.Site.__init__(self, root, timeout=5)
85f01e3f
CP
47 services = {}
48 services["StaticEngine"] = root.primaryChild = engines.StaticEngine(path)
28c8008e 49
85f01e3f
CP
50 def register(service, path, *args, **kwargs):
51 sobj = service("/" + path, *args, **kwargs)
52 services[service.__name__] = sobj
53 root.putChild(path, sobj)
54
55 register(engines.AJAXEngine, "e")
c60795d6
CP
56 try:
57 register(engines.WebSocketEngine, "w")
58 except AttributeError:
59 pass
85f01e3f
CP
60 register(engines.FeedbackEngine, "feedback")
61 register(engines.AuthgateEngine, "auth")
62 register(engines.AdminEngine, "adminengine", services)
63
28c8008e 64mimetypes.types_map[".ico"] = "image/vnd.microsoft.icon"