Added setting for internet connection validation

This commit is contained in:
M66B 2019-10-24 20:20:03 +02:00
parent 9984fd4879
commit 5df4e83f66
5 changed files with 46 additions and 3 deletions

View File

@ -62,6 +62,7 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NavUtils;
import androidx.core.util.PatternsCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.xml.sax.Attributes;
@ -238,9 +239,11 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
screen.findPreference("vpn6").setTitle(getString(R.string.setting_vpn6, prefs.getString("vpn6", "fd00:1:fd00:1:fd00:1:fd00:1")));
EditTextPreference pref_dns1 = (EditTextPreference) screen.findPreference("dns");
EditTextPreference pref_dns2 = (EditTextPreference) screen.findPreference("dns2");
EditTextPreference pref_validate = (EditTextPreference) screen.findPreference("validate");
EditTextPreference pref_ttl = (EditTextPreference) screen.findPreference("ttl");
pref_dns1.setTitle(getString(R.string.setting_dns, prefs.getString("dns", "-")));
pref_dns2.setTitle(getString(R.string.setting_dns, prefs.getString("dns2", "-")));
pref_validate.setTitle(getString(R.string.setting_validate, prefs.getString("validate", "www.google.com")));
pref_ttl.setTitle(getString(R.string.setting_ttl, prefs.getString("ttl", "259200")));
// SOCKS5 parameters
@ -669,6 +672,21 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
getString(R.string.setting_dns, prefs.getString(name, "-")));
ServiceSinkhole.reload("changed " + name, this, false);
} else if ("validate".equals(name)) {
String host = prefs.getString(name, "www.google.com");
try {
checkDomain(host);
prefs.edit().putString(name, host.trim()).apply();
} catch (Throwable ex) {
prefs.edit().remove(name).apply();
((EditTextPreference) getPreferenceScreen().findPreference(name)).setText(null);
if (!TextUtils.isEmpty(host))
Toast.makeText(ActivitySettings.this, ex.toString(), Toast.LENGTH_LONG).show();
}
getPreferenceScreen().findPreference(name).setTitle(
getString(R.string.setting_validate, prefs.getString(name, "www.google.com")));
ServiceSinkhole.reload("changed " + name, this, false);
} else if ("ttl".equals(name))
getPreferenceScreen().findPreference(name).setTitle(
getString(R.string.setting_ttl, prefs.getString(name, "259200")));
@ -793,6 +811,17 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
}
}
private void checkDomain(String address) throws IllegalArgumentException, UnknownHostException {
if (address != null)
address = address.trim();
if (TextUtils.isEmpty(address))
throw new IllegalArgumentException("Bad address");
if (Util.isNumericAddress(address))
throw new IllegalArgumentException("Bad address");
if (!PatternsCompat.DOMAIN_NAME.matcher(address).matches())
throw new IllegalArgumentException("Bad address");
}
private BroadcastReceiver interactiveStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {

View File

@ -2142,13 +2142,15 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
}
}
Log.i(TAG, "Validating " + network + " " + ni);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSinkhole.this);
String host = prefs.getString("validate", "www.google.com");
Log.i(TAG, "Validating " + network + " " + ni + " host=" + host);
Socket socket = null;
try {
socket = network.getSocketFactory().createSocket();
socket.connect(new InetSocketAddress("www.google.com", 443), 10000);
Log.i(TAG, "Validated " + network + " " + ni);
socket.connect(new InetSocketAddress(host, 443), 10000);
Log.i(TAG, "Validated " + network + " " + ni + " host=" + host);
synchronized (validated) {
validated.put(network, new Date().getTime());
}

View File

@ -111,6 +111,7 @@
<string name="setting_vpn4">VPN IPv4: %s</string>
<string name="setting_vpn6">VPN IPv6: %s</string>
<string name="setting_dns">VPN DNS: %s</string>
<string name="setting_validate">Validate at: %s</string>
<string name="setting_ttl">Minimum DNS TTL: %s s</string>
<string name="setting_socks5_enabled">Use SOCKS5 proxy</string>
<string name="setting_socks5_addr">SOCKS5 address: %s</string>
@ -165,6 +166,7 @@
<string name="summary_track_usage">Track the number of bytes sent and received for each app and address. This might result in extra battery usage.</string>
<string name="summary_block_domains">Respond with the configured DNS response code for blocked domain names. This switch is disabled when no hosts file is available.</string>
<string name="summary_rcode">The default value is 3 (NXDOMAIN), which means \'non-existent domain\'.</string>
<string name="summary_validate">Domain name used to validate the internet connection at port 443 (https).</string>
<string name="summary_socks5_enabled">Only TCP traffic will be sent to the proxy server</string>
<string name="summary_watchdog">Periodically check if NetGuard is still running (enter zero to disable this option). This might result in extra battery usage.</string>

View File

@ -228,6 +228,11 @@
android:dependency="filter"
android:inputType="text"
android:key="dns2" />
<EditTextPreference
android:hint="www.google.com"
android:inputType="text"
android:key="validate"
android:summary="@string/summary_validate" />
<EditTextPreference
android:dependency="filter"
android:inputType="number"

View File

@ -228,6 +228,11 @@
android:dependency="filter"
android:inputType="text"
android:key="dns2" />
<EditTextPreference
android:hint="www.google.com"
android:inputType="text"
android:key="validate"
android:summary="@string/summary_validate" />
<EditTextPreference
android:dependency="filter"
android:inputType="number"