]> git.ipfire.org Git - ipfire.org.git/blame - src/web/__init__.py
wiki: Fix typo
[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 174 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
5cf65b4f 175 (r"/release/(.*)", download.ReleaseRedirectHandler),
ed8116c7 176 (r"/(.*)", download.FileHandler),
54af860e 177 ])
940227cb
MT
178
179 # mirrors.ipfire.org
8fceca0a 180 self.add_handlers(r"mirrors(\.dev)?\.ipfire\.org", [
95483f04
MT
181 (r"/", mirrors.IndexHandler),
182 (r"/mirrors/(.*)", mirrors.MirrorHandler),
3808b871 183 ])
940227cb 184
d0d074e0 185 # planet.ipfire.org
7cad1818 186 self.add_handlers(r"planet(\.dev)?\.ipfire\.org", [
3d4ce901 187 (r"/", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/" }),
d76ec66e
MT
188 (r"/post/([A-Za-z0-9_-]+)", handlers.PlanetPostHandler),
189 (r"/user/([a-z0-9_-]+)", handlers.PlanetUserHandler),
bcc3ed4d
MT
190
191 # RSS
f0714277 192 (r"/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
d76ec66e 193 (r"/user/([a-z0-9_-]+)/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
f0714277 194 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
3808b871 195 ])
d0d074e0 196
66862195 197 # fireinfo.ipfire.org
8fceca0a 198 self.add_handlers(r"fireinfo(\.dev)?\.ipfire\.org", [
96c9bb79 199 (r"/", fireinfo.IndexHandler),
8ab37e0b
MT
200
201 # Vendors
202 (r"/vendors", fireinfo.VendorsHandler),
203 (r"/vendors/(pci|usb)/([0-9a-f]{4})", fireinfo.VendorHandler),
66862195 204
1e3b2aad 205 # Driver
0cd21a36 206 (r"/drivers/(.*)", fireinfo.DriverDetail),
1e3b2aad 207
66862195 208 # Show profiles
96c9bb79 209 (r"/profile/random", fireinfo.RandomProfileHandler),
b84b407f 210 (r"/profile/([a-z0-9]{40})", fireinfo.ProfileHandler),
91a446f0 211
ed2e3c1f 212 # Stats
19518d6e 213 (r"/processors", fireinfo.ProcessorsHandler),
ed2e3c1f
MT
214 (r"/releases", fireinfo.ReleasesHandler),
215
19518d6e 216 # Send profiles
96c9bb79 217 (r"/send/([a-z0-9]+)", fireinfo.ProfileSendHandler),
3808b871 218 ])
5cf160e0 219
c37ec602 220 # i-use.ipfire.org
8fceca0a 221 self.add_handlers(r"i-use(\.dev)?\.ipfire\.org", [
e2f2865d 222 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
395c1ac0 223 (r"/profile/([a-f0-9]{40})/([0-9]+).png", iuse.ImageHandler),
c37ec602
MT
224 ])
225
8e2e1261
MT
226 # boot.ipfire.org
227 BOOT_STATIC_PATH = os.path.join(self.settings["static_path"], "netboot")
8fceca0a 228 self.add_handlers(r"boot(\.dev)?\.ipfire\.org", [
f301d952 229 (r"/", tornado.web.RedirectHandler, { "url" : "https://wiki.ipfire.org/installation/pxe" }),
8e2e1261
MT
230
231 # Configurations
f301d952
MT
232 (r"/premenu.cfg", boot.PremenuCfgHandler),
233 (r"/menu.gpxe", boot.MenuGPXEHandler),
234 (r"/menu.cfg", boot.MenuCfgHandler),
8e2e1261
MT
235
236 # Static files
37b5c0cf 237 (r"/(boot\.png|pxelinux\.0|menu\.c32|vesamenu\.c32)",
8e2e1261
MT
238 tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
239 ])
240
60024cc8 241 # nopaste.ipfire.org
8fceca0a 242 self.add_handlers(r"nopaste(\.dev)?\.ipfire\.org", [
a41085fb
MT
243 (r"/", nopaste.CreateHandler),
244 (r"/raw/(.*)", nopaste.RawHandler),
245 (r"/view/(.*)", nopaste.ViewHandler),
3808b871 246 ] + authentication_handlers)
60024cc8 247
f5b01fc2
MT
248 # location.ipfire.org
249 self.add_handlers(r"location(\.dev)?\.ipfire\.org", [
250 (r"/", location.IndexHandler),
2517822e 251 (r"/lookup/(.+)/blacklists", location.BlacklistsHandler),
f5b01fc2
MT
252 (r"/lookup/(.+)", location.LookupHandler),
253 ])
254
9068dba1 255 # geoip.ipfire.org
8fceca0a 256 self.add_handlers(r"geoip(\.dev)?\.ipfire\.org", [
f5b01fc2 257 (r"/", tornado.web.RedirectHandler, { "url" : "https://location.ipfire.org/" }),
3808b871 258 ])
9068dba1 259
66862195
MT
260 # talk.ipfire.org
261 self.add_handlers(r"talk(\.dev)?\.ipfire\.org", [
786e9ca8
MT
262 (r"/", tornado.web.RedirectHandler, { "url" : "https://people.ipfire.org/" }),
263 ])
66862195 264
03706893
MT
265 # people.ipfire.org
266 self.add_handlers(r"people(\.dev)?\.ipfire\.org", [
786e9ca8 267 (r"/", people.IndexHandler),
d8a15b2e 268 (r"/activate/(\w+)/(\w+)", auth.ActivateHandler),
30aeccdb 269 (r"/conferences", people.ConferencesHandler),
f32dd17f 270 (r"/register", auth.RegisterHandler),
786e9ca8
MT
271 (r"/search", people.SearchHandler),
272 (r"/users", people.UsersHandler),
273 (r"/users/(\w+)", people.UserHandler),
03706893 274 (r"/users/(\w+)\.jpg", people.AvatarHandler),
68ece434 275 (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 276 (r"/users/(\w+)/calls(?:/(\d{4}-\d{2}-\d{2}))?", people.CallsHandler),
e96e445b 277 (r"/users/(\w+)/edit", people.UserEditHandler),
3ea97943 278 (r"/users/(\w+)/passwd", people.UserPasswdHandler),
f4672785 279 (r"/users/(\w+)/ssh-keys", people.SSHKeysIndexHandler),
44b75370
MT
280 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)/delete", people.SSHKeysDeleteHandler),
281 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)", people.SSHKeysDownloadHandler),
0d1fb712 282 (r"/users/(\w+)/ssh-keys/upload", people.SSHKeysUploadHandler),
e0daee8f 283 (r"/users/(\w+)/sip", people.SIPHandler),
786e9ca8 284 ] + authentication_handlers)
2cd9af74 285
181d08f3
MT
286 # wiki.ipfire.org
287 self.add_handlers(r"wiki(\.dev)?\.ipfire\.org",
288 authentication_handlers + [
289
f9db574a
MT
290 # Handlers
291 (r"/recent\-changes", wiki.RecentChangesHandler),
181d08f3 292 (r"/search", wiki.SearchHandler),
f9db574a
MT
293
294 # Render pages
181d08f3
MT
295 (r"([A-Za-z0-9\-_\/]+)?", wiki.PageHandler),
296 ])
297
ae0228e1 298 # ipfire.org
45592df5 299 self.add_handlers(r"ipfire\.org", [
ba43a892 300 (r".*", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org" })
5cf160e0 301 ])
3add293a 302
feb02477
MT
303 logging.info("Successfully initialied application")
304
574a88c7
MT
305 def format_country_name(self, handler, country_code):
306 return ipfire.countries.get_name(country_code)
307
6eddfb50
MT
308 def format_language_name(self, handler, language):
309 _ = handler.locale.translate
310
311 if language == "de":
312 return _("German")
313 elif language == "en":
314 return _("English")
315 elif language == "es":
316 return _("Spanish")
317 elif language == "fr":
318 return _("French")
319 elif language == "it":
320 return _("Italian")
321 elif language == "nl":
322 return _("Dutch")
323 elif language == "pl":
324 return _("Polish")
325 elif language == "pt":
326 return _("Portuguese")
327 elif language == "ru":
328 return _("Russian")
329 elif language == "tr":
330 return _("Turkish")
331
332 return language
333
cc3b928d
MT
334 def format_month_name(self, handler, month):
335 _ = handler.locale.translate
336
337 if month == 1:
338 return _("January")
339 elif month == 2:
340 return _("February")
341 elif month == 3:
342 return _("March")
343 elif month == 4:
344 return _("April")
345 elif month == 5:
346 return _("May")
347 elif month == 6:
348 return _("June")
349 elif month == 7:
350 return _("July")
351 elif month == 8:
352 return _("August")
353 elif month == 9:
354 return _("September")
355 elif month == 10:
356 return _("October")
357 elif month == 11:
358 return _("November")
359 elif month == 12:
360 return _("December")
361
362 return month
401827c2 363
e96e445b
MT
364 def format_phone_number(self, handler, number):
365 if not isinstance(number, phonenumbers.PhoneNumber):
366 try:
01e73b0e 367 number = phonenumbers.parse(number, None)
e96e445b
MT
368 except phonenumbers.phonenumberutil.NumberParseException:
369 return number
c01ad253
MT
370
371 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
372
e96e445b
MT
373 def format_phone_number_to_e164(self, handler, number):
374 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.E164)
375
376 def format_phone_number_location(self, handler, number):
377 s = [
378 phonenumbers.geocoder.description_for_number(number, handler.locale.code),
379 phonenumbers.region_code_for_number(number),
380 ]
381
382 return ", ".join((e for e in s if e))
383
401827c2
MT
384
385def grouper(handler, iterator, n):
386 """
387 Returns groups of n from the iterator
388 """
389 i = iter(iterator)
390
391 while True:
392 ret = list(itertools.islice(i, 0, n))
393 if not ret:
394 break
395
396 yield ret