From e2c4ec1f6ff0ba39cfc21eed67a99bbf46a20b90 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Fri, 15 Feb 2019 14:52:00 -0800 Subject: Make uploading over ajax, and ajax flash messages, work --- onionshare/web/receive_mode.py | 26 ++++++++++++++++----- share/static/css/style.css | 18 +++++---------- share/static/js/receive.js | 51 +++++++++++++++++++++++++++++++++++++----- share/templates/receive.html | 27 +++++++++++----------- 4 files changed, 84 insertions(+), 38 deletions(-) diff --git a/onionshare/web/receive_mode.py b/onionshare/web/receive_mode.py index 8500838a..16c433ee 100644 --- a/onionshare/web/receive_mode.py +++ b/onionshare/web/receive_mode.py @@ -1,5 +1,6 @@ import os import tempfile +import json from datetime import datetime from flask import Request, request, render_template, make_response, flash, redirect from werkzeug.utils import secure_filename @@ -150,6 +151,21 @@ class ReceiveModeWeb(object): return self.web.error404() return upload_logic() + @self.web.app.route("//upload-ajax", methods=['POST']) + def upload_ajax(slug_candidate): + if not self.can_upload: + return self.web.error403() + self.web.check_slug_candidate(slug_candidate) + return upload_logic(slug_candidate, ajax=True) + + @self.web.app.route("/upload-ajax", methods=['POST']) + def upload_ajax_public(): + if not self.can_upload: + return self.web.error403() + if not self.common.settings.get('public_mode'): + return self.web.error404() + return upload_logic(ajax=True) + class ReceiveModeWSGIMiddleware(object): """ @@ -251,12 +267,12 @@ class ReceiveModeRequest(Request): # Is this a valid upload request? self.upload_request = False if self.method == 'POST': - if self.path == '/{}/upload'.format(self.web.slug): - self.upload_request = True + if self.web.common.settings.get('public_mode'): + if self.path == '/upload' or self.path == '/upload-ajax': + self.upload_request = True else: - if self.web.common.settings.get('public_mode'): - if self.path == '/upload': - self.upload_request = True + if self.path == '/{}/upload'.format(self.web.slug) or self.path == '/{}/upload-ajax'.format(self.web.slug): + self.upload_request = True if self.upload_request: # No errors yet diff --git a/share/static/css/style.css b/share/static/css/style.css index daaa9ce4..73d3e6f9 100644 --- a/share/static/css/style.css +++ b/share/static/css/style.css @@ -139,30 +139,22 @@ ul.flashes { } ul.flashes li { - margin: 0; + margin: 0 0 5px 0; padding: 10px; + list-style: none; + border: 0; + border-radius: 3px; + text-align: left; } li.error { - list-style: none; - margin: 0; - padding: 0; color: #ffffff; background-color: #c90c0c; - border: 0; - border-radius: 5px; - text-align: left; } li.info { - list-style: none; - margin: 0; - padding: 0; color: #000000; background-color: #a9e26c; - border: 0; - border-radius: 5px; - text-align: left; } .closed-wrapper { diff --git a/share/static/js/receive.js b/share/static/js/receive.js index 746b860e..45cbc9dc 100644 --- a/share/static/js/receive.js +++ b/share/static/js/receive.js @@ -4,6 +4,15 @@ document.getElementById('noscript').style.display = 'none'; var form = document.getElementById('send'); var fileSelect = document.getElementById('file-select'); var uploadButton = document.getElementById('send-button'); +var flashes = document.getElementById('flashes'); + +// Add a flash message +function flash(category, message) { + var el = document.createElement('li'); + el.innerText = message; + el.className = category; + flashes.appendChild(el); +} form.onsubmit = function(event) { event.preventDefault(); @@ -30,9 +39,37 @@ form.onsubmit = function(event) { uploadButton.innerHTML = 'Uploading '+percent+'%'; }, false); - ajax.addEventListener("load", function(event){ - console.log("upload finished"); + ajax.addEventListener('load', function(event){ + console.log('upload finished', ajax.response); if(ajax.status == 200) { + // Parse response + try { + var response = JSON.parse(ajax.response); + + // The 'new_body' response replaces the whole HTML document and ends + if('new_body' in response) { + document.body.innerHTML = response['new_body']; + return; + } + + // Show error flashes + if('error_flashes' in response) { + for(var i=0; i

- {% with messages = get_flashed_messages(with_categories=true) %} - {% if messages %} -
    - {% for category, message in messages %} -
  • {{ message }}
  • - {% endfor %} -
- {% endif %} - {% endwith %} +
    + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
  • {{ message }}
  • + {% endfor %} + {% endif %} + {% endwith %} +
-

@@ -47,6 +45,7 @@ to Standard or turn off your Tor Browser's NoScript XSS setting.

+ -- cgit v1.2.3-54-g00ecf