aboutsummaryrefslogtreecommitdiff
path: root/desktop/onionshare/tor_settings_tab.py
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/onionshare/tor_settings_tab.py')
-rw-r--r--desktop/onionshare/tor_settings_tab.py82
1 files changed, 48 insertions, 34 deletions
diff --git a/desktop/onionshare/tor_settings_tab.py b/desktop/onionshare/tor_settings_tab.py
index 089cf1fe..0e72c3b8 100644
--- a/desktop/onionshare/tor_settings_tab.py
+++ b/desktop/onionshare/tor_settings_tab.py
@@ -21,7 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
from PySide2 import QtCore, QtWidgets, QtGui
import sys
import platform
-import re
import os
from onionshare_cli.meek import Meek
@@ -43,7 +42,15 @@ class TorSettingsTab(QtWidgets.QWidget):
tor_is_connected = QtCore.Signal()
tor_is_disconnected = QtCore.Signal()
- def __init__(self, common, tab_id, are_tabs_active, status_bar):
+ def __init__(
+ self,
+ common,
+ tab_id,
+ are_tabs_active,
+ status_bar,
+ from_autoconnect=False,
+ parent=None,
+ ):
super(TorSettingsTab, self).__init__()
self.common = common
@@ -54,6 +61,8 @@ class TorSettingsTab(QtWidgets.QWidget):
self.system = platform.system()
self.tab_id = tab_id
+ self.parent = parent
+ self.from_autoconnect = from_autoconnect
# Connection type: either automatic, control port, or socket file
@@ -303,6 +312,21 @@ class TorSettingsTab(QtWidgets.QWidget):
)
connection_type_radio_group.setLayout(connection_type_radio_group_layout)
+ # Quickstart settings
+ self.autoconnect_checkbox = QtWidgets.QCheckBox(
+ strings._("gui_enable_autoconnect_checkbox")
+ )
+ self.autoconnect_checkbox.toggled.connect(self.autoconnect_toggled)
+ left_column_settings = QtWidgets.QVBoxLayout()
+ connection_type_radio_group.setFixedHeight(300)
+ left_column_settings.addWidget(connection_type_radio_group)
+ left_column_settings.addSpacing(20)
+ left_column_settings.addWidget(self.autoconnect_checkbox)
+ left_column_settings.addStretch()
+ left_column_settings.setContentsMargins(0, 0, 0, 0)
+ left_column_setting_widget = QtWidgets.QWidget()
+ left_column_setting_widget.setLayout(left_column_settings)
+
# The Bridges options are not exclusive (enabling Bridges offers obfs4 or custom bridges)
connection_type_bridges_radio_group_layout = QtWidgets.QVBoxLayout()
connection_type_bridges_radio_group_layout.addWidget(self.bridges)
@@ -322,7 +346,7 @@ class TorSettingsTab(QtWidgets.QWidget):
# Settings are in columns
columns_layout = QtWidgets.QHBoxLayout()
- columns_layout.addWidget(connection_type_radio_group)
+ columns_layout.addWidget(left_column_setting_widget)
columns_layout.addSpacing(20)
columns_layout.addLayout(connection_type_layout, stretch=1)
columns_wrapper = QtWidgets.QWidget()
@@ -391,6 +415,10 @@ class TorSettingsTab(QtWidgets.QWidget):
self.old_settings = Settings(self.common)
self.old_settings.load()
+ # Check if autoconnect was enabled
+ if self.old_settings.get("auto_connect"):
+ self.autoconnect_checkbox.setCheckState(QtCore.Qt.Checked)
+
connection_type = self.old_settings.get("connection_type")
if connection_type == "bundled":
if self.connection_type_bundled_radio.isEnabled():
@@ -477,6 +505,12 @@ class TorSettingsTab(QtWidgets.QWidget):
self.bridge_use_checkbox.setCheckState(QtCore.Qt.Unchecked)
self.bridge_settings.hide()
+ def autoconnect_toggled(self):
+ """
+ Auto connect checkbox clicked
+ """
+ self.common.log("TorSettingsTab", "autoconnect_checkbox_clicked")
+
def active_tabs_changed(self, are_tabs_active):
if are_tabs_active:
self.main_widget.hide()
@@ -664,7 +698,9 @@ class TorSettingsTab(QtWidgets.QWidget):
# If Tor isn't connected, or if Tor settings have changed, Reinitialize
# the Onion object
reboot_onion = False
- if not self.common.gui.local_only:
+ if not self.common.gui.local_only and not (
+ self.from_autoconnect and not settings.get("auto_connect")
+ ):
if self.common.gui.onion.is_authenticated():
self.common.log(
"TorSettingsTab", "save_clicked", "Connected to Tor"
@@ -717,9 +753,9 @@ class TorSettingsTab(QtWidgets.QWidget):
self.tor_con.show()
self.tor_con.start(settings)
else:
- self.close_this_tab.emit()
+ self.parent.close_this_tab.emit()
else:
- self.close_this_tab.emit()
+ self.parent.close_this_tab.emit()
def tor_con_success(self):
"""
@@ -750,7 +786,7 @@ class TorSettingsTab(QtWidgets.QWidget):
# Tell the tabs that Tor is connected
self.tor_is_connected.emit()
# Close the tab
- self.close_this_tab.emit()
+ self.parent.close_this_tab.emit()
self.tor_con_type = None
@@ -777,6 +813,9 @@ class TorSettingsTab(QtWidgets.QWidget):
settings = Settings(self.common)
settings.load() # To get the last update timestamp
+ # autoconnect
+ settings.set("auto_connect", self.autoconnect_checkbox.isChecked())
+
# Tor connection
if self.connection_type_bundled_radio.isChecked():
settings.set("connection_type", "bundled")
@@ -835,35 +874,10 @@ class TorSettingsTab(QtWidgets.QWidget):
if self.bridge_custom_radio.isChecked():
settings.set("bridges_type", "custom")
- new_bridges = []
bridges = self.bridge_custom_textbox.toPlainText().split("\n")
- bridges_valid = False
- for bridge in bridges:
- if bridge != "":
- # Check the syntax of the custom bridge to make sure it looks legitimate
- ipv4_pattern = re.compile(
- "(obfs4\s+)?(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]):([0-9]+)(\s+)([A-Z0-9]+)(.+)$"
- )
- ipv6_pattern = re.compile(
- "(obfs4\s+)?\[(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\]:[0-9]+\s+[A-Z0-9]+(.+)$"
- )
- meek_lite_pattern = re.compile(
- "(meek_lite)(\s)+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)(\s)+([0-9A-Z]+)(\s)+url=(.+)(\s)+front=(.+)"
- )
- snowflake_pattern = re.compile(
- "(snowflake)(\s)+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)(\s)+([0-9A-Z]+)"
- )
- if (
- ipv4_pattern.match(bridge)
- or ipv6_pattern.match(bridge)
- or meek_lite_pattern.match(bridge)
- or snowflake_pattern.match(bridge)
- ):
- new_bridges.append(bridge)
- bridges_valid = True
-
+ bridges_valid = self.common.check_bridges_valid(bridges)
if bridges_valid:
- new_bridges = "\n".join(new_bridges) + "\n"
+ new_bridges = "\n".join(bridges_valid) + "\n"
settings.set("bridges_custom", new_bridges)
else:
self.error_label.setText(