Allow selecting a snowflake bridge, and make it try to use the snowflake bridge

This commit is contained in:
Micah Lee 2021-10-13 21:11:56 -07:00
parent 1244f56d26
commit 3ea92d6bad
7 changed files with 98 additions and 32 deletions

View file

@ -405,7 +405,21 @@ class GuiCommon:
def get_tor_paths(self):
if self.common.platform == "Linux":
return self.common.get_tor_paths()
base_path = self.get_resource_path("tor")
if os.path.exists(base_path):
tor_path = os.path.join(base_path, "tor")
tor_geo_ip_file_path = os.path.join(base_path, "geoip")
tor_geo_ipv6_file_path = os.path.join(base_path, "geoip6")
obfs4proxy_file_path = os.path.join(base_path, "obfs4proxy")
snowflake_file_path = os.path.join(base_path, "snowflake-client")
else:
# Fallback to looking in the path
tor_path = shutil.which("tor")
obfs4proxy_file_path = shutil.which("obfs4proxy")
snowflake_file_path = shutil.which("snowflake-client")
prefix = os.path.dirname(os.path.dirname(tor_path))
tor_geo_ip_file_path = os.path.join(prefix, "share/tor/geoip")
tor_geo_ipv6_file_path = os.path.join(prefix, "share/tor/geoip6")
if self.common.platform == "Windows":
base_path = self.get_resource_path("tor")

View file

@ -60,13 +60,13 @@
"gui_settings_authenticate_no_auth_option": "No authentication, or cookie authentication",
"gui_settings_authenticate_password_option": "Password",
"gui_settings_password_label": "Password",
"gui_settings_tor_bridges": "Would you like to Use a Tor bridge?",
"gui_settings_tor_bridges": "Connect using a Tor bridge?",
"gui_settings_tor_bridges_label": "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.",
"gui_settings_tor_bridges_no_bridges_radio_option": "Don't use a bridge",
"gui_settings_tor_bridges_obfs4_radio_option": "Use built-in obfs4 pluggable transports",
"gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Use built-in obfs4 pluggable transports (requires obfs4proxy)",
"gui_settings_tor_bridges_meek_lite_azure_radio_option": "Use built-in meek_lite (Azure) pluggable transports",
"gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Use built-in meek_lite (Azure) pluggable transports (requires obfs4proxy)",
"gui_settings_meek_lite_expensive_warning": "Warning: The meek_lite bridges are very costly for the Tor Project to run.<br><br>Only use them if unable to connect to Tor directly, via obfs4 transports, or other normal bridges.",
"gui_settings_tor_bridges_obfs4_radio_option": "Use built-in obfs4 bridge",
"gui_settings_tor_bridges_meek_lite_azure_radio_option": "Use built-in meek-azure bridge",
"gui_settings_tor_bridges_snowflake_radio_option": "Use built-in snowflake bridge",
"gui_settings_meek_lite_expensive_warning": "Warning: The meek-azure bridges are very costly for the Tor Project to run.<br><br>Only use them if unable to connect to Tor directly, via obfs4 transports, or other normal bridges.",
"gui_settings_tor_bridges_custom_radio_option": "Use custom bridges",
"gui_settings_tor_bridges_custom_label": "You can get bridges from <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
"gui_settings_tor_bridges_invalid": "None of the bridges you added work.\nDouble-check them or add others.",

View file

