]>
Commit | Line | Data |
---|---|---|
940227cb MT |
1 | #!/usr/bin/python |
2 | ||
60024cc8 MT |
3 | from __future__ import division |
4 | ||
cc3b928d | 5 | import datetime |
66862195 MT |
6 | import dateutil.parser |
7 | import httplib | |
8 | import ipaddr | |
47ed77ed | 9 | import logging |
940227cb MT |
10 | import time |
11 | import tornado.locale | |
12 | import tornado.web | |
13 | ||
a95c2f97 | 14 | from .. import util |
60024cc8 | 15 | |
940227cb | 16 | class BaseHandler(tornado.web.RequestHandler): |
37ed7c3c MT |
17 | def write_error(self, status_code, **kwargs): |
18 | # Translate code into message | |
19 | try: | |
20 | message = httplib.responses[status_code] | |
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 |
161 | class 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 |
167 | class 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) |