]> git.ipfire.org Git - ipfire.org.git/blame - src/web/__init__.py
fireinfo: Show total amount of profiles in database
[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
a41085fb 26from . import nopaste
03706893 27from . import people
df6180a5 28from . import ui_modules
181d08f3 29from . import wiki
12e5de7e 30
81675874 31class Application(tornado.web.Application):
3e7c6ccd
MT
32 def __init__(self, config, **kwargs):
33 # Initialize backend
a95c2f97 34 self.backend = ipfire.Backend(config)
a6dc0bad 35
9ed02e3b
MT
36 settings = {
37 # Do not compress responses
38 "gzip" : False,
39
40 # Enable XSRF cookies
41 "xsrf_cookies" : True,
42
43 # Login
44 "login_url" : "/login",
45
46 # Setup directory structure
47 "static_path" : self.backend.config.get("global", "static_dir"),
48 "template_path" : self.backend.config.get("global", "templates_dir"),
49
eabe6b8d 50 # UI Methods
9ed02e3b 51 "ui_methods" : {
574a88c7 52 "format_country_name" : self.format_country_name,
6eddfb50 53 "format_language_name" : self.format_language_name,
e96e445b
MT
54 "format_month_name" : self.format_month_name,
55 "format_phone_number" : self.format_phone_number,
56 "format_phone_number_to_e164" : self.format_phone_number_to_e164,
57 "format_phone_number_location" : self.format_phone_number_location,
58 "grouper" : grouper,
cc3b928d 59 },
eabe6b8d
MT
60
61 # UI Modules
9ed02e3b 62 "ui_modules" : {
f5b01fc2 63 # Blog
7e64f6a3
MT
64 "BlogHistoryNavigation": blog.HistoryNavigationModule,
65 "BlogList" : blog.ListModule,
f91dfcc7 66 "BlogPost" : blog.PostModule,
8a897d25 67 "BlogPosts" : blog.PostsModule,
f91dfcc7 68
93feb275
MT
69 # Boot
70 "BootMenuConfig" : boot.MenuConfigModule,
71 "BootMenuHeader" : boot.MenuHeaderModule,
72 "BootMenuSeparator" : boot.MenuSeparatorModule,
73
eabe6b8d 74 # People
dbb0c109 75 "AccountsList" : people.AccountsListModule,
c66f2152 76 "Agent" : people.AgentModule,
dbb0c109
MT
77 "CDR" : people.CDRModule,
78 "Channels" : people.ChannelsModule,
68ece434 79 "MOS" : people.MOSModule,
9150881e 80 "NewAccounts" : people.NewAccountsModule,
b5e2077f 81 "Password" : people.PasswordModule,
dbb0c109 82 "Registrations" : people.RegistrationsModule,
7afd64bb 83 "SIPStatus" : people.SIPStatusModule,
917434b8 84
e1814f16
MT
85 # Nopaste
86 "Code" : nopaste.CodeModule,
87
23f0179e 88 # Fireinfo
96c9bb79 89 "FireinfoDeviceTable" : fireinfo.DeviceTableModule,
eabe6b8d
MT
90 "FireinfoDeviceAndGroupsTable"
91 : fireinfo.DeviceAndGroupsTableModule,
92
6ac7e934 93 # Wiki
c21ffadb 94 "WikiDiff" : wiki.WikiDiffModule,
6ac7e934 95 "WikiNavbar" : wiki.WikiNavbarModule,
f9db574a 96 "WikiList" : wiki.WikiListModule,
6ac7e934 97
eabe6b8d 98 # Misc
6563eb49 99 "ChristmasBanner" : ui_modules.ChristmasBannerModule,
1c4522dc 100 "Markdown" : ui_modules.MarkdownModule,
eabe6b8d
MT
101 "Map" : ui_modules.MapModule,
102 "ProgressBar" : ui_modules.ProgressBarModule,
81675874 103 },
3403dc5e
MT
104
105 # Call this when a page wasn't found
b22bc8e8 106 "default_handler_class" : base.NotFoundHandler,
9ed02e3b 107 }
9068dba1 108 settings.update(kwargs)
5cf160e0 109
ae0228e1
MT
110 tornado.web.Application.__init__(self, **settings)
111
66862195 112 authentication_handlers = [
08df6527
MT
113 (r"/login", auth.LoginHandler),
114 (r"/logout", auth.LogoutHandler),
66862195
MT
115 ]
116
399506a8 117 self.add_handlers(r"(dev|www)\.ipfire\.org", [
940227cb
MT
118 # Entry site that lead the user to index
119 (r"/", IndexHandler),
940227cb 120
81675874 121 # Download sites
60b0917c 122 (r"/downloads", tornado.web.RedirectHandler, { "url" : "/download" }),
e77cd04c
MT
123 (r"/download", download.IndexHandler),
124 (r"/download/([0-9a-z\-\.]+)", download.ReleaseHandler),
940227cb 125
e64ce07e 126 # Donate
c7bcb9ca
MT
127 (r"/donate", donate.DonateHandler),
128 (r"/donate/thank-you", donate.ThankYouHandler),
129 (r"/donate/error", donate.ErrorHandler),
e64ce07e 130 (r"/donation", tornado.web.RedirectHandler, { "url" : "/donate" }),
8d48f4ef 131
de683d7c 132 # RSS feed
f0714277 133 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
7f9dbcc0
MT
134
135 # Redirect news articles to blog
d76ec66e 136 (r"/news/(.*)", handlers.NewsHandler),
de683d7c 137
45592df5 138 # Static Pages
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 200
dc96f754
MT
201 # Admin
202 (r"/admin", fireinfo.AdminIndexHandler),
203
8ab37e0b
MT
204 # Vendors
205 (r"/vendors", fireinfo.VendorsHandler),
206 (r"/vendors/(pci|usb)/([0-9a-f]{4})", fireinfo.VendorHandler),
66862195 207
1e3b2aad 208 # Driver
0cd21a36 209 (r"/drivers/(.*)", fireinfo.DriverDetail),
1e3b2aad 210
66862195 211 # Show profiles
96c9bb79 212 (r"/profile/random", fireinfo.RandomProfileHandler),
b84b407f 213 (r"/profile/([a-z0-9]{40})", fireinfo.ProfileHandler),
91a446f0 214
ed2e3c1f 215 # Stats
19518d6e 216 (r"/processors", fireinfo.ProcessorsHandler),
ed2e3c1f
MT
217 (r"/releases", fireinfo.ReleasesHandler),
218
19518d6e 219 # Send profiles
96c9bb79 220 (r"/send/([a-z0-9]+)", fireinfo.ProfileSendHandler),
dc96f754 221 ] + authentication_handlers)
5cf160e0 222
c37ec602 223 # i-use.ipfire.org
8fceca0a 224 self.add_handlers(r"i-use(\.dev)?\.ipfire\.org", [
e2f2865d 225 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
395c1ac0 226 (r"/profile/([a-f0-9]{40})/([0-9]+).png", iuse.ImageHandler),
c37ec602
MT
227 ])
228
8e2e1261
MT
229 # boot.ipfire.org
230 BOOT_STATIC_PATH = os.path.join(self.settings["static_path"], "netboot")
8fceca0a 231 self.add_handlers(r"boot(\.dev)?\.ipfire\.org", [
f301d952 232 (r"/", tornado.web.RedirectHandler, { "url" : "https://wiki.ipfire.org/installation/pxe" }),
8e2e1261
MT
233
234 # Configurations
f301d952
MT
235 (r"/premenu.cfg", boot.PremenuCfgHandler),
236 (r"/menu.gpxe", boot.MenuGPXEHandler),
237 (r"/menu.cfg", boot.MenuCfgHandler),
8e2e1261
MT
238
239 # Static files
37b5c0cf 240 (r"/(boot\.png|pxelinux\.0|menu\.c32|vesamenu\.c32)",
8e2e1261
MT
241 tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
242 ])
243
60024cc8 244 # nopaste.ipfire.org
8fceca0a 245 self.add_handlers(r"nopaste(\.dev)?\.ipfire\.org", [
a41085fb
MT
246 (r"/", nopaste.CreateHandler),
247 (r"/raw/(.*)", nopaste.RawHandler),
248 (r"/view/(.*)", nopaste.ViewHandler),
3808b871 249 ] + authentication_handlers)
60024cc8 250
f5b01fc2
MT
251 # location.ipfire.org
252 self.add_handlers(r"location(\.dev)?\.ipfire\.org", [
253 (r"/", location.IndexHandler),
55eea098 254 (r"/how\-to\-use", StaticHandler, { "template" : "../location/how-to-use.html" }),
2517822e 255 (r"/lookup/(.+)/blacklists", location.BlacklistsHandler),
f5b01fc2
MT
256 (r"/lookup/(.+)", location.LookupHandler),
257 ])
258
9068dba1 259 # geoip.ipfire.org
8fceca0a 260 self.add_handlers(r"geoip(\.dev)?\.ipfire\.org", [
f5b01fc2 261 (r"/", tornado.web.RedirectHandler, { "url" : "https://location.ipfire.org/" }),
3808b871 262 ])
9068dba1 263
66862195
MT
264 # talk.ipfire.org
265 self.add_handlers(r"talk(\.dev)?\.ipfire\.org", [
786e9ca8
MT
266 (r"/", tornado.web.RedirectHandler, { "url" : "https://people.ipfire.org/" }),
267 ])
66862195 268
03706893
MT
269 # people.ipfire.org
270 self.add_handlers(r"people(\.dev)?\.ipfire\.org", [
786e9ca8 271 (r"/", people.IndexHandler),
2c65e17c 272 (r"/activate/([a-z_][a-z0-9_-]{0,31})/(\w+)", auth.ActivateHandler),
30aeccdb 273 (r"/conferences", people.ConferencesHandler),
18b13823 274 (r"/groups", people.GroupsHandler),
736e7544 275 (r"/groups/([a-z_][a-z0-9_-]{0,31})", people.GroupHandler),
f32dd17f 276 (r"/register", auth.RegisterHandler),
786e9ca8
MT
277 (r"/search", people.SearchHandler),
278 (r"/users", people.UsersHandler),
2c65e17c
MT
279 (r"/users/([a-z_][a-z0-9_-]{0,31})", people.UserHandler),
280 (r"/users/([a-z_][a-z0-9_-]{0,31})\.jpg", people.AvatarHandler),
281 (r"/users/([a-z_][a-z0-9_-]{0,31})/calls/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})", people.CallHandler),
282 (r"/users/([a-z_][a-z0-9_-]{0,31})/calls(?:/(\d{4}-\d{2}-\d{2}))?", people.CallsHandler),
283 (r"/users/([a-z_][a-z0-9_-]{0,31})/edit", people.UserEditHandler),
284 (r"/users/([a-z_][a-z0-9_-]{0,31})/passwd", people.UserPasswdHandler),
285 (r"/users/([a-z_][a-z0-9_-]{0,31})/sip", people.SIPHandler),
2dac7110 286
92c4b559
MT
287 # Promotional Consent Stuff
288 (r"/subscribe", people.SubscribeHandler),
289 (r"/unsubscribe", people.UnsubscribeHandler),
290
2dac7110
MT
291 # Single-Sign-On for Discourse
292 (r"/sso/discourse", people.SSODiscourse),
689effd0 293
c7594d58 294 # Password Reset
391ede9e
MT
295 (r"/password\-reset", auth.PasswordResetInitiationHandler),
296 (r"/password\-reset/([a-z_][a-z0-9_-]{0,31})/(\w+)", auth.PasswordResetHandler),
c7594d58 297
226d2676
MT
298 # Stats
299 (r"/stats", people.StatsHandler),
300
689effd0 301 # API
66181c96 302 (r"/api/check/email", auth.APICheckEmail),
689effd0 303 (r"/api/check/uid", auth.APICheckUID),
786e9ca8 304 ] + authentication_handlers)
2cd9af74 305
181d08f3
MT
306 # wiki.ipfire.org
307 self.add_handlers(r"wiki(\.dev)?\.ipfire\.org",
308 authentication_handlers + [
309
f2cfd873 310 # Actions
b26c705a 311 (r"((?:[A-Za-z0-9\-_\/]+)?(?:.*)\.(?:\w+))/_delete", wiki.ActionDeleteHandler),
40cb87a4 312 (r"([A-Za-z0-9\-_\/]+)?/_edit", wiki.ActionEditHandler),
2901b734 313 (r"([A-Za-z0-9\-_\/]+)?/_render", wiki.ActionRenderHandler),
9db2e89f 314 (r"([A-Za-z0-9\-_\/]+)?/_(watch|unwatch)", wiki.ActionWatchHandler),
d4c68c5c 315 (r"/actions/restore", wiki.ActionRestoreHandler),
f2cfd873
MT
316 (r"/actions/upload", wiki.ActionUploadHandler),
317
f9db574a
MT
318 # Handlers
319 (r"/recent\-changes", wiki.RecentChangesHandler),
181d08f3 320 (r"/search", wiki.SearchHandler),
2f23c558 321 (r"/watchlist", wiki.WatchlistHandler),
f9db574a 322
f2cfd873 323 # Media
3b33319e 324 (r"([A-Za-z0-9\-_\/]+)?/_files", wiki.FilesHandler),
f2cfd873
MT
325 (r"((?!/static)(?:[A-Za-z0-9\-_\/]+)?(?:.*)\.(?:\w+))$", wiki.FileHandler),
326
f9db574a 327 # Render pages
181d08f3
MT
328 (r"([A-Za-z0-9\-_\/]+)?", wiki.PageHandler),
329 ])
330
ae0228e1 331 # ipfire.org
45592df5 332 self.add_handlers(r"ipfire\.org", [
ba43a892 333 (r".*", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org" })
5cf160e0 334 ])
3add293a 335
feb02477
MT
336 logging.info("Successfully initialied application")
337
574a88c7
MT
338 def format_country_name(self, handler, country_code):
339 return ipfire.countries.get_name(country_code)
340
6eddfb50
MT
341 def format_language_name(self, handler, language):
342 _ = handler.locale.translate
343
344 if language == "de":
345 return _("German")
346 elif language == "en":
347 return _("English")
348 elif language == "es":
349 return _("Spanish")
350 elif language == "fr":
351 return _("French")
352 elif language == "it":
353 return _("Italian")
354 elif language == "nl":
355 return _("Dutch")
356 elif language == "pl":
357 return _("Polish")
358 elif language == "pt":
359 return _("Portuguese")
360 elif language == "ru":
361 return _("Russian")
362 elif language == "tr":
363 return _("Turkish")
364
365 return language
366
cc3b928d
MT
367 def format_month_name(self, handler, month):
368 _ = handler.locale.translate
369
370 if month == 1:
371 return _("January")
372 elif month == 2:
373 return _("February")
374 elif month == 3:
375 return _("March")
376 elif month == 4:
377 return _("April")
378 elif month == 5:
379 return _("May")
380 elif month == 6:
381 return _("June")
382 elif month == 7:
383 return _("July")
384 elif month == 8:
385 return _("August")
386 elif month == 9:
387 return _("September")
388 elif month == 10:
389 return _("October")
390 elif month == 11:
391 return _("November")
392 elif month == 12:
393 return _("December")
394
395 return month
401827c2 396
e96e445b
MT
397 def format_phone_number(self, handler, number):
398 if not isinstance(number, phonenumbers.PhoneNumber):
399 try:
01e73b0e 400 number = phonenumbers.parse(number, None)
e96e445b
MT
401 except phonenumbers.phonenumberutil.NumberParseException:
402 return number
c01ad253
MT
403
404 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
405
e96e445b
MT
406 def format_phone_number_to_e164(self, handler, number):
407 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.E164)
408
409 def format_phone_number_location(self, handler, number):
410 s = [
411 phonenumbers.geocoder.description_for_number(number, handler.locale.code),
412 phonenumbers.region_code_for_number(number),
413 ]
414
415 return ", ".join((e for e in s if e))
416
401827c2
MT
417
418def grouper(handler, iterator, n):
419 """
420 Returns groups of n from the iterator
421 """
422 i = iter(iterator)
423
424 while True:
425 ret = list(itertools.islice(i, 0, n))
426 if not ret:
427 break
428
429 yield ret