]>
git.ipfire.org Git - ipfire.org.git/blob - src/web/handlers_base.py
3 from __future__
import division
16 class BaseHandler(tornado
.web
.RequestHandler
):
19 def get_account(self
, uid
):
20 # Find the name of the author
21 return self
.accounts
.find(uid
)
25 # Remove the development prefix
26 return self
.request
.host
.replace(".dev.", ".")
31 "ssl_cipher" : self
.request
.headers
.get("X-Https-Cipher", None),
32 "ssl_protocol" : self
.request
.headers
.get("X-Https-Protocol", None),
36 def render_args(self
):
37 today
= datetime
.date
.today()
40 "format_size" : util
.format_size
,
41 "format_time" : util
.format_time
,
42 "hostname" : self
.hostname
,
43 "rss_url" : self
.rss_url
,
46 ret
.update(self
.ssl_params
)
50 def render(self
, *args
, **_kwargs
):
51 kwargs
= self
.render_args
52 kwargs
.update(_kwargs
)
53 tornado
.web
.RequestHandler
.render(self
, *args
, **kwargs
)
55 def render_string(self
, *args
, **_kwargs
):
56 kwargs
= self
.render_args
57 kwargs
.update(_kwargs
)
58 return tornado
.web
.RequestHandler
.render_string(self
, *args
, **kwargs
)
60 def get_remote_ip(self
):
61 # Fix for clients behind a proxy that sends "X-Forwarded-For".
62 remote_ips
= self
.request
.remote_ip
.split(", ")
64 for remote_ip
in remote_ips
:
66 addr
= ipaddr
.IPAddress(remote_ip
)
68 # Skip invalid IP addresses.
71 # Check if the given IP address is from a
78 # Return the last IP if nothing else worked
79 return remote_ips
.pop()
81 def get_remote_location(self
):
82 if not hasattr(self
, "__remote_location"):
83 remote_ip
= self
.get_remote_ip()
85 self
.__remote
_location
= self
.geoip
.get_location(remote_ip
)
87 return self
.__remote
_location
89 def get_argument_date(self
, arg
, *args
, **kwargs
):
90 value
= self
.get_argument(arg
, *args
, **kwargs
)
95 return dateutil
.parser
.parse(value
)
97 raise tornado
.web
.HTTPError(400)
101 def get_current_user(self
):
102 session_id
= self
.get_cookie("session_id")
106 # Get account from the session object
107 account
= self
.backend
.accounts
.get_by_session(session_id
, self
.request
.host
)
109 # If the account was not found or the session was not valid
110 # any more, we will remove the cookie.
112 self
.clear_cookie("session_id")
116 def login(self
, username
, password
):
118 account
= self
.backend
.accounts
.find_account(username
)
120 logging
.warning(401, "unknown account: %s" % username
)
124 if not account
.check_password(password
):
125 logging
.warning("invalid password for %s" % account
)
128 # User has logged in, create a session
129 session_id
, session_expires
= self
.backend
.accounts
.create_session(account
,
132 # Check if a new session was created
134 logging
.warning("Could not create session")
137 # Send session cookie to the client
138 self
.set_cookie("session_id", session_id
,
139 domain
=self
.request
.host
, expires
=session_expires
)
144 session_id
= self
.get_cookie("session_id")
149 success
= self
.backend
.accounts
.destroy_session(session_id
, self
.request
.host
)
151 self
.clear_cookie("session_id")
155 return self
.application
.backend
159 return self
.backend
.db
162 def advertisements(self
):
163 return self
.backend
.advertisements
167 return self
.backend
.accounts
171 return self
.backend
.downloads
175 return self
.backend
.fireinfo
179 return self
.backend
.iuse
183 return self
.backend
.memcache
187 return self
.backend
.mirrors
191 return self
.backend
.netboot
195 return self
.backend
.news
199 return self
.backend
.settings
203 return self
.backend
.releases
207 return self
.backend
.geoip
211 return self
.backend
.talk
215 return self
.backend
.tracker
219 return self
.backend
.planet
222 class LoginHandler(BaseHandler
):
224 self
.render("auth/login.html")
227 username
= self
.get_argument("username")
228 password
= self
.get_argument("password")
230 if not self
.login(username
, password
):
231 raise tornado
.web
.HTTPError(401)
233 next
= self
.get_argument("next", "/")
234 return self
.redirect(next
)
237 class LogoutHandler(BaseHandler
):
241 # Get back to the start page
245 class NotFoundHandler(BaseHandler
):
247 # Raises 404 as soon as it is called
248 raise tornado
.web
.HTTPError(404)
250 def write_error(self
, status_code
, **kwargs
):
251 assert status_code
== 404
253 self
.render("error-404.html")