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

Commit ab81794f authored by Guillaume Jacquart's avatar Guillaume Jacquart Committed by Guillaume Jacquart
Browse files

epic18: Trackers control while Tor enabled

parent 34572a11
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -4,6 +4,8 @@ plugins {
    alias(libs.plugins.kotlin.serialization)
}

apply from : '../exportdependencies/publish.gradle'

android {
    namespace = "org.torproject.android.service"
    compileSdk = 35
@@ -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)
}
+5 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
+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
@@ -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)
@@ -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
    }
}
+4 −4
Original line number Diff line number Diff line
@@ -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)