diff --git a/dangerzone/__init__.py b/dangerzone/__init__.py index 8edcba8..8021fc4 100644 --- a/dangerzone/__init__.py +++ b/dangerzone/__init__.py @@ -3,11 +3,14 @@ import sys dangerzone_version = "0.1.5" -# This is a hack for Windows and Mac to be able to run dangerzone-container, even though -# PyInstaller builds a single binary +# Depending on the filename, decide if we want to run: +# dangerzone, dangerzone-cli, or dangerzone-container + basename = os.path.basename(sys.argv[0]) + if basename == "dangerzone-container" or basename == "dangerzone-container.exe": from .container import container_main as main +elif basename == "dangerzone-cli" or basename == "dangerzone-cli.exe": + from .cli import cli_main as main else: - # If the binary isn't "dangerzone-contatiner", then launch the GUI from .gui import gui_main as main diff --git a/dangerzone/cli.py b/dangerzone/cli.py new file mode 100644 index 0000000..7265bc9 --- /dev/null +++ b/dangerzone/cli.py @@ -0,0 +1,8 @@ +import click + + +@click.command() +@click.option("--custom-container") # Use this container instead of flmcode/dangerzone +@click.argument("filename", required=False) +def cli_main(custom_container, filename): + pass diff --git a/dangerzone/global_common.py b/dangerzone/global_common.py index 0f74a6e..084e79f 100644 --- a/dangerzone/global_common.py +++ b/dangerzone/global_common.py @@ -1,26 +1,13 @@ import sys import os import inspect -import tempfile import appdirs import platform import subprocess -import shlex import pipes from PySide2 import QtCore, QtGui, QtWidgets -if platform.system() == "Darwin": - import CoreServices - import LaunchServices - import plistlib - -elif platform.system() == "Linux": - import grp - import getpass - from xdg.DesktopEntry import DesktopEntry - from .settings import Settings -from .docker_installer import is_docker_ready class GlobalCommon(object): @@ -28,19 +15,7 @@ class GlobalCommon(object): The GlobalCommon class is a singleton of shared functionality throughout the app """ - def __init__(self, app): - # Qt app - self.app = app - - # Name of input file - self.document_filename = None - - # Name of output file - self.save_filename = None - - # Preload font - self.fixed_font = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.FixedFont) - + def __init__(self): # App data folder self.appdata_path = appdirs.user_config_dir("dangerzone") @@ -50,9 +25,6 @@ class GlobalCommon(object): # dangerzone-container path self.dz_container_path = self.get_dangerzone_container_path() - # Preload list of PDF viewers on computer - self.pdf_viewers = self._find_pdf_viewers() - # Languages supported by tesseract self.ocr_languages = { "Afrikaans": "ar", @@ -295,187 +267,6 @@ class GlobalCommon(object): stderr=subprocess.PIPE, ) - def get_window_icon(self): - if platform.system() == "Windows": - path = self.get_resource_path("dangerzone.ico") - else: - path = self.get_resource_path("icon.png") - return QtGui.QIcon(path) - - def open_pdf_viewer(self, filename): - if self.settings.get("open_app") in self.pdf_viewers: - if platform.system() == "Darwin": - # Get the PDF reader bundle command - bundle_identifier = self.pdf_viewers[self.settings.get("open_app")] - args = ["open", "-b", bundle_identifier, filename] - - # Run - print(f"Executing: {' '.join(args)}") - subprocess.run(args) - - elif platform.system() == "Linux": - # Get the PDF reader command - args = shlex.split(self.pdf_viewers[self.settings.get("open_app")]) - # %f, %F, %u, and %U are filenames or URLS -- so replace with the file to open - for i in range(len(args)): - if ( - args[i] == "%f" - or args[i] == "%F" - or args[i] == "%u" - or args[i] == "%U" - ): - args[i] = filename - - # Open as a background process - print(f"Executing: {' '.join(args)}") - subprocess.Popen(args) - - def _find_pdf_viewers(self): - pdf_viewers = {} - - if platform.system() == "Darwin": - # Get all installed apps that can open PDFs - bundle_identifiers = LaunchServices.LSCopyAllRoleHandlersForContentType( - "com.adobe.pdf", CoreServices.kLSRolesAll - ) - for bundle_identifier in bundle_identifiers: - # Get the filesystem path of the app - res = LaunchServices.LSCopyApplicationURLsForBundleIdentifier( - bundle_identifier, None - ) - if res[0] is None: - continue - app_url = res[0][0] - app_path = str(app_url.path()) - - # Load its plist file - plist_path = os.path.join(app_path, "Contents/Info.plist") - - # Skip if there's not an Info.plist - if not os.path.exists(plist_path): - continue - - with open(plist_path, "rb") as f: - plist_data = f.read() - - plist_dict = plistlib.loads(plist_data) - - if ( - plist_dict.get("CFBundleName") - and plist_dict["CFBundleName"] != "Dangerzone" - ): - pdf_viewers[plist_dict["CFBundleName"]] = bundle_identifier - - elif platform.system() == "Linux": - # Find all .desktop files - for search_path in [ - "/usr/share/applications", - "/usr/local/share/applications", - os.path.expanduser("~/.local/share/applications"), - ]: - try: - for filename in os.listdir(search_path): - full_filename = os.path.join(search_path, filename) - if os.path.splitext(filename)[1] == ".desktop": - - # See which ones can open PDFs - desktop_entry = DesktopEntry(full_filename) - if ( - "application/pdf" in desktop_entry.getMimeTypes() - and desktop_entry.getName() != "dangerzone" - ): - pdf_viewers[ - desktop_entry.getName() - ] = desktop_entry.getExec() - - except FileNotFoundError: - pass - - return pdf_viewers - - def ensure_docker_group_preference(self): - # If the user prefers typing their password - if self.settings.get("linux_prefers_typing_password") == True: - return True - - # Get the docker group - try: - groupinfo = grp.getgrnam("docker") - except: - # Ignore if group is not found - return True - - # See if the user is in the group - username = getpass.getuser() - if username not in groupinfo.gr_mem: - # User is not in the docker group, ask if they prefer typing their password - message = "Dangerzone requires Docker

