]>
Commit | Line | Data |
---|---|---|
1 | from twisted.web import resource, server, static, http | |
2 | from twisted.internet import error, reactor | |
3 | import engines | |
4 | import mimetypes | |
5 | import config | |
6 | import sigdebug | |
7 | import re | |
8 | ||
9 | class RootResource(resource.Resource): | |
10 | def getChild(self, name, request): | |
11 | if name == "": | |
12 | name = "qui.html" | |
13 | return self.primaryChild.getChild(name, request) | |
14 | ||
15 | class ProxyRequest(server.Request): | |
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) | |
17 | def validIP(self, ip): | |
18 | m = self.ip_re.match(ip) | |
19 | if m is None: | |
20 | return False | |
21 | return True | |
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 | ||
38 | class RootSite(server.Site): | |
39 | protocol = http.HTTPChannel | |
40 | ||
41 | if hasattr(config, "FORWARDED_FOR_HEADER"): | |
42 | requestFactory = ProxyRequest | |
43 | ||
44 | def __init__(self, path): | |
45 | root = RootResource() | |
46 | server.Site.__init__(self, root, timeout=5) | |
47 | services = {} | |
48 | services["StaticEngine"] = root.primaryChild = engines.StaticEngine(path) | |
49 | ||
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") | |
56 | try: | |
57 | register(engines.WebSocketEngine, "w") | |
58 | except AttributeError: | |
59 | pass | |
60 | register(engines.FeedbackEngine, "feedback") | |
61 | register(engines.AuthgateEngine, "auth") | |
62 | register(engines.AdminEngine, "adminengine", services) | |
63 | ||
64 | mimetypes.types_map[".ico"] = "image/vnd.microsoft.icon" |