Dns fixes

This commit is contained in:
世界 2021-02-19 21:43:14 +08:00
parent be2516ccd7
commit 01e8c8c64c
No known key found for this signature in database
GPG Key ID: CD109927C34A63C4
3 changed files with 46 additions and 75 deletions

View File

@ -3,13 +3,13 @@ import cn.hutool.core.util.RuntimeUtil
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
def verName = "7.4.2-rc07"
def verName = "7.4.2-rc08"
if (System.getenv("DEBUG_BUILD") == "true") {
verName += "-" + RuntimeUtil.execForStr("git log --pretty=format:'%h' -n 1)")
}
def verCode = 188
def verCode = 190
def officialVer = "7.4.2"
def officialCode = 2227
@ -84,7 +84,6 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2'
implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
implementation "com.squareup.okhttp3:okhttp-dnsoverhttps:$okHttpVersion"
implementation 'dnsjava:dnsjava:3.3.1'
implementation 'org.dizitart:nitrite:3.4.3'

View File

@ -864,7 +864,7 @@ public class ConnectionsManager extends BaseController {
String domain = native_isTestBackend(currentAccount) != 0 ? "tapv3.stel.com" : AccountInstance.getInstance(currentAccount).getMessagesController().dcDomainName;
try {
ArrayList<String> arrayList = DnsFactory.Companion.getTxts(domain);
List<String> arrayList = DnsFactory.Companion.getTxts(domain);
Collections.sort(arrayList, (o1, o2) -> {
int l1 = o1.length();
int l2 = o2.length();

View File

@ -1,108 +1,80 @@
package tw.nekomimi.nekogram.utils
import android.os.Build
import cn.hutool.core.util.ArrayUtil
import okhttp3.Dns
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.dnsoverhttps.DnsOverHttps
import org.telegram.messenger.FileLog
import org.telegram.tgnet.ConnectionsManager
import org.xbill.DNS.DohResolver
import org.xbill.DNS.Lookup
import org.xbill.DNS.TXTRecord
import org.xbill.DNS.Type
import org.xbill.DNS.*
import java.net.InetAddress
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.collections.ArrayList
open class DnsFactory : Dns {
val providers = LinkedList<DohResolver>()
companion object : DnsFactory() {
init {
if (Build.VERSION.SDK_INT >= 21) {
addProvider("https://mozilla.cloudflare-dns.com/dns-query")
addProvider("https://dns.google/dns-query")
addProvider("https://dns.twnic.tw/dns-query")
addProvider("https://dns.adguard.com/dns-query")
}
addProvider("https://dns.twnic.tw/dns-query")
addProvider("https://mozilla.cloudflare-dns.com/dns-query")
addProvider("https://dns.google/dns-query")
}
}
val providers = LinkedList<DnsOverHttps>()
val dnsJavaProviders = LinkedList<DohResolver>()
val client = OkHttpClient.Builder().connectTimeout(3,TimeUnit.SECONDS).build()
fun addProvider(url: String) = providers.add(DohResolver(url))
fun addProvider(url: String) {
override fun lookup(domain: String): List<InetAddress> {
providers.add(DnsOverHttps.Builder()
.client(client)
.url(url.toHttpUrl())
.includeIPv6(ConnectionsManager.useIpv6Address())
.build())
FileLog.d("Lookup $domain")
for (provider in providers) {
FileLog.d("Provider ${provider.uriTemplate}")
val lookup = Lookup(Name.fromConstantString(domain), if (!ConnectionsManager.useIpv6Address()) Type.A else Type.AAAA)
lookup.setSearchPath(* emptyArray<String>())
lookup.setCache(null)
lookup.setResolver(provider)
lookup.run()
if (lookup.result != Lookup.SUCCESSFUL) continue
FileLog.d("Results: " + ArrayUtil.toString(lookup.answers))
return lookup.answers.map { (it as? ARecord)?.address ?: (it as AAAARecord).address }
}
runCatching { return InetAddress.getAllByName(domain).toList() }
return listOf()
}
override fun lookup(hostname: String): List<InetAddress> {
fun getTxts(domain: String): List<String> {
providers.forEach { provider ->
FileLog.d("Lookup $domain for txts")
runCatching {
return provider.lookup(hostname)
}.onFailure {
FileLog.e(it)
}
for (provider in providers) {
FileLog.d("Provider ${provider.uriTemplate}")
}
val lookup = Lookup(Name.fromConstantString(domain), Type.TXT)
lookup.setSearchPath(* emptyArray<String>())
lookup.setCache(null)
lookup.setResolver(provider)
lookup.run()
runCatching {
return Dns.SYSTEM.lookup(hostname)
if (lookup.result != Lookup.SUCCESSFUL) continue
FileLog.d("Results: " + ArrayUtil.toString(lookup.answers))
val result = ArrayList<String>()
for (record in lookup.answers.filterIsInstance<TXTRecord>()) result.addAll(record.strings)
return result
}
return listOf()
}
fun getTxts(domain: String): ArrayList<String> {
val results = ArrayList<String>()
dnsJavaProviders.forEach {
runCatching {
val lookup = Lookup(domain, Type.TXT)
lookup.setResolver(it)
lookup.run()
if (lookup.result == Lookup.SUCCESSFUL) {
lookup.answers.forEach {
(it as TXTRecord).strings.forEach {
results.add(it)
}
}
}
}
}
return results
}
}