Refactoring

pull/178/head
M66B 6 years ago
parent 1f8079e773
commit 032910771b

@ -117,6 +117,14 @@ public class ApplicationEx extends Application {
registerReceiver(onScreenOff, new IntentFilter(Intent.ACTION_SCREEN_OFF)); registerReceiver(onScreenOff, new IntentFilter(Intent.ACTION_SCREEN_OFF));
if (BuildConfig.DEBUG)
new Thread(new Runnable() {
@Override
public void run() {
DnsHelper.test(ApplicationEx.this);
}
}).start();
long end = new Date().getTime(); long end = new Date().getTime();
Log.i("App created " + (end - start) + " ms"); Log.i("App created " + (end - start) + " ms");
} }

@ -38,6 +38,7 @@ import org.xbill.DNS.Type;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.mail.Address; import javax.mail.Address;
@ -107,28 +108,54 @@ public class DnsHelper {
} }
@NonNull @NonNull
static Record[] lookup(Context context, String name, int type) throws TextParseException, UnknownHostException { static DnsRecord[] lookup(Context context, String name, String type) throws UnknownHostException {
Lookup lookup = new Lookup(name, type); int rtype;
switch (type) {
case "mx":
rtype = Type.MX;
break;
case "srv":
rtype = Type.SRV;
break;
default:
throw new IllegalArgumentException(type);
}
SimpleResolver resolver = new SimpleResolver(getDnsServer(context)); try {
lookup.setResolver(resolver); Lookup lookup = new Lookup(name, rtype);
Log.i("Lookup name=" + name + " @" + resolver.getAddress() + " type=" + type);
Record[] records = lookup.run();
if (lookup.getResult() != Lookup.SUCCESSFUL) SimpleResolver resolver = new SimpleResolver(getDnsServer(context));
if (lookup.getResult() == Lookup.HOST_NOT_FOUND || lookup.setResolver(resolver);
lookup.getResult() == Lookup.TYPE_NOT_FOUND) Log.i("Lookup name=" + name + " @" + resolver.getAddress() + " type=" + rtype);
throw new UnknownHostException(name); Record[] records = lookup.run();
else
throw new UnknownHostException(lookup.getErrorString()); 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 (records.length == 0)
throw new UnknownHostException(name); throw new UnknownHostException(name);
for (Record record : records) List<DnsRecord> result = new ArrayList<>();
Log.i("Found record=" + record); 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 records; return result.toArray(new DnsRecord[0]);
} catch (TextParseException ex) {
throw new UnknownHostException(ex.getMessage());
}
} }
static String getParentDomain(String host) { static String getParentDomain(String host) {
@ -174,14 +201,27 @@ public class DnsHelper {
return dns.get(0).getHostAddress(); return dns.get(0).getHostAddress();
} }
static class DnsRecord {
String name;
Integer port;
DnsRecord(String name) {
this.name = name;
}
DnsRecord(String name, int port) {
this.name = name;
this.port = port;
}
}
static void test(Context context) { static void test(Context context) {
try { try {
String domain = "gmail.com"; String domain = "gmail.com";
boolean ok = lookupMx(context, new Address[]{Log.myAddress()}); boolean ok = lookupMx(context, new Address[]{Log.myAddress()});
InetAddress iaddr = lookupMx(context, domain); InetAddress iaddr = lookupMx(context, domain);
Record[] records = DnsHelper.lookup(context, "_imaps._tcp." + domain, Type.SRV); DnsRecord[] records = DnsHelper.lookup(context, "_imaps._tcp." + domain, "srv");
SRVRecord srv = (SRVRecord) records[0]; Log.i("DNS ok=" + ok + " iaddr=" + iaddr + " srv=" + records[0].name + ":" + records[0].port);
Log.i("DNS ok=" + ok + " iaddr=" + iaddr + " srv=" + srv.getTarget().toString());
} catch (Throwable ex) { } catch (Throwable ex) {
Log.e("DNS", ex); Log.e("DNS", ex);
} }

@ -25,11 +25,6 @@ import android.text.TextUtils;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.xbill.DNS.MXRecord;
import org.xbill.DNS.Record;
import org.xbill.DNS.SRVRecord;
import org.xbill.DNS.TextParseException;
import org.xbill.DNS.Type;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlPullParserFactory;
@ -226,9 +221,9 @@ public class EmailProvider {
try { try {
// Retry at MX server addresses // Retry at MX server addresses
Record[] records = DnsHelper.lookup(context, domain, Type.MX); DnsHelper.DnsRecord[] records = DnsHelper.lookup(context, domain, "mx");
for (Record record : records) { for (DnsHelper.DnsRecord record : records) {
String target = ((MXRecord) record).getTarget().toString(true); String target = record.name;
while (autoconfig == null && target != null && target.indexOf('.') > 0) { while (autoconfig == null && target != null && target.indexOf('.') > 0) {
try { try {
autoconfig = _fromDomain(context, target.toLowerCase(Locale.ROOT), email, discover); autoconfig = _fromDomain(context, target.toLowerCase(Locale.ROOT), email, discover);
@ -498,35 +493,32 @@ public class EmailProvider {
} }
@NonNull @NonNull
private static EmailProvider fromDNS(Context context, String domain, Discover discover) throws TextParseException, UnknownHostException { private static EmailProvider fromDNS(Context context, String domain, Discover discover) throws UnknownHostException {
// https://tools.ietf.org/html/rfc6186 // https://tools.ietf.org/html/rfc6186
EmailProvider provider = new EmailProvider(domain); EmailProvider provider = new EmailProvider(domain);
if (discover == Discover.ALL || discover == Discover.IMAP) { if (discover == Discover.ALL || discover == Discover.IMAP) {
try { try {
// Identifies an IMAP server where TLS is initiated directly upon connection to the IMAP server. // Identifies an IMAP server where TLS is initiated directly upon connection to the IMAP server.
Record[] records = DnsHelper.lookup(context, "_imaps._tcp." + domain, Type.SRV); DnsHelper.DnsRecord[] records = DnsHelper.lookup(context, "_imaps._tcp." + domain, "srv");
// ... service is not supported at all at a particular domain by setting the target of an SRV RR to "." // ... service is not supported at all at a particular domain by setting the target of an SRV RR to "."
SRVRecord srv = (SRVRecord) records[0]; provider.imap.host = records[0].name;
provider.imap.host = srv.getTarget().toString(true); provider.imap.port = records[0].port;
provider.imap.port = srv.getPort();
provider.imap.starttls = false; provider.imap.starttls = false;
} catch (UnknownHostException ex) { } catch (UnknownHostException ex) {
// Identifies an IMAP server that MAY ... require the MUA to use the "STARTTLS" command // Identifies an IMAP server that MAY ... require the MUA to use the "STARTTLS" command
Record[] records = DnsHelper.lookup(context, "_imap._tcp." + domain, Type.SRV); DnsHelper.DnsRecord[] records = DnsHelper.lookup(context, "_imap._tcp." + domain, "srv");
SRVRecord srv = (SRVRecord) records[0]; provider.imap.host = records[0].name;
provider.imap.host = srv.getTarget().toString(true); provider.imap.port = records[0].port;
provider.imap.port = srv.getPort();
provider.imap.starttls = (provider.imap.port == 143); provider.imap.starttls = (provider.imap.port == 143);
} }
} }
if (discover == Discover.ALL || discover == Discover.SMTP) { if (discover == Discover.ALL || discover == Discover.SMTP) {
// Note that this covers connections both with and without Transport Layer Security (TLS) // Note that this covers connections both with and without Transport Layer Security (TLS)
Record[] records = DnsHelper.lookup(context, "_submission._tcp." + domain, Type.SRV); DnsHelper.DnsRecord[] records = DnsHelper.lookup(context, "_submission._tcp." + domain, "srv");
SRVRecord srv = (SRVRecord) records[0]; provider.smtp.host = records[0].name;
provider.smtp.host = srv.getTarget().toString(true); provider.smtp.port = records[0].port;
provider.smtp.port = srv.getPort();
provider.smtp.starttls = (provider.smtp.port == 587); provider.smtp.starttls = (provider.smtp.port == 587);
} }

Loading…
Cancel
Save