From 6b90d0e16655cbaaea70dcdd17e6e4fb20e4c859 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 2 Jan 2024 16:44:35 +0100 Subject: [PATCH] Added custom DNS resolver option --- app/src/main/java/eu/faircode/email/DnsHelper.java | 12 ++++++++++++ .../faircode/email/FragmentOptionsConnection.java | 12 +++++++++++- .../java/eu/faircode/email/ServiceSynchronize.java | 2 +- .../res/layout/fragment_options_connection.xml | 14 +++++++++++++- app/src/main/res/values/strings.xml | 1 + 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DnsHelper.java b/app/src/main/java/eu/faircode/email/DnsHelper.java index c926e0f117..311f1a79b8 100644 --- a/app/src/main/java/eu/faircode/email/DnsHelper.java +++ b/app/src/main/java/eu/faircode/email/DnsHelper.java @@ -20,6 +20,7 @@ package eu.faircode.email; */ import android.content.Context; +import android.content.SharedPreferences; import android.net.ConnectivityManager; import android.net.DnsResolver; import android.net.LinkProperties; @@ -29,6 +30,7 @@ import android.os.Build; import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.preference.PreferenceManager; import org.minidns.DnsClient; import org.minidns.dnsmessage.DnsMessage; @@ -310,10 +312,20 @@ public class DnsHelper { } static InetAddress getByName(Context context, String host) throws UnknownHostException { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean custom_dns = prefs.getBoolean("custom_dns", false); + if (!custom_dns) + return InetAddress.getByName(host); + return getAllByName(context, host)[0]; } static InetAddress[] getAllByName(Context context, String host) throws UnknownHostException { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean custom_dns = prefs.getBoolean("custom_dns", false); + if (!custom_dns) + return InetAddress.getAllByName(host); + List result = new ArrayList<>(); boolean[] has46 = ConnectionHelper.has46(context); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java b/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java index d9a65cd519..32d2794e24 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java @@ -95,6 +95,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre private SwitchCompat swBindSocket; private SwitchCompat swStandaloneVpn; private SwitchCompat swTcpKeepAlive; + private SwitchCompat swCustomDns; private SwitchCompat swSslUpdate; private SwitchCompat swSslHarden; private SwitchCompat swSslHardenStrict; @@ -125,7 +126,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre "metered", "download", "download_limited", "roaming", "rlah", "download_headers", "download_eml", "download_plain", "require_validated", "require_validated_captive", "vpn_only", - "timeout", "prefer_ip4", "bind_socket", "standalone_vpn", "tcp_keep_alive", + "timeout", "prefer_ip4", "bind_socket", "standalone_vpn", "tcp_keep_alive", "custom_dns", "ssl_update", "ssl_harden", "ssl_harden_strict", "cert_strict", "cert_transparency", "check_names", "open_safe", "http_redirect", "bouncy_castle", "bc_fips" @@ -158,6 +159,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre swBindSocket = view.findViewById(R.id.swBindSocket); swStandaloneVpn = view.findViewById(R.id.swStandaloneVpn); swTcpKeepAlive = view.findViewById(R.id.swTcpKeepAlive); + swCustomDns = view.findViewById(R.id.swCustomDns); swSslUpdate = view.findViewById(R.id.swSslUpdate); swSslHarden = view.findViewById(R.id.swSslHarden); swSslHardenStrict = view.findViewById(R.id.swSslHardenStrict); @@ -350,6 +352,13 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre } }); + swCustomDns.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton v, boolean checked) { + prefs.edit().putBoolean("custom_dns", checked).apply(); + } + }); + swSslUpdate.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton v, boolean checked) { @@ -715,6 +724,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre swBindSocket.setChecked(prefs.getBoolean("bind_socket", false)); swStandaloneVpn.setChecked(prefs.getBoolean("standalone_vpn", false)); swTcpKeepAlive.setChecked(prefs.getBoolean("tcp_keep_alive", false)); + swCustomDns.setChecked(prefs.getBoolean("custom_dns", false)); swSslUpdate.setChecked(prefs.getBoolean("ssl_update", true)); swSslHarden.setChecked(prefs.getBoolean("ssl_harden", false)); swSslHardenStrict.setChecked(prefs.getBoolean("ssl_harden_strict", false)); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index e9a87dded8..6297516128 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -171,7 +171,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences "sync_folders", "sync_shared_folders", "download_headers", "download_eml", - "prefer_ip4", "bind_socket", "standalone_vpn", "tcp_keep_alive", // force reconnect + "prefer_ip4", "bind_socket", "standalone_vpn", "tcp_keep_alive", "custom_dns", // force reconnect "ssl_harden", "ssl_harden_strict", "cert_strict", "cert_transparency", "check_names", "bouncy_castle", "bc_fips", // force reconnect "experiments", "debug", "protocol", // force reconnect "auth_plain", "auth_login", "auth_ntlm", "auth_sasl", "auth_apop", // force reconnect diff --git a/app/src/main/res/layout/fragment_options_connection.xml b/app/src/main/res/layout/fragment_options_connection.xml index 7c84d3972b..af7aa3ee56 100644 --- a/app/src/main/res/layout/fragment_options_connection.xml +++ b/app/src/main/res/layout/fragment_options_connection.xml @@ -448,6 +448,18 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/swTcpKeepAlive" /> + + Bind sockets to the active network Standalone VPN TCP keep alive + Use custom DNS resolver Use updated SSL provider Harden SSL connections Require TLS 1.3