Add support for DoH

This commit is contained in:
NekoInverter committed 2020-11-13 11:13:15 +08:00
1 parent 60e7c0744f
commit fba42f0c4a
6 files changed
+52 -3

No files matched your search

@@ -91,7 +91,8 @@ public class Settings {
public static final String KEY_ENABLE_FINGERPRINT = "enable_fingerprint";
public static final String KEY_READ_CACHE_SIZE = "read_cache_size";
public static final int DEFAULT_READ_CACHE_SIZE = 160;
public static final String KEY_BUILT_IN_HOSTS = "built_in_hosts";
public static final String KEY_BUILT_IN_HOSTS = "built_in_hosts_2";
public static final String KEY_DOH = "dns_over_https";
public static final String KEY_APP_LANGUAGE = "app_language";
private static final String TAG = Settings.class.getSimpleName();
private static final String KEY_VERSION_CODE = "version_code";
@@ -235,6 +236,7 @@ public class Settings {
private static final String KEY_SAVE_CRASH_LOG = "save_crash_log";
private static final boolean DEFAULT_SAVE_CRASH_LOG = false;
private static final boolean DEFAULT_BUILT_IN_HOSTS = false;
private static final boolean DEFAULT_DOH = false;
private static final String DEFAULT_APP_LANGUAGE = "system";
private static final String KEY_PROXY_TYPE = "proxy_type";
private static final int DEFAULT_PROXY_TYPE = EhProxySelector.TYPE_SYSTEM;
@@ -272,9 +274,9 @@ public class Settings {
private static void fixDefaultValue(Context context) {
// Enable builtin hosts if the country is CN
if (!sSettingsPre.contains(KEY_BUILT_IN_HOSTS)) {
if (!sSettingsPre.contains(KEY_DOH)) {
if ("CN".equals(Locale.getDefault().getCountry())) {
putBuiltInHosts(true);
putDoH(true);
}
}
}
@@ -1002,6 +1004,14 @@ public class Settings {
putBoolean(KEY_BUILT_IN_HOSTS, value);
}
public static boolean getDoH() {
return getBoolean(KEY_DOH, DEFAULT_DOH);
}
public static void putDoH(boolean value) {
putBoolean(KEY_DOH, value);
}
public static String getAppLanguage() {
return getString(KEY_APP_LANGUAGE, DEFAULT_APP_LANGUAGE);
}
@@ -37,6 +37,9 @@ import java.util.List;
import java.util.Map;
import okhttp3.Dns;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.dnsoverhttps.DnsOverHttps;
public class EhDns implements Dns {
@@ -53,9 +56,27 @@ public class EhDns implements Dns {
}
private final Hosts hosts;
private static DnsOverHttps dnsOverHttps;
public EhDns(Context context) {
hosts = EhApplication.getHosts(context);
DnsOverHttps.Builder builder = new DnsOverHttps.Builder()
.client(new OkHttpClient.Builder().build())
.url(HttpUrl.get("https://cloudflare-dns.com/dns-query"));
try {
builder.bootstrapDnsHosts(InetAddress.getByName("162.159.36.1"),
InetAddress.getByName("162.159.46.1"),
InetAddress.getByName("1.1.1.1"),
InetAddress.getByName("1.0.0.1"),
InetAddress.getByName("162.159.132.53"),
InetAddress.getByName("2606:4700:4700::1111"),
InetAddress.getByName("2606:4700:4700::1001"),
InetAddress.getByName("2606:4700:4700::0064"),
InetAddress.getByName("2606:4700:4700::6400"));
} catch (UnknownHostException e) {
e.printStackTrace();
}
dnsOverHttps = builder.post(true).build();
}
private static void put(Map<String, InetAddress> map, String host, String ip) {
@@ -79,6 +100,12 @@ public class EhDns implements Dns {
return Collections.singletonList(inetAddress);
}
}
if (Settings.getDoH()) {
List<InetAddress> inetAddresses = dnsOverHttps.lookup(hostname);
if (inetAddresses != null && inetAddresses.size() > 0) {
return inetAddresses;
}
}
try {
return Arrays.asList(InetAddress.getAllByName(hostname));