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