1 package club.wpia.gigi.util;
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
8 import java.util.HashSet;
10 public class PublicSuffixes {
12 private HashSet<String> suffixes = new HashSet<>();
14 private HashSet<String> wildcards = new HashSet<>();
16 private HashSet<String> exceptions = new HashSet<>();
18 static final String url = "https://publicsuffix.org/list/effective_tld_names.dat";
20 private static PublicSuffixes instance;
22 private static PublicSuffixes generateDefault() throws IOException {
23 InputStream res = PublicSuffixes.class.getResourceAsStream("effective_tld_names.dat");
26 throw new Error("Public Suffix List could not be loaded.");
29 try (InputStreamReader isr = new InputStreamReader(res, "UTF-8"); BufferedReader br = new BufferedReader(isr)) {
30 return new PublicSuffixes(br);
34 public synchronized static PublicSuffixes getInstance() {
35 if (instance == null) {
37 instance = generateDefault();
38 } catch (IOException e) {
45 private PublicSuffixes(BufferedReader br) throws IOException {
47 while ((line = br.readLine()) != null) {
48 if (line.startsWith("//")) {
54 String[] lineParts = line.split("\\s", 2);
55 if (lineParts.length == 0) {
56 throw new Error("split had strange behavior");
59 if (line.startsWith("*.")) {
60 String data = line.substring(2);
61 if (data.contains("*") || data.contains("!")) {
62 System.out.println("Error! unparsable public suffix line: " + line);
65 addWildcard(IDN.toASCII(data));
66 } else if (line.startsWith("!")) {
67 String data = line.substring(1);
68 if (data.contains("*") || data.contains("!")) {
69 System.out.println("Error! unparsable public suffix line: " + line);
72 addException(IDN.toASCII(data));
74 if (line.contains("*") || line.contains("!")) {
75 System.out.println("Error! unparsable public suffix line: " + line);
78 addSuffix(IDN.toASCII(line));
83 private void addWildcard(String data) {
87 private void addException(String data) {
91 private void addSuffix(String line) {
95 public String getRegistrablePart(String domain) {
99 if (domain.startsWith(".")) {
102 if (isSuffix(domain) && !exceptions.contains(domain)) {
105 return getPublicSuffix0(domain);
108 private String getPublicSuffix0(String domain) {
110 int d = domain.indexOf('.');
114 if (exceptions.contains(domain)) {
117 String nextDomain = domain.substring(d + 1);
118 if (isSuffix(nextDomain)) {
122 return getPublicSuffix0(nextDomain);
125 private boolean isSuffix(String domain) {
126 if (suffixes.contains(domain)) {
129 if (exceptions.contains(domain)) {
132 int idx = domain.indexOf('.');
133 if (idx != -1 && wildcards.contains(domain.substring(idx + 1))) {