Updated DNS on network change, better reload logic

Fixes #251
This commit is contained in:
M66B 2016-01-26 07:26:43 +01:00
parent e8ba6e24f5
commit 3787fc9190
2 changed files with 55 additions and 41 deletions

View File

@ -343,35 +343,30 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
if ("whitelist_wifi".equals(name) ||
"screen_wifi".equals(name))
SinkholeService.reload("wifi", "setting changed", this);
SinkholeService.reload("wifi", "changed " + name, this);
else if ("whitelist_other".equals(name) ||
"screen_other".equals(name))
SinkholeService.reload("other", "setting changed", this);
SinkholeService.reload("other", "changed " + name, this);
else if ("whitelist_roaming".equals(name)) {
if (prefs.getBoolean(name, false)) {
if (Util.hasPhoneStatePermission(this))
SinkholeService.reload("other", "setting changed", this);
SinkholeService.reload("other", "changed " + name, this);
else
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_INTERNATIONAL);
} else
SinkholeService.reload("other", "setting changed", this);
SinkholeService.reload("other", "changed " + name, this);
} else if ("manage_system".equals(name)) {
boolean manage = prefs.getBoolean(name, false);
if (!manage)
prefs.edit().putBoolean("show_user", true).apply();
prefs.edit().putBoolean("show_system", manage).apply();
SinkholeService.reload(null, "setting changed", this);
SinkholeService.reload(null, "changed " + name, this);
} else if ("tethering".equals(name)) {
if (prefs.getBoolean("filter", false)) {
// Requires a full stop to reconfigure the VPN
SinkholeService.stop("tethering", this);
SinkholeService.start("tethering", this);
} else
SinkholeService.reload(null, "setting changed", this);
SinkholeService.reload(null, "changed " + name, this);
} else if ("log".equals(name)) {
if (prefs.getBoolean(name, false) && !IAB.isPurchased(ActivityPro.SKU_LOG, this)) {
@ -380,11 +375,11 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
startActivity(new Intent(this, ActivityPro.class));
return;
} else
SinkholeService.reload(null, "setting changed", this);
SinkholeService.reload(null, "changed " + name, this);
} else if ("filter".equals(name)) {
// TODO pro feature
SinkholeService.reload(null, "setting changed", this);
SinkholeService.reload(null, "changed " + name, this);
// Show dialog
if (prefs.getBoolean(name, false)) {
@ -403,7 +398,7 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
}
} else if ("use_hosts".equals(name))
SinkholeService.reload(null, "setting changed", this);
SinkholeService.reload(null, "changed " + name, this);
else if ("auto_enable".equals(name))
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_auto, prefs.getString(name, "0")));
@ -421,33 +416,33 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, TextUtils.join(", ", ssid)));
else
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, "-"));
SinkholeService.reload(null, "setting changed", this);
SinkholeService.reload(null, "changed " + name, this);
} else if ("use_metered".equals(name))
SinkholeService.reload(null, "setting changed", this);
SinkholeService.reload(null, "changed " + name, this);
else if ("unmetered_2g".equals(name) ||
"unmetered_3g".equals(name) ||
"unmetered_4g".equals(name)) {
if (prefs.getBoolean(name, false)) {
if (Util.hasPhoneStatePermission(this))
SinkholeService.reload("other", "setting changed", this);
SinkholeService.reload("other", "changed " + name, this);
else
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED);
} else
SinkholeService.reload("other", "setting changed", this);
SinkholeService.reload("other", "changed " + name, this);
} else if ("national_roaming".equals(name)) {
if (prefs.getBoolean(name, false)) {
if (Util.hasPhoneStatePermission(this))
SinkholeService.reload("other", "setting changed", this);
SinkholeService.reload("other", "changed " + name, this);
else
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_NATIONAL);
} else
SinkholeService.reload("other", "setting changed", this);
SinkholeService.reload("other", "changed " + name, this);
} else if ("show_stats".equals(name)) {
SinkholeService.reloadStats("setting changed", this);
SinkholeService.reloadStats("changed " + name, this);
} else if ("stats_base".equals(name)) {
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_stats_base, prefs.getString(name, "5")));
@ -459,16 +454,13 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_stats_samples, prefs.getString(name, "90")));
} else if ("loglevel".equals(name))
SinkholeService.reload(null, "setting changed", this);
SinkholeService.reload(null, "changed " + name, this);
else if ("dns".equals(name)) {
if (TextUtils.isEmpty(prefs.getString(name, null)))
if (TextUtils.isEmpty(prefs.getString(name, "")))
prefs.edit().remove(name).apply();
if (prefs.getBoolean("filter", false)) {
// Requires a full stop to reconfigure the VPN
SinkholeService.stop("dns", this);
SinkholeService.start("dns", this);
}
if (prefs.getBoolean("filter", false))
SinkholeService.reload(null, "changed " + name, this);
}
}

