1 package org.cacert.gigi.util;
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.net.HttpURLConnection;
9 import java.util.HashSet;
11 public class PublicSuffixes {
13 HashSet<String> suffixes = new HashSet<>();
15 HashSet<String> wildcards = new HashSet<>();
17 HashSet<String> exceptions = new HashSet<>();
19 private static final String url = "https://publicsuffix.org/list/effective_tld_names.dat";
21 private static PublicSuffixes instance;
23 private static void generateDefault() throws IOException {
25 HttpURLConnection huc = (HttpURLConnection) u.openConnection();
26 BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream(), "UTF-8"));
27 instance = new PublicSuffixes(br);
30 public static PublicSuffixes getInstance() {
31 if (instance == null) {
34 } catch (IOException e) {
41 private PublicSuffixes(BufferedReader br) throws IOException {
43 while ((line = br.readLine()) != null) {
44 if (line.startsWith("//")) {
50 line = line.split("\\s", 2)[0];
51 if (line.startsWith("*.")) {
52 String data = line.substring(2);
53 if (data.contains("*") || data.contains("!")) {
54 System.out.println("Error! unparsable public suffix line: " + line);
57 addWildcard(IDN.toASCII(data));
58 } else if (line.startsWith("!")) {
59 String data = line.substring(1);
60 if (data.contains("*") || data.contains("!")) {
61 System.out.println("Error! unparsable public suffix line: " + line);
64 addException(IDN.toASCII(data));
66 if (line.contains("*") || line.contains("!")) {
67 System.out.println("Error! unparsable public suffix line: " + line);
70 addSuffix(IDN.toASCII(line));
75 private void addWildcard(String data) {
79 private void addException(String data) {
83 private void addSuffix(String line) {
87 public String getRegistrablePart(String domain) {
91 if (domain.startsWith(".")) {
94 if (isSuffix(domain) && !exceptions.contains(domain)) {
97 return getPublicSuffix0(domain);
100 private String getPublicSuffix0(String domain) {
102 int d = domain.indexOf('.');
106 if (exceptions.contains(domain)) {
109 String nextDomain = domain.substring(d + 1);
110 if (isSuffix(nextDomain)) {
114 return getPublicSuffix0(nextDomain);
117 private boolean isSuffix(String domain) {
118 if (suffixes.contains(domain)) {
121 if (exceptions.contains(domain)) {
124 int idx = domain.indexOf('.');
125 if (idx != -1 && wildcards.contains(domain.substring(idx + 1))) {