]> git.ipfire.org Git - ipfire.org.git/blame - src/web/__init__.py
donation: Check blacklist before allowing to access page
[ipfire.org.git] / src / web / __init__.py
CommitLineData
81675874 1#/usr/bin/python
2
feb02477 3import logging
401827c2 4import itertools
81675874 5import os.path
c01ad253 6import phonenumbers
e96e445b 7import phonenumbers.geocoder
81675874 8import tornado.locale
a49b5422 9import tornado.options
81675874 10import tornado.web
11
a95c2f97 12import ipfire
574a88c7 13import ipfire.countries
feb02477 14
11347e46 15from .handlers import *
81675874 16
08df6527 17from . import auth
12e5de7e 18from . import blog
f301d952 19from . import boot
c7bcb9ca 20from . import donate
e77cd04c 21from . import download
96c9bb79 22from . import fireinfo
699a0911 23from . import iuse
f5b01fc2 24from . import location
95483f04 25from . import mirrors
5613b94b 26from . import newsletter
a41085fb 27from . import nopaste
03706893 28from . import people
df6180a5 29from . import ui_modules
181d08f3 30from . import wiki
12e5de7e 31
81675874 32class Application(tornado.web.Application):
3e7c6ccd
MT
33 def __init__(self, config, **kwargs):
34 # Initialize backend
a95c2f97 35 self.backend = ipfire.Backend(config)
a6dc0bad 36
9ed02e3b
MT
37 settings = {
38 # Do not compress responses
39 "gzip" : False,
40
41 # Enable XSRF cookies
42 "xsrf_cookies" : True,
43
44 # Login
45 "login_url" : "/login",
46
47 # Setup directory structure
48 "static_path" : self.backend.config.get("global", "static_dir"),
49 "template_path" : self.backend.config.get("global", "templates_dir"),
50
eabe6b8d 51 # UI Methods
9ed02e3b 52 "ui_methods" : {
574a88c7 53 "format_country_name" : self.format_country_name,
6eddfb50 54 "format_language_name" : self.format_language_name,
e96e445b
MT
55 "format_month_name" : self.format_month_name,
56 "format_phone_number" : self.format_phone_number,
57 "format_phone_number_to_e164" : self.format_phone_number_to_e164,
58 "format_phone_number_location" : self.format_phone_number_location,
59 "grouper" : grouper,
cc3b928d 60 },
eabe6b8d
MT
61
62 # UI Modules
9ed02e3b 63 "ui_modules" : {
f5b01fc2 64 # Blog
7e64f6a3
MT
65 "BlogHistoryNavigation": blog.HistoryNavigationModule,
66 "BlogList" : blog.ListModule,
f91dfcc7 67 "BlogPost" : blog.PostModule,
8a897d25 68 "BlogPosts" : blog.PostsModule,
f91dfcc7 69
93feb275
MT
70 # Boot
71 "BootMenuConfig" : boot.MenuConfigModule,
72 "BootMenuHeader" : boot.MenuHeaderModule,
73 "BootMenuSeparator" : boot.MenuSeparatorModule,
74
eabe6b8d 75 # People
dbb0c109
MT
76 "AccountsList" : people.AccountsListModule,
77 "CDR" : people.CDRModule,
78 "Channels" : people.ChannelsModule,
68ece434 79 "MOS" : people.MOSModule,
b5e2077f 80 "Password" : people.PasswordModule,
dbb0c109 81 "Registrations" : people.RegistrationsModule,
7afd64bb 82 "SIPStatus" : people.SIPStatusModule,
917434b8 83
e1814f16
MT
84 # Nopaste
85 "Code" : nopaste.CodeModule,
86
23f0179e 87 # Fireinfo
96c9bb79 88 "FireinfoDeviceTable" : fireinfo.DeviceTableModule,
eabe6b8d
MT
89 "FireinfoDeviceAndGroupsTable"
90 : fireinfo.DeviceAndGroupsTableModule,
91
6ac7e934
MT
92 # Wiki
93 "WikiNavbar" : wiki.WikiNavbarModule,
f9db574a 94 "WikiList" : wiki.WikiListModule,
6ac7e934 95
eabe6b8d
MT
96 # Misc
97 "Map" : ui_modules.MapModule,
98 "ProgressBar" : ui_modules.ProgressBarModule,
81675874 99 },
3403dc5e
MT
100
101 # Call this when a page wasn't found
b22bc8e8 102 "default_handler_class" : base.NotFoundHandler,
9ed02e3b 103 }
9068dba1 104 settings.update(kwargs)
5cf160e0 105
ae0228e1
MT
106 tornado.web.Application.__init__(self, **settings)
107
66862195 108 authentication_handlers = [
08df6527
MT
109 (r"/login", auth.LoginHandler),
110 (r"/logout", auth.LogoutHandler),
66862195
MT
111 ]
112
399506a8 113 self.add_handlers(r"(dev|www)\.ipfire\.org", [
940227cb
MT
114 # Entry site that lead the user to index
115 (r"/", IndexHandler),
940227cb 116
81675874 117 # Download sites
60b0917c 118 (r"/downloads", tornado.web.RedirectHandler, { "url" : "/download" }),
e77cd04c
MT
119 (r"/download", download.IndexHandler),
120 (r"/download/([0-9a-z\-\.]+)", download.ReleaseHandler),
940227cb 121
e64ce07e 122 # Donate
c7bcb9ca
MT
123 (r"/donate", donate.DonateHandler),
124 (r"/donate/thank-you", donate.ThankYouHandler),
125 (r"/donate/error", donate.ErrorHandler),
e64ce07e 126 (r"/donation", tornado.web.RedirectHandler, { "url" : "/donate" }),
8d48f4ef 127
5613b94b
MT
128 # Newsletter
129 (r"/newsletter/subscribe", newsletter.SubscribeHandler),
130
de683d7c 131 # RSS feed
f0714277 132 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
7f9dbcc0
MT
133
134 # Redirect news articles to blog
d76ec66e 135 (r"/news/(.*)", handlers.NewsHandler),
de683d7c 136
45592df5 137 # Static Pages
84151dbf 138 (r"/chat", StaticHandler, { "template" : "chat.html" }),
45592df5 139 (r"/features", StaticHandler, { "template" : "features.html" }),
45592df5 140 (r"/legal", StaticHandler, { "template" : "legal.html" }),
00026d8b 141 (r"/support", StaticHandler, { "template" : "support.html" }),
45592df5 142
14cd4fa8
MT
143 # Handle old pages that have moved elsewhere
144 (r"/imprint", tornado.web.RedirectHandler, { "url" : "/legal" }),
3808b871 145 (r"/(de|en)/(.*)", LangCompatHandler),
37ed7c3c
MT
146
147 # Export arbitrary error pages
b22bc8e8 148 (r"/error/([45][0-9]{2})", base.ErrorHandler),
baa693a3
MT
149
150 # Block page
b22bc8e8 151 (r"/blocked", base.BlockedHandler),
940227cb
MT
152 ])
153
12e5de7e
MT
154 # blog.ipfire.org
155 self.add_handlers(r"blog(\.dev)?\.ipfire\.org", [
8a897d25 156 (r"/", blog.IndexHandler),
cfc0823a 157 (r"/authors/(\w+)", blog.AuthorHandler),
541c952b 158 (r"/compose", blog.ComposeHandler),
0b342a05 159 (r"/drafts", blog.DraftsHandler),
d17a2624 160 (r"/post/([0-9a-z\-\._]+)", blog.PostHandler),
914238a5 161 (r"/post/([0-9a-z\-\._]+)/delete", blog.DeleteHandler),
d17a2624
MT
162 (r"/post/([0-9a-z\-\._]+)/edit", blog.EditHandler),
163 (r"/post/([0-9a-z\-\._]+)/publish", blog.PublishHandler),
e6b18dce 164 (r"/search", blog.SearchHandler),
8d7487d2 165 (r"/tags/([0-9a-z\-\.]+)", blog.TagHandler),
7e64f6a3 166 (r"/years/([0-9]+)", blog.YearHandler),
f0714277
MT
167
168 # RSS Feed
169 (r"/feed.xml", blog.FeedHandler),
08df6527 170 ] + authentication_handlers)
12e5de7e 171
940227cb 172 # downloads.ipfire.org
80594ae3 173 self.add_handlers(r"downloads?(\.dev)?\.ipfire\.org", [
ed8116c7
MT
174 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
175 (r"/(.*)", download.FileHandler),
54af860e 176 ])
940227cb
MT
177
178 # mirrors.ipfire.org
8fceca0a 179 self.add_handlers(r"mirrors(\.dev)?\.ipfire\.org", [
95483f04
MT
180 (r"/", mirrors.IndexHandler),
181 (r"/mirrors/(.*)", mirrors.MirrorHandler),
3808b871 182 ])
940227cb 183
d0d074e0 184 # planet.ipfire.org
7cad1818 185 self.add_handlers(r"planet(\.dev)?\.ipfire\.org", [
3d4ce901 186 (r"/", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/" }),
d76ec66e
MT
187 (r"/post/([A-Za-z0-9_-]+)", handlers.PlanetPostHandler),
188 (r"/user/([a-z0-9_-]+)", handlers.PlanetUserHandler),
bcc3ed4d
MT
189
190 # RSS
f0714277 191 (r"/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
d76ec66e 192 (r"/user/([a-z0-9_-]+)/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
f0714277 193 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
3808b871 194 ])
d0d074e0 195
66862195 196 # fireinfo.ipfire.org
8fceca0a 197 self.add_handlers(r"fireinfo(\.dev)?\.ipfire\.org", [
96c9bb79 198 (r"/", fireinfo.IndexHandler),
8ab37e0b
MT
199
200 # Vendors
201 (r"/vendors", fireinfo.VendorsHandler),
202 (r"/vendors/(pci|usb)/([0-9a-f]{4})", fireinfo.VendorHandler),
66862195 203
1e3b2aad 204 # Driver
0cd21a36 205 (r"/drivers/(.*)", fireinfo.DriverDetail),
1e3b2aad 206
66862195 207 # Show profiles
96c9bb79 208 (r"/profile/random", fireinfo.RandomProfileHandler),
b84b407f 209 (r"/profile/([a-z0-9]{40})", fireinfo.ProfileHandler),
91a446f0 210
ed2e3c1f 211 # Stats
19518d6e 212 (r"/processors", fireinfo.ProcessorsHandler),
ed2e3c1f
MT
213 (r"/releases", fireinfo.ReleasesHandler),
214
19518d6e 215 # Send profiles
96c9bb79 216 (r"/send/([a-z0-9]+)", fireinfo.ProfileSendHandler),
3808b871 217 ])
5cf160e0 218
c37ec602 219 # i-use.ipfire.org
8fceca0a 220 self.add_handlers(r"i-use(\.dev)?\.ipfire\.org", [
e2f2865d 221 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
395c1ac0 222 (r"/profile/([a-f0-9]{40})/([0-9]+).png", iuse.ImageHandler),
c37ec602
MT
223 ])
224
8e2e1261
MT
225 # boot.ipfire.org
226 BOOT_STATIC_PATH = os.path.join(self.settings["static_path"], "netboot")
8fceca0a 227 self.add_handlers(r"boot(\.dev)?\.ipfire\.org", [
f301d952 228 (r"/", tornado.web.RedirectHandler, { "url" : "https://wiki.ipfire.org/installation/pxe" }),
8e2e1261
MT
229
230 # Configurations
f301d952
MT
231 (r"/premenu.cfg", boot.PremenuCfgHandler),
232 (r"/menu.gpxe", boot.MenuGPXEHandler),
233 (r"/menu.cfg", boot.MenuCfgHandler),
8e2e1261
MT
234
235 # Static files
37b5c0cf 236 (r"/(boot\.png|pxelinux\.0|menu\.c32|vesamenu\.c32)",
8e2e1261
MT
237 tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
238 ])
239
60024cc8 240 # nopaste.ipfire.org
8fceca0a 241 self.add_handlers(r"nopaste(\.dev)?\.ipfire\.org", [
a41085fb
MT
242 (r"/", nopaste.CreateHandler),
243 (r"/raw/(.*)", nopaste.RawHandler),
244 (r"/view/(.*)", nopaste.ViewHandler),
3808b871 245 ] + authentication_handlers)
60024cc8 246
f5b01fc2
MT
247 # location.ipfire.org
248 self.add_handlers(r"location(\.dev)?\.ipfire\.org", [
249 (r"/", location.IndexHandler),
2517822e 250 (r"/lookup/(.+)/blacklists", location.BlacklistsHandler),
f5b01fc2
MT
251 (r"/lookup/(.+)", location.LookupHandler),
252 ])
253
9068dba1 254 # geoip.ipfire.org
8fceca0a 255 self.add_handlers(r"geoip(\.dev)?\.ipfire\.org", [
f5b01fc2 256 (r"/", tornado.web.RedirectHandler, { "url" : "https://location.ipfire.org/" }),
3808b871 257 ])
9068dba1 258
66862195
MT
259 # talk.ipfire.org
260 self.add_handlers(r"talk(\.dev)?\.ipfire\.org", [
786e9ca8
MT
261 (r"/", tornado.web.RedirectHandler, { "url" : "https://people.ipfire.org/" }),
262 ])
66862195 263
03706893
MT
264 # people.ipfire.org
265 self.add_handlers(r"people(\.dev)?\.ipfire\.org", [
786e9ca8 266 (r"/", people.IndexHandler),
30aeccdb 267 (r"/conferences", people.ConferencesHandler),
786e9ca8
MT
268 (r"/search", people.SearchHandler),
269 (r"/users", people.UsersHandler),
270 (r"/users/(\w+)", people.UserHandler),
03706893 271 (r"/users/(\w+)\.jpg", people.AvatarHandler),
68ece434 272 (r"/users/(\w+)/calls/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})", people.CallHandler),
bdaf6b46 273 (r"/users/(\w+)/calls(?:/(\d{4}-\d{2}-\d{2}))?", people.CallsHandler),
e96e445b 274 (r"/users/(\w+)/edit", people.UserEditHandler),
3ea97943 275 (r"/users/(\w+)/passwd", people.UserPasswdHandler),
f4672785 276 (r"/users/(\w+)/ssh-keys", people.SSHKeysIndexHandler),
44b75370
MT
277 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)/delete", people.SSHKeysDeleteHandler),
278 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)", people.SSHKeysDownloadHandler),
0d1fb712 279 (r"/users/(\w+)/ssh-keys/upload", people.SSHKeysUploadHandler),
e0daee8f 280 (r"/users/(\w+)/sip", people.SIPHandler),
786e9ca8 281 ] + authentication_handlers)
2cd9af74 282
181d08f3
MT
283 # wiki.ipfire.org
284 self.add_handlers(r"wiki(\.dev)?\.ipfire\.org",
285 authentication_handlers + [
286
f9db574a
MT
287 # Handlers
288 (r"/recent\-changes", wiki.RecentChangesHandler),
181d08f3 289 (r"/search", wiki.SearchHandler),
f9db574a
MT
290
291 # Render pages
181d08f3
MT
292 (r"([A-Za-z0-9\-_\/]+)?", wiki.PageHandler),
293 ])
294
ae0228e1 295 # ipfire.org
45592df5 296 self.add_handlers(r"ipfire\.org", [
ba43a892 297 (r".*", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org" })
5cf160e0 298 ])
3add293a 299
feb02477
MT
300 logging.info("Successfully initialied application")
301
574a88c7
MT
302 def format_country_name(self, handler, country_code):
303 return ipfire.countries.get_name(country_code)
304
6eddfb50
MT
305 def format_language_name(self, handler, language):
306 _ = handler.locale.translate
307
308 if language == "de":
309 return _("German")
310 elif language == "en":
311 return _("English")
312 elif language == "es":
313 return _("Spanish")
314 elif language == "fr":
315 return _("French")
316 elif language == "it":
317 return _("Italian")
318 elif language == "nl":
319 return _("Dutch")
320 elif language == "pl":
321 return _("Polish")
322 elif language == "pt":
323 return _("Portuguese")
324 elif language == "ru":
325 return _("Russian")
326 elif language == "tr":
327 return _("Turkish")
328
329 return language
330
cc3b928d
MT
331 def format_month_name(self, handler, month):
332 _ = handler.locale.translate
333
334 if month == 1:
335 return _("January")
336 elif month == 2:
337 return _("February")
338 elif month == 3:
339 return _("March")
340 elif month == 4:
341 return _("April")
342 elif month == 5:
343 return _("May")
344 elif month == 6:
345 return _("June")
346 elif month == 7:
347 return _("July")
348 elif month == 8:
349 return _("August")
350 elif month == 9:
351 return _("September")
352 elif month == 10:
353 return _("October")
354 elif month == 11:
355 return _("November")
356 elif month == 12:
357 return _("December")
358
359 return month
401827c2 360
e96e445b
MT
361 def format_phone_number(self, handler, number):
362 if not isinstance(number, phonenumbers.PhoneNumber):
363 try:
01e73b0e 364 number = phonenumbers.parse(number, None)
e96e445b
MT
365 except phonenumbers.phonenumberutil.NumberParseException:
366 return number
c01ad253
MT
367
368 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
369
e96e445b
MT
370 def format_phone_number_to_e164(self, handler, number):
371 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.E164)
372
373 def format_phone_number_location(self, handler, number):
374 s = [
375 phonenumbers.geocoder.description_for_number(number, handler.locale.code),
376 phonenumbers.region_code_for_number(number),
377 ]
378
379 return ", ".join((e for e in s if e))
380
401827c2
MT
381
382def grouper(handler, iterator, n):
383 """
384 Returns groups of n from the iterator
385 """
386 i = iter(iterator)
387
388 while True:
389 ret = list(itertools.islice(i, 0, n))
390 if not ret:
391 break
392
393 yield ret