Loading build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -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' } src/main/java/org/torproject/android/service/vpn/DNSResolver.java +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 ); Loading @@ -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; } } src/main/java/org/torproject/android/service/vpn/DNSResolverOLD.java 0 → 100644 +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; } } src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -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(() -> { Loading src/main/java/org/torproject/android/service/vpn/RequestPacketHandler.java +3 −6 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading
build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -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' }
src/main/java/org/torproject/android/service/vpn/DNSResolver.java +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 ); Loading @@ -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; } }
src/main/java/org/torproject/android/service/vpn/DNSResolverOLD.java 0 → 100644 +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; } }
src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -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(() -> { Loading
src/main/java/org/torproject/android/service/vpn/RequestPacketHandler.java +3 −6 Original line number Diff line number Diff line Loading @@ -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()); Loading