onionshare/onionshare_gui/webapp.py
2014-06-24 17:23:10 -04:00

108 lines
2.8 KiB
Python

from flask import Flask, render_template
import threading, json, os, time, platform, sys
onionshare = None
onionshare_port = None
filename = None
onion_host = None
qtapp = None
clipboard = None
url = None
# figure out this platform's temp dir
if platform.system() == 'Windows':
temp_dir = os.environ['Temp'].replace('\\', '/')
else:
temp_dir = '/tmp/'
# suppress output in windows
if platform.system() == 'Windows':
sys.stdout = open('{0}/onionshare.stdout.log'.format(temp_dir), 'w')
sys.stderr = open('{0}/onionshare.stderr.log'.format(temp_dir), 'w')
# log web errors to file
import logging
log_handler = logging.FileHandler('{0}/onionshare.web.log'.format(temp_dir))
log_handler.setLevel(logging.WARNING)
app = Flask(__name__, template_folder='./templates')
app.logger.addHandler(log_handler)
@app.route("/")
def index():
return render_template('index.html')
@app.route("/init_info")
def init_info():
global onionshare, filename
basename = os.path.basename(filename)
return json.dumps({
'strings': onionshare.strings,
'basename': basename
})
@app.route("/start_onionshare")
def start_onionshare():
global onionshare, onionshare_port, filename, onion_host, url
url = 'http://{0}/{1}'.format(onion_host, onionshare.slug)
filehash, filesize = onionshare.file_crunching(filename)
onionshare.set_file_info(filename, filehash, filesize)
# start onionshare service in new thread
t = threading.Thread(target=onionshare.app.run, kwargs={'port': onionshare_port})
t.daemon = True
t.start()
return json.dumps({
'filehash': filehash,
'filesize': filesize,
'url': url
})
@app.route("/copy_url")
def copy_url():
if platform.system() == 'Windows':
# Qt's QClipboard isn't working in Windows
# https://github.com/micahflee/onionshare/issues/46
import ctypes
GMEM_DDESHARE = 0x2000
ctypes.windll.user32.OpenClipboard(None)
ctypes.windll.user32.EmptyClipboard()
hcd = ctypes.windll.kernel32.GlobalAlloc(GMEM_DDESHARE, len(bytes(url))+1)
pch_data = ctypes.windll.kernel32.GlobalLock(hcd)
ctypes.cdll.msvcrt.strcpy(ctypes.c_char_p(pch_data), bytes(url))
ctypes.windll.kernel32.GlobalUnlock(hcd)
ctypes.windll.user32.SetClipboardData(1, hcd)
ctypes.windll.user32.CloseClipboard()
else:
global clipboard
clipboard.setText(url)
return ''
@app.route("/heartbeat")
def check_for_requests():
global onionshare
events = []
done = False
while not done:
try:
r = onionshare.q.get(False)
events.append(r)
except onionshare.Queue.Empty:
done = True
return json.dumps(events)
@app.route("/close")
def close():
global qtapp
time.sleep(1)
qtapp.closeAllWindows()
return ''