In order to use Docker, your user must be in the 'docker' group or you'll need to type your password each time you run dangerzone.

Adding your user to the 'docker' group is more convenient but less secure, and will require just typing your password once. Which do you prefer?" - return_code = Alert( - self, - message, - ok_text="I'll type my password each time", - extra_button_text="Add my user to the 'docker' group", - ).launch() - if return_code == QtWidgets.QDialog.Accepted: - # Prefers typing password - self.settings.set("linux_prefers_typing_password", True) - self.settings.save() - return True - elif return_code == 2: - # Prefers being in the docker group - self.settings.set("linux_prefers_typing_password", False) - self.settings.save() - - # Add user to the docker group - p = subprocess.run( - [ - "/usr/bin/pkexec", - "/usr/sbin/usermod", - "-a", - "-G", - "docker", - username, - ] - ) - if p.returncode == 0: - message = "Great! Now you must log out of your computer and log back in, and then you can use Dangerzone." - Alert(self, message).launch() - else: - message = "Failed to add your user to the 'docker' group, quitting." - Alert(self, message).launch() - - return False - else: - # Cancel - return False - - return True - - def ensure_docker_service_is_started(self): - if not is_docker_ready(self): - message = "Dangerzone requires Docker

Docker should be installed, but it looks like it's not running in the background.

