]>
git.ipfire.org Git - ipfire.org.git/blob - src/web/base.py
13 from ..decorators
import *
16 def blacklisted(method
):
17 @tornado.gen
.coroutine
18 @functools.wraps(method
)
19 def wrapper(self
, *args
, **kwargs
):
20 # Check if remote is blacklisted
21 is_blacklisted
= yield self
.remote
.is_blacklisted()
23 # If so, redirect to the blocked page
25 logging
.warning("%s is blacklisted" % self
.remote
)
27 return self
.redirect("https://www.ipfire.org/blocked")
29 return method(self
, *args
, **kwargs
)
34 class BaseHandler(tornado
.web
.RequestHandler
):
35 def set_expires(self
, seconds
):
37 self
.add_header("Cache-Control", "max-age=%s, must-revalidate" % seconds
)
40 expires
= datetime
.datetime
.utcnow() + datetime
.timedelta(seconds
=seconds
)
41 self
.add_header("Expires", expires
)
43 def write_error(self
, status_code
, **kwargs
):
44 # Translate code into message
46 message
= http
.client
.responses
[status_code
]
50 self
.render("error.html", status_code
=status_code
, message
=message
, **kwargs
)
52 def xsrf_form_html(self
, *args
, **kwargs
):
53 # Set Vary: Cookie header
54 self
.add_header("Vary", "Cookie")
56 return super().xsrf_form_html(*args
, **kwargs
)
60 # Remove the development prefix
61 return self
.request
.host
.replace(".dev.", ".")
63 def get_template_namespace(self
):
64 ns
= tornado
.web
.RequestHandler
.get_template_namespace(self
)
66 now
= datetime
.date
.today()
69 "backend" : self
.backend
,
70 "debug" : self
.application
.settings
.get("debug", False),
71 "format_size" : util
.format_size
,
72 "format_time" : util
.format_time
,
73 "hostname" : self
.hostname
,
80 def get_remote_ip(self
):
81 # Fix for clients behind a proxy that sends "X-Forwarded-For".
82 remote_ips
= self
.request
.remote_ip
.split(", ")
84 for remote_ip
in remote_ips
:
86 addr
= ipaddress
.ip_address(remote_ip
)
88 # Skip invalid IP addresses.
91 # Check if the given IP address is from a
98 # Return the last IP if nothing else worked
99 return remote_ips
.pop()
103 address
= self
.get_remote_ip()
106 return self
.backend
.geoip
.lookup(address
)
109 def current_country_code(self
):
110 remote_ip
= self
.get_remote_ip()
113 return self
.backend
.geoip
.get_country(remote_ip
)
115 def get_remote_location(self
):
116 if not hasattr(self
, "__remote_location"):
117 remote_ip
= self
.get_remote_ip()
119 self
.__remote
_location
= self
.geoip
.get_location(remote_ip
)
121 return self
.__remote
_location
123 def get_argument_int(self
, *args
, **kwargs
):
124 arg
= self
.get_argument(*args
, **kwargs
)
126 if arg
is None or arg
== "":
132 raise tornado
.web
.HTTPError(400)
134 def get_argument_date(self
, arg
, *args
, **kwargs
):
135 value
= self
.get_argument(arg
, *args
, **kwargs
)
140 return dateutil
.parser
.parse(value
)
142 raise tornado
.web
.HTTPError(400)
144 def get_file(self
, name
):
146 file = self
.request
.files
[name
][0]
148 return file["filename"], file["body"], file["content_type"]
154 def get_current_user(self
):
155 session_id
= self
.get_cookie("session_id")
159 # Get account from the session object
160 account
= self
.backend
.accounts
.get_by_session(session_id
, self
.request
.host
)
162 # If the account was not found or the session was not valid
163 # any more, we will remove the cookie.
165 self
.clear_cookie("session_id")
171 return self
.application
.backend
175 return self
.backend
.db
179 return self
.backend
.accounts
183 return self
.backend
.downloads
187 return self
.backend
.fireinfo
191 return self
.backend
.iuse
195 return self
.backend
.memcache
199 return self
.backend
.mirrors
203 return self
.backend
.netboot
207 return self
.backend
.releases
211 return self
.backend
.geoip
215 return self
.backend
.talk
218 class NotFoundHandler(BaseHandler
):
220 # Raises 404 as soon as it is called
221 raise tornado
.web
.HTTPError(404)
224 class ErrorHandler(BaseHandler
):
226 Raises any error we want
232 raise tornado
.web
.HTTPError(400)
234 raise tornado
.web
.HTTPError(code
)
237 class BlockedHandler(BaseHandler
):
242 self
.render("static/blocked.html", address
=self
.get_remote_ip())