]> git.ipfire.org Git - ipfire.org.git/blame - src/web/__init__.py
Add blocked page
[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
MT
257 (r"/", people.IndexHandler),
258 (r"/search", people.SearchHandler),
259 (r"/users", people.UsersHandler),
260 (r"/users/(\w+)", people.UserHandler),
03706893 261 (r"/users/(\w+)\.jpg", people.AvatarHandler),
68ece434 262 (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 263 (r"/users/(\w+)/calls(?:/(\d{4}-\d{2}-\d{2}))?", people.CallsHandler),
e96e445b 264 (r"/users/(\w+)/edit", people.UserEditHandler),
3ea97943 265 (r"/users/(\w+)/passwd", people.UserPasswdHandler),
f4672785 266 (r"/users/(\w+)/ssh-keys", people.SSHKeysIndexHandler),
44b75370
MT
267 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)/delete", people.SSHKeysDeleteHandler),
268 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)", people.SSHKeysDownloadHandler),
0d1fb712 269 (r"/users/(\w+)/ssh-keys/upload", people.SSHKeysUploadHandler),
e0daee8f 270 (r"/users/(\w+)/sip", people.SIPHandler),
786e9ca8 271 ] + authentication_handlers)
2cd9af74 272
ae0228e1 273 # ipfire.org
45592df5 274 self.add_handlers(r"ipfire\.org", [
ba43a892 275 (r".*", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org" })
5cf160e0 276 ])
3add293a 277
feb02477
MT
278 logging.info("Successfully initialied application")
279
cc3b928d
MT
280 def format_month_name(self, handler, month):
281 _ = handler.locale.translate
282
283 if month == 1:
284 return _("January")
285 elif month == 2:
286 return _("February")
287 elif month == 3:
288 return _("March")
289 elif month == 4:
290 return _("April")
291 elif month == 5:
292 return _("May")
293 elif month == 6:
294 return _("June")
295 elif month == 7:
296 return _("July")
297 elif month == 8:
298 return _("August")
299 elif month == 9:
300 return _("September")
301 elif month == 10:
302 return _("October")
303 elif month == 11:
304 return _("November")
305 elif month == 12:
306 return _("December")
307
308 return month
401827c2 309
e96e445b
MT
310 def format_phone_number(self, handler, number):
311 if not isinstance(number, phonenumbers.PhoneNumber):
312 try:
01e73b0e 313 number = phonenumbers.parse(number, None)
e96e445b
MT
314 except phonenumbers.phonenumberutil.NumberParseException:
315 return number
c01ad253
MT
316
317 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
318
e96e445b
MT
319 def format_phone_number_to_e164(self, handler, number):
320 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.E164)
321
322 def format_phone_number_location(self, handler, number):
323 s = [
324 phonenumbers.geocoder.description_for_number(number, handler.locale.code),
325 phonenumbers.region_code_for_number(number),
326 ]
327
328 return ", ".join((e for e in s if e))
329
401827c2
MT
330
331def grouper(handler, iterator, n):
332 """
333 Returns groups of n from the iterator
334 """
335 i = iter(iterator)
336
337 while True:
338 ret = list(itertools.islice(i, 0, n))
339 if not ret:
340 break
341
342 yield ret