From 57f75017804c6eb3ddeef432961770e8026f8700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCrten?= Date: Wed, 19 Apr 2023 09:03:50 +0200 Subject: [PATCH] macOS support --- bramble-java/build.gradle | 2 +- .../plugin/tor/MacTorPluginFactory.java | 85 +++++++++++++++++++ bramble-java/witness.gradle | 2 - briar-headless/build.gradle | 19 +++++ .../briar/headless/HeadlessModule.kt | 5 +- briar-headless/witness.gradle | 3 + 6 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/MacTorPluginFactory.java diff --git a/bramble-java/build.gradle b/bramble-java/build.gradle index 8e3e6d92b..9515a6bf7 100644 --- a/bramble-java/build.gradle +++ b/bramble-java/build.gradle @@ -11,7 +11,7 @@ dependencies { implementation project(':bramble-core') implementation fileTree(dir: 'libs', include: '*.jar') - def jna_version = '4.5.2' + def jna_version = '5.13.0' implementation "net.java.dev.jna:jna:$jna_version" implementation "net.java.dev.jna:jna-platform:$jna_version" implementation "org.briarproject:onionwrapper-java:$onionwrapper_version" diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/MacTorPluginFactory.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/MacTorPluginFactory.java new file mode 100644 index 000000000..4ec204db1 --- /dev/null +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/MacTorPluginFactory.java @@ -0,0 +1,85 @@ +package org.briarproject.bramble.plugin.tor; + +import org.briarproject.bramble.api.battery.BatteryManager; +import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.event.EventBus; +import org.briarproject.bramble.api.event.EventExecutor; +import org.briarproject.bramble.api.lifecycle.IoExecutor; +import org.briarproject.bramble.api.network.NetworkManager; +import org.briarproject.bramble.api.plugin.Backoff; +import org.briarproject.bramble.api.plugin.BackoffFactory; +import org.briarproject.bramble.api.plugin.PluginCallback; +import org.briarproject.bramble.api.plugin.TorControlPort; +import org.briarproject.bramble.api.plugin.TorDirectory; +import org.briarproject.bramble.api.plugin.TorSocksPort; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.system.WakefulIoExecutor; +import org.briarproject.nullsafety.NotNullByDefault; +import org.briarproject.onionwrapper.CircumventionProvider; +import org.briarproject.onionwrapper.LocationUtils; +import org.briarproject.onionwrapper.MacTorWrapper; +import org.briarproject.onionwrapper.TorWrapper; +import org.briarproject.onionwrapper.UnixTorWrapper; + +import java.io.File; +import java.util.concurrent.Executor; + +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; +import javax.inject.Inject; +import javax.net.SocketFactory; + +import static java.util.logging.Level.INFO; +import static org.briarproject.bramble.util.OsUtils.isMac; + +@Immutable +@NotNullByDefault +public class MacTorPluginFactory extends TorPluginFactory { + + @Inject + MacTorPluginFactory(@IoExecutor Executor ioExecutor, + @EventExecutor Executor eventExecutor, + @WakefulIoExecutor Executor wakefulIoExecutor, + NetworkManager networkManager, + LocationUtils locationUtils, + EventBus eventBus, + SocketFactory torSocketFactory, + BackoffFactory backoffFactory, + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, + Clock clock, + CryptoComponent crypto, + @TorDirectory File torDirectory, + @TorSocksPort int torSocksPort, + @TorControlPort int torControlPort) { + super(ioExecutor, eventExecutor, wakefulIoExecutor, networkManager, + locationUtils, eventBus, torSocketFactory, backoffFactory, + circumventionProvider, batteryManager, clock, crypto, + torDirectory, torSocksPort, torControlPort); + } + + @Nullable + @Override + String getArchitectureForTorBinary() { + if (!isMac()) return null; + String arch = System.getProperty("os.arch"); + if (LOG.isLoggable(INFO)) { + LOG.info("System's os.arch is " + arch); + } + if (arch.equals("amd64")) return "x86_64"; + else if (arch.equals("aarch64")) return "aarch64"; + return null; + } + + @Override + TorPlugin createPluginInstance(Backoff backoff, + TorRendezvousCrypto torRendezvousCrypto, PluginCallback callback, + String architecture) { + TorWrapper tor = new MacTorWrapper(ioExecutor, eventExecutor, + architecture, torDirectory, torSocksPort, torControlPort); + return new TorPlugin(ioExecutor, wakefulIoExecutor, networkManager, + locationUtils, torSocketFactory, circumventionProvider, + batteryManager, backoff, torRendezvousCrypto, tor, callback, + MAX_LATENCY, MAX_IDLE_TIME, true); + } +} diff --git a/bramble-java/witness.gradle b/bramble-java/witness.gradle index db4502ba3..a25b51a26 100644 --- a/bramble-java/witness.gradle +++ b/bramble-java/witness.gradle @@ -20,9 +20,7 @@ dependencyVerification { 'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', 'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3', 'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11', - 'net.java.dev.jna:jna-platform:4.5.2:jna-platform-4.5.2.jar:f1d00c167d8921c6e23c626ef9f1c3ae0be473c95c68ffa012bc7ae55a87e2d6', 'net.java.dev.jna:jna-platform:5.13.0:jna-platform-5.13.0.jar:474d7b88f6e97009b6ec1d98c3024dd95c23187c65dabfbc35331bcac3d173dd', - 'net.java.dev.jna:jna:4.5.2:jna-4.5.2.jar:0c8eb7acf67261656d79005191debaba3b6bf5dd60a43735a245429381dbecff', 'net.java.dev.jna:jna:5.13.0:jna-5.13.0.jar:66d4f819a062a51a1d5627bffc23fac55d1677f0e0a1feba144aabdd670a64bb', 'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0', 'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd', diff --git a/briar-headless/build.gradle b/briar-headless/build.gradle index 5bfac5c67..07b550018 100644 --- a/briar-headless/build.gradle +++ b/briar-headless/build.gradle @@ -20,6 +20,9 @@ configurations { linux { extendsFrom runtimeClasspath } + macos { + extendsFrom runtimeClasspath + } } sourceCompatibility = 1.8 @@ -38,6 +41,10 @@ dependencies { windows "org.briarproject:obfs4proxy-windows:$obfs4proxy_version" windows "org.briarproject:snowflake-windows:$snowflake_version" + macos "org.briarproject:tor-macos:$tor_version" + macos "org.briarproject:obfs4proxy-macos:$obfs4proxy_version" + macos "org.briarproject:snowflake-macos:$snowflake_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'io.javalin:javalin:3.5.0' implementation 'org.slf4j:slf4j-simple:1.7.30' @@ -153,10 +160,22 @@ task windowsJar(type: Jar) { jarFactory(it, 'windows', 'x86_64', configurations.windows) } +task aarch64MacOsJar(type: Jar) { + jarFactory(it, 'macos', 'aarch64', configurations.macos) +} + +task x86MacOsJar(type: Jar) { + jarFactory(it, 'macos', 'x86_64', configurations.macos) +} + task linuxJars { dependsOn(aarch64LinuxJar, armhfLinuxJar, x86LinuxJar) } +task macosJars { + dependsOn(aarch64MacOsJar, x86MacOsJar) +} + // At the moment for non-Android projects we need to explicitly mark the code generated by kapt // as 'generated source code' for correct highlighting and resolve in IDE. idea { diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt index 983b230b8..4ef13c8f1 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt @@ -18,6 +18,7 @@ import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory import org.briarproject.bramble.battery.DefaultBatteryManagerModule import org.briarproject.bramble.event.DefaultEventExecutorModule +import org.briarproject.bramble.plugin.tor.MacTorPluginFactory import org.briarproject.bramble.plugin.tor.UnixTorPluginFactory import org.briarproject.bramble.plugin.tor.WindowsTorPluginFactory import org.briarproject.bramble.system.ClockModule @@ -92,10 +93,12 @@ internal class HeadlessModule(private val appDir: File) { @Singleton internal fun providePluginConfig( unixTor: UnixTorPluginFactory, + macTor: MacTorPluginFactory, winTor: WindowsTorPluginFactory ): PluginConfig { val duplex: List = when { - isLinux() || isMac() -> listOf(unixTor) + isLinux() -> listOf(unixTor) + isMac() -> listOf(macTor) isWindows() -> listOf(winTor) else -> emptyList() } diff --git a/briar-headless/witness.gradle b/briar-headless/witness.gradle index bab5e2d06..fe294dc4a 100644 --- a/briar-headless/witness.gradle +++ b/briar-headless/witness.gradle @@ -44,12 +44,15 @@ dependencyVerification { 'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b', 'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011', 'org.briarproject:obfs4proxy-linux:0.0.14-tor2:obfs4proxy-linux-0.0.14-tor2.jar:bb2431092b5ad998ad620b0223e725c0f7e43f1b02af2f097a2544edc1fd9738', + 'org.briarproject:obfs4proxy-macos:0.0.14-tor2:obfs4proxy-macos-0.0.14-tor2.jar:4a688d3a14d2510dd312213488c8f39ee08e609e47a7300aa12e31ceacb16ce2', 'org.briarproject:obfs4proxy-windows:0.0.14-tor2:obfs4proxy-windows-0.0.14-tor2.jar:b5fbd00a8c35ccf095b265370752390e4cd46055331049c4dfcc236dc9c650ac', 'org.briarproject:onionwrapper-core:0.0.4:onionwrapper-core-0.0.4.jar:28a01a62e96aa763989a8afc325abd3bee54f8021269f91aa48b247a6e717870', 'org.briarproject:onionwrapper-java:0.0.4:onionwrapper-java-0.0.4.jar:7806ef878074498653b557e26eb70e6007df3450d6a910a2e9a322f7eb4df442', 'org.briarproject:snowflake-linux:2.5.1:snowflake-linux-2.5.1.jar:edc807dcb7758365970d95525e4749349a27f462d0e2df6505ad1ca65fb296d2', + 'org.briarproject:snowflake-macos:2.5.1:snowflake-macos-2.5.1.jar:f6d59471d476860950bb639ac318920caa460c4d6d023cbd6547c742949c84f0', 'org.briarproject:snowflake-windows:2.5.1:snowflake-windows-2.5.1.jar:700ec9c68dc033f544daa4ca3547c89e523aed66500cf4b3ac51fe017c51e7be', 'org.briarproject:tor-linux:0.4.7.13-2:tor-linux-0.4.7.13-2.jar:1e4ca9e0f724e1f17fcce570832704942cc3be26c4c2eccbe5aae29f35afa307', + 'org.briarproject:tor-macos:0.4.7.13-2:tor-macos-0.4.7.13-2.jar:3d84fbe667584d24275c6a4cb197bafcb0ead890e4d46acac3317debf0cd3351', 'org.briarproject:tor-windows:0.4.7.13-2:tor-windows-0.4.7.13-2.jar:3a0aa01ed3103cac0c22a91a6f227ab99f7d32ea970ea41558eece484ab49e88', 'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a', 'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',