]> git.ipfire.org Git - ipfire.org.git/commitdiff
nopaste: Bring back the upload page
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 23 Feb 2024 20:07:40 +0000 (20:07 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 23 Feb 2024 20:07:40 +0000 (20:07 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/templates/nopaste/create.html
src/templates/nopaste/upload.html [new file with mode: 0644]
src/web/__init__.py
src/web/nopaste.py

index 334b0d83da5c9e7bb771d72b4204522719017e58..7cafb5cb30deac45d4ec523236019563427bf554 100644 (file)
@@ -53,8 +53,8 @@
 
                                                <div class="field">
                                                        <div class="control">
-                                                               <button type="submit" class="button is-primary has-text-weight-bold">
-                                                                       <i class="fa-solid fa-upload"></i>{{ _("Upload") }}
+                                                               <button type="submit" class="button is-primary">
+                                                                       <i class="fa-solid fa-upload"></i> {{ _("Upload") }}
                                                                </button>
                                                        </div>
                                                </div>
diff --git a/src/templates/nopaste/upload.html b/src/templates/nopaste/upload.html
new file mode 100644 (file)
index 0000000..f953bfc
--- /dev/null
@@ -0,0 +1,82 @@
+{% extends "../base.html" %}
+
+{% block title %}{{ _("Upload File") }}{% end block %}
+
+{% block container %}
+       <section class="hero is-primary">
+               <div class="hero-body">
+                       <div class="container">
+                               <h1 class="title">{{ _("Upload File") }}</h1>
+                       </div>
+               </div>
+       </section>
+
+       <section class="section">
+               <div class="container">
+                       <div class="columns">
+                               <div class="column is-8">
+                                       <form action="" method="POST" enctype="multipart/form-data">
+                                               {% raw xsrf_form_html() %}
+
+                                               <div class="field">
+                                                       <label class="label">{{ _("File") }}</label>
+
+                                                       <div class="control">
+                                                               <div class="file has-name is-fullwidth">
+                                                                       <label class="file-label">
+                                                                               <input class="file-input" type="file" name="file">
+
+                                                                               <span class="file-cta">
+                                                                                       <span class="file-icon">
+                                                                                               <i class="fas fa-upload"></i>
+                                                                                       </span>
+                                                                                       <span class="file-label">
+                                                                                               {{ _("Choose a file…") }}
+                                                                                       </span>
+                                                                               </span>
+
+                                                                               <span class="file-name"></span>
+                                                                       </label>
+                                                               </div>
+                                                       </div>
+                                               </div>
+
+                                               <div class="field">
+                                                       <label class="label">{{ _("Subject") }}</label>
+
+                                                       <div class="control">
+                                                               <input class="input" type="text" name="subject"
+                                                                       placeholder="{{ _("Subject") }} ({{ _("optional") }})">
+                                                       </div>
+                                               </div>
+
+                                               <div class="field">
+                                                       <label class="label">{{ _("Expires After") }}</label>
+
+                                                       <div class="control">
+                                                               <div class="select is-fullwidth" name="expires">
+                                                                       <select>
+                                                                               <option value="0">{{ _("never") }}</option>
+                                                                               <option value="600">{{ _("after ten minutes") }}</option>
+                                                                               <option value="3600">{{ _("after one hour") }}</option>
+                                                                               <option value="{{ 24 * 3600 }}">{{ _("after one day") }}</option>
+                                                                               <option value="{{ 7 * 24 * 3600 }}">{{ _("after one week") }}</option>
+                                                                               <option value="{{ 30 * 24 * 3600 }}" selected>{{ _("after one month") }}</option>
+                                                                       </select>
+                                                               </div>
+                                                       </div>
+                                               </div>
+
+                                               <div class="field">
+                                                       <div class="control">
+                                                               <button type="submit" class="button is-primary">
+                                                                       <i class="fa-solid fa-upload"></i> {{ _("Upload") }}
+                                                               </button>
+                                                       </div>
+                                               </div>
+                                       </form>
+                               </div>
+                       </div>
+               </div>
+       </section>
+{% end block %}
index 0ea16fcd8080aa0e5e57329cf8be45f1f0349e1d..52aab69947cb3c1c32129c61b7aeaafbaecfb55f 100644 (file)
@@ -330,6 +330,9 @@ class Application(tornado.web.Application):
                # nopaste.ipfire.org
                self.add_handlers(r"nopaste\.([a-z]+\.dev\.)?ipfire\.org", [
                        (r"/", nopaste.CreateHandler),
+                       (r"/upload", nopaste.UploadHandler),
+
+                       # View
                        (r"/raw/(.*)", nopaste.RawHandler),
                        (r"/view/(.*)", nopaste.ViewHandler),
 
index 910d5364d2ee059c22f77dbbd5e300122dfab950..f643813e0891bdc741decdc1297152bd5cdc3956 100644 (file)
@@ -68,6 +68,30 @@ class CreateHandler(base.AnalyticsMixin, base.BaseHandler):
                self.finish()
 
 
+class UploadHandler(base.AnalyticsMixin, base.BaseHandler):
+       @tornado.web.authenticated
+       def get(self):
+               self.render("nopaste/upload.html")
+
+       @tornado.web.authenticated
+       def post(self):
+               subject = self.get_argument("subject", None)
+
+               # Fetch expires time
+               expires = self.get_argument_int("expires", "0")
+
+               with self.db.transaction():
+                       for f in self.request.files.get("file"):
+                               paste = self.backend.nopaste.create(f.body, subject=subject, expires=expires,
+                                       account=self.current_user, address=self.get_remote_ip())
+
+                               # Only accept one file
+                               break
+
+               # Redirect to the paste
+               return self.redirect("/view/%s" % paste.uuid)
+
+
 class RawHandler(base.AnalyticsMixin, base.BaseHandler):
        def get(self, uid):
                with self.db.transaction():