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