diff options
author | kali <kali@leap.se> | 2017-08-02 18:40:21 -0700 |
---|---|---|
committer | Kali Kaneko <kali@leap.se> | 2017-08-14 18:09:06 -0400 |
commit | 9c74ffb925325de98e8dd73acdf1602dd40bfcc0 (patch) | |
tree | b0cb7e5ab25b86927c2c95d51df172ae91824986 /src/leap/bitmask/gui/app2.py | |
parent | e40e28b51312cd1e257022bfcb74b37d619dc0ea (diff) |
[pkg] working bundle in osx using pywebview + pyobjc
Diffstat (limited to 'src/leap/bitmask/gui/app2.py')
-rw-r--r-- | src/leap/bitmask/gui/app2.py | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/leap/bitmask/gui/app2.py b/src/leap/bitmask/gui/app2.py new file mode 100644 index 00000000..13f369c4 --- /dev/null +++ b/src/leap/bitmask/gui/app2.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +# app.py +# Copyright (C) 2016 LEAP Encryption Acess Project +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +""" +Main entrypoint for the Bitmask Qt GUI. +It just launches a webview browser that runs the local web-ui served by bitmaskd +when the web service is running. +""" + +import os +import platform +import signal +import sys +import time +import webbrowser + +from functools import partial +from multiprocessing import Process + +from leap.bitmask.core.launcher import run_bitmaskd, pid +from leap.common.config import get_path_prefix +#from leap.bitmask.gui import app_rc + +import webview + +DEBUG = os.environ.get("DEBUG", False) + +BITMASK_URI = 'http://localhost:7070/' +PIXELATED_URI = 'http://localhost:9090/' + +qApp = None +bitmaskd = None +browser = None + + +class BrowserWindow(object): + """ + A browser window using pywebview. + + This BrowserWindow assumes that the backend is already running, since it is + going to look for the authtoken in the configuration folder. + """ + def __init__(self, *args, **kw): + url = kw.pop('url', None) + first = False + if not url: + url = "http://localhost:7070" + path = os.path.join(get_path_prefix(), 'leap', 'authtoken') + waiting = 20 + while not os.path.isfile(path): + if waiting == 0: + # If we arrive here, something really messed up happened, + # because touching the token file is one of the first + # things the backend does, and this BrowserWindow + # should be called *right after* launching the backend. + raise NoAuthToken( + 'No authentication token found!') + time.sleep(0.1) + waiting -= 1 + token = open(path).read().strip() + url += '#' + token + first = True + self.url = url + self.closing = False + + webview.create_window('Bitmask', self.url) + + + def loadPage(self, web_page): + self.load(url) + + def shutdown(self, *args): + if self.closing: + return + self.closing = True + global bitmaskd + bitmaskd.join() + if os.path.isfile(pid): + with open(pid) as f: + pidno = int(f.read()) + print('[bitmask] terminating bitmaskd...') + os.kill(pidno, signal.SIGTERM) + print('[bitmask] shutting down gui...') + + + +def launch_gui(): + global bitmaskd + global browser + + bitmaskd = Process(target=run_bitmaskd) + bitmaskd.start() + + try: + browser = BrowserWindow(None) + except NoAuthToken as e: + print('ERROR: ' + e.message) + sys.exit(1) + + +def start_app(): + from leap.bitmask.util import STANDALONE + os.environ['QT_AUTO_SCREEN_SCALE_FACTOR'] = '1' + + # Allow the frozen binary in the bundle double as the cli entrypoint + # Why have only a user interface when you can have two? + + if STANDALONE and len(sys.argv) > 1: + if sys.argv[1] == 'bitmask_helpers': + from leap.bitmask.vpn.helpers import main + return main() + + from leap.bitmask.cli import bitmask_cli + return bitmask_cli.main() + + prev_auth = os.path.join(get_path_prefix(), 'leap', 'authtoken') + try: + os.remove(prev_auth) + except OSError: + pass + + launch_gui() + + +class NoAuthToken(Exception): + pass + + +if __name__ == "__main__": + start_app() |