From fd6ff59280d8d33c6411a4e5286d9d7d5e8de46b Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 13 Mar 2022 11:03:32 +0100 Subject: [PATCH] DMARC: recursive SPF lookup --- .../java/eu/faircode/email/ActivityDmarc.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ActivityDmarc.java b/app/src/main/java/eu/faircode/email/ActivityDmarc.java index 863f93f306..309e264344 100644 --- a/app/src/main/java/eu/faircode/email/ActivityDmarc.java +++ b/app/src/main/java/eu/faircode/email/ActivityDmarc.java @@ -32,6 +32,7 @@ import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.text.style.TypefaceSpan; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -366,10 +367,11 @@ public class ActivityDmarc extends ActivityBase { if (feedback) { ssb.append("\n\n"); if (lastDomain != null) { + for (Pair spf : lookupSpf(context, lastDomain)) + ssb.append(spf.first).append(' ') + .append(spf.second.name).append("\n"); + List records = new ArrayList<>(); - for (DnsHelper.DnsRecord r : DnsHelper.lookup(context, lastDomain, "txt")) - if (r.name.contains("spf")) - records.add(r); records.addAll(Arrays.asList( DnsHelper.lookup(context, "_dmarc." + lastDomain, "txt"))); records.addAll(Arrays.asList( @@ -437,6 +439,23 @@ public class ActivityDmarc extends ActivityBase { tvDmarc.setText(ex + "\n" + android.util.Log.getStackTraceString(ex)); grpReady.setVisibility(View.VISIBLE); } + + private List> lookupSpf(Context context, String domain) { + List> result = new ArrayList<>(); + try { + for (DnsHelper.DnsRecord r : DnsHelper.lookup(context, domain, "txt")) + if (r.name.contains("spf")) { + result.add(new Pair<>(domain, r)); + for (String part : r.name.split("\\s+")) + if (part.toLowerCase(Locale.ROOT).startsWith("include:")) + result.addAll(lookupSpf(context, part.substring("include:".length()))); + } + } catch (Throwable ex) { + Log.w(ex); + } + return result; + } + }.execute(this, args, "dmarc:decode"); } }