From 7b53bd19ae4ac532e8f6d3e49dbad067a7e551a1 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 7 Sep 2024 19:46:14 +0200 Subject: [PATCH] Added prefer ipv6 option --- .../java/eu/faircode/email/EmailService.java | 32 +++++++++---------- .../email/FragmentOptionsConnection.java | 14 +++++++- .../eu/faircode/email/ServiceSynchronize.java | 2 +- .../layout/fragment_options_connection.xml | 15 ++++++++- app/src/main/res/values/strings.xml | 1 + 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/EmailService.java b/app/src/main/java/eu/faircode/email/EmailService.java index ccea2a8dbc..969f2f3706 100644 --- a/app/src/main/java/eu/faircode/email/EmailService.java +++ b/app/src/main/java/eu/faircode/email/EmailService.java @@ -637,18 +637,9 @@ public class EmailService implements AutoCloseable { // throw new MailConnectException( // new SocketConnectException("Debug", new IOException("Test"), host, port, 0)); - boolean prefer_ip4 = prefs.getBoolean("prefer_ip4", true); - String key = "dns." + host; try { main = DnsHelper.getByName(context, host, dnssec); - if (!prefer_ip4 && false) - for (InetAddress iaddr : DnsHelper.getAllByName(context, host, dnssec)) - if (iaddr instanceof Inet6Address) { - main = iaddr; - break; - } - EntityLog.log(context, EntityLog.Type.Network, "Main address=" + main); prefs.edit().putString(key, main.getHostAddress()).apply(); } catch (UnknownHostException ex) { @@ -661,12 +652,14 @@ public class EmailService implements AutoCloseable { } } - if (prefer_ip4 && main instanceof Inet6Address) { + boolean prefer_ip4 = prefs.getBoolean("prefer_ip4", true); + boolean prefer_ip6 = !prefer_ip4 && prefs.getBoolean("prefer_ip6", false); + if ((prefer_ip4 && main instanceof Inet6Address) || (prefer_ip6 && main instanceof Inet4Address)) { boolean[] has46 = ConnectionHelper.has46(context); - if (has46[0]) + if (prefer_ip4 ? has46[0] : has46[1]) try { for (InetAddress iaddr : DnsHelper.getAllByName(context, host, dnssec)) - if (iaddr instanceof Inet4Address) { + if ((prefer_ip4 && iaddr instanceof Inet4Address) || (prefer_ip6 && iaddr instanceof Inet6Address)) { main = iaddr; EntityLog.log(context, EntityLog.Type.Network, "Preferring=" + main); break; @@ -761,17 +754,22 @@ public class EmailService implements AutoCloseable { boolean[] has46 = ConnectionHelper.has46(context); + boolean prefer_ip4 = prefs.getBoolean("prefer_ip4", true); + boolean prefer_ip6 = !prefer_ip4 && prefs.getBoolean("prefer_ip6", false); + EntityLog.log(context, EntityLog.Type.Network, "Address main=" + main + " count=" + iaddrs.length + - " ip4=" + ip4 + " max4=" + MAX_IPV4 + " has4=" + has46[0] + - " ip6=" + ip6 + " max6=" + MAX_IPV6 + " has6=" + has46[1]); + " ip4=" + ip4 + " max4=" + MAX_IPV4 + " has4=" + has46[0] + " pref4=" + prefer_ip4 + + " ip6=" + ip6 + " max6=" + MAX_IPV6 + " has6=" + has46[1] + " pref6=" + prefer_ip6); - boolean prefer_ip4 = prefs.getBoolean("prefer_ip4", true); - if (prefer_ip4) + if (prefer_ip4 || prefer_ip6) Arrays.sort(iaddrs, new Comparator() { @Override public int compare(InetAddress a1, InetAddress a2) { - return -Boolean.compare(a1 instanceof Inet4Address, a2 instanceof Inet4Address); + int s = Boolean.compare(a1 instanceof Inet4Address, a2 instanceof Inet4Address); + if (prefer_ip4) + s = -s; + return s; } }); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java b/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java index c5dce09817..5986565fdc 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsConnection.java @@ -94,6 +94,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre private SwitchCompat swVpnOnly; private EditText etTimeout; private SwitchCompat swPreferIp4; + private SwitchCompat swPreferIp6; private SwitchCompat swBindSocket; private SwitchCompat swStandaloneVpn; private SwitchCompat swDnsCustom; @@ -133,7 +134,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", + "timeout", "prefer_ip4", "prefer_ip6", "bind_socket", "standalone_vpn", "dns_extra", "dns_custom", "dns_clear", "tcp_keep_alive", "ssl_update", "ssl_harden", "ssl_harden_strict", "cert_strict", "cert_transparency", "check_names", @@ -165,6 +166,7 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre swVpnOnly = view.findViewById(R.id.swVpnOnly); etTimeout = view.findViewById(R.id.etTimeout); swPreferIp4 = view.findViewById(R.id.swPreferIp4); + swPreferIp6 = view.findViewById(R.id.swPreferIp6); swBindSocket = view.findViewById(R.id.swBindSocket); swStandaloneVpn = view.findViewById(R.id.swStandaloneVpn); swDnsCustom = view.findViewById(R.id.swDnsCustom); @@ -330,6 +332,14 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { prefs.edit().putBoolean("prefer_ip4", checked).apply(); + swPreferIp6.setEnabled(!checked); + } + }); + + swPreferIp6.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("prefer_ip6", checked).apply(); } }); @@ -769,6 +779,8 @@ public class FragmentOptionsConnection extends FragmentBase implements SharedPre etTimeout.setHint(Integer.toString(EmailService.DEFAULT_CONNECT_TIMEOUT)); swPreferIp4.setChecked(prefs.getBoolean("prefer_ip4", true)); + swPreferIp6.setChecked(prefs.getBoolean("prefer_ip6", false)); + swPreferIp6.setEnabled(!swPreferIp4.isChecked()); swBindSocket.setChecked(prefs.getBoolean("bind_socket", false)); swStandaloneVpn.setChecked(prefs.getBoolean("standalone_vpn", false)); swDnsCustom.setChecked(prefs.getBoolean("dns_custom", false)); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 7db5a46039..5c41f8e108 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -176,7 +176,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences "sync_folders", "sync_shared_folders", "download_headers", "download_eml", - "prefer_ip4", "bind_socket", "standalone_vpn", // force reconnect + "prefer_ip4", "prefer_ip6", "bind_socket", "standalone_vpn", // force reconnect "dns_extra", "dns_custom", // force reconnect "tcp_keep_alive", // force reconnect "ssl_harden", "ssl_harden_strict", "cert_strict", "cert_transparency", "check_names", "bouncy_castle", "bc_fips", // 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 c479cd9bb2..257f4377e0 100644 --- a/app/src/main/res/layout/fragment_options_connection.xml +++ b/app/src/main/res/layout/fragment_options_connection.xml @@ -413,6 +413,19 @@ app:layout_constraintTop_toBottomOf="@id/etTimeout" app:switchPadding="12dp" /> + + Connect only via a VPN Connection timeout (seconds) Prefer IPv4 over IPv6 + Prefer IPv6 over IPv4 Bind sockets to the active network Standalone VPN Preferred DNS server addresses (comma separated)