diff options
author | Espen Kåsa Notodden <enotodden@puvoid.com> | 2014-06-26 22:51:20 +0200 |
---|---|---|
committer | Espen Kåsa Notodden <enotodden@puvoid.com> | 2014-06-26 22:51:20 +0200 |
commit | 4e5eb62dcace003d6b849a82b668e6d548a18443 (patch) | |
tree | e1892a0dd1237283fdbf1199b3120453bf86cbda | |
parent | 10f8600e540dde3c65841aa0a70df62243d61b62 (diff) | |
parent | 680b92e61db8776d62a6e7c7464759ef660eb2b2 (diff) | |
download | onionshare-4e5eb62dcace003d6b849a82b668e6d548a18443.tar.gz onionshare-4e5eb62dcace003d6b849a82b668e6d548a18443.zip |
Merge branch 'master' of https://github.com/micahflee/onionshare
-rw-r--r-- | BUILD.md | 3 | ||||
-rw-r--r-- | onionshare/onionshare.py | 10 | ||||
-rw-r--r-- | onionshare_gui/onionshare_gui.py | 44 | ||||
-rw-r--r-- | onionshare_gui/static/onionshare.js | 12 | ||||
-rw-r--r-- | onionshare_gui/webapp.py | 17 |
5 files changed, 69 insertions, 17 deletions
@@ -76,6 +76,7 @@ The first time you're setting up your dev environment: * Open a command prompt and type: `pip install flask stem pyinstaller` * Go to http://www.riverbankcomputing.com/software/pyqt/download and download the latest PyQt4 for Windows for python 2.7, 32-bit (I downloaded `PyQt4-4.11-gpl-Py2.7-Qt4.8.6-x32.exe`), then install it. * Go to http://sourceforge.net/projects/pywin32/ and download and install the latest 32-bit pywin32 binary for python 2.7. I downloaded `pywin32-219.win32-py2.7.exe`. +* Download and install the [Microsoft Visual C++ 2008 Redistributable Package (x86)](http://www.microsoft.com/en-us/download/details.aspx?id=29). To make a .exe: @@ -88,7 +89,7 @@ If you want to build the installer: To build the installer: -* Follow the steps above until to make the .exe. You should have a folder called `dist\onionshare` with a bunch of files inside of it, including `onionshare.exe`. +* Follow the steps above until to make the .exe. You should have a folder called `dist\onionshare` with a bunch of files inside of it, including `onionshare.exe`. Run `onionshare.exe` once before you build the installer, to compile all the `.py` files into `.pyc` files. * Open a command prompt, cd into the onionshare directory, and type: `makensisw setup\onionshare.nsi`. You'll find the installer, `OnionShare_Setup.exe`, inside the `dist` folder. ## Tests diff --git a/onionshare/onionshare.py b/onionshare/onionshare.py index a04a29a1..e728577e 100644 --- a/onionshare/onionshare.py +++ b/onionshare/onionshare.py @@ -29,6 +29,12 @@ def set_file_info(new_filename, new_filehash, new_filesize): filehash = new_filehash filesize = new_filesize +# automatically close +stay_open = False +def set_stay_open(new_stay_open): + global stay_open + stay_open = new_stay_open + app = Flask(__name__) # get path of onioshare directory @@ -40,7 +46,6 @@ else: strings = {} slug = random_string(16) download_count = 0 -stay_open = False REQUEST_LOAD = 0 REQUEST_DOWNLOAD = 1 @@ -127,6 +132,7 @@ def download(): # download is finished, close the server global stay_open if not stay_open: + print "Closing automatically because download finished" if shutdown_func is None: raise RuntimeError('Not running with the Werkzeug Server') shutdown_func() @@ -243,7 +249,7 @@ def main(): parser = argparse.ArgumentParser() parser.add_argument('--local-only', action='store_true', dest='local_only', help='Do not attempt to use tor: for development only') parser.add_argument('--stay-open', action='store_true', dest='stay_open', help='Keep hidden service running after download has finished') - parser.add_argument('filename', nargs=1) + parser.add_argument('filename', nargs=1, help='File to share') args = parser.parse_args() filename = os.path.abspath(args.filename[0]) diff --git a/onionshare_gui/onionshare_gui.py b/onionshare_gui/onionshare_gui.py index 51c60e44..233e7083 100644 --- a/onionshare_gui/onionshare_gui.py +++ b/onionshare_gui/onionshare_gui.py @@ -1,4 +1,4 @@ -import os, sys, subprocess, inspect, platform +import os, sys, subprocess, inspect, platform, argparse from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtWebKit import * @@ -54,11 +54,9 @@ def alert(msg, icon=QMessageBox.NoIcon): dialog.setIcon(icon) dialog.exec_() -def select_file(strings): +def select_file(strings, filename=None): # get filename, either from argument or file chooser dialog - if len(sys.argv) == 2: - filename = sys.argv[1] - else: + if not filename: args = {} if onionshare.get_platform() == 'Tails': args['directory'] = '/home/amnesia' @@ -89,21 +87,38 @@ def main(): subprocess.call(['/usr/bin/gksudo']+sys.argv) return + # parse arguments + parser = argparse.ArgumentParser() + parser.add_argument('--local-only', action='store_true', dest='local_only', help='Do not attempt to use tor: for development only') + parser.add_argument('--stay-open', action='store_true', dest='stay_open', help='Keep hidden service running after download has finished') + parser.add_argument('--debug', action='store_true', dest='debug', help='Log errors to disk') + parser.add_argument('filename', nargs='?', help='File to share') + args = parser.parse_args() + + filename = args.filename + local_only = args.local_only + stay_open = bool(args.stay_open) + debug = args.debug + + onionshare.set_stay_open(stay_open) + # create the onionshare icon global window_icon, onionshare_gui_dir window_icon = QIcon("{0}/onionshare-icon.png".format(onionshare_gui_dir)) # try starting hidden service onionshare_port = onionshare.choose_port() - try: - onion_host = onionshare.start_hidden_service(onionshare_port) - except onionshare.NoTor as e: - alert(e.args[0], QMessageBox.Warning) - return + local_host = "127.0.0.1:{0}".format(onionshare_port) + if not local_only: + try: + onion_host = onionshare.start_hidden_service(onionshare_port) + except onionshare.NoTor as e: + alert(e.args[0], QMessageBox.Warning) + return onionshare.tails_open_port(onionshare_port) # select file to share - filename, basename = select_file(onionshare.strings) + filename, basename = select_file(onionshare.strings, filename) if not filename: return @@ -111,9 +126,14 @@ def main(): webapp.onionshare = onionshare webapp.onionshare_port = onionshare_port webapp.filename = filename - webapp.onion_host = onion_host + if not local_only: + webapp.onion_host = onion_host + else: + webapp.onion_host = local_host webapp.qtapp = app webapp.clipboard = app.clipboard() + webapp.stay_open = stay_open + webapp.debug = debug # run the web app in a new thread webapp_port = onionshare.choose_port() diff --git a/onionshare_gui/static/onionshare.js b/onionshare_gui/static/onionshare.js index 6c7b7fa0..7dedb6af 100644 --- a/onionshare_gui/static/onionshare.js +++ b/onionshare_gui/static/onionshare.js @@ -75,6 +75,14 @@ $(function(){ }); } + $('#close-on-finish').change(function(){ + if($('#close-on-finish').is(':checked')) { + $.ajax({ url: '/stay_open_false' }); + } else { + $.ajax({ url: '/stay_open_true' }); + } + }); + // initialize $.ajax({ url: '/init_info', @@ -86,6 +94,10 @@ $(function(){ $('#filehash .label').html(onionshare.strings['sha1_checksum']+':'); $('#close-on-finish-wrapper label').html(onionshare.strings['close_on_finish']); $('#loading .calculating').html(onionshare.strings['calculating_sha1']); + + if(onionshare.stay_open) { + $('#close-on-finish').removeAttr('checked'); + } // after getting the initial info, start the onionshare server $.ajax({ diff --git a/onionshare_gui/webapp.py b/onionshare_gui/webapp.py index 80f2c3f8..11f62cd8 100644 --- a/onionshare_gui/webapp.py +++ b/onionshare_gui/webapp.py @@ -7,6 +7,8 @@ filename = None onion_host = None qtapp = None clipboard = None +stay_open = None +debug = None url = None @@ -35,12 +37,13 @@ def index(): @app.route("/init_info") def init_info(): - global onionshare, filename + global onionshare, filename, stay_open basename = os.path.basename(filename) return json.dumps({ 'strings': onionshare.strings, - 'basename': basename + 'basename': basename, + 'stay_open': stay_open }) @app.route("/start_onionshare") @@ -83,6 +86,16 @@ def copy_url(): clipboard.setText(url) return '' +@app.route("/stay_open_true") +def stay_open_true(): + global onionshare + onionshare.set_stay_open(True) + +@app.route("/stay_open_false") +def stay_open_false(): + global onionshare + onionshare.set_stay_open(False) + @app.route("/heartbeat") def check_for_requests(): global onionshare |