Add toggle setting for Tor plugin.

This commit is contained in:
akwizgran
2020-01-16 14:41:03 +00:00
parent dac21cb3a0
commit 0940b8d5b9
6 changed files with 66 additions and 18 deletions

View File

@@ -13,6 +13,7 @@ public interface TorConstants {
int CONNECT_TO_PROXY_TIMEOUT = 5000; // Milliseconds int CONNECT_TO_PROXY_TIMEOUT = 5000; // Milliseconds
int EXTRA_SOCKET_TIMEOUT = 30000; // Milliseconds int EXTRA_SOCKET_TIMEOUT = 30000; // Milliseconds
String PREF_TOR_ENABLE = "enable";
String PREF_TOR_NETWORK = "network2"; String PREF_TOR_NETWORK = "network2";
String PREF_TOR_PORT = "port"; String PREF_TOR_PORT = "port";
String PREF_TOR_MOBILE = "useMobileData"; String PREF_TOR_MOBILE = "useMobileData";

View File

@@ -75,6 +75,7 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING;
import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE;
import static org.briarproject.bramble.api.plugin.TorConstants.CONTROL_PORT; import static org.briarproject.bramble.api.plugin.TorConstants.CONTROL_PORT;
import static org.briarproject.bramble.api.plugin.TorConstants.ID; import static org.briarproject.bramble.api.plugin.TorConstants.ID;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_ENABLE;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_MOBILE; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_MOBILE;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_AUTOMATIC; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_AUTOMATIC;
@@ -200,7 +201,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
} }
} }
// Load the settings // Load the settings
settings = callback.getSettings(); settings = migrateSettings(callback.getSettings());
// Install or update the assets if necessary // Install or update the assets if necessary
if (!assetsAreUpToDate()) installAssets(); if (!assetsAreUpToDate()) installAssets();
if (cookieFile.exists() && !cookieFile.delete()) if (cookieFile.exists() && !cookieFile.delete())
@@ -288,6 +289,18 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
bind(); bind();
} }
// TODO: Remove after a reasonable migration period (added 2020-01-16)
private Settings migrateSettings(Settings settings) {
int network = settings.getInt(PREF_TOR_NETWORK,
PREF_TOR_NETWORK_AUTOMATIC);
if (network == PREF_TOR_NETWORK_NEVER) {
settings.putInt(PREF_TOR_NETWORK, PREF_TOR_NETWORK_AUTOMATIC);
settings.putBoolean(PREF_TOR_ENABLE, false);
callback.mergeSettings(settings);
}
return settings;
}
private boolean assetsAreUpToDate() { private boolean assetsAreUpToDate() {
return doneFile.lastModified() > getLastUpdateTime(); return doneFile.lastModified() > getLastUpdateTime();
} }
@@ -763,6 +776,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
String country = locationUtils.getCurrentCountry(); String country = locationUtils.getCurrentCountry();
boolean blocked = boolean blocked =
circumventionProvider.isTorProbablyBlocked(country); circumventionProvider.isTorProbablyBlocked(country);
boolean enabledByUser = settings.getBoolean(PREF_TOR_ENABLE, true);
int network = settings.getInt(PREF_TOR_NETWORK, int network = settings.getInt(PREF_TOR_NETWORK,
PREF_TOR_NETWORK_AUTOMATIC); PREF_TOR_NETWORK_AUTOMATIC);
boolean useMobile = settings.getBoolean(PREF_TOR_MOBILE, true); boolean useMobile = settings.getBoolean(PREF_TOR_MOBILE, true);
@@ -785,7 +799,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
if (!online) { if (!online) {
LOG.info("Disabling network, device is offline"); LOG.info("Disabling network, device is offline");
} else if (network == PREF_TOR_NETWORK_NEVER) { } else if (!enabledByUser) {
LOG.info("Disabling network, user has disabled Tor"); LOG.info("Disabling network, user has disabled Tor");
disabledBySettings = true; disabledBySettings = true;
reasonDisabled = REASON_USER; reasonDisabled = REASON_USER;
@@ -866,11 +880,11 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
callback.pluginStateChanged(getState()); callback.pluginStateChanged(getState());
} }
// Doesn't affect getState()
synchronized void setTorStarted() { synchronized void setTorStarted() {
torStarted = true; torStarted = true;
} }
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
synchronized boolean isTorRunning() { synchronized boolean isTorRunning() {
return torStarted && !stopped; return torStarted && !stopped;
} }
@@ -910,12 +924,14 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
callback.pluginStateChanged(getState()); callback.pluginStateChanged(getState());
} }
// Doesn't affect getState()
synchronized boolean setServerSocket(ServerSocket ss) { synchronized boolean setServerSocket(ServerSocket ss) {
if (stopped || serverSocket != null) return false; if (stopped || serverSocket != null) return false;
serverSocket = ss; serverSocket = ss;
return true; return true;
} }
// Doesn't affect getState()
synchronized void clearServerSocket(ServerSocket ss) { synchronized void clearServerSocket(ServerSocket ss) {
if (serverSocket == ss) serverSocket = null; if (serverSocket == ss) serverSocket = null;
} }

