瀏覽代碼

Add advanced option for DNS over HTTPS via Cloudflare (closes #3377)

arkon 4 年之前
父節點
當前提交
3645d19135

+ 1 - 0
app/build.gradle

@@ -166,6 +166,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

+ 2 - 0
app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt

@@ -155,6 +155,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"

+ 2 - 0
app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt

@@ -234,4 +234,6 @@ class PreferencesHelper(val context: Context) {
     fun migrateFlags() = flowPrefs.getInt("migrate_flags", Int.MAX_VALUE)
 
     fun trustedSignatures() = flowPrefs.getStringSet("trusted_signatures", emptySet())
+
+    fun enableDoh() = prefs.getBoolean(Keys.enableDoh, false)
 }

+ 28 - 0
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
 
 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 @@ class NetworkHelper(context: Context) {
             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()
     }
 

+ 20 - 8
app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt

@@ -17,6 +17,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 as Keys
 import eu.kanade.tachiyomi.network.NetworkHelper
 import eu.kanade.tachiyomi.ui.base.controller.DialogController
 import eu.kanade.tachiyomi.ui.library.LibraryController
@@ -87,14 +88,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
@@ -107,6 +100,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
 

+ 5 - 2
app/src/main/res/values/strings.xml

@@ -361,13 +361,16 @@
     <string name="restoring_backup_canceled">Canceled restore</string>
 
       <!-- Advanced section -->
+    <string name="label_network">Network</string>
+    <string name="pref_clear_cookies">Clear cookies</string>
+    <string name="pref_dns_over_https" translatable="false">DNS over HTTPS (Cloudflare)</string>
+    <string name="pref_dns_over_https_summary">Requires app restart to take effect</string>
+    <string name="cookies_cleared">Cookies cleared</string>
     <string name="label_data">Data</string>
     <string name="pref_clear_chapter_cache">Clear chapter cache</string>
     <string name="used_cache">Used: %1$s</string>
     <string name="cache_deleted">Cache cleared. %1$d files have been deleted</string>
     <string name="cache_delete_error">An error occurred while clearing cache</string>
-    <string name="pref_clear_cookies">Clear cookies</string>
-    <string name="cookies_cleared">Cookies cleared</string>
     <string name="choices_reset">Dialog choices reset</string>
     <string name="pref_clear_database">Clear database</string>
     <string name="pref_clear_database_summary">Delete history for manga that are not saved in your library</string>