/* * 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: lobochief@users.sourceforge.net */ /* * Created on Jun 2, 2005 */ package com.nvarghese.beowulf.common.cobra.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? } /** * */ private Domains() { super(); } public static boolean isValidCookieDomain(String domain, 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; } } /** * * @param host * A host name in lower case. * @return */ public static boolean endsWithGTLD(String host) { Iterator i = gTLDs.iterator(); while (i.hasNext()) { String ending = (String) i.next(); if (host.endsWith(ending)) { return true; } } return false; } public static boolean isLikelyHostName(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 Collection getPossibleDomains(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; } }