From 3449815e68d6b8c658f90406a5130afff5629741 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 2 Jul 2021 07:32:15 +0200 Subject: [PATCH] Highlight mail-do domain name, refactoring --- .../java/eu/faircode/email/DnsHelper.java | 9 ---- .../java/eu/faircode/email/EntityMessage.java | 4 +- .../java/eu/faircode/email/EntityRule.java | 2 +- .../eu/faircode/email/FragmentAccount.java | 2 +- .../email/FragmentDialogOpenLink.java | 27 +++++++++--- .../java/eu/faircode/email/FragmentPop.java | 2 +- .../main/java/eu/faircode/email/IPInfo.java | 5 +-- .../java/eu/faircode/email/UriHelper.java | 44 +++++++++++++++++++ 8 files changed, 71 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/UriHelper.java diff --git a/app/src/main/java/eu/faircode/email/DnsHelper.java b/app/src/main/java/eu/faircode/email/DnsHelper.java index 4be67705ac..303e0bed78 100644 --- a/app/src/main/java/eu/faircode/email/DnsHelper.java +++ b/app/src/main/java/eu/faircode/email/DnsHelper.java @@ -227,15 +227,6 @@ public class DnsHelper { } } - static String getParentDomain(String host) { - if (host != null) { - String[] h = host.split("\\."); - if (h.length >= 2) - return h[h.length - 2] + "." + h[h.length - 1]; - } - return host; - } - private static String getDnsServer(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 41e83901fc..f6c5e4ac59 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -315,14 +315,14 @@ public class EntityMessage implements Serializable { int rat = (r == null ? -1 : r.indexOf('@')); if (rat < 0) continue; - String rdomain = DnsHelper.getParentDomain(r.substring(rat + 1)); + String rdomain = UriHelper.getParentDomain(r.substring(rat + 1)); for (Address _from : from) { String f = ((InternetAddress) _from).getAddress(); int fat = (f == null ? -1 : f.indexOf('@')); if (fat < 0) continue; - String fdomain = DnsHelper.getParentDomain(f.substring(fat + 1)); + String fdomain = UriHelper.getParentDomain(f.substring(fat + 1)); if (!rdomain.equalsIgnoreCase(fdomain)) return context.getString(R.string.title_reply_domain, fdomain, rdomain); diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index 0108db2495..c5e0dea4ee 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -860,7 +860,7 @@ public class EntityRule { int at = sender.indexOf('@'); if (at > 0) { boolean whitelisted = false; - String domain = DnsHelper.getParentDomain(sender.substring(at + 1)); + String domain = UriHelper.getParentDomain(sender.substring(at + 1)); for (String d : whitelist) if (domain.matches(d)) { whitelisted = true; diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java index 4eaa600429..25f69157a6 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccount.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java @@ -1077,7 +1077,7 @@ public class FragmentAccount extends FragmentBase { db.beginTransaction(); if (account != null && !account.password.equals(password)) { - String domain = DnsHelper.getParentDomain(account.host); + String domain = UriHelper.getParentDomain(account.host); String match = (Objects.equals(account.host, domain) ? account.host : "%." + domain); int count = db.identity().setIdentityPassword(account.id, account.user, password, match); Log.i("Updated passwords=" + count + " match=" + match); diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogOpenLink.java b/app/src/main/java/eu/faircode/email/FragmentDialogOpenLink.java index c3a2f32111..f1ee90ee78 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogOpenLink.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogOpenLink.java @@ -54,6 +54,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.Group; +import androidx.core.net.MailTo; import androidx.core.util.PatternsCompat; import androidx.preference.PreferenceManager; @@ -502,14 +503,26 @@ public class FragmentDialogOpenLink extends FragmentDialogBase { private Spanned format(Uri uri, Context context) { String text = uri.toString(); SpannableStringBuilder ssb = new SpannableStringBuilder(text); - String host = uri.getHost(); - if (host != null) { - int textColorLink = Helper.resolveColor(context, android.R.attr.textColorLink); - int index = text.indexOf(host); - if (index >= 0) - ssb.setSpan(new ForegroundColorSpan(textColorLink), - index, index + host.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + try { + String host = uri.getHost(); + + if (host == null && "mailto".equals(uri.getScheme())) { + MailTo email = MailTo.parse(uri.toString()); + host = UriHelper.getEmailDomain(email.getTo()); + } + + if (host != null) { + int textColorLink = Helper.resolveColor(context, android.R.attr.textColorLink); + int index = text.indexOf(host); + if (index >= 0) + ssb.setSpan(new ForegroundColorSpan(textColorLink), + index, index + host.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } catch (Throwable ex) { + Log.e(ex); } + return ssb; } } \ No newline at end of file diff --git a/app/src/main/java/eu/faircode/email/FragmentPop.java b/app/src/main/java/eu/faircode/email/FragmentPop.java index d406a2882e..264fa381a8 100644 --- a/app/src/main/java/eu/faircode/email/FragmentPop.java +++ b/app/src/main/java/eu/faircode/email/FragmentPop.java @@ -488,7 +488,7 @@ public class FragmentPop extends FragmentBase { db.beginTransaction(); if (account != null && !account.password.equals(password)) { - String domain = DnsHelper.getParentDomain(account.host); + String domain = UriHelper.getParentDomain(account.host); String match = (Objects.equals(account.host, domain) ? account.host : "%." + domain); int count = db.identity().setIdentityPassword(account.id, account.user, password, match); Log.i("Updated passwords=" + count + " match=" + match); diff --git a/app/src/main/java/eu/faircode/email/IPInfo.java b/app/src/main/java/eu/faircode/email/IPInfo.java index c1aeb0d6bd..7ea9bbc26c 100644 --- a/app/src/main/java/eu/faircode/email/IPInfo.java +++ b/app/src/main/java/eu/faircode/email/IPInfo.java @@ -45,10 +45,9 @@ public class IPInfo { static Pair getOrganization(@NonNull Uri uri, Context context) throws IOException, ParseException { if ("mailto".equalsIgnoreCase(uri.getScheme())) { MailTo email = MailTo.parse(uri.toString()); - String to = email.getTo(); - if (to == null || !to.contains("@")) + String domain = UriHelper.getEmailDomain(email.getTo()); + if (domain == null) throw new UnknownHostException(); - String domain = to.substring(to.indexOf('@') + 1); InetAddress address = DnsHelper.lookupMx(context, domain); if (address == null) throw new UnknownHostException(); diff --git a/app/src/main/java/eu/faircode/email/UriHelper.java b/app/src/main/java/eu/faircode/email/UriHelper.java new file mode 100644 index 0000000000..df6f19d9b7 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/UriHelper.java @@ -0,0 +1,44 @@ +package eu.faircode.email; + +/* + This file is part of FairEmail. + + FairEmail is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + FairEmail is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FairEmail. If not, see . + + Copyright 2018-2021 by Marcel Bokhorst (M66B) +*/ + +public class UriHelper { + static String getParentDomain(String host) { + if (host == null) + return null; + + String[] h = host.split("\\."); + if (h.length >= 2) + return h[h.length - 2] + "." + h[h.length - 1]; + + return host; + } + + static String getEmailDomain(String address) { + if (address == null) + return null; + + int at = address.indexOf('@'); + if (at > 0) + return address.substring(at + 1); + + return address; + } +}