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