@ -89,6 +89,9 @@ class TorSettingsDialog(QtWidgets.QDialog):
# Bridge options for bundled tor
bridges_label = QtWidgets.QLabel(strings._("gui_settings_tor_bridges_label"))
bridges_label.setWordWrap(True)
# No bridges option radio
self.tor_bridges_no_bridges_radio = QtWidgets.QRadioButton(
strings._("gui_settings_tor_bridges_no_bridges_radio_option")
@ -107,39 +110,55 @@ class TorSettingsDialog(QtWidgets.QDialog):
# obfs4 option radio
# if the obfs4proxy binary is missing, we can't use obfs4 transports
if not self.obfs4proxy_file_path or not os.path.isfile(
self.obfs4proxy_file_path
):
self.tor_bridges_use_obfs4_radio = QtWidgets.QRadioButton(
strings._("gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy")
)
self.tor_bridges_use_obfs4_radio.setEnabled(False)
else:
self.tor_bridges_use_obfs4_radio = QtWidgets.QRadioButton(
strings._("gui_settings_tor_bridges_obfs4_radio_option")
)
self.tor_bridges_use_obfs4_radio = QtWidgets.QRadioButton(
strings._("gui_settings_tor_bridges_obfs4_radio_option")
)
self.tor_bridges_use_obfs4_radio.toggled.connect(
self.tor_bridges_use_obfs4_radio_toggled
)
# meek_lite-azure option radio
# if the obfs4proxy binary is missing, we can't use meek_lite-azure transports
if not self.obfs4proxy_file_path or not os.path.isfile(
self.obfs4proxy_file_path
):
self.tor_bridges_use_meek_lite_azure_radio = QtWidgets.QRadioButton(
strings._(
"gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy"
)
)
self.tor_bridges_use_meek_lite_azure_radio.setEnabled(False)
else:
self.tor_bridges_use_meek_lite_azure_radio = QtWidgets.QRadioButton(
strings._("gui_settings_tor_bridges_meek_lite_azure_radio_option")
self.common.log(
"TorSettingsDialog",
"__init__",
f"missing binary {self.obfs4proxy_file_path}, hiding obfs4 bridge",
)
self.tor_bridges_use_obfs4_radio.hide()
# meek-azure option radio
# if the obfs4proxy binary is missing, we can't use meek_lite-azure transports
self.tor_bridges_use_meek_lite_azure_radio = QtWidgets.QRadioButton(
strings._("gui_settings_tor_bridges_meek_lite_azure_radio_option")
)
self.tor_bridges_use_meek_lite_azure_radio.toggled.connect(
self.tor_bridges_use_meek_lite_azure_radio_toggled
)
if not self.obfs4proxy_file_path or not os.path.isfile(
self.obfs4proxy_file_path
):
self.common.log(
"TorSettingsDialog",
"__init__",
f"missing binary {self.obfs4proxy_file_path}, hiding meek-azure bridge",
)
self.tor_bridges_use_meek_lite_azure_radio.hide()
# snowflake option radio
# if the snowflake-client binary is missing, we can't use snowflake transports
self.tor_bridges_use_snowflake_radio = QtWidgets.QRadioButton(
strings._("gui_settings_tor_bridges_snowflake_radio_option")
)
self.tor_bridges_use_snowflake_radio.toggled.connect(
self.tor_bridges_use_snowflake_radio_toggled
)
if not self.snowflake_file_path or not os.path.isfile(self.snowflake_file_path):
self.common.log(
"TorSettingsDialog",
"__init__",
f"missing binary {self.snowflake_file_path}, hiding snowflake bridge",
)
self.tor_bridges_use_snowflake_radio.hide()
# Custom bridges radio and textbox
self.tor_bridges_use_custom_radio = QtWidgets.QRadioButton(
@ -178,9 +197,11 @@ class TorSettingsDialog(QtWidgets.QDialog):
# Bridges layout/widget
bridges_layout = QtWidgets.QVBoxLayout()
bridges_layout.addWidget(bridges_label)
bridges_layout.addWidget(self.tor_bridges_no_bridges_radio)
bridges_layout.addWidget(self.tor_bridges_use_obfs4_radio)
bridges_layout.addWidget(self.tor_bridges_use_meek_lite_azure_radio)
bridges_layout.addWidget(self.tor_bridges_use_snowflake_radio)
bridges_layout.addWidget(self.tor_bridges_use_custom_radio)
bridges_layout.addWidget(self.tor_bridges_use_custom_textbox_options)
@ -411,6 +432,7 @@ class TorSettingsDialog(QtWidgets.QDialog):
self.tor_bridges_no_bridges_radio.setChecked(True)
self.tor_bridges_use_obfs4_radio.setChecked(False)
self.tor_bridges_use_meek_lite_azure_radio.setChecked(False)
self.tor_bridges_use_snowflake_radio.setChecked(False)
self.tor_bridges_use_custom_radio.setChecked(False)
else:
self.tor_bridges_no_bridges_radio.setChecked(False)
@ -420,6 +442,9 @@ class TorSettingsDialog(QtWidgets.QDialog):
self.tor_bridges_use_meek_lite_azure_radio.setChecked(
self.old_settings.get("tor_bridges_use_meek_lite_azure")
)
self.tor_bridges_use_snowflake_radio.setChecked(
self.old_settings.get("tor_bridges_use_snowflake")
)
if self.old_settings.get("tor_bridges_use_custom_bridges"):
self.tor_bridges_use_custom_radio.setChecked(True)
@ -473,6 +498,13 @@ class TorSettingsDialog(QtWidgets.QDialog):
QtWidgets.QMessageBox.Warning,
)
def tor_bridges_use_snowflake_radio_toggled(self, checked):
"""
snowflake bridges option was toggled. If checked, disable custom bridge options.
"""
if checked:
self.tor_bridges_use_custom_textbox_options.hide()
def tor_bridges_use_custom_radio_toggled(self, checked):
"""
Custom bridges option was toggled. If checked, show custom bridge options.
@ -712,21 +744,31 @@ class TorSettingsDialog(QtWidgets.QDialog):
settings.set("no_bridges", True)
settings.set("tor_bridges_use_obfs4", False)
settings.set("tor_bridges_use_meek_lite_azure", False)
settings.set("tor_bridges_use_snowflake", False)
settings.set("tor_bridges_use_custom_bridges", "")
if self.tor_bridges_use_obfs4_radio.isChecked():
settings.set("no_bridges", False)
settings.set("tor_bridges_use_obfs4", True)
settings.set("tor_bridges_use_meek_lite_azure", False)
settings.set("tor_bridges_use_snowflake", False)
settings.set("tor_bridges_use_custom_bridges", "")
if self.tor_bridges_use_meek_lite_azure_radio.isChecked():
settings.set("no_bridges", False)
settings.set("tor_bridges_use_obfs4", False)
settings.set("tor_bridges_use_meek_lite_azure", True)
settings.set("tor_bridges_use_snowflake", False)
settings.set("tor_bridges_use_custom_bridges", "")
if self.tor_bridges_use_snowflake_radio.isChecked():
settings.set("no_bridges", False)
settings.set("tor_bridges_use_obfs4", False)
settings.set("tor_bridges_use_meek_lite_azure", False)
settings.set("tor_bridges_use_snowflake", True)
settings.set("tor_bridges_use_custom_bridges", "")
if self.tor_bridges_use_custom_radio.isChecked():
settings.set("no_bridges", False)
settings.set("tor_bridges_use_obfs4", False)
settings.set("tor_bridges_use_meek_lite_azure", False)
settings.set("tor_bridges_use_snowflake", False)
# Insert a 'Bridge' line at the start of each bridge.
# This makes it easier to copy/paste a set of bridges