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