View File

@ -64,6 +64,7 @@ import android.widget.RemoteViews;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
@ -81,6 +82,8 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
private boolean last_connected = false;
private boolean last_metered = true;
private boolean last_interactive = false;
private String last_dns = null;
private boolean last_tethering = false;
private boolean phone_state = false;
private Object subscriptionsChangedListener = null;
private ParcelFileDescriptor vpn = null;
@ -334,6 +337,8 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
private void reload() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SinkholeService.this);
boolean tethering = prefs.getBoolean("tethering", false);
boolean filter = prefs.getBoolean("filter", false);
if (state != State.enforcing) {
if (state != State.none) {
@ -348,7 +353,9 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
List<Rule> listRule = Rule.getRules(true, TAG, SinkholeService.this);
List<Rule> listAllowed = getAllowedRules(listRule);
if (prefs.getBoolean("filter", false)) {
if (filter &&
tethering == last_tethering &&
getDns().equals(last_dns)) {
Log.i(TAG, "Native restart");
if (vpn != null)
@ -653,30 +660,45 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
}
}
private String getDns() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String sysDns = Util.getDefaultDNS(SinkholeService.this);
String vpnDns = prefs.getString("dns", sysDns);
Log.i(TAG, "DNS system=" + sysDns + " VPN=" + vpnDns);
try {
InetAddress.getByName(vpnDns);
Log.i(TAG, "DNS using=" + vpnDns);
return vpnDns;
} catch (Throwable ex) {
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
try {
InetAddress.getByName(sysDns);
Log.i(TAG, "DNS using=" + sysDns);
return sysDns;
} catch (Throwable exex) {
Log.e(TAG, exex.toString() + "\n" + Log.getStackTraceString(exex));
Log.i(TAG, "DNS using=8.8.8.8");
return "8.8.8.8";
}
}
}
private ParcelFileDescriptor startVPN(List<Rule> listAllowed) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean tethering = prefs.getBoolean("tethering", false);
boolean filter = prefs.getBoolean("filter", false);
last_dns = getDns();
last_tethering = tethering;
// Build VPN service
final Builder builder = new Builder();
builder.setSession(getString(R.string.app_name) + " session");
builder.addAddress(prefs.getString("vpn4", "10.1.10.1"), 32);
builder.addAddress(prefs.getString("vpn6", "fd00:1:fd00:1:fd00:1:fd00:1"), 64);
if (filter) {
// TODO multiple DNS servers
String sysDns = Util.getDefaultDNS(SinkholeService.this);
String vpnDns = prefs.getString("dns", sysDns);
Log.i(TAG, "DNS system=" + sysDns + " VPN=" + vpnDns);
try {
builder.addDnsServer(vpnDns);
} catch (Throwable ex) {
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
builder.addDnsServer(sysDns);
}
}
if (filter)
builder.addDnsServer(last_dns);
if (tethering) {
// USB Tethering 192.168.42.x