]>
git.ipfire.org Git - ipfire.org.git/blob - webapp/handlers_base.py
9575a4b3d0fd29fa41fc2ea15759b72cdffa2caa
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" : backend
.util
.format_size
,
41 "format_time" : backend
.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 write_error(self
, status_code
, **kwargs
):
61 if status_code
in (404, 500):
64 "exception" : kwargs
.get("exception", None),
65 "message" : httplib
.responses
[status_code
],
67 self
.render("error-%s.html" % status_code
, **render_args
)
69 return tornado
.web
.RequestHandler
.write_error(self
, status_code
, **kwargs
)
71 def static_url(self
, path
, static
=True):
72 ret
= tornado
.web
.RequestHandler
.static_url(self
, path
)
74 if self
.settings
.get("debug", False):
78 return "//static.ipfire.org%s" % ret
82 def get_remote_ip(self
):
83 # Fix for clients behind a proxy that sends "X-Forwarded-For".
84 remote_ips
= self
.request
.remote_ip
.split(", ")
86 for remote_ip
in remote_ips
:
88 addr
= ipaddr
.IPAddress(remote_ip
)
90 # Skip invalid IP addresses.
93 # Check if the given IP address is from a
100 # Return the last IP if nothing else worked
101 return remote_ips
.pop()
103 def get_remote_location(self
):
104 if not hasattr(self
, "__remote_location"):
105 remote_ip
= self
.get_remote_ip()
107 self
.__remote
_location
= self
.geoip
.get_location(remote_ip
)
109 return self
.__remote
_location
111 def get_argument_date(self
, arg
, *args
, **kwargs
):
112 value
= self
.get_argument(arg
, *args
, **kwargs
)
117 return dateutil
.parser
.parse(value
)
119 raise tornado
.web
.HTTPError(400)
123 def get_current_user(self
):
124 session_id
= self
.get_cookie("session_id")
128 # Get account from the session object
129 account
= self
.backend
.accounts
.get_by_session(session_id
, self
.request
.host
)
131 # If the account was not found or the session was not valid
132 # any more, we will remove the cookie.
134 self
.clear_cookie("session_id")
138 def login(self
, username
, password
):
140 account
= self
.backend
.accounts
.find_account(username
)
142 logging
.warning(401, "unknown account: %s" % username
)
146 if not account
.check_password(password
):
147 logging
.warning("invalid password for %s" % account
)
150 # User has logged in, create a session
151 session_id
, session_expires
= self
.backend
.accounts
.create_session(account
,
154 # Check if a new session was created
156 logging
.warning("Could not create session")
159 # Send session cookie to the client
160 self
.set_cookie("session_id", session_id
,
161 domain
=self
.request
.host
, expires
=session_expires
)
166 session_id
= self
.get_cookie("session_id")
171 success
= self
.backend
.accounts
.destroy_session(session_id
, self
.request
.host
)
173 self
.clear_cookie("session_id")
177 return self
.application
.backend
181 return self
.backend
.db
184 def advertisements(self
):
185 return self
.backend
.advertisements
189 return self
.backend
.accounts
193 return self
.backend
.downloads
197 return self
.backend
.fireinfo
201 return self
.backend
.iuse
205 return self
.backend
.memcache
209 return self
.backend
.mirrors
213 return self
.backend
.netboot
217 return self
.backend
.news
221 return self
.backend
.settings
225 return self
.backend
.releases
229 return self
.backend
.geoip
233 return self
.backend
.talk
237 return self
.backend
.tracker
241 return self
.backend
.planet
244 class LoginHandler(BaseHandler
):
246 self
.render("auth/login.html")
249 username
= self
.get_argument("username")
250 password
= self
.get_argument("password")
252 if not self
.login(username
, password
):
253 raise tornado
.web
.HTTPError(401)
255 next
= self
.get_argument("next", "/")
256 return self
.redirect(next
)
259 class LogoutHandler(BaseHandler
):
263 # Get back to the start page