]>
jfr.im git - irc/quakenet/qwebirc.git/blob - qwebirc/root.py
1 from twisted
.web
import resource
, server
, static
, http
2 from twisted
.internet
import error
, reactor
9 class RootResource(resource
.Resource
):
10 def getChild(self
, name
, request
):
13 return self
.primaryChild
.getChild(name
, request
)
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
)
23 def getClientIP(self
):
24 real_ip
= http
.Request
.getClientIP(self
)
25 if real_ip
not in config
.FORWARDED_FOR_IPS
:
28 fake_ips
= self
.getHeader(config
.FORWARDED_FOR_HEADER
)
32 fake_ip
= fake_ips
.split(",")[-1].strip()
33 if not self
.validIP(fake_ip
):
38 class RootSite(server
.Site
):
39 protocol
= http
.HTTPChannel
41 if hasattr(config
, "FORWARDED_FOR_HEADER"):
42 requestFactory
= ProxyRequest
44 def __init__(self
, path
):
46 server
.Site
.__init
__(self
, root
, timeout
=5)
48 services
["StaticEngine"] = root
.primaryChild
= engines
.StaticEngine(path
)
50 def register(service
, path
, *args
, **kwargs
):
51 sobj
= service("/" + path
, *args
, **kwargs
)
52 services
[service
.__name
__] = sobj
53 root
.putChild(path
, sobj
)
55 register(engines
.AJAXEngine
, "e")
57 register(engines
.WebSocketEngine
, "w")
58 except AttributeError:
60 register(engines
.FeedbackEngine
, "feedback")
61 register(engines
.AuthgateEngine
, "auth")
62 register(engines
.AdminEngine
, "adminengine", services
)
64 mimetypes
.types_map
[".ico"] = "image/vnd.microsoft.icon"