From dc19b2c8f6feddccee28c12ac77a481d5e1cbbb7 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 18 Apr 2020 19:58:39 +0200 Subject: [PATCH] Ignore unrecoverable DNS errors --- .../java/eu/faircode/email/DnsHelper.java | 38 +++++++++---------- .../java/eu/faircode/email/EmailProvider.java | 6 +++ 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DnsHelper.java b/app/src/main/java/eu/faircode/email/DnsHelper.java index 8710a1b50b..6b719915aa 100644 --- a/app/src/main/java/eu/faircode/email/DnsHelper.java +++ b/app/src/main/java/eu/faircode/email/DnsHelper.java @@ -106,28 +106,26 @@ public class DnsHelper { Log.i("Lookup name=" + name + " @" + resolver.getAddress() + " type=" + rtype); Record[] records = lookup.run(); - if (lookup.getResult() != Lookup.SUCCESSFUL) - if (lookup.getResult() == Lookup.HOST_NOT_FOUND || - lookup.getResult() == Lookup.TYPE_NOT_FOUND) - throw new UnknownHostException(name); - else - throw new UnknownHostException(lookup.getErrorString()); - - if (records.length == 0) + if (lookup.getResult() == Lookup.HOST_NOT_FOUND || + lookup.getResult() == Lookup.TYPE_NOT_FOUND) throw new UnknownHostException(name); + else if (lookup.getResult() != Lookup.SUCCESSFUL) + Log.w("DNS error=" + lookup.getErrorString()); List result = new ArrayList<>(); - for (Record record : records) { - Log.i("Found record=" + record); - if (record instanceof MXRecord) { - MXRecord mx = (MXRecord) record; - result.add(new DnsRecord(mx.getTarget().toString(true))); - } else if (record instanceof SRVRecord) { - SRVRecord srv = (SRVRecord) record; - result.add(new DnsRecord(srv.getTarget().toString(true), srv.getPort())); - } else - throw new IllegalArgumentException(record.getClass().getName()); - } + + if (records != null) + for (Record record : records) { + Log.i("Found record=" + record); + if (record instanceof MXRecord) { + MXRecord mx = (MXRecord) record; + result.add(new DnsRecord(mx.getTarget().toString(true))); + } else if (record instanceof SRVRecord) { + SRVRecord srv = (SRVRecord) record; + result.add(new DnsRecord(srv.getTarget().toString(true), srv.getPort())); + } else + throw new IllegalArgumentException(record.getClass().getName()); + } return result.toArray(new DnsRecord[0]); } catch (TextParseException ex) { @@ -198,6 +196,8 @@ public class DnsHelper { checkMx(context, new Address[]{Log.myAddress()}); InetAddress iaddr = lookupMx(context, domain); DnsRecord[] records = DnsHelper.lookup(context, "_imaps._tcp." + domain, "srv"); + if (records.length == 0) + throw new UnknownHostException(domain); Log.i("DNS iaddr=" + iaddr + " srv=" + records[0].name + ":" + records[0].port); } catch (Throwable ex) { Log.e("DNS", ex); diff --git a/app/src/main/java/eu/faircode/email/EmailProvider.java b/app/src/main/java/eu/faircode/email/EmailProvider.java index cc8f17c882..5ef7b4c40a 100644 --- a/app/src/main/java/eu/faircode/email/EmailProvider.java +++ b/app/src/main/java/eu/faircode/email/EmailProvider.java @@ -501,6 +501,8 @@ public class EmailProvider { try { // Identifies an IMAP server where TLS is initiated directly upon connection to the IMAP server. DnsHelper.DnsRecord[] records = DnsHelper.lookup(context, "_imaps._tcp." + domain, "srv"); + if (records.length == 0) + throw new UnknownHostException(domain); // ... service is not supported at all at a particular domain by setting the target of an SRV RR to "." provider.imap.host = records[0].name; provider.imap.port = records[0].port; @@ -508,6 +510,8 @@ public class EmailProvider { } catch (UnknownHostException ex) { // Identifies an IMAP server that MAY ... require the MUA to use the "STARTTLS" command DnsHelper.DnsRecord[] records = DnsHelper.lookup(context, "_imap._tcp." + domain, "srv"); + if (records.length == 0) + throw new UnknownHostException(domain); provider.imap.host = records[0].name; provider.imap.port = records[0].port; provider.imap.starttls = (provider.imap.port == 143); @@ -517,6 +521,8 @@ public class EmailProvider { if (discover == Discover.ALL || discover == Discover.SMTP) { // Note that this covers connections both with and without Transport Layer Security (TLS) DnsHelper.DnsRecord[] records = DnsHelper.lookup(context, "_submission._tcp." + domain, "srv"); + if (records.length == 0) + throw new UnknownHostException(domain); provider.smtp.host = records[0].name; provider.smtp.port = records[0].port; provider.smtp.starttls = (provider.smtp.port == 587);