don't perform dns lookups on domain parts that obviously look like ip addresses
This commit is contained in:
parent
58201b4408
commit
5a48afdd4d
|
@ -20,11 +20,19 @@ import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
public class DNSHelper {
|
public class DNSHelper {
|
||||||
|
|
||||||
|
public static final Pattern PATTERN_IPV4 = Pattern.compile("\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
|
||||||
|
public static final Pattern PATTERN_IPV6_HEX4DECCOMPRESSED = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
|
||||||
|
public static final Pattern PATTERN_IPV6_6HEX4DEC = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z");
|
||||||
|
public static final Pattern PATTERN_IPV6_HEXCOMPRESSED = Pattern.compile("\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z");
|
||||||
|
public static final Pattern PATTERN_IPV6 = Pattern.compile("\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z");
|
||||||
|
|
||||||
protected static Client client = new Client();
|
protected static Client client = new Client();
|
||||||
|
|
||||||
public static Bundle getSRVRecord(final Jid jid) throws IOException {
|
public static Bundle getSRVRecord(final Jid jid) throws IOException {
|
||||||
|
@ -160,15 +168,11 @@ public class DNSHelper {
|
||||||
return namePort;
|
return namePort;
|
||||||
}
|
}
|
||||||
|
|
||||||
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
|
public static boolean isIp(final String server) {
|
||||||
|
return PATTERN_IPV4.matcher(server).matches()
|
||||||
public static String bytesToHex(byte[] bytes) {
|
|| PATTERN_IPV6.matcher(server).matches()
|
||||||
char[] hexChars = new char[bytes.length * 2];
|
|| PATTERN_IPV6_6HEX4DEC.matcher(server).matches()
|
||||||
for (int j = 0; j < bytes.length; j++) {
|
|| PATTERN_IPV6_HEX4DECCOMPRESSED.matcher(server).matches()
|
||||||
int v = bytes[j] & 0xFF;
|
|| PATTERN_IPV6_HEXCOMPRESSED.matcher(server).matches();
|
||||||
hexChars[j * 2] = hexArray[v >>> 4];
|
|
||||||
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
|
|
||||||
}
|
|
||||||
return new String(hexChars);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.net.IDN;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.net.SocketAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.security.KeyManagementException;
|
import java.security.KeyManagementException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
@ -155,6 +156,14 @@ public class XmppConnection implements Runnable {
|
||||||
tagWriter = new TagWriter();
|
tagWriter = new TagWriter();
|
||||||
packetCallbacks.clear();
|
packetCallbacks.clear();
|
||||||
this.changeStatus(Account.State.CONNECTING);
|
this.changeStatus(Account.State.CONNECTING);
|
||||||
|
if (DNSHelper.isIp(account.getServer().toString())) {
|
||||||
|
socket = new Socket();
|
||||||
|
try {
|
||||||
|
socket.connect(new InetSocketAddress(account.getServer().toString(), 5222), Config.SOCKET_TIMEOUT * 1000);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new UnknownHostException();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
final Bundle result = DNSHelper.getSRVRecord(account.getServer());
|
final Bundle result = DNSHelper.getSRVRecord(account.getServer());
|
||||||
final ArrayList<Parcelable> values = result.getParcelableArrayList("values");
|
final ArrayList<Parcelable> values = result.getParcelableArrayList("values");
|
||||||
if ("timeout".equals(result.getString("error"))) {
|
if ("timeout".equals(result.getString("error"))) {
|
||||||
|
@ -203,6 +212,7 @@ public class XmppConnection implements Runnable {
|
||||||
} else {
|
} else {
|
||||||
throw new IOException("unhandled exception in DNS resolver");
|
throw new IOException("unhandled exception in DNS resolver");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
final OutputStream out = socket.getOutputStream();
|
final OutputStream out = socket.getOutputStream();
|
||||||
tagWriter.setOutputStream(out);
|
tagWriter.setOutputStream(out);
|
||||||
final InputStream in = socket.getInputStream();
|
final InputStream in = socket.getInputStream();
|
||||||
|
|
Loading…
Reference in New Issue