From 67fb582a3a2cd04ff23ca28b11a51bf1edc23272 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 1 Jul 2021 09:19:59 +0200 Subject: [PATCH] Added checking block lists --- app/build.gradle | 7 +++- .../java/eu/faircode/email/ActivityDSN.java | 2 +- .../eu/faircode/email/AdapterMessage.java | 5 ++- .../java/eu/faircode/email/DnsBlockList.java | 41 ++++++++++++++----- .../java/eu/faircode/email/HtmlHelper.java | 29 ++++++++++++- 5 files changed, 70 insertions(+), 14 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c85dbcc2ae..54a05365b6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,8 +187,13 @@ android { } // https://stackoverflow.com/questions/28948538/ - // $JAVA_HOME/bin/java -jar ~/Android/Sdk/tools/proguard/lib/retrace.jar ~/email/app/schemas/mapping/FairEmail-v1.nnn-github-release-mapping.txt applicationVariants.all { variant -> + if (variant.buildType.name == "debug") + variant.buildConfigField "String", "MXTOOLBOX_URI", "\"https://mxtoolbox.com\"" + else + variant.buildConfigField "String", "MXTOOLBOX_URI", "\"\"" + + // $JAVA_HOME/bin/java -jar ~/Android/Sdk/tools/proguard/lib/retrace.jar ~/email/app/schemas/mapping/FairEmail-v1.nnn-github-release-mapping.txt if (variant.getBuildType().isMinifyEnabled()) variant.assembleProvider.get().doLast { for (file in variant.getMappingFileProvider().get().files) diff --git a/app/src/main/java/eu/faircode/email/ActivityDSN.java b/app/src/main/java/eu/faircode/email/ActivityDSN.java index 1a126c506d..f15aff0141 100644 --- a/app/src/main/java/eu/faircode/email/ActivityDSN.java +++ b/app/src/main/java/eu/faircode/email/ActivityDSN.java @@ -108,7 +108,7 @@ public class ActivityDSN extends ActivityBase { bos.write(buffer, 0, length); String headers = MessageHelper.decodeMime(bos.toString(StandardCharsets.UTF_8.name())); - result.headers = HtmlHelper.highlightHeaders(context, headers); + result.headers = HtmlHelper.highlightHeaders(context, headers, false); } return result; diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 8b0873a143..36e0ab99ad 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -65,6 +65,7 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.text.format.DateUtils; import android.text.method.ArrowKeyMovementMethod; +import android.text.method.LinkMovementMethod; import android.text.style.BackgroundColorSpan; import android.text.style.DynamicDrawableSpan; import android.text.style.ForegroundColorSpan; @@ -612,6 +613,7 @@ public class AdapterMessage extends RecyclerView.Adapter blocklists) { @@ -252,6 +245,34 @@ public class DnsBlockList { return blocked; } + private static String getFromHost(String received) { + String[] words = received.split("\\s+"); + for (int i = 0; i < words.length - 1; i++) + if ("from".equalsIgnoreCase(words[i])) { + String host = words[i + 1].toLowerCase(Locale.ROOT); + if (!TextUtils.isEmpty(host)) + return host; + } + return null; + } + + static void show(Context context, String received) { + String host = DnsBlockList.getFromHost(MimeUtility.unfold(received)); + if (host == null) + return; + + if (host.startsWith("[") && host.endsWith("]")) + host = host.substring(1, host.length() - 1); + + Uri uri = Uri.parse(BuildConfig.MXTOOLBOX_URI) + .buildUpon() + .appendPath("/SuperTool.aspx") + .appendQueryParameter("action", "blacklist:" + host) + .appendQueryParameter("run", "toolpage") + .build(); + Helper.view(context, uri, true); + } + private static class CacheEntry { private final long time; private final boolean blocked; diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index 5d9bd4a3a1..9d1885b3d9 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -37,6 +37,7 @@ import android.text.TextDirectionHeuristics; import android.text.TextUtils; import android.text.style.AlignmentSpan; import android.text.style.BulletSpan; +import android.text.style.ClickableSpan; import android.text.style.ForegroundColorSpan; import android.text.style.ImageSpan; import android.text.style.QuoteSpan; @@ -50,6 +51,7 @@ import android.text.style.URLSpan; import android.text.style.UnderlineSpan; import android.util.Base64; import android.util.Patterns; +import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -1967,7 +1969,7 @@ public class HtmlHelper { return ssb.toString(); } - static Spanned highlightHeaders(Context context, String headers) { + static Spanned highlightHeaders(Context context, String headers, boolean blocklist) { SpannableStringBuilder ssb = new SpannableStringBuilder(headers); int textColorLink = Helper.resolveColor(context, android.R.attr.textColorLink); @@ -2007,6 +2009,31 @@ public class HtmlHelper { if (date != null) ssb.append(' ').append(DTF.format(date)); ssb.setSpan(new StyleSpan(Typeface.BOLD), s, ssb.length(), 0); + + if (blocklist && i == received.length - 1) { + Drawable d = context.getDrawable(R.drawable.twotone_flag_24); + + int iconSize = context.getResources().getDimensionPixelSize(R.dimen.menu_item_icon_size); + d.setBounds(0, 0, iconSize, iconSize); + + int colorWarning = Helper.resolveColor(context, R.attr.colorWarning); + d.setTint(colorWarning); + + ssb.append(" \uFFFC"); // Object replacement character + ssb.setSpan(new ImageSpan(d), ssb.length() - 1, ssb.length(), 0); + + if (!TextUtils.isEmpty(BuildConfig.MXTOOLBOX_URI)) { + final String header = received[i]; + ClickableSpan click = new ClickableSpan() { + @Override + public void onClick(@NonNull View widget) { + DnsBlockList.show(widget.getContext(), header); + } + }; + ssb.setSpan(click, ssb.length() - 1, ssb.length(), 0); + } + } + ssb.append('\n'); int j = 0;