Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26b48241 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Small Android10Resolver improvements

parent 2eeb1be8
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -3,24 +3,28 @@ package at.bitfire.davdroid
import android.net.DnsResolver
import android.os.Build
import androidx.annotation.RequiresApi
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.runBlocking
import org.xbill.DNS.Message
import org.xbill.DNS.Resolver
import org.xbill.DNS.ResolverListener
import org.xbill.DNS.TSIG
import java.util.*
import java.util.concurrent.CompletableFuture

/**
 * dnsjava Resolver that uses Android's [DnsResolver] API, which is available since Android 10.
 */
@RequiresApi(Build.VERSION_CODES.Q)
class Android10Resolver: Resolver {
object Android10Resolver: Resolver {

    private val executor = Dispatchers.IO.asExecutor()
    private val resolver = DnsResolver.getInstance()


    override fun send(query: Message): Message {
        val future = CompletableFuture<Message>()
    override fun send(query: Message): Message = runBlocking {
        val future = CompletableDeferred<Message>()

        resolver.rawQuery(null, query.toWire(), DnsResolver.FLAG_EMPTY, executor, null, object: DnsResolver.Callback<ByteArray> {
            override fun onAnswer(rawAnswer: ByteArray, rcode: Int) {
@@ -32,7 +36,7 @@ class Android10Resolver: Resolver {
            }
        })

        return future.get()
        future.await()
    }

    override fun sendAsync(query: Message, listener: ResolverListener): Any {
+6 −4
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ object DavUtils {
        ACTIVE, PENDING, IDLE
    }

    val DNS_QUAD9 = InetAddress.getByAddress(byteArrayOf(9,9,9,9))

    const val MIME_TYPE_ACCEPT_ALL = "*/*"

    val MEDIA_TYPE_JCARD = "application/vcard+json".toMediaType()
@@ -64,9 +66,9 @@ object DavUtils {
    fun prepareLookup(context: Context, lookup: Lookup) {
        if (Build.VERSION.SDK_INT >= 29) {
            /* Since Android 10, there's a native DnsResolver API that allows to send SRV queries without
               knowing which DNS serv0ers have to be used. DNS over TLS is now also supported. */
               knowing which DNS servers have to be used. DNS over TLS is now also supported. */
            Logger.log.fine("Using Android 10+ DnsResolver")
            lookup.setResolver(Android10Resolver())
            lookup.setResolver(Android10Resolver)

        } else if (Build.VERSION.SDK_INT >= 26) {
            /* Since Android 8, the system properties net.dns1, net.dns2, ... are not available anymore.
@@ -88,8 +90,8 @@ object DavUtils {
                }
            }

            // fallback: add Quad9 DNS (9.9.9.9) in case that other DNS works
            dnsServers.add(InetAddress.getByAddress(byteArrayOf(9,9,9,9)))
            // fallback: add Quad9 DNS in case that no other DNS works
            dnsServers.add(DNS_QUAD9)

            val uniqueDnsServers = LinkedHashSet<InetAddress>(dnsServers)
            val simpleResolvers = uniqueDnsServers.map { dns ->