commit 04da65342a76f74b3d4a58601f326ded457dc97a
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Apr 30 15:58:32 2020 +0000
Bug 33931 - Patch TOPL for filtering bridges by type
---
...ug-33931-Filter-bridges-in-stream-by-type.patch | 76 ++++++++++++++++++++++
projects/tor-onion-proxy-library/build | 2 +
projects/tor-onion-proxy-library/config | 1 +
3 files changed, 79 insertions(+)
diff --git a/projects/tor-onion-proxy-library/0001-Bug-33931-Filter-bridges-in-stream-by-type.patch b/projects/tor-onion-proxy-library/0001-Bug-33931-Filter-bridges-in-stream-by-type.patch
new file mode 100644
index 0000000..e04e7d9
--- /dev/null
+++ b/projects/tor-onion-proxy-library/0001-Bug-33931-Filter-bridges-in-stream-by-type.patch
@@ -0,0 +1,76 @@
+From 9a2048f02d602cab7bd937c66a4d3f9c35fbfa9e Mon Sep 17 00:00:00 2001
+From: Matthew Finkel <sysrqb(a)torproject.org>
+Date: Thu, 30 Apr 2020 15:40:25 +0000
+Subject: [PATCH] Bug 33931 - Filter bridges in stream by type
+
+The InputStream contains a first-byte that indicates the format of the
+following datastream. If the first-byte is 1, then the following stream
+is a string of bridges that are separated by the '\n' byte. If the
+first-byte is not 1, then the following data stream is default bridges
+and that list should be filtered such that only the requested bridge
+type is used.
+---
+ .../thali/toronionproxy/TorConfigBuilder.java | 35 ++++++++++++++++---
+ 1 file changed, 31 insertions(+), 4 deletions(-)
+
+diff --git a/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfigBuilder.java b/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfigBuilder.java
+index ab11948..2405097 100644
+--- a/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfigBuilder.java
++++ b/universal/src/main/java/com/msopentech/thali/toronionproxy/TorConfigBuilder.java
+@@ -535,9 +535,32 @@ public final class TorConfigBuilder {
+ TorConfigBuilder addBridgesFromResources() throws IOException {
+ if(settings.hasBridges()) {
+ InputStream bridgesStream = context.getInstaller().openBridgesStream();
+- int formatType = bridgesStream.read();
+- if (formatType == 0) {
+- addBridges(bridgesStream);
++ // The first byte encodes the type of bridges contained within the
++ // following data stream. Currently, it may contain either default bridges
++ // or user-provided bridges.
++ int bridgesType = bridgesStream.read();
++
++ // When bridgesType is 0x01, then the following stream is
++ // user-provided (custom) bridges.
++ // When bridgesType is one of: 0x02 or 0x03, then the Stream
++ // consists of default PT bridges. That list must be filtered, after
++ // parsing each bridge line, such that only the requested bridge type
++ // is used.
++ if (bridgesType != 1) {
++ // Terrible hack. Must keep in sync with tas::CustomTorInstaller::openBridgesStream
++ // and transports defined by TorConfigBuilder::transportPlugin().
++ String reqBridgeType;
++ switch (bridgesType) {
++ case 2:
++ reqBridgeType = "obfs4";
++ break;
++ case 3:
++ reqBridgeType = "meek_lite";
++ break;
++ default:
++ throw new IOException("Requested unknown transport type: " + bridgesType);
++ }
++ addBridges(bridgesStream, reqBridgeType);
+ } else {
+ addCustomBridges(bridgesStream);
+ }
+@@ -548,12 +571,16 @@ public final class TorConfigBuilder {
+ /**
+ * Add bridges from bridges.txt file.
+ */
+- private void addBridges(InputStream input) {
++ private void addBridges(InputStream input, String bridgeType) {
+ if (input == null) {
+ return;
+ }
+ List<Bridge> bridges = readBridgesFromStream(input);
+ for (Bridge b : bridges) {
++ if (!b.type.equals(bridgeType)) {
++ // This is not the transport we're looking for.
++ continue;
++ }
+ bridge(b.type, b.config);
+ }
+ }
+--
+2.20.1
+
diff --git a/projects/tor-onion-proxy-library/build b/projects/tor-onion-proxy-library/build
index 21c8f7a..c8025ad 100644
--- a/projects/tor-onion-proxy-library/build
+++ b/projects/tor-onion-proxy-library/build
@@ -21,6 +21,8 @@ cd /var/tmp/build/[% project %]-[% c('version') %]
# build will pull down the correct android tool versions
patch -p1 < $rootdir/gradle.patch
+patch -p1 < $rootdir/0001-Bug-33931-Filter-bridges-in-stream-by-type.patch
+
# Extract obfs4proxy from TorBrowser/Tor/PluggableTransports/obfs4proxy
tar --strip-components=4 -xf $rootdir/[% c('input_files_by_name/obfs4') %]
diff --git a/projects/tor-onion-proxy-library/config b/projects/tor-onion-proxy-library/config
index 080f0c2..5d90481 100644
--- a/projects/tor-onion-proxy-library/config
+++ b/projects/tor-onion-proxy-library/config
@@ -25,3 +25,4 @@ input_files:
name: gradle-dependencies
exec: '[% INCLUDE "fetch-gradle-dependencies" %]'
- filename: gradle.patch
+ - filename: 0001-Bug-33931-Filter-bridges-in-stream-by-type.patch