/*
* GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project
*
* This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Contact info: xamjadmin@users.sourceforge.net
*/
/*
* Created on Jun 2, 2005
*/
package org.cobra_grendel.util;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
/**
* @author J. H. S.
*/
public class Domains
{
private static final Collection gTLDs;
static
{
gTLDs = new HashSet();
gTLDs.add(".com");
gTLDs.add(".edu");
gTLDs.add(".gov");
gTLDs.add(".int");
gTLDs.add(".mil");
gTLDs.add(".net");
gTLDs.add(".org");
gTLDs.add(".biz");
gTLDs.add(".info");
gTLDs.add(".name");
gTLDs.add(".pro");
gTLDs.add(".aero");
gTLDs.add(".coop");
gTLDs.add(".museum");
// TODO: New gTLDs?
}
/**
*
* @param host
* A host name in lower case.
* @return
*/
public static boolean endsWithGTLD(final String host)
{
Iterator i = gTLDs.iterator();
while (i.hasNext())
{
String ending = (String) i.next();
if (host.endsWith(ending))
{
return true;
}
}
return false;
}
public static Collection getPossibleDomains(final String hostName)
{
Collection domains = new LinkedList();
domains.add(hostName);
int dotIdx = hostName.indexOf('.', 1);
if (dotIdx == -1)
{
return domains;
}
String testDomain = hostName.substring(dotIdx);
if (!Domains.isValidCookieDomain(testDomain, hostName))
{
return domains;
}
domains.addAll(Domains.getPossibleDomains(testDomain.substring(1)));
return domains;
}
public static boolean isLikelyHostName(final String name)
{
String nameTL = name.toLowerCase();
if (nameTL.startsWith("www."))
{
return true;
}
if (endsWithGTLD(name))
{
return true;
}
int lastDotIdx = nameTL.lastIndexOf('.');
if (lastDotIdx == -1)
{
return false;
}
// Check for country code.
return lastDotIdx == nameTL.length() - 3;
}
public static boolean isValidCookieDomain(String domain, final String hostName)
{
String plainDomain;
if (!domain.startsWith("."))
{
// Valid domains must start with a dot
// according to RFC 2109, but
// RFC 2965 specifies a dot is prepended
// in the Set-Cookie2 header.
plainDomain = domain;
domain = "." + domain;
}
else
{
plainDomain = domain.substring(1);
}
String plainDomainTL = plainDomain.toLowerCase();
String hostNameTL = hostName.toLowerCase();
if (!hostNameTL.endsWith(plainDomainTL))
{
return false;
}
int lastDotIdx = domain.lastIndexOf('.');
if (lastDotIdx == -1)
{
return false;
}
String suffix = domain.substring(lastDotIdx).toLowerCase();
if (gTLDs.contains(suffix))
{
return Strings.countChars(domain, '.') >= 2;
}
else
{
return Strings.countChars(domain, '.') >= 3;
}
}
/**
*
*/
private Domains()
{
super();
}
}