]>
Commit | Line | Data |
---|---|---|
60024cc8 MT |
1 | #!/usr/bin/python |
2 | ||
3 | import tornado.web | |
4 | ||
5 | from handlers_base import * | |
6 | ||
66862195 | 7 | class NopasteCreateHandler(BaseHandler): |
b0b3e3e7 MT |
8 | MODES = ("paste", "upload") |
9 | ||
60024cc8 | 10 | def get(self): |
b0b3e3e7 MT |
11 | mode = self.get_argument("mode", "paste") |
12 | if not mode in self.MODES: | |
13 | raise tornado.web.HTTPError(400) | |
14 | ||
15 | self.render("nopaste/create.html", mode=mode, | |
16 | max_size=self._max_size) | |
60024cc8 MT |
17 | |
18 | def post(self): | |
b0b3e3e7 MT |
19 | mode = self.get_argument("mode") |
20 | if not mode in self.MODES: | |
21 | raise tornado.web.HTTPError(400) | |
22 | ||
23 | if mode == "paste": | |
24 | subject = self.get_argument("subject", None) | |
25 | content = self.get_argument("content") | |
26 | type = "text" | |
27 | ||
28 | elif mode == "upload": | |
29 | type = "file" | |
30 | ||
31 | for f in self.request.files.get("file"): | |
32 | subject = f.filename | |
33 | content = f.body | |
34 | break | |
35 | ||
36 | # Check maximum size | |
37 | if len(content) > self._max_size: | |
38 | raise tornado.web.HTTPError(400, | |
39 | "You cannot upload more than %s bytes" % self._max_size) | |
66862195 MT |
40 | |
41 | expires = self.get_argument("expires", "0") | |
42 | try: | |
43 | expires = int(expires) | |
44 | except (TypeError, ValueError): | |
45 | expires = None | |
46 | ||
b0b3e3e7 | 47 | uid = self.backend.nopaste.create(subject, content, type=type, |
66862195 MT |
48 | expires=expires, account=self.current_user, |
49 | address=self.get_remote_ip()) | |
50 | ||
51 | if uid: | |
52 | return self.redirect("/view/%s" % uid) | |
53 | ||
54 | raise tornado.web.HTTPError(500) | |
55 | ||
b0b3e3e7 MT |
56 | @property |
57 | def _max_size(self): | |
58 | # Authenticated users are allowed to upload up to 10MB | |
59 | if self.current_user: | |
e72c1f45 | 60 | return 25 * (1024 ** 2) |
b0b3e3e7 MT |
61 | |
62 | # The rest is only allowed to upload up to 2MB | |
63 | return 2 * (1024 ** 2) | |
64 | ||
66862195 MT |
65 | |
66 | class NopasteRawHandler(BaseHandler): | |
67 | def get(self, uid): | |
68 | entry = self.backend.nopaste.get(uid) | |
69 | if not entry: | |
70 | raise tornado.web.HTTPError(404) | |
71 | ||
6f3eb7f9 MT |
72 | # Set the filename |
73 | self.set_header("Content-Disposition", "inline; filename=\"%s\"" % entry.subject) | |
74 | ||
66862195 MT |
75 | # Set mimetype |
76 | self.set_header("Content-Type", entry.mimetype) | |
77 | ||
e2708eb5 MT |
78 | # Set expiry headers |
79 | expires = entry.time_expires or \ | |
80 | (datetime.datetime.utcnow() + datetime.timedelta(days=30)) | |
81 | ||
82 | # For HTTP/1.0 | |
83 | self.set_header("Expires", expires) | |
84 | ||
85 | # For HTTP/1.1 | |
86 | max_age = expires - datetime.datetime.utcnow() | |
87 | self.set_header("Cache-Control", "public,max-age=%d" % max_age.total_seconds()) | |
88 | ||
66862195 | 89 | # Send content |
0de07bc3 MT |
90 | content = self.backend.nopaste.get_content(entry.uuid) |
91 | self.finish(content) | |
60024cc8 MT |
92 | |
93 | ||
66862195 MT |
94 | class NopasteViewHandler(BaseHandler): |
95 | def get(self, uid): | |
96 | entry = self.backend.nopaste.get(uid) | |
97 | if not entry: | |
98 | raise tornado.web.HTTPError(404) | |
60024cc8 | 99 | |
0de07bc3 MT |
100 | # Fetch the content if the output should be displayed |
101 | if entry.mimetype.startswith("text/"): | |
102 | content = self.backend.nopaste.get_content(entry.uuid) | |
103 | else: | |
104 | content = None | |
105 | ||
106 | self.render("nopaste/view.html", entry=entry, content=content) |