]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blobdiff - webapp/handlers_nopaste.py
nopaste: Send filename of uploaded files in the header
[people/shoehn/ipfire.org.git] / webapp / handlers_nopaste.py
index ec29f7e2052e8b10edc56555962ba157791d83c2..6c2b75b011a76b5512cc7fd2ba47aa848d9cdb77 100644 (file)
@@ -4,16 +4,103 @@ import tornado.web
 
 from handlers_base import *
 
+class NopasteCreateHandler(BaseHandler):
+       MODES = ("paste", "upload")
 
-class NopasteIndexHandler(BaseHandler):
        def get(self):
-               self.render("nopaste-index.html")
+               mode = self.get_argument("mode", "paste")
+               if not mode in self.MODES:
+                       raise tornado.web.HTTPError(400)
+
+               self.render("nopaste/create.html", mode=mode,
+                       max_size=self._max_size)
 
        def post(self):
-               pass
+               mode = self.get_argument("mode")
+               if not mode in self.MODES:
+                       raise tornado.web.HTTPError(400)
+
+               if mode == "paste":
+                       subject = self.get_argument("subject", None)
+                       content = self.get_argument("content")
+                       type = "text"
+
+               elif mode == "upload":
+                       type = "file"
+
+                       for f in self.request.files.get("file"):
+                               subject = f.filename
+                               content = f.body
+                               break
+
+               # Check maximum size
+               if len(content) > self._max_size:
+                       raise tornado.web.HTTPError(400,
+                               "You cannot upload more than %s bytes" % self._max_size)
+
+               expires = self.get_argument("expires", "0")
+               try:
+                       expires = int(expires)
+               except (TypeError, ValueError):
+                       expires = None
+
+               uid = self.backend.nopaste.create(subject, content, type=type,
+                       expires=expires, account=self.current_user,
+                       address=self.get_remote_ip())
+
+               if uid:
+                       return self.redirect("/view/%s" % uid)
+
+               raise tornado.web.HTTPError(500)
+
+       @property
+       def _max_size(self):
+               # Authenticated users are allowed to upload up to 10MB
+               if self.current_user:
+                       return 25 * (1024 ** 2)
+
+               # The rest is only allowed to upload up to 2MB
+               return 2 * (1024 ** 2)
+
+
+class NopasteRawHandler(BaseHandler):
+       def get(self, uid):
+               entry = self.backend.nopaste.get(uid)
+               if not entry:
+                       raise tornado.web.HTTPError(404)
+
+               # Set the filename
+               self.set_header("Content-Disposition", "inline; filename=\"%s\"" % entry.subject)
+
+               # Set mimetype
+               self.set_header("Content-Type", entry.mimetype)
+
+               # Set expiry headers
+               expires = entry.time_expires or \
+                       (datetime.datetime.utcnow() + datetime.timedelta(days=30))
+
+               # For HTTP/1.0
+               self.set_header("Expires", expires)
+
+               # For HTTP/1.1
+               max_age = expires - datetime.datetime.utcnow()
+               self.set_header("Cache-Control", "public,max-age=%d" % max_age.total_seconds())
+
+               # Send content
+               content = self.backend.nopaste.get_content(entry.uuid)
+               self.finish(content)
+
 
+class NopasteViewHandler(BaseHandler):
+       def get(self, uid):
+               entry = self.backend.nopaste.get(uid)
+               if not entry:
+                       raise tornado.web.HTTPError(404)
 
-class NopasteEntryHandler(BaseHandler):
-       def get(self, uuid):
-               pass
+               # Fetch the content if the output should be displayed
+               if entry.mimetype.startswith("text/"):
+                       content = self.backend.nopaste.get_content(entry.uuid)
+               else:
+                       content = None
 
+               self.render("nopaste/view.html", entry=entry, content=content)