/*
GNU GENERAL LICENSE
Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2017 Lobo Evolution
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
verion 3 of the License, or (at your option) any later version.
This program 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
General License for more details.
You should have received a copy of the GNU General Public
along with this program. If not, see <http://www.gnu.org/licenses/>.
Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it
*/
/*
* Created on Jun 2, 2005
*/
package org.lobobrowser.util;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
/**
* The Class Domains.
*
* @author J. H. S.
*/
public class Domains {
/** The Constant gTLDs. */
private static final Collection<String> gTLDs;
static {
gTLDs = new HashSet<String>();
gTLDs.add(".aero");
gTLDs.add(".asia");
gTLDs.add(".biz");
gTLDs.add(".cat");
gTLDs.add(".com");
gTLDs.add(".coop");
gTLDs.add(".edu");
gTLDs.add(".gov");
gTLDs.add(".info");
gTLDs.add(".int");
gTLDs.add(".jobs");
gTLDs.add(".mil");
gTLDs.add(".mobi");
gTLDs.add(".museum");
gTLDs.add(".name");
gTLDs.add(".net");
gTLDs.add(".org");
gTLDs.add(".pro");
gTLDs.add(".tel");
gTLDs.add(".travel");
gTLDs.add(".xxx");
gTLDs.add(".ac");
gTLDs.add(".ad");
gTLDs.add(".ae");
gTLDs.add(".af");
gTLDs.add(".ag");
gTLDs.add(".ai");
gTLDs.add(".al");
gTLDs.add(".am");
gTLDs.add(".an");
gTLDs.add(".ao");
gTLDs.add(".aq");
gTLDs.add(".ar");
gTLDs.add(".as");
gTLDs.add(".at");
gTLDs.add(".au");
gTLDs.add(".aw");
gTLDs.add(".ax");
gTLDs.add(".az");
gTLDs.add(".ba");
gTLDs.add(".bb");
gTLDs.add(".bd");
gTLDs.add(".be");
gTLDs.add(".bf");
gTLDs.add(".bg");
gTLDs.add(".bh");
gTLDs.add(".bi");
gTLDs.add(".bj");
gTLDs.add(".bm");
gTLDs.add(".bn");
gTLDs.add(".bo");
gTLDs.add(".br");
gTLDs.add(".bs");
gTLDs.add(".bt");
gTLDs.add(".bv");
gTLDs.add(".bw");
gTLDs.add(".by");
gTLDs.add(".bz");
gTLDs.add(".ca");
gTLDs.add(".cc");
gTLDs.add(".cd");
gTLDs.add(".cf");
gTLDs.add(".cg");
gTLDs.add(".ch");
gTLDs.add(".ci");
gTLDs.add(".ck");
gTLDs.add(".cl");
gTLDs.add(".cm");
gTLDs.add(".cn");
gTLDs.add(".co");
gTLDs.add(".cr");
gTLDs.add(".cu");
gTLDs.add(".cv");
gTLDs.add(".cx");
gTLDs.add(".cy");
gTLDs.add(".cz");
gTLDs.add(".de");
gTLDs.add(".dj");
gTLDs.add(".dk");
gTLDs.add(".dm");
gTLDs.add(".do");
gTLDs.add(".dz");
gTLDs.add(".ec");
gTLDs.add(".ee");
gTLDs.add(".eg");
gTLDs.add(".er");
gTLDs.add(".es");
gTLDs.add(".et");
gTLDs.add(".eu");
gTLDs.add(".fi");
gTLDs.add(".fj");
gTLDs.add(".fk");
gTLDs.add(".fm");
gTLDs.add(".fo");
gTLDs.add(".fr");
gTLDs.add(".ga");
gTLDs.add(".gb");
gTLDs.add(".gd");
gTLDs.add(".ge");
gTLDs.add(".gf");
gTLDs.add(".gg");
gTLDs.add(".gh");
gTLDs.add(".gi");
gTLDs.add(".gl");
gTLDs.add(".gm");
gTLDs.add(".gn");
gTLDs.add(".gp");
gTLDs.add(".gq");
gTLDs.add(".gr");
gTLDs.add(".gs");
gTLDs.add(".gt");
gTLDs.add(".gu");
gTLDs.add(".gw");
gTLDs.add(".gy");
gTLDs.add(".hk");
gTLDs.add(".hm");
gTLDs.add(".hn");
gTLDs.add(".hr");
gTLDs.add(".ht");
gTLDs.add(".hu");
gTLDs.add(".id");
gTLDs.add(".ie");
gTLDs.add(".il");
gTLDs.add(".im");
gTLDs.add(".in");
gTLDs.add(".io");
gTLDs.add(".iq");
gTLDs.add(".ir");
gTLDs.add(".is");
gTLDs.add(".it");
gTLDs.add(".je");
gTLDs.add(".jm");
gTLDs.add(".jo");
gTLDs.add(".jp");
gTLDs.add(".ke");
gTLDs.add(".kg");
gTLDs.add(".kh");
gTLDs.add(".ki");
gTLDs.add(".km");
gTLDs.add(".kn");
gTLDs.add(".kp");
gTLDs.add(".kr");
gTLDs.add(".kw");
gTLDs.add(".ky");
gTLDs.add(".kz");
gTLDs.add(".la");
gTLDs.add(".lb");
gTLDs.add(".lc");
gTLDs.add(".li");
gTLDs.add(".lk");
gTLDs.add(".lr");
gTLDs.add(".ls");
gTLDs.add(".lt");
gTLDs.add(".lu");
gTLDs.add(".lv");
gTLDs.add(".ly");
gTLDs.add(".ma");
gTLDs.add(".mc");
gTLDs.add(".md");
gTLDs.add(".me");
gTLDs.add(".mg");
gTLDs.add(".mh");
gTLDs.add(".mk");
gTLDs.add(".ml");
gTLDs.add(".mm");
gTLDs.add(".mn");
gTLDs.add(".mo");
gTLDs.add(".mp");
gTLDs.add(".mq");
gTLDs.add(".mr");
gTLDs.add(".ms");
gTLDs.add(".mt");
gTLDs.add(".mu");
gTLDs.add(".mv");
gTLDs.add(".mw");
gTLDs.add(".mx");
gTLDs.add(".my");
gTLDs.add(".mz");
gTLDs.add(".na");
gTLDs.add(".news");
gTLDs.add(".nc");
gTLDs.add(".ne");
gTLDs.add(".nf");
gTLDs.add(".ng");
gTLDs.add(".ni");
gTLDs.add(".nl");
gTLDs.add(".no");
gTLDs.add(".np");
gTLDs.add(".nr");
gTLDs.add(".nu");
gTLDs.add(".nz");
gTLDs.add(".om");
gTLDs.add(".pa");
gTLDs.add(".pe");
gTLDs.add(".pf");
gTLDs.add(".pg");
gTLDs.add(".ph");
gTLDs.add(".pk");
gTLDs.add(".pl");
gTLDs.add(".pm");
gTLDs.add(".pn");
gTLDs.add(".pr");
gTLDs.add(".ps");
gTLDs.add(".pt");
gTLDs.add(".pw");
gTLDs.add(".py");
gTLDs.add(".qa");
gTLDs.add(".re");
gTLDs.add(".ro");
gTLDs.add(".rs");
gTLDs.add(".ru");
gTLDs.add(".rw");
gTLDs.add(".sa");
gTLDs.add(".sb");
gTLDs.add(".sc");
gTLDs.add(".sd");
gTLDs.add(".se");
gTLDs.add(".sg");
gTLDs.add(".sh");
gTLDs.add(".si");
gTLDs.add(".sj");
gTLDs.add(".sk");
gTLDs.add(".sl");
gTLDs.add(".sm");
gTLDs.add(".sn");
gTLDs.add(".so");
gTLDs.add(".sr");
gTLDs.add(".ss");
gTLDs.add(".st");
gTLDs.add(".su");
gTLDs.add(".sv");
gTLDs.add(".sy");
gTLDs.add(".sz");
gTLDs.add(".tc");
gTLDs.add(".td");
gTLDs.add(".tf");
gTLDs.add(".tg");
gTLDs.add(".th");
gTLDs.add(".tj");
gTLDs.add(".tk");
gTLDs.add(".tl");
gTLDs.add(".tm");
gTLDs.add(".tn");
gTLDs.add(".to");
gTLDs.add(".tp");
gTLDs.add(".tr");
gTLDs.add(".tt");
gTLDs.add(".tv");
gTLDs.add(".tw");
gTLDs.add(".tz");
gTLDs.add(".ua");
gTLDs.add(".ug");
gTLDs.add(".uk");
gTLDs.add(".us");
gTLDs.add(".uy");
gTLDs.add(".uz");
gTLDs.add(".va");
gTLDs.add(".vc");
gTLDs.add(".ve");
gTLDs.add(".vg");
gTLDs.add(".vi");
gTLDs.add(".vn");
gTLDs.add(".vu");
gTLDs.add(".wf");
gTLDs.add(".ws");
gTLDs.add(".ye");
gTLDs.add(".yt");
gTLDs.add(".yu");
gTLDs.add(".za");
gTLDs.add(".zm");
gTLDs.add(".zw");
}
/**
* Instantiates a new domains.
*/
private Domains() {
super();
}
/**
* Checks if is valid cookie domain.
*
* @param domain
* the domain
* @param hostName
* the host name
* @return true, if is valid cookie domain
*/
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;
}
}
/**
* Ends with gtld.
*
* @param host
* A host name in lower case.
* @return true, if successful
*/
public static boolean endsWithGTLD(String host) {
Iterator<String> i = gTLDs.iterator();
while (i.hasNext()) {
String ending = i.next();
if (host.endsWith(ending)) {
return true;
}
}
return false;
}
/**
* Checks if is likely host name.
*
* @param name
* the name
* @return true, if is likely host name
*/
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);
}
/**
* Gets the possible domains.
*
* @param hostName
* the host name
* @return the possible domains
*/
public static Collection<String> getPossibleDomains(String hostName) {
Collection<String> domains = new LinkedList<String>();
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;
}
}