Check well known SRVs as well as DNSSEC

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/utils/Resolver.java | 18 +++++++--
1 file changed, 14 insertions(+), 4 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/utils/Resolver.java 🔗

@@ -8,6 +8,7 @@ import androidx.annotation.NonNull;
 
 import com.google.common.base.Strings;
 import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.net.InetAddresses;
 import com.google.common.primitives.Ints;
 
@@ -20,6 +21,7 @@ import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 //import de.gultsch.minidns.AndroidDNSClient;
 import org.minidns.AbstractDnsClient;
@@ -167,6 +169,12 @@ public class Resolver {
         "zw"
     );
 
+    protected static final Map<String, String> knownSRV = ImmutableMap.of(
+        "_xmpp-client._tcp.yax.im", "xmpp.yaxim.org",
+        "_xmpps-client._tcp.yax.im", "xmpp.yaxim.org",
+        "_xmpp-server._tcp.yax.im", "xmpp.yaxim.org"
+    );
+
     public static void init(XmppConnectionService service) {
         Resolver.SERVICE = service;
         DnsClient.removeDNSServerLookupMechanism(AndroidUsingExec.INSTANCE);
@@ -304,7 +312,8 @@ public class Resolver {
     }
 
     private static List<Result> resolveSrv(String domain, final boolean directTls) throws IOException {
-        DnsName dnsName = DnsName.from((directTls ? DIRECT_TLS_SERVICE : STARTTLS_SERVICE) + "._tcp." + domain);
+        final String dnsNameS = (directTls ? DIRECT_TLS_SERVICE : STARTTLS_SERVICE) + "._tcp." + domain;
+        DnsName dnsName = DnsName.from(dnsNameS);
         ResolverResult<SRV> result = resolveWithFallback(dnsName, SRV.class);
         final List<Result> results = new ArrayList<>();
         final List<Thread> threads = new ArrayList<>();
@@ -312,8 +321,9 @@ public class Resolver {
             if (record.name.length() == 0 && record.priority == 0) {
                 continue;
             }
+            final boolean authentic = result.isAuthenticData() || record.target.toString().equals(knownSRV.get(dnsNameS));
             threads.add(new Thread(() -> {
-                final List<Result> ipv4s = resolveIp(record, A.class, result.isAuthenticData(), directTls);
+                final List<Result> ipv4s = resolveIp(record, A.class, authentic, directTls);
                 if (ipv4s.size() == 0) {
                     Result resolverResult = Result.fromRecord(record, directTls);
                     resolverResult.authenticated = result.isAuthenticData();
@@ -325,7 +335,7 @@ public class Resolver {
 
             }));
             threads.add(new Thread(() -> {
-                final List<Result> ipv6s = resolveIp(record, AAAA.class, result.isAuthenticData(), directTls);
+                final List<Result> ipv6s = resolveIp(record, AAAA.class, authentic, directTls);
                 synchronized (results) {
                     results.addAll(ipv6s);
                 }
@@ -347,7 +357,7 @@ public class Resolver {
     private static <D extends InternetAddressRR> List<Result> resolveIp(SRV srv, Class<D> type, boolean authenticated, boolean directTls) {
         List<Result> list = new ArrayList<>();
         try {
-            ResolverResult<D> results = resolveWithFallback(srv.name, type);
+            ResolverResult<D> results = resolveWithFallback(srv.target, type);
             for (D record : results.getAnswersOrEmptySet()) {
                 Result resolverResult = Result.fromRecord(srv, directTls);
                 resolverResult.authenticated = results.isAuthenticData() && authenticated;