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