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