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