diff options
Diffstat (limited to 'src/main/java/de/pixart/messenger/utils/Resolver.java')
-rw-r--r-- | src/main/java/de/pixart/messenger/utils/Resolver.java | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/src/main/java/de/pixart/messenger/utils/Resolver.java b/src/main/java/de/pixart/messenger/utils/Resolver.java index ed5e62fd3..a7c286cc7 100644 --- a/src/main/java/de/pixart/messenger/utils/Resolver.java +++ b/src/main/java/de/pixart/messenger/utils/Resolver.java @@ -1,6 +1,7 @@ package de.pixart.messenger.utils; import android.content.ContentValues; +import android.database.Cursor; import android.util.Log; import androidx.annotation.NonNull; @@ -168,6 +169,7 @@ public class Resolver { final Result result = new Result(); result.ip = InetAddress.getByName(domain); result.port = port; + result.authenticated = true; return result; } catch (UnknownHostException e) { e.printStackTrace(); @@ -202,18 +204,20 @@ public class Resolver { })); fallbackThreads.add(new Thread(() -> { try { - for (CNAME cname : resolveWithFallback(record.name, CNAME.class, result.isAuthenticData()).getAnswersOrEmptySet()) { - final List<Result> ipv6s = resolveIp(record, cname.name, AAAA.class, result.isAuthenticData(), directTls); + ResolverResult<CNAME> cnames = resolveWithFallback(record.name, CNAME.class, result.isAuthenticData()); + for (CNAME cname : cnames.getAnswersOrEmptySet()) { + final List<Result> ipv6s = resolveIp(record, cname.name, AAAA.class, cnames.isAuthenticData(), directTls); synchronized (fallbackResults) { fallbackResults.addAll(ipv6s); } - final List<Result> ipv4s = resolveIp(record, cname.name, A.class, result.isAuthenticData(), directTls); + final List<Result> ipv4s = resolveIp(record, cname.name, A.class, cnames.isAuthenticData(), directTls); synchronized (results) { fallbackResults.addAll(ipv4s); } } + Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + "cname in srv (agains RFC2782) - run slow fallback"); } catch (Throwable throwable) { - Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + "error resolving srv cname-fallback records", throwable); + Log.i(Config.LOGTAG, Resolver.class.getSimpleName() + "error resolving srv cname-fallback records", throwable); } })); } @@ -358,12 +362,14 @@ public class Resolver { } public static class Result implements Comparable<Result>, Callable<Result> { + public static final String DOMAIN = "domain"; public static final String IP = "ip"; public static final String HOSTNAME = "hostname"; public static final String PORT = "port"; public static final String PRIORITY = "priority"; public static final String DIRECT_TLS = "directTls"; public static final String AUTHENTICATED = "authenticated"; + public static final String TIME_REQUESTED = "time_requested"; private InetAddress ip; private DNSName hostname; @@ -371,12 +377,14 @@ public class Resolver { private boolean directTls = false; private boolean authenticated = false; private int priority; + private long timeRequested; private Socket socket; private String logID = ""; static Result fromRecord(final SRV srv, final boolean directTls) { Result result = new Result(); + result.timeRequested = System.currentTimeMillis(); result.port = srv.port; result.hostname = srv.name; result.directTls = directTls; @@ -386,6 +394,7 @@ public class Resolver { static Result createDefault(final DNSName hostname, final InetAddress ip, final int port) { Result result = new Result(); + result.timeRequested = System.currentTimeMillis(); result.port = port; result.hostname = hostname; result.ip = ip; @@ -430,6 +439,10 @@ public class Resolver { return authenticated; } + public boolean isOutdated() { + return (System.currentTimeMillis() - timeRequested) > 300_000; + } + public Socket getSocket() { return socket; } @@ -506,6 +519,23 @@ public class Resolver { throw new Exception("Resolver.Result was not possible to connect - should be catched by executor"); } + public static Result fromCursor(Cursor cursor) { + final Result result = new Result(); + try { + result.ip = InetAddress.getByAddress(cursor.getBlob(cursor.getColumnIndex(IP))); + } catch (UnknownHostException e) { + result.ip = null; + } + final String hostname = cursor.getString(cursor.getColumnIndex(HOSTNAME)); + result.hostname = hostname == null ? null : DNSName.from(hostname); + result.port = cursor.getInt(cursor.getColumnIndex(PORT)); + result.directTls = cursor.getInt(cursor.getColumnIndex(DIRECT_TLS)) > 0; + result.authenticated = cursor.getInt(cursor.getColumnIndex(AUTHENTICATED)) > 0; + result.priority = cursor.getInt(cursor.getColumnIndex(PRIORITY)); + result.timeRequested = cursor.getLong(cursor.getColumnIndex(TIME_REQUESTED)); + return result; + } + public ContentValues toContentValues() { final ContentValues contentValues = new ContentValues(); contentValues.put(IP, ip == null ? null : ip.getAddress()); @@ -514,6 +544,7 @@ public class Resolver { contentValues.put(PRIORITY, priority); contentValues.put(DIRECT_TLS, directTls ? 1 : 0); contentValues.put(AUTHENTICATED, authenticated ? 1 : 0); + contentValues.put(TIME_REQUESTED, timeRequested); return contentValues; } } |