]> git.ipfire.org Git - ipfire.org.git/blame - src/web/__init__.py
blog: Allow deleting posts
[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 148 (r"/post/([0-9a-z\-\._]+)", blog.PostHandler),
914238a5 149 (r"/post/([0-9a-z\-\._]+)/delete", blog.DeleteHandler),
d17a2624
MT
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", [
95483f04
MT
168 (r"/", mirrors.IndexHandler),
169 (r"/mirrors/(.*)", mirrors.MirrorHandler),
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", [
e2f2865d 223 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
395c1ac0 224 (r"/profile/([a-f0-9]{40})/([0-9]+).png", iuse.ImageHandler),
c37ec602
MT
225 ])
226
8e2e1261
MT
227 # boot.ipfire.org
228 BOOT_STATIC_PATH = os.path.join(self.settings["static_path"], "netboot")
8fceca0a 229 self.add_handlers(r"boot(\.dev)?\.ipfire\.org", [
f301d952 230 (r"/", tornado.web.RedirectHandler, { "url" : "https://wiki.ipfire.org/installation/pxe" }),
8e2e1261
MT
231
232 # Configurations
f301d952
MT
233 (r"/premenu.cfg", boot.PremenuCfgHandler),
234 (r"/menu.gpxe", boot.MenuGPXEHandler),
235 (r"/menu.cfg", boot.MenuCfgHandler),
8e2e1261
MT
236
237 # Static files
37b5c0cf 238 (r"/(boot\.png|pxelinux\.0|menu\.c32|vesamenu\.c32)",
8e2e1261
MT
239 tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
240 ])
241
60024cc8 242 # nopaste.ipfire.org
8fceca0a 243 self.add_handlers(r"nopaste(\.dev)?\.ipfire\.org", [
a41085fb
MT
244 (r"/", nopaste.CreateHandler),
245 (r"/raw/(.*)", nopaste.RawHandler),
246 (r"/view/(.*)", nopaste.ViewHandler),
3808b871 247 ] + authentication_handlers)
60024cc8 248
f5b01fc2
MT
249 # location.ipfire.org
250 self.add_handlers(r"location(\.dev)?\.ipfire\.org", [
251 (r"/", location.IndexHandler),
252 (r"/lookup/(.+)", location.LookupHandler),
253 ])
254
9068dba1 255 # geoip.ipfire.org
8fceca0a 256 self.add_handlers(r"geoip(\.dev)?\.ipfire\.org", [
f5b01fc2 257 (r"/", tornado.web.RedirectHandler, { "url" : "https://location.ipfire.org/" }),
3808b871 258 ])
9068dba1 259
66862195
MT
260 # talk.ipfire.org
261 self.add_handlers(r"talk(\.dev)?\.ipfire\.org", [
786e9ca8
MT
262 (r"/", tornado.web.RedirectHandler, { "url" : "https://people.ipfire.org/" }),
263 ])
66862195 264
03706893
MT
265 # people.ipfire.org
266 self.add_handlers(r"people(\.dev)?\.ipfire\.org", [
786e9ca8 267 (r"/", people.IndexHandler),
30aeccdb 268 (r"/conferences", people.ConferencesHandler),
786e9ca8
MT
269 (r"/search", people.SearchHandler),
270 (r"/users", people.UsersHandler),
271 (r"/users/(\w+)", people.UserHandler),
03706893 272 (r"/users/(\w+)\.jpg", people.AvatarHandler),
68ece434 273 (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 274 (r"/users/(\w+)/calls(?:/(\d{4}-\d{2}-\d{2}))?", people.CallsHandler),
e96e445b 275 (r"/users/(\w+)/edit", people.UserEditHandler),
3ea97943 276 (r"/users/(\w+)/passwd", people.UserPasswdHandler),
f4672785 277 (r"/users/(\w+)/ssh-keys", people.SSHKeysIndexHandler),
44b75370
MT
278 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)/delete", people.SSHKeysDeleteHandler),
279 (r"/users/(\w+)/ssh-keys/(SHA256\:.*)", people.SSHKeysDownloadHandler),
0d1fb712 280 (r"/users/(\w+)/ssh-keys/upload", people.SSHKeysUploadHandler),
e0daee8f 281 (r"/users/(\w+)/sip", people.SIPHandler),
786e9ca8 282 ] + authentication_handlers)
2cd9af74 283
ae0228e1 284 # ipfire.org
45592df5 285 self.add_handlers(r"ipfire\.org", [
ba43a892 286 (r".*", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org" })
5cf160e0 287 ])
3add293a 288
feb02477
MT
289 logging.info("Successfully initialied application")
290
cc3b928d
MT
291 def format_month_name(self, handler, month):
292 _ = handler.locale.translate
293
294 if month == 1:
295 return _("January")
296 elif month == 2:
297 return _("February")
298 elif month == 3:
299 return _("March")
300 elif month == 4:
301 return _("April")
302 elif month == 5:
303 return _("May")
304 elif month == 6:
305 return _("June")
306 elif month == 7:
307 return _("July")
308 elif month == 8:
309 return _("August")
310 elif month == 9:
311 return _("September")
312 elif month == 10:
313 return _("October")
314 elif month == 11:
315 return _("November")
316 elif month == 12:
317 return _("December")
318
319 return month
401827c2 320
e96e445b
MT
321 def format_phone_number(self, handler, number):
322 if not isinstance(number, phonenumbers.PhoneNumber):
323 try:
01e73b0e 324 number = phonenumbers.parse(number, None)
e96e445b
MT
325 except phonenumbers.phonenumberutil.NumberParseException:
326 return number
c01ad253
MT
327
328 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
329
e96e445b
MT
330 def format_phone_number_to_e164(self, handler, number):
331 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.E164)
332
333 def format_phone_number_location(self, handler, number):
334 s = [
335 phonenumbers.geocoder.description_for_number(number, handler.locale.code),
336 phonenumbers.region_code_for_number(number),
337 ]
338
339 return ", ".join((e for e in s if e))
340
401827c2
MT
341
342def grouper(handler, iterator, n):
343 """
344 Returns groups of n from the iterator
345 """
346 i = iter(iterator)
347
348 while True:
349 ret = list(itertools.islice(i, 0, n))
350 if not ret:
351 break
352
353 yield ret