]> git.ipfire.org Git - ipfire.org.git/blob - src/web/nopaste.py
location: Add download page
[ipfire.org.git] / src / web / nopaste.py
1 #!/usr/bin/python
2
3 import tornado.web
4
5 from . import auth
6 from . import base
7 from . import ui_modules
8
9 class CreateHandler(auth.CacheMixin, base.BaseHandler):
10 MODES = ("paste", "upload")
11
12 def get(self):
13 mode = self.get_argument("mode", "paste")
14 if not mode in self.MODES:
15 raise tornado.web.HTTPError(400)
16
17 self.render("nopaste/create.html", mode=mode,
18 max_size=self._max_size)
19
20 @base.ratelimit(minutes=15, requests=5)
21 def post(self):
22 mode = self.get_argument("mode")
23 if not mode in self.MODES:
24 raise tornado.web.HTTPError(400)
25
26 mimetype = "text/plain"
27
28 if mode == "paste":
29 subject = self.get_argument("subject", None)
30 content = self.get_argument("content", "").encode("utf-8")
31
32 elif mode == "upload":
33 for f in self.request.files.get("file"):
34 subject = f.filename
35 content = f.body
36 mimetype = f.content_type
37 break
38
39 # Check maximum size
40 if len(content) > self._max_size:
41 raise tornado.web.HTTPError(400,
42 "You cannot upload more than %s bytes" % self._max_size)
43
44 expires = self.get_argument("expires", "0")
45 try:
46 expires = int(expires)
47 except (TypeError, ValueError):
48 expires = None
49
50 uid = self.backend.nopaste.create(subject, content, mimetype=mimetype,
51 expires=expires, account=self.current_user, address=self.get_remote_ip())
52
53 if uid:
54 return self.redirect("/view/%s" % uid)
55
56 raise tornado.web.HTTPError(500)
57
58 @property
59 def _max_size(self):
60 # Authenticated users are allowed to upload up to 25MB
61 if self.current_user:
62 return 25 * (1024 ** 2)
63
64 # The rest is only allowed to upload up to 2MB
65 return 2 * (1024 ** 2)
66
67
68 class RawHandler(base.BaseHandler):
69 def get(self, uid):
70 entry = self.backend.nopaste.get(uid)
71 if not entry:
72 raise tornado.web.HTTPError(404)
73
74 # Set the filename
75 self.set_header("Content-Disposition", "inline; filename=\"%s\"" % entry.subject)
76
77 # Set mimetype
78 self.set_header("Content-Type", entry.mimetype)
79
80 # Set expiry headers
81 self.set_expires(3600)
82
83 # Send content
84 content = self.backend.nopaste.get_content(entry.uuid)
85 self.finish(content)
86
87
88 class ViewHandler(auth.CacheMixin, base.BaseHandler):
89 def get(self, uid):
90 entry = self.backend.nopaste.get(uid)
91 if not entry:
92 raise tornado.web.HTTPError(404)
93
94 # Fetch the content if the output should be displayed
95 if entry.mimetype.startswith("text/"):
96 content = self.backend.nopaste.get_content(entry.uuid)
97 else:
98 content = None
99
100 # Set expiry headers
101 self.set_expires(3600)
102
103 self.render("nopaste/view.html", entry=entry, content=content)
104
105
106 class CodeModule(ui_modules.UIModule):
107 def render(self, content):
108 return self.render_string("nopaste/modules/code.html", content=content)
109
110 def javascript_files(self):
111 return "js/prettify.js"
112
113 def css_files(self):
114 return "css/prettify.css"
115
116 def embedded_javascript(self):
117 return """
118 // Run pretty print
119 prettyPrint();
120 """