/* * Copyright (C) 2008-2017, Juick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package com.juick.components.s2s; import org.apache.commons.lang3.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.Hashtable; import java.util.Random; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; /** * * @author ugnich */ public class DNSQueries { private static final Logger logger = LoggerFactory.getLogger(DNSQueries.class); private static Random rand = new Random(); public static InetSocketAddress getServerAddress(String hostname) { String host = hostname; int port = 5269; Hashtable env = new Hashtable<>(5); env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); try { DirContext ctx = new InitialDirContext(env); Attribute att = ctx.getAttributes("_xmpp-server._tcp." + hostname, new String[]{"SRV"}).get("SRV"); if (att != null && att.size() > 0) { int i = rand.nextInt(att.size()); String srv[] = att.get(i).toString().split(" "); port = NumberUtils.toInt(srv[2], 5269); host = srv[3]; } ctx.close(); } catch (NamingException e) { logger.info("SRV record for {} is not resolved, falling back to A record", hostname); } return new InetSocketAddress(host, port); } }