]> git.ipfire.org Git - ipfire.org.git/blame - src/web/__init__.py
web: Rename i-use 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
f301d952 18from . import boot
e77cd04c 19from . import download
699a0911 20from . import iuse
f5b01fc2 21from . import location
5613b94b 22from . import newsletter
a41085fb 23from . import nopaste
03706893 24from . import people
df6180a5 25from . import ui_modules
12e5de7e 26
81675874 27class Application(tornado.web.Application):
3e7c6ccd
MT
28 def __init__(self, config, **kwargs):
29 # Initialize backend
a95c2f97 30 self.backend = ipfire.Backend(config)
a6dc0bad 31
9ed02e3b
MT
32 settings = {
33 # Do not compress responses
34 "gzip" : False,
35
36 # Enable XSRF cookies
37 "xsrf_cookies" : True,
38
39 # Login
40 "login_url" : "/login",
41
42 # Setup directory structure
43 "static_path" : self.backend.config.get("global", "static_dir"),
44 "template_path" : self.backend.config.get("global", "templates_dir"),
45
46 # UI Modules
47 "ui_methods" : {
e96e445b
MT
48 "format_month_name" : self.format_month_name,
49 "format_phone_number" : self.format_phone_number,
50 "format_phone_number_to_e164" : self.format_phone_number_to_e164,
51 "format_phone_number_location" : self.format_phone_number_location,
52 "grouper" : grouper,
cc3b928d 53 },
9ed02e3b 54 "ui_modules" : {
f5b01fc2 55 # Blog
7e64f6a3
MT
56 "BlogHistoryNavigation": blog.HistoryNavigationModule,
57 "BlogList" : blog.ListModule,
f91dfcc7 58 "BlogPost" : blog.PostModule,
8a897d25 59 "BlogPosts" : blog.PostsModule,
f91dfcc7 60
93feb275
MT
61 # Boot
62 "BootMenuConfig" : boot.MenuConfigModule,
63 "BootMenuHeader" : boot.MenuHeaderModule,
64 "BootMenuSeparator" : boot.MenuSeparatorModule,
65
f5b01fc2 66 # Location
df6180a5 67 "Map" : ui_modules.MapModule,
f5b01fc2 68
917434b8 69 # Talk
dbb0c109
MT
70 "AccountsList" : people.AccountsListModule,
71 "CDR" : people.CDRModule,
72 "Channels" : people.ChannelsModule,
68ece434 73 "MOS" : people.MOSModule,
b5e2077f 74 "Password" : people.PasswordModule,
dbb0c109 75 "Registrations" : people.RegistrationsModule,
7afd64bb 76 "SIPStatus" : people.SIPStatusModule,
917434b8 77
e1814f16
MT
78 # Nopaste
79 "Code" : nopaste.CodeModule,
80
f91dfcc7 81 # Old modules
df6180a5
MT
82 "LanguageName" : ui_modules.LanguageNameModule,
83
84 "MirrorItem" : ui_modules.MirrorItemModule,
85 "MirrorsTable" : ui_modules.MirrorsTableModule,
df6180a5 86 "ProgressBar" : ui_modules.ProgressBarModule,
df6180a5
MT
87 "FireinfoDeviceTable" : ui_modules.FireinfoDeviceTableModule,
88 "FireinfoDeviceAndGroupsTable" : ui_modules.FireinfoDeviceAndGroupsTableModule,
89 "FireinfoGeoTable" : ui_modules.FireinfoGeoTableModule,
81675874 90 },
3403dc5e
MT
91
92 # Call this when a page wasn't found
b22bc8e8 93 "default_handler_class" : base.NotFoundHandler,
9ed02e3b 94 }
9068dba1 95 settings.update(kwargs)
5cf160e0 96
ae0228e1
MT
97 tornado.web.Application.__init__(self, **settings)
98
66862195 99 authentication_handlers = [
08df6527
MT
100 (r"/login", auth.LoginHandler),
101 (r"/logout", auth.LogoutHandler),
66862195
MT
102 ]
103
d4dc517c 104 self.add_handlers(r"(dev|www)\.ipfire\.(at|org)", [
940227cb
MT
105 # Entry site that lead the user to index
106 (r"/", IndexHandler),
940227cb 107
81675874 108 # Download sites
60b0917c 109 (r"/downloads", tornado.web.RedirectHandler, { "url" : "/download" }),
e77cd04c
MT
110 (r"/download", download.IndexHandler),
111 (r"/download/([0-9a-z\-\.]+)", download.ReleaseHandler),
940227cb 112
e64ce07e
MT
113 # Donate
114 (r"/donate", DonateHandler),
115 (r"/donation", tornado.web.RedirectHandler, { "url" : "/donate" }),
8d48f4ef 116
5613b94b
MT
117 # Newsletter
118 (r"/newsletter/subscribe", newsletter.SubscribeHandler),
119
de683d7c 120 # RSS feed
f0714277 121 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
7f9dbcc0
MT
122
123 # Redirect news articles to blog
124 (r"/news/(.*)", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/posts/{1}" }),
de683d7c 125
45592df5 126 # Static Pages
84151dbf 127 (r"/chat", StaticHandler, { "template" : "chat.html" }),
45592df5 128 (r"/features", StaticHandler, { "template" : "features.html" }),
45592df5 129 (r"/legal", StaticHandler, { "template" : "legal.html" }),
00026d8b 130 (r"/support", StaticHandler, { "template" : "support.html" }),
45592df5 131
14cd4fa8
MT
132 # Handle old pages that have moved elsewhere
133 (r"/imprint", tornado.web.RedirectHandler, { "url" : "/legal" }),
3808b871 134 (r"/(de|en)/(.*)", LangCompatHandler),
37ed7c3c
MT
135
136 # Export arbitrary error pages
b22bc8e8 137 (r"/error/([45][0-9]{2})", base.ErrorHandler),
baa693a3
MT
138
139 # Block page
b22bc8e8 140 (r"/blocked", base.BlockedHandler),
940227cb
MT
141 ])
142
12e5de7e
MT
143 # blog.ipfire.org
144 self.add_handlers(r"blog(\.dev)?\.ipfire\.org", [
8a897d25 145 (r"/", blog.IndexHandler),
cfc0823a 146 (r"/authors/(\w+)", blog.AuthorHandler),
541c952b 147 (r"/compose", blog.ComposeHandler),
0b342a05 148 (r"/drafts", blog.DraftsHandler),
d17a2624
MT
149 (r"/post/([0-9a-z\-\._]+)", blog.PostHandler),
150 (r"/post/([0-9a-z\-\._]+)/edit", blog.EditHandler),
151 (r"/post/([0-9a-z\-\._]+)/publish", blog.PublishHandler),
e6b18dce 152 (r"/search", blog.SearchHandler),
8d7487d2 153 (r"/tags/([0-9a-z\-\.]+)", blog.TagHandler),
7e64f6a3 154 (r"/years/([0-9]+)", blog.YearHandler),
f0714277
MT
155
156 # RSS Feed
157 (r"/feed.xml", blog.FeedHandler),
08df6527 158 ] + authentication_handlers)
12e5de7e 159
940227cb 160 # downloads.ipfire.org
80594ae3 161 self.add_handlers(r"downloads?(\.dev)?\.ipfire\.org", [
ed8116c7
MT
162 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
163 (r"/(.*)", download.FileHandler),
54af860e 164 ])
940227cb
MT
165
166 # mirrors.ipfire.org
8fceca0a 167 self.add_handlers(r"mirrors(\.dev)?\.ipfire\.org", [
940227cb 168 (r"/", MirrorIndexHandler),
9068dba1 169 (r"/mirror/(.*)", MirrorItemHandler),
3808b871 170 ])
940227cb 171
d0d074e0 172 # planet.ipfire.org
7cad1818 173 self.add_handlers(r"planet(\.dev)?\.ipfire\.org", [
3d4ce901
MT
174 (r"/", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/" }),
175 (r"/post/([A-Za-z0-9_-]+)", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/posts/{1}" }),
176 (r"/user/([a-z0-9_-]+)", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/authors/{1}" }),
bcc3ed4d
MT
177
178 # RSS
f0714277 179 (r"/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
3d4ce901 180 (r"/user/([a-z0-9_-]+)/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/authors/{1}.rss" }),
f0714277 181 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
3808b871 182 ])
d0d074e0 183
66862195 184 # fireinfo.ipfire.org
8fceca0a 185 self.add_handlers(r"fireinfo(\.dev)?\.ipfire\.org", [
66862195
MT
186 (r"/", FireinfoIndexHandler),
187 (r"/device/driver/(.*)", FireinfoDeviceDriverDetail),
188 (r"/device/vendors", FireinfoDeviceVendorsHandler),
189 (r"/device/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorHandler),
190 (r"/device/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelHandler),
191
192 # Show profiles
193 (r"/profile/random", FireinfoRandomProfileHandler),
194 (r"/profile/([a-z0-9]{40})", FireinfoProfileDetailHandler),
91a446f0 195
30852a9e 196 # Send profiles.
66862195
MT
197 (r"/send/([a-z0-9]+)", FireinfoProfileSendHandler),
198
199 # Stats handlers
200 (r"/statistics", FireinfoStatsHandler),
201 (r"/statistics/processors", FireinfoStatsProcessorsHandler),
202 (r"/statistics/processors/(arm|x86)", FireinfoStatsProcessorDetailHandler),
203 (r"/statistics/geo-locations", FireinfoStatsGeoHandler),
204 (r"/statistics/languages", FireinfoStatsLanguagesHandler),
205 (r"/statistics/memory", FireinfoStatsMemoryHandler),
206 (r"/statistics/networking", FireinfoStatsNetworkingHandler),
207 (r"/statistics/releases", FireinfoStatsReleasesHandler),
208 (r"/statistics/virtualization", FireinfoStatsVirtualHandler),
209
210 # Compat handlers
211 (r"/stats", tornado.web.RedirectHandler, { "url" : "/statistics" }),
212 (r"/stats/cpus", tornado.web.RedirectHandler, { "url" : "/statistics/processors" }),
213 (r"/stats/geo", tornado.web.RedirectHandler, { "url" : "/statistics/geo-locations" }),
214 (r"/stats/network", tornado.web.RedirectHandler, { "url" : "/statistics/networking" }),
215 (r"/stats/oses", tornado.web.RedirectHandler, { "url" : "/statistics/releases" }),
216 (r"/stats/virtual", tornado.web.RedirectHandler, { "url" : "/statistics/virtualization" }),
217 (r"/vendor/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorCompatHandler),
218 (r"/model/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelCompatHandler),
3808b871 219 ])
5cf160e0 220
c37ec602 221 # i-use.ipfire.org
8fceca0a 222 self.add_handlers(r"i-use(\.dev)?\.ipfire\.org", [
699a0911 223 (r"/profile/([a-f0-9]{40})/([0-9]+).png", iuse.Image),
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