View File

@@ -73,6 +73,7 @@ import static androidx.core.view.ViewCompat.LAYOUT_DIRECTION_LTR;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import static org.briarproject.bramble.api.plugin.BluetoothConstants.PREF_BT_ENABLE; import static org.briarproject.bramble.api.plugin.BluetoothConstants.PREF_BT_ENABLE;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_ENABLE;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_MOBILE; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_MOBILE;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK;
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_AUTOMATIC; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_AUTOMATIC;
@@ -105,16 +106,19 @@ public class SettingsFragment extends PreferenceFragmentCompat
implements EventListener, OnPreferenceChangeListener { implements EventListener, OnPreferenceChangeListener {
public static final String SETTINGS_NAMESPACE = "android-ui"; public static final String SETTINGS_NAMESPACE = "android-ui";
public static final String BT_NAMESPACE = BluetoothConstants.ID.getString();
public static final String TOR_NAMESPACE = TorConstants.ID.getString();
public static final String LANGUAGE = "pref_key_language"; public static final String LANGUAGE = "pref_key_language";
public static final String PREF_SCREEN_LOCK = "pref_key_lock"; public static final String PREF_SCREEN_LOCK = "pref_key_lock";
public static final String PREF_SCREEN_LOCK_TIMEOUT = public static final String PREF_SCREEN_LOCK_TIMEOUT =
"pref_key_lock_timeout"; "pref_key_lock_timeout";
public static final String NOTIFY_SIGN_IN = "pref_key_notify_sign_in"; public static final String NOTIFY_SIGN_IN = "pref_key_notify_sign_in";
public static final String TOR_NETWORK = "pref_key_tor_network";
public static final String TOR_MOBILE = "pref_key_tor_mobile_data"; private static final String BT_NAMESPACE =
public static final String TOR_ONLY_WHEN_CHARGING = BluetoothConstants.ID.getString();
private static final String TOR_NAMESPACE = TorConstants.ID.getString();
private static final String TOR_ENABLE = "pref_key_tor_enable";
private static final String TOR_NETWORK = "pref_key_tor_network";
private static final String TOR_MOBILE = "pref_key_tor_mobile_data";
private static final String TOR_ONLY_WHEN_CHARGING =
"pref_key_tor_only_when_charging"; "pref_key_tor_only_when_charging";
private static final Logger LOG = private static final Logger LOG =
@@ -123,6 +127,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
private SettingsActivity listener; private SettingsActivity listener;
private ListPreference language; private ListPreference language;
private ListPreference enableBluetooth; private ListPreference enableBluetooth;
private SwitchPreference enableTor;
private ListPreference torNetwork; private ListPreference torNetwork;
private SwitchPreference torMobile; private SwitchPreference torMobile;
private SwitchPreference torOnlyWhenCharging; private SwitchPreference torOnlyWhenCharging;
@@ -167,6 +172,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
setLanguageEntries(); setLanguageEntries();
ListPreference theme = findPreference("pref_key_theme"); ListPreference theme = findPreference("pref_key_theme");
enableBluetooth = findPreference("pref_key_bluetooth"); enableBluetooth = findPreference("pref_key_bluetooth");
enableTor = findPreference(TOR_ENABLE);
torNetwork = findPreference(TOR_NETWORK); torNetwork = findPreference(TOR_NETWORK);
torMobile = findPreference(TOR_MOBILE); torMobile = findPreference(TOR_MOBILE);
torOnlyWhenCharging = findPreference(TOR_ONLY_WHEN_CHARGING); torOnlyWhenCharging = findPreference(TOR_ONLY_WHEN_CHARGING);
@@ -187,8 +193,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
UiUtils.setTheme(getActivity(), (String) newValue); UiUtils.setTheme(getActivity(), (String) newValue);
// bring up parent activity, so it can change its theme as well // bring up parent activity, so it can change its theme as well
// upstream bug: https://issuetracker.google.com/issues/38352704 // upstream bug: https://issuetracker.google.com/issues/38352704
Intent intent = Intent intent = new Intent(getActivity(), ENTRY_ACTIVITY);
new Intent(getActivity(), ENTRY_ACTIVITY);
intent.setFlags( intent.setFlags(
FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK); FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); startActivity(intent);
@@ -200,6 +205,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
return true; return true;
}); });
enableBluetooth.setOnPreferenceChangeListener(this); enableBluetooth.setOnPreferenceChangeListener(this);
enableTor.setOnPreferenceChangeListener(this);
torNetwork.setOnPreferenceChangeListener(this); torNetwork.setOnPreferenceChangeListener(this);
torMobile.setOnPreferenceChangeListener(this); torMobile.setOnPreferenceChangeListener(this);
torOnlyWhenCharging.setOnPreferenceChangeListener(this); torOnlyWhenCharging.setOnPreferenceChangeListener(this);
@@ -365,6 +371,10 @@ public class SettingsFragment extends PreferenceFragmentCompat
btSettings.getBoolean(PREF_BT_ENABLE, false); btSettings.getBoolean(PREF_BT_ENABLE, false);
enableBluetooth.setValue(Boolean.toString(btEnabledSetting)); enableBluetooth.setValue(Boolean.toString(btEnabledSetting));
boolean torEnabledSetting =
torSettings.getBoolean(PREF_TOR_ENABLE, true);
enableTor.setChecked(torEnabledSetting);
int torNetworkSetting = torSettings.getInt(PREF_TOR_NETWORK, int torNetworkSetting = torSettings.getInt(PREF_TOR_NETWORK,
PREF_TOR_NETWORK_AUTOMATIC); PREF_TOR_NETWORK_AUTOMATIC);
torNetwork.setValue(Integer.toString(torNetworkSetting)); torNetwork.setValue(Integer.toString(torNetworkSetting));
@@ -437,9 +447,10 @@ public class SettingsFragment extends PreferenceFragmentCompat
// - pref_key_lock (screenLock -> displayScreenLockSetting()) // - pref_key_lock (screenLock -> displayScreenLockSetting())
// - pref_key_lock_timeout (screenLockTimeout) // - pref_key_lock_timeout (screenLockTimeout)
enableBluetooth.setEnabled(enabled); enableBluetooth.setEnabled(enabled);
torNetwork.setEnabled(enabled); enableTor.setEnabled(enabled);
torMobile.setEnabled(enabled); torNetwork.setEnabled(enabled && enableTor.isChecked());
torOnlyWhenCharging.setEnabled(enabled); torMobile.setEnabled(enabled && enableTor.isChecked());
torOnlyWhenCharging.setEnabled(enabled && enableTor.isChecked());
if (!enabled) screenLock.setEnabled(false); if (!enabled) screenLock.setEnabled(false);
notifyPrivateMessages.setEnabled(enabled); notifyPrivateMessages.setEnabled(enabled);
notifyGroupMessages.setEnabled(enabled); notifyGroupMessages.setEnabled(enabled);
@@ -541,6 +552,13 @@ public class SettingsFragment extends PreferenceFragmentCompat
} else if (preference == enableBluetooth) { } else if (preference == enableBluetooth) {
boolean btSetting = Boolean.valueOf((String) newValue); boolean btSetting = Boolean.valueOf((String) newValue);
storeBluetoothSettings(btSetting); storeBluetoothSettings(btSetting);
} else if (preference == enableTor) {
boolean torEnabledSetting = (Boolean) newValue;
torNetwork.setEnabled(torNetwork.isEnabled() && torEnabledSetting);
torMobile.setEnabled(torMobile.isEnabled() && torEnabledSetting);
torOnlyWhenCharging.setEnabled(torOnlyWhenCharging.isEnabled() &&
torEnabledSetting);
storeTorEnabledSetting(torEnabledSetting);
} else if (preference == torNetwork) { } else if (preference == torNetwork) {
int torNetworkSetting = Integer.valueOf((String) newValue); int torNetworkSetting = Integer.valueOf((String) newValue);
storeTorNetworkSetting(torNetworkSetting); storeTorNetworkSetting(torNetworkSetting);
@@ -604,6 +622,12 @@ public class SettingsFragment extends PreferenceFragmentCompat
builder.show(); builder.show();
} }
private void storeTorEnabledSetting(boolean torEnabledSetting) {
Settings s = new Settings();
s.putBoolean(PREF_TOR_ENABLE, torEnabledSetting);
mergeSettings(s, TOR_NAMESPACE);
}
private void storeTorNetworkSetting(int torNetworkSetting) { private void storeTorNetworkSetting(int torNetworkSetting) {
Settings s = new Settings(); Settings s = new Settings();
s.putInt(PREF_TOR_NETWORK, torNetworkSetting); s.putInt(PREF_TOR_NETWORK, torNetworkSetting);

View File

@@ -13,13 +13,11 @@
<item>@string/tor_network_setting_automatic</item> <item>@string/tor_network_setting_automatic</item>
<item>@string/tor_network_setting_without_bridges</item> <item>@string/tor_network_setting_without_bridges</item>
<item>@string/tor_network_setting_with_bridges</item> <item>@string/tor_network_setting_with_bridges</item>
<item>@string/tor_network_setting_never</item>
</string-array> </string-array>
<string-array name="tor_network_setting_values"> <string-array name="tor_network_setting_values">
<item>0</item> <item>0</item>
<item>1</item> <item>1</item>
<item>2</item> <item>2</item>
<item>3</item>
</string-array> </string-array>
<string-array name="pref_language_values"> <string-array name="pref_language_values">

View File

@@ -441,12 +441,13 @@
<string name="pref_theme_auto">Automatic (Daytime)</string> <string name="pref_theme_auto">Automatic (Daytime)</string>
<string name="pref_theme_system">System Default</string> <string name="pref_theme_system">System Default</string>
<!-- Settings Network --> <!-- Settings Connections -->
<string name="network_settings_title">Networks</string> <string name="network_settings_title">Connections</string>
<string name="bluetooth_setting">Connect via Bluetooth</string> <string name="bluetooth_setting">Connect via Bluetooth</string>
<string name="bluetooth_setting_enabled">Whenever contacts are nearby</string> <string name="bluetooth_setting_enabled">Whenever contacts are nearby</string>
<string name="bluetooth_setting_disabled">Only when adding contacts</string> <string name="bluetooth_setting_disabled">Only when adding contacts</string>
<string name="tor_network_setting">Connect via Internet (Tor)</string> <string name="tor_enable_title">Connect to contacts via Internet (Tor)</string>
<string name="tor_network_setting">Connection method for Internet (Tor)</string>
<string name="tor_network_setting_automatic">Automatic based on location</string> <string name="tor_network_setting_automatic">Automatic based on location</string>
<string name="tor_network_setting_without_bridges">Use Tor without bridges</string> <string name="tor_network_setting_without_bridges">Use Tor without bridges</string>
<string name="tor_network_setting_with_bridges">Use Tor with bridges</string> <string name="tor_network_setting_with_bridges">Use Tor with bridges</string>

View File

@@ -39,6 +39,14 @@
android:title="@string/bluetooth_setting" android:title="@string/bluetooth_setting"
app:iconSpaceReserved="false"/> app:iconSpaceReserved="false"/>
<SwitchPreference
android:defaultValue="true"
android:key="pref_key_tor_enable"
android:persistent="false"
android:title="@string/tor_enable_title"
android:widgetLayout="@layout/preference_switch_compat"
app:iconSpaceReserved="false"/>
<ListPreference <ListPreference
android:defaultValue="0" android:defaultValue="0"
android:entries="@array/tor_network_setting_names" android:entries="@array/tor_network_setting_names"