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

Commit 5dfe6772 authored by Guillaume Jacquart's avatar Guillaume Jacquart
Browse files

WIP - DNS filtering.

parent 33f183bb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -59,4 +59,5 @@ dependencies {
    //    until a new full release is done
    implementation files('../libs/tor-android-binary-release.aar')

    implementation 'foundation.e:privacymodule.trackerfilter:2.0.0-dev'
}
+38 −4
Original line number Diff line number Diff line
package org.torproject.android.service.vpn;

import android.content.Context;
import android.util.Log;

import org.pcap4j.packet.DnsPacket;
import org.pcap4j.packet.IllegalRawDataException;
import org.pcap4j.packet.namednumber.DnsRCode;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import foundation.e.privacymodules.trackers.api.ShouldBlockDNSRequest;

public class DNSResolver {

    private final int mPort;
    private InetAddress mLocalhost = null;
    private ShouldBlockDNSRequest hostnameFilter = null;

    public DNSResolver(int localPort) {
    public DNSResolver(Context context, int localPort) {
        hostnameFilter = ShouldBlockDNSRequest.Companion.getInstance(context);
        mPort = localPort;
    }

    public byte[] processDNS(byte[] payload) throws IOException {
    public DnsPacket processDNS(DnsPacket dnsRequest) throws IOException {
        DnsPacket dnsResponse = null;

        try {
            String host = dnsRequest.getHeader().getQuestions().get(0).getQName().getName();
            if (hostnameFilter.shouldBlock(host, ShouldBlockDNSRequest.DUMMY_APP_UID)) {
                dnsResponse = dnsRequest.getBuilder()
                        .rCode(DnsRCode.NX_DOMAIN)
                        .response(true).build();

                return dnsResponse;
            }
        } catch(Exception e) {
            Log.e("DNSResolver", "find host in question failed", e);
        }


        if (mLocalhost == null)
            mLocalhost = InetAddress.getLocalHost();

        byte[] payload = dnsRequest.getRawData();
        DatagramPacket packet = new DatagramPacket(
                payload, payload.length, mLocalhost, mPort
        );
@@ -30,7 +57,14 @@ public class DNSResolver {
        packet = new DatagramPacket(buf, buf.length);
        datagramSocket.receive(packet);

        return packet.getData();
        byte[] dnsResp = packet.getData();
        if (dnsResp != null) {
            try {
                dnsResponse = DnsPacket.newPacket(dnsResp, 0, dnsResp.length);
            } catch (IllegalRawDataException e) {
                Log.e("DNSResolver", "Can't parse DNS response", e);
            }
        }
        return dnsResponse;
    }

}
+50 −0
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 java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class DNSResolverOLD {

    private final int mPort;
    private InetAddress mLocalhost = null;

    public DNSResolverOLD(int localPort) {
        mPort = localPort;
    }

    public DnsPacket processDNS(DnsPacket dnsRequest) throws IOException {

        if (mLocalhost == null)
            mLocalhost = InetAddress.getLocalHost();

        byte[] payload = dnsRequest.getRawData();
        DatagramPacket packet = new DatagramPacket(
                payload, payload.length, mLocalhost, mPort
        );
        DatagramSocket datagramSocket = new DatagramSocket();
        datagramSocket.send(packet);

        // Await response from DNS server
        byte[] buf = new byte[1024];
        packet = new DatagramPacket(buf, buf.length);
        datagramSocket.receive(packet);

        byte[] dnsResp = packet.getData();
        DnsPacket dnsResponse = null;
        if (dnsResp != null) {
            try {
                dnsResponse = DnsPacket.newPacket(dnsResp, 0, dnsResp.length);
            } catch (IllegalRawDataException e) {
                Log.e("DNSResolver", "Can't parse DNS response", e);
            }
        }
        return dnsResponse;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -276,7 +276,7 @@ public class OrbotVpnManager implements Handler.Callback, OrbotConstants {

            mInterface = builder.establish();

            mDnsResolver = new DNSResolver(mTorDns);
            mDnsResolver = new DNSResolver(mService.getApplicationContext(), mTorDns);

            final Handler handler = new Handler(Looper.getMainLooper());
            handler.postDelayed(() -> {
+3 −6
Original line number Diff line number Diff line
@@ -29,14 +29,11 @@ public class RequestPacketHandler implements Runnable {
    public void run() {
            try {
                UdpPacket udpPacket = (UdpPacket) packet.getPayload();

                byte[] dnsResp = mDnsResolver.processDNS(udpPacket.getPayload().getRawData());

                if (dnsResp != null) {

                DnsPacket dnsRequest = (DnsPacket) udpPacket.getPayload();
                     DnsPacket dnsResponse = DnsPacket.newPacket(dnsResp, 0, dnsResp.length);

                DnsPacket dnsResponse = mDnsResolver.processDNS(dnsRequest);

                if (dnsResponse != null) {
                     DnsPacket.Builder dnsBuilder = new DnsPacket.Builder();
                     dnsBuilder.questions(dnsRequest.getHeader().getQuestions());
                     dnsBuilder.id(dnsRequest.getHeader().getId());