diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java index 7115a2bc3..d14a82d46 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java @@ -1,6 +1,6 @@ /** * - * Copyright 2003-2007 Jive Software, 2017-2018 Florian Schmaus. + * Copyright 2003-2007 Jive Software, 2017-2019 Florian Schmaus. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,8 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.net.SocketFactory; import javax.net.ssl.HostnameVerifier; @@ -46,6 +48,7 @@ import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.jid.parts.Resourcepart; import org.jxmpp.stringprep.XmppStringprepException; import org.minidns.dnsname.DnsName; +import org.minidns.dnsname.InvalidDnsNameException; import org.minidns.util.InetAddressUtil; /** @@ -61,6 +64,8 @@ public abstract class ConnectionConfiguration { SmackConfiguration.getVersion(); } + private static final Logger LOGGER = Logger.getLogger(ConnectionConfiguration.class.getName()); + /** * The XMPP domain of the XMPP Service. Usually servers use the same service name as the name * of the server. However, there are some servers like google where host would be @@ -68,6 +73,8 @@ public abstract class ConnectionConfiguration { */ protected final DomainBareJid xmppServiceDomain; + protected final DnsName xmppServiceDomainDnsName; + protected final InetAddress hostAddress; protected final DnsName host; protected final int port; @@ -140,6 +147,19 @@ public abstract class ConnectionConfiguration { if (xmppServiceDomain == null) { throw new IllegalArgumentException("Must define the XMPP domain"); } + + DnsName xmppServiceDomainDnsName; + try { + xmppServiceDomainDnsName = DnsName.from(xmppServiceDomain); + } catch (InvalidDnsNameException e) { + LOGGER.log(Level.INFO, + "Could not transform XMPP service domain '" + xmppServiceDomain + + "' to a DNS name. TLS X.509 certificate validiation may not be possible.", + e); + xmppServiceDomainDnsName = null; + } + this.xmppServiceDomainDnsName = xmppServiceDomainDnsName; + hostAddress = builder.hostAddress; host = builder.host; port = builder.port; @@ -201,6 +221,17 @@ public abstract class ConnectionConfiguration { return xmppServiceDomain; } + /** + * Returns the XMPP service domain as DNS name if possible. Note that since not every XMPP address domainpart is a + * valid DNS name, this method may return null. + * + * @return the XMPP service domain as DNS name or null. + * @since 4.3.4 + */ + public DnsName getXmppServiceDomainAsDnsNameIfPossible() { + return xmppServiceDomainDnsName; + } + /** * Returns the TLS security mode used when making the connection. By default, * the mode is {@link SecurityMode#ifpossible}.