Click Ok to try starting the docker service. You will have to type your login password." - if Alert(self, message).launch() == QtWidgets.QDialog.Accepted: - p = subprocess.run( - [ - "/usr/bin/pkexec", - self.get_resource_path("enable_docker_service.sh"), - ] - ) - if p.returncode == 0: - # Make sure docker is now ready - if is_docker_ready(self): - return True - else: - message = "Restarting docker appeared to work, but the service still isn't responding, quitting." - Alert(self, message).launch() - else: - message = "Failed to start the docker service, quitting." - Alert(self, message).launch() - - return False - - return True - def get_subprocess_startupinfo(self): if platform.system() == "Windows": startupinfo = subprocess.STARTUPINFO() @@ -483,71 +274,3 @@ class GlobalCommon(object): return startupinfo else: return None - - -class Alert(QtWidgets.QDialog): - def __init__(self, common, message, ok_text="Ok", extra_button_text=None): - super(Alert, self).__init__() - self.common = common - - self.setWindowTitle("dangerzone") - self.setWindowIcon(self.common.get_window_icon()) - self.setModal(True) - - flags = ( - QtCore.Qt.CustomizeWindowHint - | QtCore.Qt.WindowTitleHint - | QtCore.Qt.WindowSystemMenuHint - | QtCore.Qt.WindowCloseButtonHint - | QtCore.Qt.WindowStaysOnTopHint - ) - self.setWindowFlags(flags) - - logo = QtWidgets.QLabel() - logo.setPixmap( - QtGui.QPixmap.fromImage( - QtGui.QImage(self.common.get_resource_path("icon.png")) - ) - ) - - label = QtWidgets.QLabel() - label.setText(message) - label.setWordWrap(True) - - message_layout = QtWidgets.QHBoxLayout() - message_layout.addWidget(logo) - message_layout.addSpacing(10) - message_layout.addWidget(label, stretch=1) - - ok_button = QtWidgets.QPushButton(ok_text) - ok_button.clicked.connect(self.clicked_ok) - if extra_button_text: - extra_button = QtWidgets.QPushButton(extra_button_text) - extra_button.clicked.connect(self.clicked_extra) - cancel_button = QtWidgets.QPushButton("Cancel") - cancel_button.clicked.connect(self.clicked_cancel) - - buttons_layout = QtWidgets.QHBoxLayout() - buttons_layout.addStretch() - buttons_layout.addWidget(ok_button) - if extra_button_text: - buttons_layout.addWidget(extra_button) - buttons_layout.addWidget(cancel_button) - - layout = QtWidgets.QVBoxLayout() - layout.addLayout(message_layout) - layout.addSpacing(10) - layout.addLayout(buttons_layout) - self.setLayout(layout) - - def clicked_ok(self): - self.done(QtWidgets.QDialog.Accepted) - - def clicked_extra(self): - self.done(2) - - def clicked_cancel(self): - self.done(QtWidgets.QDialog.Rejected) - - def launch(self): - return self.exec_() diff --git a/dangerzone/gui.py b/dangerzone/gui/__init__.py similarity index 90% rename from dangerzone/gui.py rename to dangerzone/gui/__init__.py index 4fe1107..a2c59a8 100644 --- a/dangerzone/gui.py +++ b/dangerzone/gui/__init__.py @@ -3,21 +3,19 @@ import sys import signal import platform import click -import time import uuid -import subprocess from PySide2 import QtCore, QtWidgets -from .global_common import GlobalCommon +from .common import GuiCommon from .main_window import MainWindow from .docker_installer import ( is_docker_installed, is_docker_ready, - launch_docker_windows, DockerInstaller, AuthorizationFailed, ) -from .container import container_runtime +from ..global_common import GlobalCommon +from ..container import container_runtime # For some reason, Dangerzone segfaults if I inherit from QApplication directly, so instead @@ -59,8 +57,9 @@ def gui_main(custom_container, filename): app_wrapper = ApplicationWrapper() app = app_wrapper.app - # GlobalCommon object - global_common = GlobalCommon(app) + # Common objects + global_common = GlobalCommon() + gui_common = GuiCommon(app, global_common) if custom_container: # Do we have this container? @@ -89,10 +88,10 @@ def gui_main(custom_container, filename): # If we're using Linux and docker, see if we need to add the user to the docker group or if the user prefers typing their password if platform.system() == "Linux": - if not global_common.ensure_docker_group_preference(): + if not gui_common.ensure_docker_group_preference(): return try: - if not global_common.ensure_docker_service_is_started(): + if not gui_common.ensure_docker_service_is_started(): click.echo("Failed to start docker service") return except AuthorizationFailed: @@ -101,10 +100,10 @@ def gui_main(custom_container, filename): # See if we need to install Docker... if (platform.system() == "Darwin" or platform.system() == "Windows") and ( - not is_docker_installed(global_common) or not is_docker_ready(global_common) + not is_docker_installed() or not is_docker_ready(global_common) ): click.echo("Docker is either not installed or not running") - docker_installer = DockerInstaller(global_common) + docker_installer = DockerInstaller(gui_common) docker_installer.start() return @@ -124,7 +123,7 @@ def gui_main(custom_container, filename): window = windows[list(windows.keys())[0]] else: window_id = uuid.uuid4().hex - window = MainWindow(global_common, window_id) + window = MainWindow(global_common, gui_common, window_id) window.delete_window.connect(delete_window) windows[window_id] = window diff --git a/dangerzone/gui/common.py b/dangerzone/gui/common.py new file mode 100644 index 0000000..982121e --- /dev/null +++ b/dangerzone/gui/common.py @@ -0,0 +1,295 @@ +import os +import platform +import subprocess +import shlex +from PySide2 import QtCore, QtGui, QtWidgets + +if platform.system() == "Darwin": + import CoreServices + import LaunchServices + import plistlib + +elif platform.system() == "Linux": + import grp + import getpass + from xdg.DesktopEntry import DesktopEntry + +from .docker_installer import is_docker_ready +from ..settings import Settings + + +class GuiCommon(object): + """ + The GuiCommon class is a singleton of shared functionality for the GUI + """ + + def __init__(self, app, global_common): + # Qt app + self.app = app + + # Global common singleton + self.global_common = global_common + + # Preload font + self.fixed_font = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.FixedFont) + + # Preload list of PDF viewers on computer + self.pdf_viewers = self._find_pdf_viewers() + + def get_window_icon(self): + if platform.system() == "Windows": + path = self.global_common.get_resource_path("dangerzone.ico") + else: + path = self.global_common.get_resource_path("icon.png") + return QtGui.QIcon(path) + + def open_pdf_viewer(self, filename): + if self.global_common.settings.get("open_app") in self.pdf_viewers: + if platform.system() == "Darwin": + # Get the PDF reader bundle command + bundle_identifier = self.pdf_viewers[self.global_common.settings.get("open_app")] + args = ["open", "-b", bundle_identifier, filename] + + # Run + print(f"Executing: {' '.join(args)}") + subprocess.run(args) + + elif platform.system() == "Linux": + # Get the PDF reader command + args = shlex.split(self.pdf_viewers[self.global_common.settings.get("open_app")]) + # %f, %F, %u, and %U are filenames or URLS -- so replace with the file to open + for i in range(len(args)): + if ( + args[i] == "%f" + or args[i] == "%F" + or args[i] == "%u" + or args[i] == "%U" + ): + args[i] = filename + + # Open as a background process + print(f"Executing: {' '.join(args)}") + subprocess.Popen(args) + + def _find_pdf_viewers(self): + pdf_viewers = {} + + if platform.system() == "Darwin": + # Get all installed apps that can open PDFs + bundle_identifiers = LaunchServices.LSCopyAllRoleHandlersForContentType( + "com.adobe.pdf", CoreServices.kLSRolesAll + ) + for bundle_identifier in bundle_identifiers: + # Get the filesystem path of the app + res = LaunchServices.LSCopyApplicationURLsForBundleIdentifier( + bundle_identifier, None + ) + if res[0] is None: + continue + app_url = res[0][0] + app_path = str(app_url.path()) + + # Load its plist file + plist_path = os.path.join(app_path, "Contents/Info.plist") + + # Skip if there's not an Info.plist + if not os.path.exists(plist_path): + continue + + with open(plist_path, "rb") as f: + plist_data = f.read() + + plist_dict = plistlib.loads(plist_data) + + if ( + plist_dict.get("CFBundleName") + and plist_dict["CFBundleName"] != "Dangerzone" + ): + pdf_viewers[plist_dict["CFBundleName"]] = bundle_identifier + + elif platform.system() == "Linux": + # Find all .desktop files + for search_path in [ + "/usr/share/applications", + "/usr/local/share/applications", + os.path.expanduser("~/.local/share/applications"), + ]: + try: + for filename in os.listdir(search_path): + full_filename = os.path.join(search_path, filename) + if os.path.splitext(filename)[1] == ".desktop": + + # See which ones can open PDFs + desktop_entry = DesktopEntry(full_filename) + if ( + "application/pdf" in desktop_entry.getMimeTypes() + and desktop_entry.getName() != "dangerzone" + ): + pdf_viewers[ + desktop_entry.getName() + ] = desktop_entry.getExec() + + except FileNotFoundError: + pass + + return pdf_viewers + + def ensure_docker_group_preference(self): + # If the user prefers typing their password + if self.global_common.settings.get("linux_prefers_typing_password") == True: + return True + + # Get the docker group + try: + groupinfo = grp.getgrnam("docker") + except: + # Ignore if group is not found + return True + + # See if the user is in the group + username = getpass.getuser() + if username not in groupinfo.gr_mem: + # User is not in the docker group, ask if they prefer typing their password + message = "Dangerzone requires Docker

