From f99887d7cad3cdc0bd0df7be59e65cf63675bb4e Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 27 Mar 2014 11:03:10 +0100 Subject: [PATCH] further dns improvements --- .../siacs/conversations/utils/DNSHelper.java | 132 ++++++++++-------- 1 file changed, 72 insertions(+), 60 deletions(-) diff --git a/src/eu/siacs/conversations/utils/DNSHelper.java b/src/eu/siacs/conversations/utils/DNSHelper.java index 8953e3e5f..aa9f8057a 100644 --- a/src/eu/siacs/conversations/utils/DNSHelper.java +++ b/src/eu/siacs/conversations/utils/DNSHelper.java @@ -26,6 +26,10 @@ public class DNSHelper { if (value != null && !"".equals(value) && !servers.contains(value)) ip = InetAddress.getByName(value); servers.add(value); + Bundle result = queryDNS(host, ip); + if (!result.containsKey("error")) { + return result; + } } } catch (ClassNotFoundException e) { ip = InetAddress.getByName("8.8.8.8"); @@ -38,71 +42,79 @@ public class DNSHelper { } catch (InvocationTargetException e) { ip = InetAddress.getByName("8.8.8.8"); } - - Log.d("xmppService","using dns server: "+ip.toString()+" to look up SRV records"); - + return queryDNS(host, ip); + } + + public static Bundle queryDNS(String host, InetAddress dnsServer) { Bundle namePort = new Bundle(); - String[] hostParts = host.split("\\."); - byte[] transId = new byte[2]; - Random random = new Random(); - random.nextBytes(transId); - byte[] header = { 0x01, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x0c, 0x5f, 0x78, 0x6d, 0x70, 0x70, 0x2d, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x04, 0x5f, 0x74, 0x63, 0x70 }; - byte[] rest = { 0x00, 0x00, 0x21, 0x00, 0x01, 0x00, 0x00, 0x29, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - ByteArrayOutputStream output = new ByteArrayOutputStream(); - output.write(transId); - output.write(header); - for (int i = 0; i < hostParts.length; ++i) { - char[] tmpChars = hostParts[i].toCharArray(); - byte[] tmp = new byte[tmpChars.length]; - for (int j = 0; j < tmpChars.length; ++j) { - tmp[j] = (byte) tmpChars[j]; - } - output.write(tmp.length); - output.write(tmp); + try { + Log.d("xmppService","using dns server: "+dnsServer.toString()+" to look up "+host); + String[] hostParts = host.split("\\."); + byte[] transId = new byte[2]; + Random random = new Random(); + random.nextBytes(transId); + byte[] header = { 0x01, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x0c, 0x5f, 0x78, 0x6d, 0x70, 0x70, 0x2d, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x04, 0x5f, 0x74, 0x63, 0x70 }; + byte[] rest = { 0x00, 0x00, 0x21, 0x00, 0x01, 0x00, 0x00, 0x29, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + ByteArrayOutputStream output = new ByteArrayOutputStream(); + output.write(transId); + output.write(header); + for (int i = 0; i < hostParts.length; ++i) { + char[] tmpChars = hostParts[i].toCharArray(); + byte[] tmp = new byte[tmpChars.length]; + for (int j = 0; j < tmpChars.length; ++j) { + tmp[j] = (byte) tmpChars[j]; } - output.write(rest); - byte[] sendPaket = output.toByteArray(); - int realLenght = sendPaket.length - 11; - DatagramPacket packet = new DatagramPacket(sendPaket, - sendPaket.length, ip, 53); - DatagramSocket datagramSocket = new DatagramSocket(); - datagramSocket.send(packet); - byte[] receiveData = new byte[1024]; + output.write(tmp.length); + output.write(tmp); + } + output.write(rest); + byte[] sendPaket = output.toByteArray(); + int realLenght = sendPaket.length - 11; + DatagramPacket packet = new DatagramPacket(sendPaket, + sendPaket.length, dnsServer, 53); + DatagramSocket datagramSocket = new DatagramSocket(); + datagramSocket.send(packet); + byte[] receiveData = new byte[1024]; - DatagramPacket receivePacket = new DatagramPacket(receiveData, - receiveData.length); - datagramSocket.setSoTimeout(2000); - datagramSocket.receive(receivePacket); - if (receiveData[3]!=-128) { - namePort.putString("error", "nosrv"); - return namePort; + DatagramPacket receivePacket = new DatagramPacket(receiveData, + receiveData.length); + datagramSocket.setSoTimeout(3000); + datagramSocket.receive(receivePacket); + if (receiveData[3]!=-128) { + namePort.putString("error", "nosrv"); + return namePort; + } + namePort.putInt("port",calcPort(receiveData[realLenght + 16], + receiveData[realLenght + 17])); + int i = realLenght + 18; + int wordLenght = 0; + StringBuilder builder = new StringBuilder(); + while (receiveData[i] != 0) { + if (wordLenght > 0) { + builder.append((char) receiveData[i]); + --wordLenght; + } else { + wordLenght = receiveData[i]; + builder.append("."); } - namePort.putInt("port",calcPort(receiveData[realLenght + 16], - receiveData[realLenght + 17])); - int i = realLenght + 18; - int wordLenght = 0; - StringBuilder builder = new StringBuilder(); - while (receiveData[i] != 0) { - if (wordLenght > 0) { - builder.append((char) receiveData[i]); - --wordLenght; - } else { - wordLenght = receiveData[i]; - builder.append("."); - } - ++i; - } - builder.replace(0, 1, ""); - byte type = receiveData[i+1]; - if (type!=-64) { - namePort.putString("error", "nosrv"); - return namePort; - } - namePort.putString("name",builder.toString()); + ++i; + } + builder.replace(0, 1, ""); + byte type = receiveData[i+1]; + if (type!=-64) { + namePort.putString("error", "nosrv"); + return namePort; + } + namePort.putString("name",builder.toString()); return namePort; + } catch (IOException e) { + Log.d("xmppService","io execpiton during dns"); + namePort.putString("error", "nosrv"); + return namePort; + } } static int calcPort(byte hb, byte lb) {