/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.support.transport.ip; import freenet.io.AddressIdentifier; import freenet.support.LogThresholdCallback; import freenet.support.Logger; import freenet.support.Logger.LogLevel; public class HostnameUtil { private static volatile boolean logDEBUG; static { Logger.registerLogThresholdCallback(new LogThresholdCallback(){ @Override public void shouldUpdate(){ logDEBUG = Logger.shouldLog(LogLevel.DEBUG, this); } }); } /** * * @param hn * @param allowIPAddress * @return */ public static boolean isValidHostname(String hn, boolean allowIPAddress) { if(allowIPAddress) { // debugging log messages because AddressIdentifier doesn't appear to handle all IPv6 literals correctly, such as "fe80::204:1234:dead:beef" AddressIdentifier.AddressType addressType = AddressIdentifier.getAddressType(hn, true); if(logDEBUG)Logger.debug(null, "Address type of '"+hn+"' appears to be '"+addressType+ '\''); if(!addressType.toString().equals("Other")) { // the address typer thinks it's either an IPv4 or IPv6 IP address return true; } } // NOTE: It is believed that this code supports PUNYCODE based // ASCII Compatible Encoding (ACE) IDNA labels as // described in RFC3490. Such an assertion has not be // thoroughly tested. if(!hn.matches("(?:[-!#\\$%&'\\*+\\\\/0-9=?A-Z^_`a-z{|}]+\\.)+[a-zA-Z]{2,6}")) { System.err.println("Failed to match "+hn+" as a hostname or IPv4/IPv6 IP address"); return false; } return true; } }