]>
jfr.im git - irc/quakenet/qwebirc.git/blob - 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
10 class RootResource(resource
.Resource
):
11 def getChild(self
, name
, request
):
14 return self
.primaryChild
.getChild(name
, request
)
16 class HTTPChannel(http
.HTTPChannel
, TimeoutMixin
):
19 class ProxyRequest(server
.Request
):
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
)
21 def validIP(self
, ip
):
22 m
= self
.ip_re
.match(ip
)
27 def getClientIP(self
):
28 real_ip
= http
.Request
.getClientIP(self
)
29 if real_ip
not in config
.FORWARDED_FOR_IPS
:
32 fake_ips
= self
.getHeader(config
.FORWARDED_FOR_HEADER
)
36 fake_ip
= fake_ips
.split(",")[-1].strip()
37 if not self
.validIP(fake_ip
):
42 class RootSite(server
.Site
):
43 protocol
= HTTPChannel
45 if hasattr(config
, "FORWARDED_FOR_HEADER"):
46 requestFactory
= ProxyRequest
48 def __init__(self
, path
, *args
, **kwargs
):
50 server
.Site
.__init
__(self
, root
, *args
, **kwargs
)
53 services
["StaticEngine"] = root
.primaryChild
= engines
.StaticEngine(path
)
55 def register(service
, path
, *args
, **kwargs
):
56 sobj
= service("/" + path
, *args
, **kwargs
)
57 services
[service
.__name
__] = sobj
58 root
.putChild(path
, sobj
)
60 register(engines
.AJAXEngine
, "e")
62 register(engines
.WebSocketEngine
, "w")
63 except AttributeError:
65 register(engines
.FeedbackEngine
, "feedback")
66 register(engines
.AuthgateEngine
, "auth")
67 register(engines
.AdminEngine
, "adminengine", services
)
69 mimetypes
.types_map
[".ico"] = "image/vnd.microsoft.icon"