diff --git a/onionshare/mode_settings.py b/onionshare/mode_settings.py new file mode 100644 index 00000000..9557abcd --- /dev/null +++ b/onionshare/mode_settings.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +""" +OnionShare | https://onionshare.org/ + +Copyright (C) 2014-2018 Micah Lee + +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 . +""" + + +class ModeSettings: + """ + This stores the settings for a single instance of an OnionShare mode. In CLI there + is only one TabSettings, and in the GUI there is a separate TabSettings for each tab + """ + + def __init__(self, common): + self.common = common + + self.settings = { + "persistent": { + "enabled": False, + "private_key": None, + "hidservauth": None, + "password": None, + }, + "general": { + "public": False, + "autostart_timer": False, + "autostop_timer": False, + "legacy": False, + "client_auth": False, + }, + "share": {"autostop_sharing": True}, + "receive": {"data_dir": self.common.settings.build_default_data_dir()}, + "website": {"disable_csp": False}, + } + + def get(self, group, key): + return self.settings[group][key] + + def set(self, group, key, val): + self.settings[group][key] = val diff --git a/onionshare/web/web.py b/onionshare/web/web.py index 16dfffd0..604faf02 100644 --- a/onionshare/web/web.py +++ b/onionshare/web/web.py @@ -60,10 +60,19 @@ class Web: REQUEST_OTHER = 13 REQUEST_INVALID_PASSWORD = 14 - def __init__(self, common, is_gui, mode="share"): + def __init__( + self, common, is_gui, tab_settings_get=None, tab_settings_set=None, mode="share" + ): + """ + tab_settings_get and tab_settings_set are getter and setter functions for tab settings + """ + self.common = common self.common.log("Web", "__init__", f"is_gui={is_gui}, mode={mode}") + self.settings_get = tab_settings_get + self.settings_set = tab_settings_set + # The flask app self.app = Flask( __name__, diff --git a/onionshare_gui/tab/mode/__init__.py b/onionshare_gui/tab/mode/__init__.py index 8018a4eb..8399c962 100644 --- a/onionshare_gui/tab/mode/__init__.py +++ b/onionshare_gui/tab/mode/__init__.py @@ -23,7 +23,7 @@ from onionshare import strings from onionshare.common import AutoStopTimer from .history import IndividualFileHistoryItem -from .mode_settings import ModeSettings +from .mode_settings_widget import ModeSettingsWidget from ..server_status import ServerStatus from ...threads import OnionThread, AutoStartTimer @@ -47,6 +47,7 @@ class Mode(QtWidgets.QWidget): def __init__(self, tab): super(Mode, self).__init__() self.tab = tab + self.settings = tab.mode_settings self.common = tab.common self.qtapp = self.common.gui.qtapp @@ -72,7 +73,9 @@ class Mode(QtWidgets.QWidget): self.header_label.setStyleSheet(self.common.gui.css["mode_header_label"]) self.header_label.setAlignment(QtCore.Qt.AlignHCenter) - self.mode_settings = ModeSettings(self.common, self.tab) + self.mode_settings = ModeSettingsWidget( + self.common, self.tab.tab_id, self.tab.mode_settings + ) self.mode_settings.change_persistent.connect(self.change_persistent) header_layout = QtWidgets.QVBoxLayout() diff --git a/onionshare_gui/tab/mode/mode_settings.py b/onionshare_gui/tab/mode/mode_settings_widget.py similarity index 90% rename from onionshare_gui/tab/mode/mode_settings.py rename to onionshare_gui/tab/mode/mode_settings_widget.py index c5ca3a8e..23fcd087 100644 --- a/onionshare_gui/tab/mode/mode_settings.py +++ b/onionshare_gui/tab/mode/mode_settings_widget.py @@ -22,17 +22,18 @@ from PyQt5 import QtCore, QtWidgets, QtGui from onionshare import strings -class ModeSettings(QtWidgets.QWidget): +class ModeSettingsWidget(QtWidgets.QWidget): """ All of the common settings for each mode are in this widget """ change_persistent = QtCore.pyqtSignal(int, bool) - def __init__(self, common, tab): - super(ModeSettings, self).__init__() + def __init__(self, common, tab_id, mode_settings): + super(ModeSettingsWidget, self).__init__() self.common = common - self.tab = tab + self.tab_id = tab_id + self.settings = mode_settings # Downstream Mode need to fill in this layout with its settings self.mode_specific_layout = QtWidgets.QVBoxLayout() @@ -137,32 +138,28 @@ class ModeSettings(QtWidgets.QWidget): self.client_auth_checkbox.hide() def persistent_checkbox_clicked(self): - self.tab.set_tab_setting( - "persistent", "enabled", self.persistent_checkbox.isChecked() - ) + self.settings.set("persistent", "enabled", self.persistent_checkbox.isChecked()) - self.change_persistent.emit( - self.tab.tab_id, self.persistent_checkbox.isChecked() - ) + self.change_persistent.emit(self.tab_id, self.persistent_checkbox.isChecked()) def public_checkbox_clicked(self): - self.tab.set_tab_setting("general", "public", self.public_checkbox.isChecked()) + self.settings.set("general", "public", self.public_checkbox.isChecked()) def autostart_timer_checkbox_clicked(self): - self.tab.set_tab_setting( + self.settings.set( "general", "autostart_timer", self.autostart_timer_checkbox.isChecked() ) def autostop_timer_checkbox_clicked(self): - self.tab.set_tab_setting( + self.settings.set( "general", "autostop_timer", self.autostop_timer_checkbox.isChecked() ) def legacy_checkbox_clicked(self): - self.tab.set_tab_setting("general", "legacy", self.legacy_checkbox.isChecked()) + self.settings.set("general", "legacy", self.legacy_checkbox.isChecked()) def client_auth_checkbox_clicked(self): - self.tab.set_tab_setting( + self.settings.set( "general", "client_auth", self.client_auth_checkbox.isChecked() ) diff --git a/onionshare_gui/tab/mode/receive_mode/__init__.py b/onionshare_gui/tab/mode/receive_mode/__init__.py index f0a2c6e9..3a9c2fbe 100644 --- a/onionshare_gui/tab/mode/receive_mode/__init__.py +++ b/onionshare_gui/tab/mode/receive_mode/__init__.py @@ -47,7 +47,7 @@ class ReceiveMode(Mode): ) self.data_dir_lineedit = QtWidgets.QLineEdit() self.data_dir_lineedit.setReadOnly(True) - self.data_dir_lineedit.setText(self.tab.tab_settings["receive"]["data_dir"]) + self.data_dir_lineedit.setText(self.settings.get("receive", "data_dir")) data_dir_button = QtWidgets.QPushButton( strings._("mode_settings_receive_data_dir_browse_button") ) @@ -140,7 +140,7 @@ class ReceiveMode(Mode): f"selected dir: {selected_dir}", ) self.data_dir_lineedit.setText(selected_dir) - self.tab.set_tab_setting("receive", "data_dir", data_dir) + self.settings.set("receive", "data_dir", data_dir) def get_stop_server_autostop_timer_text(self): """ diff --git a/onionshare_gui/tab/mode/share_mode/__init__.py b/onionshare_gui/tab/mode/share_mode/__init__.py index 8d595e7f..57d6475c 100644 --- a/onionshare_gui/tab/mode/share_mode/__init__.py +++ b/onionshare_gui/tab/mode/share_mode/__init__.py @@ -157,7 +157,7 @@ class ShareMode(Mode): """ Save autostop sharing setting to the tab settings """ - self.tab.set_tab_setting( + self.settings.set( "share", "autostop_sharing", self.autostop_sharing_checkbox.isChecked() ) @@ -309,7 +309,7 @@ class ShareMode(Mode): self.history.update_in_progress() # Close on finish? - if self.tab.tab_settings["share"]["autostop_sharing"]: + if self.settings.get("share", "autostop_sharing"): self.server_status.stop_server() self.status_bar.clearMessage() self.server_status_label.setText(strings._("closing_automatically")) diff --git a/onionshare_gui/tab/mode/website_mode/__init__.py b/onionshare_gui/tab/mode/website_mode/__init__.py index 1ba969cc..e6ed785d 100644 --- a/onionshare_gui/tab/mode/website_mode/__init__.py +++ b/onionshare_gui/tab/mode/website_mode/__init__.py @@ -155,7 +155,7 @@ class WebsiteMode(Mode): """ Save disable CSP setting to the tab settings """ - self.tab.set_tab_setting( + self.settings.set( "website", "disable_csp", self.disable_csp_checkbox.isChecked() ) diff --git a/onionshare_gui/tab/tab.py b/onionshare_gui/tab/tab.py index d121c9b5..60809b57 100644 --- a/onionshare_gui/tab/tab.py +++ b/onionshare_gui/tab/tab.py @@ -23,6 +23,7 @@ from PyQt5 import QtCore, QtWidgets, QtGui from onionshare import strings from onionshare.onionshare import OnionShare from onionshare.web import Web +from onionshare.mode_settings import ModeSettings from .mode.share_mode import ShareMode from .mode.receive_mode import ReceiveMode @@ -130,30 +131,7 @@ class Tab(QtWidgets.QWidget): self.persistent_image_label.setFixedSize(30, 30) # Settings for this tab - self.tab_settings = { - "persistent": { - "enabled": False, - "private_key": None, - "hidservauth": None, - "password": None, - }, - "general": { - "public": False, - "autostart_timer": False, - "autostop_timer": False, - "legacy": False, - "client_auth": False, - }, - "share": {"autostop_sharing": True}, - "receive": {"data_dir": self.common.settings.build_default_data_dir()}, - "website": {"disable_csp": False}, - } - - def get_tab_setting(self, group, key): - return self.tab_settings[group][key] - - def set_tab_setting(self, group, key, val): - self.tab_settings[group][key] = val + self.mode_settings = ModeSettings(self.common) def share_mode_clicked(self): self.common.log("Tab", "share_mode_clicked")