]> git.ipfire.org Git - ipfire.org.git/blame - src/web/__init__.py
people: List IPFire phone numbers
[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),
940227cb
MT
129 ])
130
12e5de7e
MT
131 # blog.ipfire.org
132 self.add_handlers(r"blog(\.dev)?\.ipfire\.org", [
8a897d25 133 (r"/", blog.IndexHandler),
cfc0823a 134 (r"/authors/(\w+)", blog.AuthorHandler),
541c952b 135 (r"/compose", blog.ComposeHandler),
0b342a05 136 (r"/drafts", blog.DraftsHandler),
d17a2624
MT
137 (r"/post/([0-9a-z\-\._]+)", blog.PostHandler),
138 (r"/post/([0-9a-z\-\._]+)/edit", blog.EditHandler),
139 (r"/post/([0-9a-z\-\._]+)/publish", blog.PublishHandler),
e6b18dce 140 (r"/search", blog.SearchHandler),
8d7487d2 141 (r"/tags/([0-9a-z\-\.]+)", blog.TagHandler),
7e64f6a3 142 (r"/years/([0-9]+)", blog.YearHandler),
f0714277
MT
143
144 # RSS Feed
145 (r"/feed.xml", blog.FeedHandler),
08df6527 146 ] + authentication_handlers)
12e5de7e 147
940227cb 148 # downloads.ipfire.org
80594ae3 149 self.add_handlers(r"downloads?(\.dev)?\.ipfire\.org", [
ed8116c7
MT
150 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
151 (r"/(.*)", download.FileHandler),
54af860e 152 ])
940227cb
MT
153
154 # mirrors.ipfire.org
8fceca0a 155 self.add_handlers(r"mirrors(\.dev)?\.ipfire\.org", [
940227cb 156 (r"/", MirrorIndexHandler),
9068dba1 157 (r"/mirror/(.*)", MirrorItemHandler),
3808b871 158 ])
940227cb 159
d0d074e0 160 # planet.ipfire.org
7cad1818 161 self.add_handlers(r"planet(\.dev)?\.ipfire\.org", [
3d4ce901
MT
162 (r"/", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/" }),
163 (r"/post/([A-Za-z0-9_-]+)", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/posts/{1}" }),
164 (r"/user/([a-z0-9_-]+)", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/authors/{1}" }),
bcc3ed4d
MT
165
166 # RSS
f0714277 167 (r"/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
3d4ce901 168 (r"/user/([a-z0-9_-]+)/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/authors/{1}.rss" }),
f0714277 169 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
3808b871 170 ])
d0d074e0 171
66862195 172 # fireinfo.ipfire.org
8fceca0a 173 self.add_handlers(r"fireinfo(\.dev)?\.ipfire\.org", [
66862195
MT
174 (r"/", FireinfoIndexHandler),
175 (r"/device/driver/(.*)", FireinfoDeviceDriverDetail),
176 (r"/device/vendors", FireinfoDeviceVendorsHandler),
177 (r"/device/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorHandler),
178 (r"/device/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelHandler),
179
180 # Show profiles
181 (r"/profile/random", FireinfoRandomProfileHandler),
182 (r"/profile/([a-z0-9]{40})", FireinfoProfileDetailHandler),
91a446f0 183
30852a9e 184 # Send profiles.
66862195
MT
185 (r"/send/([a-z0-9]+)", FireinfoProfileSendHandler),
186
187 # Stats handlers
188 (r"/statistics", FireinfoStatsHandler),
189 (r"/statistics/processors", FireinfoStatsProcessorsHandler),
190 (r"/statistics/processors/(arm|x86)", FireinfoStatsProcessorDetailHandler),
191 (r"/statistics/geo-locations", FireinfoStatsGeoHandler),
192 (r"/statistics/languages", FireinfoStatsLanguagesHandler),
193 (r"/statistics/memory", FireinfoStatsMemoryHandler),
194 (r"/statistics/networking", FireinfoStatsNetworkingHandler),
195 (r"/statistics/releases", FireinfoStatsReleasesHandler),
196 (r"/statistics/virtualization", FireinfoStatsVirtualHandler),
197
198 # Compat handlers
199 (r"/stats", tornado.web.RedirectHandler, { "url" : "/statistics" }),
200 (r"/stats/cpus", tornado.web.RedirectHandler, { "url" : "/statistics/processors" }),
201 (r"/stats/geo", tornado.web.RedirectHandler, { "url" : "/statistics/geo-locations" }),
202 (r"/stats/network", tornado.web.RedirectHandler, { "url" : "/statistics/networking" }),
203 (r"/stats/oses", tornado.web.RedirectHandler, { "url" : "/statistics/releases" }),
204 (r"/stats/virtual", tornado.web.RedirectHandler, { "url" : "/statistics/virtualization" }),
205 (r"/vendor/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorCompatHandler),
206 (r"/model/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelCompatHandler),
3808b871 207 ])
5cf160e0 208
c37ec602 209 # i-use.ipfire.org
8fceca0a 210 self.add_handlers(r"i-use(\.dev)?\.ipfire\.org", [
c37ec602
MT
211 (r"/profile/([a-f0-9]{40})/([0-9]+).png", IUseImage),
212 ])
213
8e2e1261
MT
214 # boot.ipfire.org
215 BOOT_STATIC_PATH = os.path.join(self.settings["static_path"], "netboot")
8fceca0a 216 self.add_handlers(r"boot(\.dev)?\.ipfire\.org", [
ba43a892 217 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/download" }),
8e2e1261
MT
218
219 # Configurations
37b5c0cf 220 (r"/premenu.cfg", PremenuCfgHandler),
8e2e1261
MT
221 (r"/menu.gpxe", MenuGPXEHandler),
222 (r"/menu.cfg", MenuCfgHandler),
8e2e1261
MT
223
224 # Static files
37b5c0cf 225 (r"/(boot\.png|pxelinux\.0|menu\.c32|vesamenu\.c32)",
8e2e1261
MT
226 tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
227 ])
228
60024cc8 229 # nopaste.ipfire.org
8fceca0a 230 self.add_handlers(r"nopaste(\.dev)?\.ipfire\.org", [
66862195
MT
231 (r"/", NopasteCreateHandler),
232 (r"/raw/(.*)", NopasteRawHandler),
233 (r"/view/(.*)", NopasteViewHandler),
3808b871 234 ] + authentication_handlers)
60024cc8 235
f5b01fc2
MT
236 # location.ipfire.org
237 self.add_handlers(r"location(\.dev)?\.ipfire\.org", [
238 (r"/", location.IndexHandler),
239 (r"/lookup/(.+)", location.LookupHandler),
240 ])
241
9068dba1 242 # geoip.ipfire.org
8fceca0a 243 self.add_handlers(r"geoip(\.dev)?\.ipfire\.org", [
f5b01fc2 244 (r"/", tornado.web.RedirectHandler, { "url" : "https://location.ipfire.org/" }),
3808b871 245 ])
9068dba1 246
66862195
MT
247 # talk.ipfire.org
248 self.add_handlers(r"talk(\.dev)?\.ipfire\.org", [
786e9ca8
MT
249 (r"/", tornado.web.RedirectHandler, { "url" : "https://people.ipfire.org/" }),
250 ])
66862195 251
03706893
MT
252 # people.ipfire.org
253 self.add_handlers(r"people(\.dev)?\.ipfire\.org", [
786e9ca8
MT
254 (r"/", people.IndexHandler),
255 (r"/search", people.SearchHandler),
256 (r"/users", people.UsersHandler),
257 (r"/users/(\w+)", people.UserHandler),
03706893 258 (r"/users/(\w+)\.jpg", people.AvatarHandler),
68ece434 259 (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 260 (r"/users/(\w+)/calls(?:/(\d{4}-\d{2}-\d{2}))?", people.CallsHandler),
e96e445b 261 (r"/users/(\w+)/edit", people.UserEditHandler),
3ea97943 262 (r"/users/(\w+)/passwd", people.UserPasswdHandler),
f4672785 263 (r"/users/(\w+)/ssh-keys", people.SSHKeysIndexHandler),
44b75370
MT
264 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)/delete", people.SSHKeysDeleteHandler),
265 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)", people.SSHKeysDownloadHandler),
0d1fb712 266 (r"/users/(\w+)/ssh-keys/upload", people.SSHKeysUploadHandler),
e0daee8f 267 (r"/users/(\w+)/sip", people.SIPHandler),
786e9ca8 268 ] + authentication_handlers)
2cd9af74 269
ae0228e1 270 # ipfire.org
45592df5 271 self.add_handlers(r"ipfire\.org", [
ba43a892 272 (r".*", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org" })
5cf160e0 273 ])
3add293a 274
feb02477
MT
275 logging.info("Successfully initialied application")
276
cc3b928d
MT
277 def format_month_name(self, handler, month):
278 _ = handler.locale.translate
279
280 if month == 1:
281 return _("January")
282 elif month == 2:
283 return _("February")
284 elif month == 3:
285 return _("March")
286 elif month == 4:
287 return _("April")
288 elif month == 5:
289 return _("May")
290 elif month == 6:
291 return _("June")
292 elif month == 7:
293 return _("July")
294 elif month == 8:
295 return _("August")
296 elif month == 9:
297 return _("September")
298 elif month == 10:
299 return _("October")
300 elif month == 11:
301 return _("November")
302 elif month == 12:
303 return _("December")
304
305 return month
401827c2 306
e96e445b
MT
307 def format_phone_number(self, handler, number):
308 if not isinstance(number, phonenumbers.PhoneNumber):
309 try:
01e73b0e 310 number = phonenumbers.parse(number, None)
e96e445b
MT
311 except phonenumbers.phonenumberutil.NumberParseException:
312 return number
c01ad253
MT
313
314 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
315
e96e445b
MT
316 def format_phone_number_to_e164(self, handler, number):
317 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.E164)
318
319 def format_phone_number_location(self, handler, number):
320 s = [
321 phonenumbers.geocoder.description_for_number(number, handler.locale.code),
322 phonenumbers.region_code_for_number(number),
323 ]
324
325 return ", ".join((e for e in s if e))
326
401827c2
MT
327
328def grouper(handler, iterator, n):
329 """
330 Returns groups of n from the iterator
331 """
332 i = iter(iterator)
333
334 while True:
335 ret = list(itertools.islice(i, 0, n))
336 if not ret:
337 break
338
339 yield ret