In order to use Docker, your user must be in the 'docker' group or you'll need to type your password each time you run dangerzone.

Adding your user to the 'docker' group is more convenient but less secure, and will require just typing your password once. Which do you prefer?" + return_code = Alert( + self, + self.global_common, + message, + ok_text="I'll type my password each time", + extra_button_text="Add my user to the 'docker' group", + ).launch() + if return_code == QtWidgets.QDialog.Accepted: + # Prefers typing password + self.global_common.settings.set("linux_prefers_typing_password", True) + self.global_common.settings.save() + return True + elif return_code == 2: + # Prefers being in the docker group + self.global_common.settings.set("linux_prefers_typing_password", False) + self.global_common.settings.save() + + # Add user to the docker group + p = subprocess.run( + [ + "/usr/bin/pkexec", + "/usr/sbin/usermod", + "-a", + "-G", + "docker", + username, + ] + ) + if p.returncode == 0: + message = "Great! Now you must log out of your computer and log back in, and then you can use Dangerzone." + Alert(self, self.global_common, message).launch() + else: + message = "Failed to add your user to the 'docker' group, quitting." + Alert(self, self.global_common, message).launch() + + return False + else: + # Cancel + return False + + return True + + def ensure_docker_service_is_started(self): + if not is_docker_ready(self): + message = "Dangerzone requires Docker

