]> git.ipfire.org Git - ipfire.org.git/blame - src/web/handlers_base.py
people: Add page to edit user accounts
[ipfire.org.git] / src / web / handlers_base.py
CommitLineData
940227cb
MT
1#!/usr/bin/python
2
cc3b928d 3import datetime
66862195 4import dateutil.parser
11347e46 5import http.client
a69e87a1 6import ipaddress
47ed77ed 7import logging
940227cb
MT
8import time
9import tornado.locale
10import tornado.web
11
a95c2f97 12from .. import util
60024cc8 13
940227cb 14class BaseHandler(tornado.web.RequestHandler):
b592d7c8
MT
15 def prepare(self):
16 # Mark this as private when someone is logged in
17 if self.current_user:
18 self.add_header("Cache-Control", "private")
19
f6ed3d4d
MT
20 def set_expires(self, seconds):
21 # For HTTP/1.1
b592d7c8 22 self.add_header("Cache-Control", "max-age=%s, must-revalidate" % seconds)
f6ed3d4d
MT
23
24 # For HTTP/1.0
25 expires = datetime.datetime.utcnow() + datetime.timedelta(seconds=seconds)
b592d7c8 26 self.add_header("Expires", expires)
f6ed3d4d 27
37ed7c3c
MT
28 def write_error(self, status_code, **kwargs):
29 # Translate code into message
30 try:
11347e46 31 message = http.client.responses[status_code]
37ed7c3c
MT
32 except KeyError:
33 message = None
34
35 self.render("error.html", status_code=status_code, message=message, **kwargs)
36
4ca1a601
MT
37 @property
38 def hostname(self):
39 # Remove the development prefix
40 return self.request.host.replace(".dev.", ".")
41
bff08cb0
MT
42 def get_template_namespace(self):
43 ns = tornado.web.RequestHandler.get_template_namespace(self)
44
911064cf 45 now = datetime.date.today()
cc3b928d 46
bff08cb0 47 ns.update({
5613b94b 48 "debug" : self.application.settings.get("debug", False),
a95c2f97
MT
49 "format_size" : util.format_size,
50 "format_time" : util.format_time,
4ca1a601 51 "hostname" : self.hostname,
911064cf
MT
52 "now" : now,
53 "year" : now.year,
bff08cb0 54 })
940227cb 55
bff08cb0 56 return ns
940227cb 57
9068dba1
MT
58 def get_remote_ip(self):
59 # Fix for clients behind a proxy that sends "X-Forwarded-For".
66862195 60 remote_ips = self.request.remote_ip.split(", ")
494d80e6 61
66862195
MT
62 for remote_ip in remote_ips:
63 try:
a69e87a1 64 addr = ipaddress.ip_address(remote_ip)
66862195
MT
65 except ValueError:
66 # Skip invalid IP addresses.
67 continue
9068dba1 68
66862195
MT
69 # Check if the given IP address is from a
70 # private network.
71 if addr.is_private:
72 continue
9068dba1 73
66862195 74 return remote_ip
9068dba1 75
494d80e6
MT
76 # Return the last IP if nothing else worked
77 return remote_ips.pop()
78
9068dba1
MT
79 def get_remote_location(self):
80 if not hasattr(self, "__remote_location"):
81 remote_ip = self.get_remote_ip()
82
83 self.__remote_location = self.geoip.get_location(remote_ip)
84
85 return self.__remote_location
86
bd2723d4
MT
87 def get_argument_int(self, *args, **kwargs):
88 arg = self.get_argument(*args, **kwargs)
89
90 if arg is None or arg == "":
91 return
92
93 try:
94 return int(arg)
95 except ValueError:
96 raise tornado.web.HTTPError(400)
97
66862195
MT
98 def get_argument_date(self, arg, *args, **kwargs):
99 value = self.get_argument(arg, *args, **kwargs)
100 if value is None:
101 return
102
103 try:
104 return dateutil.parser.parse(value)
105 except ValueError:
106 raise tornado.web.HTTPError(400)
107
108 # Login stuff
109
110 def get_current_user(self):
111 session_id = self.get_cookie("session_id")
112 if not session_id:
113 return
114
115 # Get account from the session object
116 account = self.backend.accounts.get_by_session(session_id, self.request.host)
117
118 # If the account was not found or the session was not valid
119 # any more, we will remove the cookie.
120 if not account:
121 self.clear_cookie("session_id")
122
123 return account
124
a6dc0bad
MT
125 @property
126 def backend(self):
127 return self.application.backend
128
9068dba1
MT
129 @property
130 def db(self):
131 return self.backend.db
132
940227cb
MT
133 @property
134 def accounts(self):
a6dc0bad 135 return self.backend.accounts
940227cb
MT
136
137 @property
9068dba1
MT
138 def downloads(self):
139 return self.backend.downloads
140
66862195
MT
141 @property
142 def fireinfo(self):
143 return self.backend.fireinfo
144
9068dba1
MT
145 @property
146 def iuse(self):
147 return self.backend.iuse
940227cb
MT
148
149 @property
150 def mirrors(self):
9068dba1
MT
151 return self.backend.mirrors
152
153 @property
154 def netboot(self):
155 return self.backend.netboot
940227cb 156
940227cb
MT
157 @property
158 def releases(self):
9068dba1 159 return self.backend.releases
940227cb
MT
160
161 @property
9068dba1
MT
162 def geoip(self):
163 return self.backend.geoip
940227cb
MT
164
165 @property
66862195
MT
166 def talk(self):
167 return self.backend.talk
940227cb 168
66862195 169
3403dc5e
MT
170class NotFoundHandler(BaseHandler):
171 def prepare(self):
172 # Raises 404 as soon as it is called
173 raise tornado.web.HTTPError(404)
174
3403dc5e 175
37ed7c3c
MT
176class ErrorHandler(BaseHandler):
177 """
178 Raises any error we want
179 """
180 def get(self, code):
181 try:
182 code = int(code)
183 except:
184 raise tornado.web.HTTPError(400)
185
186 raise tornado.web.HTTPError(code)