Loading build.gradle +6 −6 Original line number Diff line number Diff line Loading @@ -4,6 +4,8 @@ plugins { alias(libs.plugins.kotlin.serialization) } apply from : '../exportdependencies/publish.gradle' android { namespace = "org.torproject.android.service" compileSdk = 35 Loading Loading @@ -46,22 +48,20 @@ android { } dependencies { // Use locally built ipt_proxy+go_tun2socks api(project(":OrbotLib")) api(libs.guardian.orbotlib) api(libs.guardian.jtorctl) api(libs.tor.android) // api(files("../../tor-android/tor-android-binary/build/outputs/aar/tor-android-binary-debug.aar")) api(libs.guardian.tor.android) implementation(libs.android.shell) implementation(libs.androidx.core) implementation(libs.androidx.appcompat) implementation(libs.androidx.localbroadcast) implementation(libs.androidx.work) implementation(libs.androidx.work.kotlin) implementation(libs.androidx.work.ktx) implementation(libs.pcap.core) implementation(libs.pcap.factory) implementation(files("../libs/geoip.jar")) implementation(libs.guardian.geoip) implementation(libs.androidx.core.ktx) implementation(libs.kotlinx.serialization.json) } src/main/java/org/torproject/android/service/OrbotService.java +5 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.widget.Toast; import net.freehaven.tor.control.TorControlCommands; import net.freehaven.tor.control.TorControlConnection; import org.pcap4j.packet.DnsPacket; import org.torproject.android.service.circumvention.ContentDeliveryNetworkFronts; import org.torproject.android.service.circumvention.SnowflakeClient; import org.torproject.android.service.circumvention.SnowflakeProxyWrapper; Loading @@ -58,6 +59,7 @@ import java.util.Locale; import java.util.StringTokenizer; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Function; import IPtProxy.Controller; import IPtProxy.IPtProxy; Loading @@ -75,6 +77,9 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager; public class OrbotService extends VpnService { public final static String BINARY_TOR_VERSION = TorService.VERSION_NAME; public static Function<DnsPacket, DnsPacket> shouldBlock = null; static final int NOTIFY_ID = 1, ERROR_NOTIFY_ID = 3; public final static String NOTIFICATION_CHANNEL_ID = "orbot_channel_1"; public static int mPortSOCKS = -1, mPortHTTP = -1, mPortDns = -1, mPortTrans = -1; Loading src/main/java/org/torproject/android/service/vpn/DNSResolver.kt +25 −2 Original line number Diff line number Diff line package org.torproject.android.service.vpn import android.util.Log import org.pcap4j.packet.DnsPacket import org.pcap4j.packet.IllegalRawDataException import org.torproject.android.service.OrbotService import java.io.IOException import java.net.DatagramPacket import java.net.DatagramSocket Loading @@ -9,9 +15,17 @@ class DNSResolver(private val mPort: Int) { private var mLocalhost: InetAddress? = null @Throws(IOException::class) fun processDNS(payload: ByteArray): ByteArray? { fun processDNS(dnsRequest: DnsPacket): DnsPacket? { if (mLocalhost == null) mLocalhost = InetAddress.getLocalHost() if (OrbotService.shouldBlock != null) { val blockedResponse: DnsPacket? = OrbotService.shouldBlock.apply(dnsRequest) if (blockedResponse != null) { return blockedResponse } } val payload: ByteArray = dnsRequest.getRawData() var packet = DatagramPacket(payload, payload.size, mLocalhost, mPort) val datagramSocket = DatagramSocket() datagramSocket.send(packet) Loading @@ -23,6 +37,15 @@ class DNSResolver(private val mPort: Int) { datagramSocket.close() return packet.data val dnsResp: ByteArray? = packet.getData() var dnsResponse: DnsPacket? = null if (dnsResp != null) { try { dnsResponse = DnsPacket.newPacket(dnsResp, 0, dnsResp.size) } catch (e: IllegalRawDataException) { Log.e("DNSResolver", "Can't parse DNS response", e) } } return dnsResponse } } src/main/java/org/torproject/android/service/vpn/RequestPacketHandler.kt +4 −4 Original line number Diff line number Diff line Loading @@ -17,12 +17,12 @@ class RequestPacketHandler( override fun run() { try { val udpPacket = packet.payload as UdpPacket val dnsResp = mDnsResolver.processDNS(udpPacket.payload.rawData) if (dnsResp != null) { val dnsRequest = udpPacket.payload as DnsPacket val dnsResponse = DnsPacket.newPacket(dnsResp, 0, dnsResp.size) val dnsRequest: DnsPacket = udpPacket.getPayload() as DnsPacket val dnsResponse: DnsPacket? = mDnsResolver.processDNS(dnsRequest) if (dnsResponse != null) { val dnsBuilder = DnsPacket.Builder().apply { questions(dnsRequest.header.questions) id(dnsResponse.header.id) Loading Loading
build.gradle +6 −6 Original line number Diff line number Diff line Loading @@ -4,6 +4,8 @@ plugins { alias(libs.plugins.kotlin.serialization) } apply from : '../exportdependencies/publish.gradle' android { namespace = "org.torproject.android.service" compileSdk = 35 Loading Loading @@ -46,22 +48,20 @@ android { } dependencies { // Use locally built ipt_proxy+go_tun2socks api(project(":OrbotLib")) api(libs.guardian.orbotlib) api(libs.guardian.jtorctl) api(libs.tor.android) // api(files("../../tor-android/tor-android-binary/build/outputs/aar/tor-android-binary-debug.aar")) api(libs.guardian.tor.android) implementation(libs.android.shell) implementation(libs.androidx.core) implementation(libs.androidx.appcompat) implementation(libs.androidx.localbroadcast) implementation(libs.androidx.work) implementation(libs.androidx.work.kotlin) implementation(libs.androidx.work.ktx) implementation(libs.pcap.core) implementation(libs.pcap.factory) implementation(files("../libs/geoip.jar")) implementation(libs.guardian.geoip) implementation(libs.androidx.core.ktx) implementation(libs.kotlinx.serialization.json) }
src/main/java/org/torproject/android/service/OrbotService.java +5 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.widget.Toast; import net.freehaven.tor.control.TorControlCommands; import net.freehaven.tor.control.TorControlConnection; import org.pcap4j.packet.DnsPacket; import org.torproject.android.service.circumvention.ContentDeliveryNetworkFronts; import org.torproject.android.service.circumvention.SnowflakeClient; import org.torproject.android.service.circumvention.SnowflakeProxyWrapper; Loading @@ -58,6 +59,7 @@ import java.util.Locale; import java.util.StringTokenizer; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Function; import IPtProxy.Controller; import IPtProxy.IPtProxy; Loading @@ -75,6 +77,9 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager; public class OrbotService extends VpnService { public final static String BINARY_TOR_VERSION = TorService.VERSION_NAME; public static Function<DnsPacket, DnsPacket> shouldBlock = null; static final int NOTIFY_ID = 1, ERROR_NOTIFY_ID = 3; public final static String NOTIFICATION_CHANNEL_ID = "orbot_channel_1"; public static int mPortSOCKS = -1, mPortHTTP = -1, mPortDns = -1, mPortTrans = -1; Loading
src/main/java/org/torproject/android/service/vpn/DNSResolver.kt +25 −2 Original line number Diff line number Diff line package org.torproject.android.service.vpn import android.util.Log import org.pcap4j.packet.DnsPacket import org.pcap4j.packet.IllegalRawDataException import org.torproject.android.service.OrbotService import java.io.IOException import java.net.DatagramPacket import java.net.DatagramSocket Loading @@ -9,9 +15,17 @@ class DNSResolver(private val mPort: Int) { private var mLocalhost: InetAddress? = null @Throws(IOException::class) fun processDNS(payload: ByteArray): ByteArray? { fun processDNS(dnsRequest: DnsPacket): DnsPacket? { if (mLocalhost == null) mLocalhost = InetAddress.getLocalHost() if (OrbotService.shouldBlock != null) { val blockedResponse: DnsPacket? = OrbotService.shouldBlock.apply(dnsRequest) if (blockedResponse != null) { return blockedResponse } } val payload: ByteArray = dnsRequest.getRawData() var packet = DatagramPacket(payload, payload.size, mLocalhost, mPort) val datagramSocket = DatagramSocket() datagramSocket.send(packet) Loading @@ -23,6 +37,15 @@ class DNSResolver(private val mPort: Int) { datagramSocket.close() return packet.data val dnsResp: ByteArray? = packet.getData() var dnsResponse: DnsPacket? = null if (dnsResp != null) { try { dnsResponse = DnsPacket.newPacket(dnsResp, 0, dnsResp.size) } catch (e: IllegalRawDataException) { Log.e("DNSResolver", "Can't parse DNS response", e) } } return dnsResponse } }
src/main/java/org/torproject/android/service/vpn/RequestPacketHandler.kt +4 −4 Original line number Diff line number Diff line Loading @@ -17,12 +17,12 @@ class RequestPacketHandler( override fun run() { try { val udpPacket = packet.payload as UdpPacket val dnsResp = mDnsResolver.processDNS(udpPacket.payload.rawData) if (dnsResp != null) { val dnsRequest = udpPacket.payload as DnsPacket val dnsResponse = DnsPacket.newPacket(dnsResp, 0, dnsResp.size) val dnsRequest: DnsPacket = udpPacket.getPayload() as DnsPacket val dnsResponse: DnsPacket? = mDnsResolver.processDNS(dnsRequest) if (dnsResponse != null) { val dnsBuilder = DnsPacket.Builder().apply { questions(dnsRequest.header.questions) id(dnsResponse.header.id) Loading