Skip to content

Commit 9b51f91

Browse files
committed
Add support for PTR queries
1 parent 41405f9 commit 9b51f91

File tree

4 files changed

+16
-4
lines changed

4 files changed

+16
-4
lines changed

Diff for: core/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ dependencies {
8787
api("com.google.firebase:firebase-config-ktx:19.1.4")
8888
api("com.google.firebase:firebase-crashlytics:17.0.0")
8989
api("com.jakewharton.timber:timber:4.7.1")
90-
api("dnsjava:dnsjava:3.0.2")
90+
api("dnsjava:dnsjava:3.1.0")
9191
api("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion")
9292
api("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$coroutinesVersion")
9393
kapt("androidx.room:room-compiler:$roomVersion")

Diff for: core/src/main/java/com/github/shadowsocks/net/DnsResolverCompat.kt

+13-1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ sealed class DnsResolverCompat {
7070

7171
fun prepareDnsResponse(request: Message) = Message(request.header.id).apply {
7272
header.setFlag(Flags.QR.toInt()) // this is a response
73+
header.setFlag(Flags.RA.toInt()) // recursion available
7374
if (request.header.getFlag(Flags.RD.toInt())) header.setFlag(Flags.RD.toInt())
7475
request.question?.also { addRecord(it, Section.QUESTION) }
7576
}
@@ -135,11 +136,22 @@ sealed class DnsResolverCompat {
135136
val isIpv6 = when (val type = question?.type) {
136137
Type.A -> false
137138
Type.AAAA -> true
139+
Type.PTR -> {
140+
val ip = try {
141+
ReverseMap.fromName(question.name)
142+
} catch (e: IOException) {
143+
throw UnsupportedOperationException(e) // unrecognized PTR name
144+
}
145+
// Android does not provide a PTR lookup API for Network prior to Android 10
146+
val hostname = Name.fromString(GlobalScope.async(unboundedIO) { ip.hostName }.await())
147+
return prepareDnsResponse(request).apply {
148+
addRecord(PTRRecord(question.name, DClass.IN, TTL, hostname), Section.ANSWER)
149+
}.toWire()
150+
}
138151
else -> throw UnsupportedOperationException("Unsupported query type $type")
139152
}
140153
val host = question.name.canonicalize().toString(true)
141154
return prepareDnsResponse(request).apply {
142-
header.setFlag(Flags.RA.toInt()) // recursion available
143155
for (address in hostResolver(host).asIterable().run {
144156
if (isIpv6) filterIsInstance<Inet6Address>() else filterIsInstance<Inet4Address>()
145157
}) addRecord(when (address) {

Diff for: mobile/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ androidExtensions.isExperimental = true
1414

1515
dependencies {
1616
implementation("androidx.browser:browser:1.2.0")
17-
implementation("androidx.constraintlayout:constraintlayout:2.0.0-beta5")
17+
implementation("androidx.constraintlayout:constraintlayout:2.0.0-beta6")
1818
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion")
1919
implementation("com.google.android.gms:play-services-vision:20.0.0")
2020
implementation("com.google.firebase:firebase-ads:19.1.0")

0 commit comments

Comments
 (0)