Docker should be installed, but it looks like it's not running in the background.

Click Ok to try starting the docker service. You will have to type your login password." + if ( + Alert(self, self.global_common, message).launch() + == QtWidgets.QDialog.Accepted + ): + p = subprocess.run( + [ + "/usr/bin/pkexec", + self.global_common.get_resource_path( + "enable_docker_service.sh" + ), + ] + ) + if p.returncode == 0: + # Make sure docker is now ready + if is_docker_ready(self): + return True + else: + message = "Restarting docker appeared to work, but the service still isn't responding, quitting." + Alert(self, self.global_common, message).launch() + else: + message = "Failed to start the docker service, quitting." + Alert(self, self.global_common, message).launch() + + return False + + return True + + +class Alert(QtWidgets.QDialog): + def __init__( + self, global_common, gui_common, message, ok_text="Ok", extra_button_text=None + ): + super(Alert, self).__init__() + self.global_common = global_common + self.gui_common = gui_common + + self.setWindowTitle("dangerzone") + self.setWindowIcon(self.gui_common.get_window_icon()) + self.setModal(True) + + flags = ( + QtCore.Qt.CustomizeWindowHint + | QtCore.Qt.WindowTitleHint + | QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowCloseButtonHint + | QtCore.Qt.WindowStaysOnTopHint + ) + self.setWindowFlags(flags) + + logo = QtWidgets.QLabel() + logo.setPixmap( + QtGui.QPixmap.fromImage( + QtGui.QImage(self.global_common.get_resource_path("icon.png")) + ) + ) + + label = QtWidgets.QLabel() + label.setText(message) + label.setWordWrap(True) + + message_layout = QtWidgets.QHBoxLayout() + message_layout.addWidget(logo) + message_layout.addSpacing(10) + message_layout.addWidget(label, stretch=1) + + ok_button = QtWidgets.QPushButton(ok_text) + ok_button.clicked.connect(self.clicked_ok) + if extra_button_text: + extra_button = QtWidgets.QPushButton(extra_button_text) + extra_button.clicked.connect(self.clicked_extra) + cancel_button = QtWidgets.QPushButton("Cancel") + cancel_button.clicked.connect(self.clicked_cancel) + + buttons_layout = QtWidgets.QHBoxLayout() + buttons_layout.addStretch() + buttons_layout.addWidget(ok_button) + if extra_button_text: + buttons_layout.addWidget(extra_button) + buttons_layout.addWidget(cancel_button) + + layout = QtWidgets.QVBoxLayout() + layout.addLayout(message_layout) + layout.addSpacing(10) + layout.addLayout(buttons_layout) + self.setLayout(layout) + + def clicked_ok(self): + self.done(QtWidgets.QDialog.Accepted) + + def clicked_extra(self): + self.done(2) + + def clicked_cancel(self): + self.done(QtWidgets.QDialog.Rejected) + + def launch(self): + return self.exec_() diff --git a/dangerzone/doc_selection_widget.py b/dangerzone/gui/doc_selection_widget.py similarity index 100% rename from dangerzone/doc_selection_widget.py rename to dangerzone/gui/doc_selection_widget.py diff --git a/dangerzone/docker_installer.py b/dangerzone/gui/docker_installer.py similarity index 97% rename from dangerzone/docker_installer.py rename to dangerzone/gui/docker_installer.py index 6def8ee..150b2f2 100644 --- a/dangerzone/docker_installer.py +++ b/dangerzone/gui/docker_installer.py @@ -8,14 +8,14 @@ import time import platform from PySide2 import QtCore, QtGui, QtWidgets -from .container import container_runtime +from ..container import container_runtime class AuthorizationFailed(Exception): pass -def is_docker_installed(global_common): +def is_docker_installed(): if platform.system() == "Darwin": # Does the docker binary exist? if os.path.isdir("/Applications/Docker.app") and os.path.exists( @@ -55,12 +55,11 @@ def launch_docker_windows(global_common): class DockerInstaller(QtWidgets.QDialog): - def __init__(self, global_common): + def __init__(self, gui_common): super(DockerInstaller, self).__init__() - self.global_common = global_common self.setWindowTitle("dangerzone") - self.setWindowIcon(self.global_common.get_window_icon()) + self.setWindowIcon(gui_common.get_window_icon()) # self.setMinimumHeight(170) label = QtWidgets.QLabel() diff --git a/dangerzone/main_window.py b/dangerzone/gui/main_window.py similarity index 84% rename from dangerzone/main_window.py rename to dangerzone/gui/main_window.py index 209af08..4477f6c 100644 --- a/dangerzone/main_window.py +++ b/dangerzone/gui/main_window.py @@ -6,20 +6,21 @@ from PySide2 import QtCore, QtGui, QtWidgets from .doc_selection_widget import DocSelectionWidget from .settings_widget import SettingsWidget from .tasks_widget import TasksWidget -from .common import Common +from ..common import Common class MainWindow(QtWidgets.QMainWindow): delete_window = QtCore.Signal(str) - def __init__(self, global_common, window_id): + def __init__(self, global_common, gui_common, window_id): super(MainWindow, self).__init__() self.global_common = global_common + self.gui_common = gui_common self.window_id = window_id self.common = Common() self.setWindowTitle("dangerzone") - self.setWindowIcon(self.global_common.get_window_icon()) + self.setWindowIcon(self.gui_common.get_window_icon()) self.setMinimumWidth(600) self.setMinimumHeight(400) @@ -32,7 +33,7 @@ class MainWindow(QtWidgets.QMainWindow): ) ) header_label = QtWidgets.QLabel("dangerzone") - header_label.setFont(self.global_common.fixed_font) + header_label.setFont(self.gui_common.fixed_font) header_label.setStyleSheet("QLabel { font-weight: bold; font-size: 50px; }") header_layout = QtWidgets.QHBoxLayout() header_layout.addStretch() @@ -47,7 +48,9 @@ class MainWindow(QtWidgets.QMainWindow): self.doc_selection_widget.show() # Settings - self.settings_widget = SettingsWidget(self.global_common, self.common) + self.settings_widget = SettingsWidget( + self.global_common, self.gui_common, self.common + ) self.doc_selection_widget.document_selected.connect( self.settings_widget.document_selected ) @@ -59,7 +62,9 @@ class MainWindow(QtWidgets.QMainWindow): ) # Tasks - self.tasks_widget = TasksWidget(self.global_common, self.common) + self.tasks_widget = TasksWidget( + self.global_common, self.gui_common, self.common + ) self.tasks_widget.close_window.connect(self.close) self.doc_selection_widget.document_selected.connect( self.tasks_widget.document_selected @@ -93,4 +98,4 @@ class MainWindow(QtWidgets.QMainWindow): self.delete_window.emit(self.window_id) if platform.system() != "Darwin": - self.global_common.app.quit() + self.gui_common.app.quit() diff --git a/dangerzone/settings_widget.py b/dangerzone/gui/settings_widget.py similarity index 97% rename from dangerzone/settings_widget.py rename to dangerzone/gui/settings_widget.py index 4150653..759818f 100644 --- a/dangerzone/settings_widget.py +++ b/dangerzone/gui/settings_widget.py @@ -1,5 +1,4 @@ import os -import subprocess import platform from PySide2 import QtCore, QtGui, QtWidgets @@ -8,9 +7,10 @@ class SettingsWidget(QtWidgets.QWidget): start_clicked = QtCore.Signal() close_window = QtCore.Signal() - def __init__(self, global_common, common): + def __init__(self, global_common, gui_common, common): super(SettingsWidget, self).__init__() self.global_common = global_common + self.gui_common = gui_common self.common = common # Dangerous document label @@ -49,8 +49,8 @@ class SettingsWidget(QtWidgets.QWidget): ) self.open_checkbox.clicked.connect(self.update_ui) self.open_combobox = QtWidgets.QComboBox() - for k in self.global_common.pdf_viewers: - self.open_combobox.addItem(k, self.global_common.pdf_viewers[k]) + for k in self.gui_common.pdf_viewers: + self.open_combobox.addItem(k, self.gui_common.pdf_viewers[k]) open_layout = QtWidgets.QHBoxLayout() open_layout.addWidget(self.open_checkbox) open_layout.addWidget(self.open_combobox) diff --git a/dangerzone/tasks_widget.py b/dangerzone/gui/tasks_widget.py similarity index 92% rename from dangerzone/tasks_widget.py rename to dangerzone/gui/tasks_widget.py index 4688d36..ab77f47 100644 --- a/dangerzone/tasks_widget.py +++ b/dangerzone/gui/tasks_widget.py @@ -5,15 +5,16 @@ import platform import subprocess from PySide2 import QtCore, QtGui, QtWidgets -from .tasks import PullImageTask, ConvertToPixels, ConvertToPDF +from ..tasks import PullImageTask, ConvertToPixels, ConvertToPDF class TasksWidget(QtWidgets.QWidget): close_window = QtCore.Signal() - def __init__(self, global_common, common): + def __init__(self, global_common, gui_common, common): super(TasksWidget, self).__init__() self.global_common = global_common + self.gui_common = gui_common self.common = common # Dangerous document label @@ -31,7 +32,7 @@ class TasksWidget(QtWidgets.QWidget): self.task_details.setStyleSheet( "QLabel { background-color: #ffffff; font-size: 12px; padding: 10px; }" ) - self.task_details.setFont(self.global_common.fixed_font) + self.task_details.setFont(self.gui_common.fixed_font) self.task_details.setAlignment(QtCore.Qt.AlignTop) self.details_scrollarea = QtWidgets.QScrollArea() @@ -111,7 +112,7 @@ class TasksWidget(QtWidgets.QWidget): # Open if self.global_common.settings.get("open"): - self.global_common.open_pdf_viewer(dest_filename) + self.gui_common.open_pdf_viewer(dest_filename) # Clean up self.common.pixel_dir.cleanup() @@ -122,7 +123,7 @@ class TasksWidget(QtWidgets.QWidget): # In macOS, just close the window self.close_window.emit() else: - self.global_common.app.quit() + self.gui_common.app.quit() def scroll_to_bottom(self, minimum, maximum): self.details_scrollarea.verticalScrollBar().setValue(maximum) diff --git a/dangerzone/settings.py b/dangerzone/settings.py index 556f63a..4242b1f 100644 --- a/dangerzone/settings.py +++ b/dangerzone/settings.py @@ -7,18 +7,12 @@ class Settings: def __init__(self, common): self.common = common self.settings_filename = os.path.join(self.common.appdata_path, "settings.json") - - if len(self.common.pdf_viewers) == 0: - default_pdf_viewer = None - else: - default_pdf_viewer = list(self.common.pdf_viewers)[0] - self.default_settings = { "save": True, "ocr": True, "ocr_language": "English", "open": True, - "open_app": default_pdf_viewer, + "open_app": None, "update_container": True, "linux_prefers_typing_password": None, } diff --git a/dev_scripts/dangerzone-cli b/dev_scripts/dangerzone-cli new file mode 120000 index 0000000..2fe47df --- /dev/null +++ b/dev_scripts/dangerzone-cli @@ -0,0 +1 @@ +dangerzone \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 9aca820..0803dbb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ black = "^21.5b2" [tool.poetry.scripts] dangerzone = 'dangerzone:main' dangerzone-container = 'dangerzone:main' +dangerzone-cli = 'dangerzone:main' [build-system] requires = ["poetry>=1.1.4"]