From 3e9e42271eae7bdd38714fda4eaf10fd339128f0 Mon Sep 17 00:00:00 2001 From: arkon Date: Tue, 23 Jun 2020 22:42:53 -0400 Subject: [PATCH] Add advanced option for DNS over HTTPS via Cloudflare (closes #3377) (cherry picked from commit 3645d19135683cf8d076f560619c1b47c7b21d00) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt # app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt --- app/build.gradle | 1 + .../data/preference/PreferenceKeys.kt | 2 + .../data/preference/PreferencesHelper.kt | 2 + .../kanade/tachiyomi/network/NetworkHelper.kt | 28 ++++++++++++++ .../ui/setting/SettingsAdvancedController.kt | 37 ++++++++++++------- app/src/main/res/values/strings.xml | 7 +++- 6 files changed, 62 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index abb03160b..36de1a7ce 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -187,6 +187,7 @@ dependencies { final okhttp_version = '4.7.2' implementation "com.squareup.okhttp3:okhttp:$okhttp_version" implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version" + implementation "com.squareup.okhttp3:okhttp-dnsoverhttps:$okhttp_version" implementation 'com.squareup.okio:okio:2.6.0' // TLS 1.3 support for Android < 10 diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index 77b171336..b8e472e2f 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -161,6 +161,8 @@ object PreferenceKeys { const val searchPinnedSourcesOnly = "search_pinned_sources_only" + const val enableDoh = "enable_doh" + fun trackUsername(syncId: Int) = "pref_mangasync_username_$syncId" fun trackPassword(syncId: Int) = "pref_mangasync_password_$syncId" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index 5471e2cc9..b5ff20ac2 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -240,6 +240,8 @@ class PreferencesHelper(val context: Context) { fun trustedSignatures() = flowPrefs.getStringSet("trusted_signatures", emptySet()) + fun enableDoh() = prefs.getBoolean(Keys.enableDoh, false) + // --> AZ J2K CHERRYPICKING fun defaultMangaOrder() = flowPrefs.getString("default_manga_order", "") diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt index 771a38de0..6e5f88ed7 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt @@ -2,14 +2,21 @@ package eu.kanade.tachiyomi.network import android.content.Context import eu.kanade.tachiyomi.BuildConfig +import eu.kanade.tachiyomi.data.preference.PreferencesHelper import java.io.File +import java.net.InetAddress import java.util.concurrent.TimeUnit import okhttp3.Cache +import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient +import okhttp3.dnsoverhttps.DnsOverHttps import okhttp3.logging.HttpLoggingInterceptor +import uy.kohesive.injekt.injectLazy /* SY --> */ open /* SY <-- */ class NetworkHelper(context: Context) { + private val preferences: PreferencesHelper by injectLazy() + private val cacheDir = File(context.cacheDir, "network_cache") private val cacheSize = 5L * 1024 * 1024 // 5 MiB @@ -30,6 +37,27 @@ import okhttp3.logging.HttpLoggingInterceptor builder.addInterceptor(httpLoggingInterceptor) } + if (preferences.enableDoh()) { + builder.dns( + DnsOverHttps.Builder().client(builder.build()) + .url("https://cloudflare-dns.com/dns-query".toHttpUrl()) + .bootstrapDnsHosts( + listOf( + 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") + ) + ) + .build() + ) + } + builder.build() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt index d99c7b0bf..2f757dcb3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt @@ -18,7 +18,7 @@ import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.library.LibraryUpdateService import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Target -import eu.kanade.tachiyomi.data.preference.PreferenceKeys +import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.SourceManager.Companion.DELEGATED_SOURCES import eu.kanade.tachiyomi.ui.base.controller.DialogController @@ -97,14 +97,6 @@ class SettingsAdvancedController : SettingsController() { onClick { clearChapterCache() } } - preference { - titleRes = R.string.pref_clear_cookies - - onClick { - network.cookieManager.removeAll() - activity?.toast(R.string.cookies_cleared) - } - } preference { titleRes = R.string.pref_clear_database summaryRes = R.string.pref_clear_database_summary @@ -117,6 +109,25 @@ class SettingsAdvancedController : SettingsController() { } } + preferenceCategory { + titleRes = R.string.label_data + + preference { + titleRes = R.string.pref_clear_cookies + + onClick { + network.cookieManager.removeAll() + activity?.toast(R.string.cookies_cleared) + } + } + switchPreference { + key = Keys.enableDoh + titleRes = R.string.pref_dns_over_https + summaryRes = R.string.pref_dns_over_https_summary + defaultValue = false + } + } + preferenceCategory { titleRes = R.string.label_library @@ -141,7 +152,7 @@ class SettingsAdvancedController : SettingsController() { switchPreference { title = "Enable integrated hentai features" summary = "This is a experimental feature that will disable all hentai features if toggled off" - key = PreferenceKeys.eh_is_hentai_enabled + key = Keys.eh_is_hentai_enabled defaultValue = true onChange { @@ -202,13 +213,13 @@ class SettingsAdvancedController : SettingsController() { switchPreference { title = "Enable delegated sources" - key = PreferenceKeys.eh_delegateSources + key = Keys.eh_delegateSources defaultValue = true summary = "Apply ${context.getString(R.string.app_name)} enhancements to the following sources if they are installed: ${DELEGATED_SOURCES.values.map { it.sourceName }.distinct().joinToString()}" } intListPreference { - key = PreferenceKeys.eh_logLevel + key = Keys.eh_logLevel title = "Log level" entries = EHLogLevel.values().map { @@ -222,7 +233,7 @@ class SettingsAdvancedController : SettingsController() { switchPreference { title = "Enable source blacklist" - key = PreferenceKeys.eh_enableSourceBlacklist + key = Keys.eh_enableSourceBlacklist defaultValue = true summary = "Hide extensions/sources that are incompatible with ${context.getString(R.string.app_name)}. Force-restart app after changing." } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf3613f23..21b432a05 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -359,13 +359,16 @@ Canceled restore + Network + Clear cookies + DNS over HTTPS (Cloudflare) + Requires app restart to take effect + Cookies cleared Data Clear chapter cache Used: %1$s Cache cleared. %1$d files have been deleted An error occurred while clearing cache - Clear cookies - Cookies cleared Dialog choices reset Clear database Delete history for manga that are not saved in your library