Loading build.gradle +12 −12 Original line number Original line Diff line number Diff line Loading @@ -14,7 +14,7 @@ android { }**/ }**/ defaultConfig { defaultConfig { minSdkVersion 16 minSdkVersion 24 targetSdkVersion 31 targetSdkVersion 31 } } Loading Loading @@ -42,17 +42,17 @@ android { } } dependencies { dependencies { api libs.guardian_jtorctl api orbotlibs.guardian_jtorctl implementation( implementation( libs.android_shell, orbotlibs.android_shell, libs.androidx_core, orbotlibs.androidx_core, libs.androidx_localbroadcast, orbotlibs.androidx_localbroadcast, libs.ipt_proxy, orbotlibs.ipt_proxy, libs.guardian_geoip, orbotlibs.guardian_geoip, libs.guardian_jsocks, orbotlibs.guardian_jsocks, libs.portmapper, orbotlibs.portmapper, libs.tor_android, orbotlibs.tor_android, libs.pcap_core, orbotlibs.pcap_core, libs.pcap_factory orbotlibs.pcap_factory ) ) } } src/main/java/org/torproject/android/service/OrbotService.java +4 −0 Original line number Original line Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.widget.Toast; import net.freehaven.tor.control.TorControlCommands; import net.freehaven.tor.control.TorControlCommands; import net.freehaven.tor.control.TorControlConnection; import net.freehaven.tor.control.TorControlConnection; import org.pcap4j.packet.DnsPacket; import org.torproject.android.service.util.CustomTorResourceInstaller; import org.torproject.android.service.util.CustomTorResourceInstaller; import org.torproject.android.service.util.Prefs; import org.torproject.android.service.util.Prefs; import org.torproject.android.service.util.Utils; import org.torproject.android.service.util.Utils; Loading Loading @@ -61,6 +62,7 @@ import java.util.StringTokenizer; import java.util.UUID; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Executors; import java.util.function.Function; import IPtProxy.IPtProxy; import IPtProxy.IPtProxy; import androidx.annotation.ChecksSdkIntAtLeast; import androidx.annotation.ChecksSdkIntAtLeast; Loading @@ -73,6 +75,8 @@ public class OrbotService extends VpnService implements OrbotConstants { public final static String BINARY_TOR_VERSION = TorService.VERSION_NAME; public final static String BINARY_TOR_VERSION = TorService.VERSION_NAME; public static Function<DnsPacket, DnsPacket> shouldBlock = null; static final int NOTIFY_ID = 1; static final int NOTIFY_ID = 1; private static final int ERROR_NOTIFY_ID = 3; private static final int ERROR_NOTIFY_ID = 3; private static final Uri V3_ONION_SERVICES_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.v3onionservice/v3"); private static final Uri V3_ONION_SERVICES_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.v3onionservice/v3"); Loading src/main/java/org/torproject/android/service/vpn/DNSResolver.java +25 −3 Original line number Original line Diff line number Diff line package org.torproject.android.service.vpn; 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.io.IOException; import java.net.DatagramPacket; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.DatagramSocket; Loading @@ -14,11 +20,19 @@ public class DNSResolver { mPort = localPort; mPort = localPort; } } public byte[] processDNS(byte[] payload) throws IOException { public DnsPacket processDNS(DnsPacket dnsRequest) throws IOException { if (mLocalhost == null) if (mLocalhost == null) mLocalhost = InetAddress.getLocalHost(); mLocalhost = InetAddress.getLocalHost(); if (OrbotService.shouldBlock != null) { DnsPacket blockedResponse = OrbotService.shouldBlock.apply(dnsRequest); if (blockedResponse != null) { return blockedResponse; } } byte[] payload = dnsRequest.getRawData(); DatagramPacket packet = new DatagramPacket( DatagramPacket packet = new DatagramPacket( payload, payload.length, mLocalhost, mPort payload, payload.length, mLocalhost, mPort ); ); Loading @@ -30,7 +44,15 @@ public class DNSResolver { packet = new DatagramPacket(buf, buf.length); packet = new DatagramPacket(buf, buf.length); datagramSocket.receive(packet); datagramSocket.receive(packet); return packet.getData(); 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/RequestPacketHandler.java +3 −6 Original line number Original line Diff line number Diff line Loading @@ -29,14 +29,11 @@ public class RequestPacketHandler implements Runnable { public void run() { public void run() { try { try { UdpPacket udpPacket = (UdpPacket) packet.getPayload(); UdpPacket udpPacket = (UdpPacket) packet.getPayload(); byte[] dnsResp = mDnsResolver.processDNS(udpPacket.getPayload().getRawData()); if (dnsResp != null) { DnsPacket dnsRequest = (DnsPacket) udpPacket.getPayload(); 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(); DnsPacket.Builder dnsBuilder = new DnsPacket.Builder(); dnsBuilder.questions(dnsRequest.getHeader().getQuestions()); dnsBuilder.questions(dnsRequest.getHeader().getQuestions()); dnsBuilder.id(dnsRequest.getHeader().getId()); dnsBuilder.id(dnsRequest.getHeader().getId()); Loading Loading
build.gradle +12 −12 Original line number Original line Diff line number Diff line Loading @@ -14,7 +14,7 @@ android { }**/ }**/ defaultConfig { defaultConfig { minSdkVersion 16 minSdkVersion 24 targetSdkVersion 31 targetSdkVersion 31 } } Loading Loading @@ -42,17 +42,17 @@ android { } } dependencies { dependencies { api libs.guardian_jtorctl api orbotlibs.guardian_jtorctl implementation( implementation( libs.android_shell, orbotlibs.android_shell, libs.androidx_core, orbotlibs.androidx_core, libs.androidx_localbroadcast, orbotlibs.androidx_localbroadcast, libs.ipt_proxy, orbotlibs.ipt_proxy, libs.guardian_geoip, orbotlibs.guardian_geoip, libs.guardian_jsocks, orbotlibs.guardian_jsocks, libs.portmapper, orbotlibs.portmapper, libs.tor_android, orbotlibs.tor_android, libs.pcap_core, orbotlibs.pcap_core, libs.pcap_factory orbotlibs.pcap_factory ) ) } }
src/main/java/org/torproject/android/service/OrbotService.java +4 −0 Original line number Original line Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.widget.Toast; import net.freehaven.tor.control.TorControlCommands; import net.freehaven.tor.control.TorControlCommands; import net.freehaven.tor.control.TorControlConnection; import net.freehaven.tor.control.TorControlConnection; import org.pcap4j.packet.DnsPacket; import org.torproject.android.service.util.CustomTorResourceInstaller; import org.torproject.android.service.util.CustomTorResourceInstaller; import org.torproject.android.service.util.Prefs; import org.torproject.android.service.util.Prefs; import org.torproject.android.service.util.Utils; import org.torproject.android.service.util.Utils; Loading Loading @@ -61,6 +62,7 @@ import java.util.StringTokenizer; import java.util.UUID; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Executors; import java.util.function.Function; import IPtProxy.IPtProxy; import IPtProxy.IPtProxy; import androidx.annotation.ChecksSdkIntAtLeast; import androidx.annotation.ChecksSdkIntAtLeast; Loading @@ -73,6 +75,8 @@ public class OrbotService extends VpnService implements OrbotConstants { public final static String BINARY_TOR_VERSION = TorService.VERSION_NAME; public final static String BINARY_TOR_VERSION = TorService.VERSION_NAME; public static Function<DnsPacket, DnsPacket> shouldBlock = null; static final int NOTIFY_ID = 1; static final int NOTIFY_ID = 1; private static final int ERROR_NOTIFY_ID = 3; private static final int ERROR_NOTIFY_ID = 3; private static final Uri V3_ONION_SERVICES_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.v3onionservice/v3"); private static final Uri V3_ONION_SERVICES_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.v3onionservice/v3"); Loading
src/main/java/org/torproject/android/service/vpn/DNSResolver.java +25 −3 Original line number Original line Diff line number Diff line package org.torproject.android.service.vpn; 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.io.IOException; import java.net.DatagramPacket; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.DatagramSocket; Loading @@ -14,11 +20,19 @@ public class DNSResolver { mPort = localPort; mPort = localPort; } } public byte[] processDNS(byte[] payload) throws IOException { public DnsPacket processDNS(DnsPacket dnsRequest) throws IOException { if (mLocalhost == null) if (mLocalhost == null) mLocalhost = InetAddress.getLocalHost(); mLocalhost = InetAddress.getLocalHost(); if (OrbotService.shouldBlock != null) { DnsPacket blockedResponse = OrbotService.shouldBlock.apply(dnsRequest); if (blockedResponse != null) { return blockedResponse; } } byte[] payload = dnsRequest.getRawData(); DatagramPacket packet = new DatagramPacket( DatagramPacket packet = new DatagramPacket( payload, payload.length, mLocalhost, mPort payload, payload.length, mLocalhost, mPort ); ); Loading @@ -30,7 +44,15 @@ public class DNSResolver { packet = new DatagramPacket(buf, buf.length); packet = new DatagramPacket(buf, buf.length); datagramSocket.receive(packet); datagramSocket.receive(packet); return packet.getData(); 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/RequestPacketHandler.java +3 −6 Original line number Original line Diff line number Diff line Loading @@ -29,14 +29,11 @@ public class RequestPacketHandler implements Runnable { public void run() { public void run() { try { try { UdpPacket udpPacket = (UdpPacket) packet.getPayload(); UdpPacket udpPacket = (UdpPacket) packet.getPayload(); byte[] dnsResp = mDnsResolver.processDNS(udpPacket.getPayload().getRawData()); if (dnsResp != null) { DnsPacket dnsRequest = (DnsPacket) udpPacket.getPayload(); 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(); DnsPacket.Builder dnsBuilder = new DnsPacket.Builder(); dnsBuilder.questions(dnsRequest.getHeader().getQuestions()); dnsBuilder.questions(dnsRequest.getHeader().getQuestions()); dnsBuilder.id(dnsRequest.getHeader().getId()); dnsBuilder.id(dnsRequest.getHeader().getId()); Loading