package org.apereo.cas.support.spnego.util; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; import java.net.UnknownHostException; /** * Utility class to perform DNS work in a threaded, timeout-able way * Adapted from: http://thushw.blogspot.com/2009/11/resolving-domain-names-quickly-with.html. * * @author Sean Baker sean.baker@usuhs.edu * @author Misagh Moayyed * @since 4.1 */ public class ReverseDNSRunnable implements Runnable { /** Logger instance. **/ private static final Logger LOGGER = LoggerFactory.getLogger(ReverseDNSRunnable.class); /** Remote user IP address. **/ private String ipAddress; /** Remote user hostname. **/ private String hostName; /** * Simple constructor which also pre-sets hostName attribute for failover situations. * @param ipAddress the ip address on which reverse DNS will be done. */ public ReverseDNSRunnable(final String ipAddress) { this.ipAddress = ipAddress; this.hostName = ipAddress; } /** * Runnable implementation to thread the work done in this class, allowing the * implementer to set a thread timeout and thereby short-circuit the lookup. */ @Override public void run() { try { LOGGER.debug("Attempting to resolve [{}]", this.ipAddress); final InetAddress address = InetAddress.getByName(this.ipAddress); set(address.getCanonicalHostName()); } catch (final UnknownHostException e) { /* N/A -- Default to IP address, but that's already done. **/ LOGGER.debug("Unable to identify the canonical hostname for ip address.", e); } } /** * Glorified setter with logging. * @param hostName the resolved hostname */ public synchronized void set(final String hostName) { LOGGER.trace("ReverseDNS -- Found hostName: [{}].", hostName); this.hostName = hostName; } /** * Getter method to buildIdentifier result of lookup. * @return the remote host name, or the IP address if name not found */ public synchronized String get() { return this.hostName; } @Override public String toString() { return new ToStringBuilder(this) .append("ipAddress", this.ipAddress) .append("hostName", this.hostName) .toString(); } }