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