]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - webapp/handlers_base.py
Merge branch 'master' of ssh://git.ipfire.org/pub/git/ipfire.org
[people/shoehn/ipfire.org.git] / webapp / handlers_base.py
CommitLineData
940227cb
MT
1#!/usr/bin/python
2
60024cc8
MT
3from __future__ import division
4
cc3b928d 5import datetime
66862195
MT
6import dateutil.parser
7import httplib
8import ipaddr
47ed77ed 9import logging
940227cb
MT
10import time
11import tornado.locale
12import tornado.web
13
66862195 14import backend.util
60024cc8 15
940227cb 16class BaseHandler(tornado.web.RequestHandler):
de683d7c
MT
17 rss_url = None
18
940227cb
MT
19 def get_account(self, uid):
20 # Find the name of the author
21 return self.accounts.find(uid)
22
60024cc8 23 def get_user_locale(self):
45c763aa 24 # The planet is always in english.
4ca1a601 25 if self.hostname == "planet.ipfire.org":
dbf95cf2 26 return tornado.locale.get("en_US")
45c763aa 27
dbf95cf2
MT
28 # Otherwise take the browser locale.
29 return self.get_browser_locale()
940227cb 30
4ca1a601
MT
31 @property
32 def hostname(self):
33 # Remove the development prefix
34 return self.request.host.replace(".dev.", ".")
35
940227cb
MT
36 @property
37 def render_args(self):
cc3b928d
MT
38 today = datetime.date.today()
39
940227cb 40 return {
66862195
MT
41 "format_size" : backend.util.format_size,
42 "format_time" : backend.util.format_time,
4ca1a601 43 "hostname" : self.hostname,
940227cb 44 "lang" : self.locale.code[:2],
de683d7c 45 "rss_url" : self.rss_url,
cc3b928d 46 "year" : today.year,
940227cb
MT
47 }
48
bcc3ed4d
MT
49 def render(self, *args, **_kwargs):
50 kwargs = self.render_args
51 kwargs.update(_kwargs)
940227cb
MT
52 tornado.web.RequestHandler.render(self, *args, **kwargs)
53
bcc3ed4d
MT
54 def render_string(self, *args, **_kwargs):
55 kwargs = self.render_args
56 kwargs.update(_kwargs)
940227cb
MT
57 return tornado.web.RequestHandler.render_string(self, *args, **kwargs)
58
02f2d7fe 59 def write_error(self, status_code, **kwargs):
940227cb
MT
60 if status_code in (404, 500):
61 render_args = ({
62 "code" : status_code,
63 "exception" : kwargs.get("exception", None),
64 "message" : httplib.responses[status_code],
65 })
02f2d7fe 66 self.render("error-%s.html" % status_code, **render_args)
940227cb 67 else:
02f2d7fe 68 return tornado.web.RequestHandler.write_error(self, status_code, **kwargs)
940227cb 69
3d540c40
MT
70 def static_url(self, path, static=True):
71 ret = tornado.web.RequestHandler.static_url(self, path)
72
1de8dd23
MT
73 if self.settings.get("debug", False):
74 return ret
75
76 elif self.request.host == "admin.ipfire.org":
77 return ret
78
79 elif static:
80 return "http://static.ipfire.org%s" % ret
3d540c40
MT
81
82 return ret
83
9068dba1
MT
84 def get_remote_ip(self):
85 # Fix for clients behind a proxy that sends "X-Forwarded-For".
66862195
MT
86 remote_ips = self.request.remote_ip.split(", ")
87 for remote_ip in remote_ips:
88 try:
89 addr = ipaddr.IPAddress(remote_ip)
90 except ValueError:
91 # Skip invalid IP addresses.
92 continue
9068dba1 93
66862195
MT
94 # Check if the given IP address is from a
95 # private network.
96 if addr.is_private:
97 continue
9068dba1 98
66862195 99 return remote_ip
9068dba1
MT
100
101 def get_remote_location(self):
102 if not hasattr(self, "__remote_location"):
103 remote_ip = self.get_remote_ip()
104
105 self.__remote_location = self.geoip.get_location(remote_ip)
106
107 return self.__remote_location
108
66862195
MT
109 def get_argument_date(self, arg, *args, **kwargs):
110 value = self.get_argument(arg, *args, **kwargs)
111 if value is None:
112 return
113
114 try:
115 return dateutil.parser.parse(value)
116 except ValueError:
117 raise tornado.web.HTTPError(400)
118
119 # Login stuff
120
121 def get_current_user(self):
122 session_id = self.get_cookie("session_id")
123 if not session_id:
124 return
125
126 # Get account from the session object
127 account = self.backend.accounts.get_by_session(session_id, self.request.host)
128
129 # If the account was not found or the session was not valid
130 # any more, we will remove the cookie.
131 if not account:
132 self.clear_cookie("session_id")
133
134 return account
135
136 def login(self, username, password):
137 # Find account
138 account = self.backend.accounts.find_account(username)
139 if not account:
140 logging.warning(401, "unknown account: %s" % username)
141 return False
142
143 # Check credentials
144 if not account.check_password(password):
145 logging.warning("invalid password for %s" % account)
146 return False
147
148 # User has logged in, create a session
149 session_id, session_expires = self.backend.accounts.create_session(account,
150 self.request.host)
151
152 # Check if a new session was created
153 if not session_id:
154 logging.warning("Could not create session")
155 return False
156
157 # Send session cookie to the client
158 self.set_cookie("session_id", session_id,
159 domain=self.request.host, expires=session_expires)
160
161 return True
162
163 def logout(self):
164 session_id = self.get_cookie("session_id")
165
166 if not session_id:
167 return
168
169 success = self.backend.accounts.destroy_session(session_id, self.request.host)
170 if success:
171 self.clear_cookie("session_id")
172
a6dc0bad
MT
173 @property
174 def backend(self):
175 return self.application.backend
176
9068dba1
MT
177 @property
178 def db(self):
179 return self.backend.db
180
a0048e66
MT
181 @property
182 def advertisements(self):
9068dba1 183 return self.backend.advertisements
a0048e66 184
940227cb
MT
185 @property
186 def accounts(self):
a6dc0bad 187 return self.backend.accounts
940227cb
MT
188
189 @property
9068dba1
MT
190 def downloads(self):
191 return self.backend.downloads
192
66862195
MT
193 @property
194 def fireinfo(self):
195 return self.backend.fireinfo
196
9068dba1
MT
197 @property
198 def iuse(self):
199 return self.backend.iuse
940227cb 200
b3250465
MT
201 @property
202 def memcached(self):
9068dba1 203 return self.backend.memcache
b3250465 204
940227cb
MT
205 @property
206 def mirrors(self):
9068dba1
MT
207 return self.backend.mirrors
208
209 @property
210 def netboot(self):
211 return self.backend.netboot
940227cb
MT
212
213 @property
214 def news(self):
9068dba1 215 return self.backend.news
940227cb
MT
216
217 @property
218 def config(self):
9068dba1 219 return self.backend.settings
940227cb
MT
220
221 @property
222 def releases(self):
9068dba1 223 return self.backend.releases
940227cb
MT
224
225 @property
9068dba1
MT
226 def geoip(self):
227 return self.backend.geoip
940227cb
MT
228
229 @property
66862195
MT
230 def talk(self):
231 return self.backend.talk
940227cb
MT
232
233 @property
234 def tracker(self):
9068dba1 235 return self.backend.tracker
bcc3ed4d
MT
236
237 @property
238 def planet(self):
a6dc0bad 239 return self.backend.planet
7771acea
MT
240
241 @property
242 def wishlist(self):
9068dba1 243 return self.backend.wishlist
66862195
MT
244
245
246class LoginHandler(BaseHandler):
247 def get(self):
248 self.render("auth/login.html")
249
250 def post(self):
251 username = self.get_argument("username")
252 password = self.get_argument("password")
253
254 if not self.login(username, password):
255 raise tornado.web.HTTPError(401)
256
257 next = self.get_argument("next", "/")
258 return self.redirect(next)
259
260
261class LogoutHandler(BaseHandler):
262 def get(self):
263 self.logout()
264
265 # Get back to the start page
266 self.redirect("/")