From 61276c81d23793ad5a580304b60e12986ce2637c Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 23 Nov 2018 12:52:40 +0000 Subject: [PATCH 1/3] Make it possible to start the headless app on MacOS. The app is still non-functional because we don't have a Tor plugin. --- .../system/AndroidSecureRandomProvider.java | 22 ++++++---- ...der.java => UnixSecureRandomProvider.java} | 19 +++++---- ...andomSpi.java => UnixSecureRandomSpi.java} | 10 +++-- ...java => UnixSecureRandomProviderTest.java} | 25 ++++++----- ...Test.java => UnixSecureRandomSpiTest.java} | 42 +++++++------------ .../system/DesktopSecureRandomModule.java | 5 ++- .../briar/headless/HeadlessModule.kt | 17 +++++--- 7 files changed, 72 insertions(+), 68 deletions(-) rename bramble-core/src/main/java/org/briarproject/bramble/system/{LinuxSecureRandomProvider.java => UnixSecureRandomProvider.java} (76%) rename bramble-core/src/main/java/org/briarproject/bramble/system/{LinuxSecureRandomSpi.java => UnixSecureRandomSpi.java} (83%) rename bramble-core/src/test/java/org/briarproject/bramble/system/{LinuxSecureRandomProviderTest.java => UnixSecureRandomProviderTest.java} (64%) rename bramble-core/src/test/java/org/briarproject/bramble/system/{LinuxSecureRandomSpiTest.java => UnixSecureRandomSpiTest.java} (74%) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidSecureRandomProvider.java b/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidSecureRandomProvider.java index 3779a16e8..0403ff99b 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidSecureRandomProvider.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidSecureRandomProvider.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.system; +import android.annotation.SuppressLint; import android.app.Application; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; @@ -26,7 +27,7 @@ import static android.provider.Settings.Secure.ANDROID_ID; @Immutable @NotNullByDefault -class AndroidSecureRandomProvider extends LinuxSecureRandomProvider { +class AndroidSecureRandomProvider extends UnixSecureRandomProvider { private static final int SEED_LENGTH = 32; @@ -37,6 +38,7 @@ class AndroidSecureRandomProvider extends LinuxSecureRandomProvider { appContext = app.getApplicationContext(); } + @SuppressLint("HardwareIds") @Override protected void writeToEntropyPool(DataOutputStream out) throws IOException { super.writeToEntropyPool(out); @@ -49,12 +51,14 @@ class AndroidSecureRandomProvider extends LinuxSecureRandomProvider { String id = Settings.Secure.getString(contentResolver, ANDROID_ID); if (id != null) out.writeUTF(id); Parcel parcel = Parcel.obtain(); - WifiManager wm = - (WifiManager) appContext.getSystemService(WIFI_SERVICE); - List configs = wm.getConfiguredNetworks(); - if (configs != null) { - for (WifiConfiguration config : configs) - parcel.writeParcelable(config, 0); + WifiManager wm = (WifiManager) appContext.getApplicationContext() + .getSystemService(WIFI_SERVICE); + if (wm != null) { + List configs = wm.getConfiguredNetworks(); + if (configs != null) { + for (WifiConfiguration config : configs) + parcel.writeParcelable(config, 0); + } } BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter(); if (bt != null) { @@ -77,13 +81,13 @@ class AndroidSecureRandomProvider extends LinuxSecureRandomProvider { // Based on https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html private void applyOpenSslFix() { - byte[] seed = new LinuxSecureRandomSpi().engineGenerateSeed( + byte[] seed = new UnixSecureRandomSpi().engineGenerateSeed( SEED_LENGTH); try { // Seed the OpenSSL PRNG Class.forName("org.apache.harmony.xnet.provider.jsse.NativeCrypto") .getMethod("RAND_seed", byte[].class) - .invoke(null, seed); + .invoke(null, (Object) seed); // Mix the output of the Linux PRNG into the OpenSSL PRNG int bytesRead = (Integer) Class.forName( "org.apache.harmony.xnet.provider.jsse.NativeCrypto") diff --git a/bramble-core/src/main/java/org/briarproject/bramble/system/LinuxSecureRandomProvider.java b/bramble-core/src/main/java/org/briarproject/bramble/system/UnixSecureRandomProvider.java similarity index 76% rename from bramble-core/src/main/java/org/briarproject/bramble/system/LinuxSecureRandomProvider.java rename to bramble-core/src/main/java/org/briarproject/bramble/system/UnixSecureRandomProvider.java index dd55fa5e9..a992b955c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/system/LinuxSecureRandomProvider.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/system/UnixSecureRandomProvider.java @@ -13,32 +13,33 @@ import java.util.logging.Logger; import javax.annotation.concurrent.Immutable; import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logException; @Immutable @NotNullByDefault -class LinuxSecureRandomProvider extends AbstractSecureRandomProvider { +class UnixSecureRandomProvider extends AbstractSecureRandomProvider { private static final Logger LOG = - Logger.getLogger(LinuxSecureRandomProvider.class.getName()); + getLogger(UnixSecureRandomProvider.class.getName()); private static final File RANDOM_DEVICE = new File("/dev/urandom"); private final AtomicBoolean seeded = new AtomicBoolean(false); private final File outputDevice; - LinuxSecureRandomProvider() { + UnixSecureRandomProvider() { this(RANDOM_DEVICE); } - LinuxSecureRandomProvider(File outputDevice) { + UnixSecureRandomProvider(File outputDevice) { this.outputDevice = outputDevice; } @Override public Provider getProvider() { if (!seeded.getAndSet(true)) writeSeed(); - return new LinuxProvider(); + return new UnixProvider(); } protected void writeSeed() { @@ -55,15 +56,15 @@ class LinuxSecureRandomProvider extends AbstractSecureRandomProvider { } // Based on https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html - private static class LinuxProvider extends Provider { + private static class UnixProvider extends Provider { - private LinuxProvider() { - super("LinuxPRNG", 1.1, "A Linux-specific PRNG using /dev/urandom"); + private UnixProvider() { + super("UnixPRNG", 1.0, "A Unix-specific PRNG using /dev/urandom"); // Although /dev/urandom is not a SHA-1 PRNG, some callers // explicitly request a SHA1PRNG SecureRandom and we need to // prevent them from getting the default implementation whose // output may have low entropy. - put("SecureRandom.SHA1PRNG", LinuxSecureRandomSpi.class.getName()); + put("SecureRandom.SHA1PRNG", UnixSecureRandomSpi.class.getName()); put("SecureRandom.SHA1PRNG ImplementedIn", "Software"); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/system/LinuxSecureRandomSpi.java b/bramble-core/src/main/java/org/briarproject/bramble/system/UnixSecureRandomSpi.java similarity index 83% rename from bramble-core/src/main/java/org/briarproject/bramble/system/LinuxSecureRandomSpi.java rename to bramble-core/src/main/java/org/briarproject/bramble/system/UnixSecureRandomSpi.java index 511afd27a..066598d9c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/system/LinuxSecureRandomSpi.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/system/UnixSecureRandomSpi.java @@ -10,22 +10,24 @@ import java.security.SecureRandomSpi; import java.util.logging.Logger; import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logException; -public class LinuxSecureRandomSpi extends SecureRandomSpi { +public class UnixSecureRandomSpi extends SecureRandomSpi { private static final Logger LOG = - Logger.getLogger(LinuxSecureRandomSpi.class.getName()); + getLogger(UnixSecureRandomSpi.class.getName()); private static final File RANDOM_DEVICE = new File("/dev/urandom"); private final File inputDevice, outputDevice; - public LinuxSecureRandomSpi() { + @SuppressWarnings("WeakerAccess") + public UnixSecureRandomSpi() { this(RANDOM_DEVICE, RANDOM_DEVICE); } - LinuxSecureRandomSpi(File inputDevice, File outputDevice) { + UnixSecureRandomSpi(File inputDevice, File outputDevice) { this.inputDevice = inputDevice; this.outputDevice = outputDevice; } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSecureRandomProviderTest.java b/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomProviderTest.java similarity index 64% rename from bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSecureRandomProviderTest.java rename to bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomProviderTest.java index 8c4190ac9..a200d9a63 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSecureRandomProviderTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomProviderTest.java @@ -1,7 +1,6 @@ package org.briarproject.bramble.system; import org.briarproject.bramble.test.BrambleTestCase; -import org.briarproject.bramble.test.TestUtils; import org.briarproject.bramble.util.OsUtils; import org.junit.After; import org.junit.Before; @@ -10,48 +9,48 @@ import org.junit.Test; import java.io.File; import java.security.Provider; +import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory; +import static org.briarproject.bramble.test.TestUtils.getTestDirectory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; -public class LinuxSecureRandomProviderTest extends BrambleTestCase { +public class UnixSecureRandomProviderTest extends BrambleTestCase { - private final File testDir = TestUtils.getTestDirectory(); + private final File testDir = getTestDirectory(); @Before public void setUp() { - testDir.mkdirs(); + assumeTrue(OsUtils.isLinux() || OsUtils.isMac()); + assertTrue(testDir.mkdirs()); } @Test public void testGetProviderWritesToRandomDeviceOnFirstCall() throws Exception { - if (!(OsUtils.isLinux())) { - System.err.println("WARNING: Skipping test, can't run on this OS"); - return; - } // Redirect the provider's output to a file File urandom = new File(testDir, "urandom"); - urandom.delete(); + if (urandom.exists()) assertTrue(urandom.delete()); assertTrue(urandom.createNewFile()); assertEquals(0, urandom.length()); - LinuxSecureRandomProvider p = new LinuxSecureRandomProvider(urandom); + UnixSecureRandomProvider p = new UnixSecureRandomProvider(urandom); // Getting a provider should write entropy to the file Provider provider = p.getProvider(); assertNotNull(provider); - assertEquals("LinuxPRNG", provider.getName()); + assertEquals("UnixPRNG", provider.getName()); // There should be at least 16 bytes from the clock, 8 from the runtime long length = urandom.length(); assertTrue(length >= 24); // Getting another provider should not write to the file again provider = p.getProvider(); assertNotNull(provider); - assertEquals("LinuxPRNG", provider.getName()); + assertEquals("UnixPRNG", provider.getName()); assertEquals(length, urandom.length()); } @After public void tearDown() { - TestUtils.deleteTestDirectory(testDir); + deleteTestDirectory(testDir); } } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSecureRandomSpiTest.java b/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomSpiTest.java similarity index 74% rename from bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSecureRandomSpiTest.java rename to bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomSpiTest.java index 3d48b647a..b31138bc1 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSecureRandomSpiTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomSpiTest.java @@ -15,31 +15,31 @@ import java.io.FileOutputStream; import java.util.HashSet; import java.util.Set; +import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory; +import static org.briarproject.bramble.test.TestUtils.getTestDirectory; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; -public class LinuxSecureRandomSpiTest extends BrambleTestCase { +public class UnixSecureRandomSpiTest extends BrambleTestCase { private static final File RANDOM_DEVICE = new File("/dev/urandom"); private static final int SEED_BYTES = 32; - private final File testDir = TestUtils.getTestDirectory(); + private final File testDir = getTestDirectory(); @Before public void setUp() { - testDir.mkdirs(); + assumeTrue(OsUtils.isLinux() || OsUtils.isMac()); + assertTrue(testDir.mkdirs()); } @Test public void testSeedsAreDistinct() { - if (!(OsUtils.isLinux())) { - System.err.println("WARNING: Skipping test, can't run on this OS"); - return; - } Set seeds = new HashSet<>(); - LinuxSecureRandomSpi engine = new LinuxSecureRandomSpi(); + UnixSecureRandomSpi engine = new UnixSecureRandomSpi(); for (int i = 0; i < 1000; i++) { byte[] seed = engine.engineGenerateSeed(SEED_BYTES); assertEquals(SEED_BYTES, seed.length); @@ -49,19 +49,15 @@ public class LinuxSecureRandomSpiTest extends BrambleTestCase { @Test public void testEngineSetSeedWritesToRandomDevice() throws Exception { - if (!(OsUtils.isLinux())) { - System.err.println("WARNING: Skipping test, can't run on this OS"); - return; - } // Redirect the engine's output to a file File urandom = new File(testDir, "urandom"); - urandom.delete(); + if (urandom.exists()) assertTrue(urandom.delete()); assertTrue(urandom.createNewFile()); assertEquals(0, urandom.length()); // Generate a seed byte[] seed = TestUtils.getRandomBytes(SEED_BYTES); // Check that the engine writes the seed to the file - LinuxSecureRandomSpi engine = new LinuxSecureRandomSpi(RANDOM_DEVICE, + UnixSecureRandomSpi engine = new UnixSecureRandomSpi(RANDOM_DEVICE, urandom); engine.engineSetSeed(seed); assertEquals(SEED_BYTES, urandom.length()); @@ -74,15 +70,11 @@ public class LinuxSecureRandomSpiTest extends BrambleTestCase { @Test public void testEngineNextBytesReadsFromRandomDevice() throws Exception { - if (!(OsUtils.isLinux())) { - System.err.println("WARNING: Skipping test, can't run on this OS"); - return; - } // Generate some entropy byte[] entropy = TestUtils.getRandomBytes(SEED_BYTES); // Write the entropy to a file File urandom = new File(testDir, "urandom"); - urandom.delete(); + if (urandom.exists()) assertTrue(urandom.delete()); FileOutputStream out = new FileOutputStream(urandom); out.write(entropy); out.flush(); @@ -90,7 +82,7 @@ public class LinuxSecureRandomSpiTest extends BrambleTestCase { assertTrue(urandom.exists()); assertEquals(SEED_BYTES, urandom.length()); // Check that the engine reads from the file - LinuxSecureRandomSpi engine = new LinuxSecureRandomSpi(urandom, + UnixSecureRandomSpi engine = new UnixSecureRandomSpi(urandom, RANDOM_DEVICE); byte[] b = new byte[SEED_BYTES]; engine.engineNextBytes(b); @@ -99,15 +91,11 @@ public class LinuxSecureRandomSpiTest extends BrambleTestCase { @Test public void testEngineGenerateSeedReadsFromRandomDevice() throws Exception { - if (!(OsUtils.isLinux())) { - System.err.println("WARNING: Skipping test, can't run on this OS"); - return; - } // Generate some entropy byte[] entropy = TestUtils.getRandomBytes(SEED_BYTES); // Write the entropy to a file File urandom = new File(testDir, "urandom"); - urandom.delete(); + if (urandom.exists()) assertTrue(urandom.delete()); FileOutputStream out = new FileOutputStream(urandom); out.write(entropy); out.flush(); @@ -115,7 +103,7 @@ public class LinuxSecureRandomSpiTest extends BrambleTestCase { assertTrue(urandom.exists()); assertEquals(SEED_BYTES, urandom.length()); // Check that the engine reads from the file - LinuxSecureRandomSpi engine = new LinuxSecureRandomSpi(urandom, + UnixSecureRandomSpi engine = new UnixSecureRandomSpi(urandom, RANDOM_DEVICE); byte[] b = engine.engineGenerateSeed(SEED_BYTES); assertArrayEquals(entropy, b); @@ -123,6 +111,6 @@ public class LinuxSecureRandomSpiTest extends BrambleTestCase { @After public void tearDown() { - TestUtils.deleteTestDirectory(testDir); + deleteTestDirectory(testDir); } } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/system/DesktopSecureRandomModule.java b/bramble-java/src/main/java/org/briarproject/bramble/system/DesktopSecureRandomModule.java index 65246870c..14e093287 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/system/DesktopSecureRandomModule.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/system/DesktopSecureRandomModule.java @@ -14,6 +14,9 @@ public class DesktopSecureRandomModule { @Provides @Singleton SecureRandomProvider provideSecureRandomProvider() { - return OsUtils.isLinux() ? new LinuxSecureRandomProvider() : null; + if (OsUtils.isLinux() || OsUtils.isMac()) + return new UnixSecureRandomProvider(); + // TODO: Create a secure random provider for Windows + throw new UnsupportedOperationException(); } } 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 f9d3c00db..dea73be0f 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 @@ -26,6 +26,7 @@ import org.briarproject.bramble.plugin.tor.CircumventionModule import org.briarproject.bramble.plugin.tor.CircumventionProvider import org.briarproject.bramble.plugin.tor.LinuxTorPluginFactory import org.briarproject.bramble.system.JavaSystemModule +import org.briarproject.bramble.util.OsUtils import org.briarproject.bramble.util.StringUtils.fromHexString import org.briarproject.briar.headless.blogs.HeadlessBlogModule import org.briarproject.briar.headless.contact.HeadlessContactModule @@ -70,11 +71,17 @@ internal class HeadlessModule(private val appDir: File) { circumventionProvider: CircumventionProvider, batteryManager: BatteryManager, clock: Clock ): PluginConfig { val torDirectory = File(appDir, "tor") - val tor = LinuxTorPluginFactory( - ioExecutor, networkManager, locationUtils, eventBus, torSocketFactory, backoffFactory, - resourceProvider, circumventionProvider, batteryManager, clock, torDirectory - ) - val duplex = listOf(tor) + val duplex: List + if (OsUtils.isLinux()) { + val tor = LinuxTorPluginFactory( + ioExecutor, networkManager, locationUtils, eventBus, + torSocketFactory, backoffFactory, resourceProvider, circumventionProvider, + batteryManager, clock, torDirectory + ) + duplex = listOf(tor) + } else { + duplex = emptyList() + } return object : PluginConfig { override fun getDuplexFactories(): Collection { return duplex From ce7d6d3db5b0613692b7190dd3be100e51b3c31d Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 23 Nov 2018 12:56:34 +0000 Subject: [PATCH 2/3] Code cleanup. --- .../main/java/org/briarproject/bramble/util/OsUtils.java | 2 -- .../bramble/system/UnixSecureRandomProviderTest.java | 5 +++-- .../bramble/system/UnixSecureRandomSpiTest.java | 5 +++-- .../bramble/lifecycle/DesktopLifecycleModule.java | 5 +++-- .../bramble/lifecycle/WindowsShutdownManagerImpl.java | 6 +++--- .../bramble/system/DesktopSecureRandomModule.java | 6 ++++-- .../java/org/briarproject/briar/headless/HeadlessModule.kt | 4 ++-- 7 files changed, 18 insertions(+), 15 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/util/OsUtils.java b/bramble-api/src/main/java/org/briarproject/bramble/util/OsUtils.java index bcde55bf0..8821838ef 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/util/OsUtils.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/util/OsUtils.java @@ -10,8 +10,6 @@ public class OsUtils { @Nullable private static final String os = System.getProperty("os.name"); @Nullable - private static final String version = System.getProperty("os.version"); - @Nullable private static final String vendor = System.getProperty("java.vendor"); public static boolean isWindows() { diff --git a/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomProviderTest.java b/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomProviderTest.java index a200d9a63..c7fd59e14 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomProviderTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomProviderTest.java @@ -1,7 +1,6 @@ package org.briarproject.bramble.system; import org.briarproject.bramble.test.BrambleTestCase; -import org.briarproject.bramble.util.OsUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -11,6 +10,8 @@ import java.security.Provider; import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory; import static org.briarproject.bramble.test.TestUtils.getTestDirectory; +import static org.briarproject.bramble.util.OsUtils.isLinux; +import static org.briarproject.bramble.util.OsUtils.isMac; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -22,7 +23,7 @@ public class UnixSecureRandomProviderTest extends BrambleTestCase { @Before public void setUp() { - assumeTrue(OsUtils.isLinux() || OsUtils.isMac()); + assumeTrue(isLinux() || isMac()); assertTrue(testDir.mkdirs()); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomSpiTest.java b/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomSpiTest.java index b31138bc1..528733a9c 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomSpiTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/system/UnixSecureRandomSpiTest.java @@ -4,7 +4,6 @@ import org.briarproject.bramble.api.Bytes; import org.briarproject.bramble.test.BrambleTestCase; import org.briarproject.bramble.test.TestUtils; import org.briarproject.bramble.util.IoUtils; -import org.briarproject.bramble.util.OsUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -17,6 +16,8 @@ import java.util.Set; import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory; import static org.briarproject.bramble.test.TestUtils.getTestDirectory; +import static org.briarproject.bramble.util.OsUtils.isLinux; +import static org.briarproject.bramble.util.OsUtils.isMac; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -32,7 +33,7 @@ public class UnixSecureRandomSpiTest extends BrambleTestCase { @Before public void setUp() { - assumeTrue(OsUtils.isLinux() || OsUtils.isMac()); + assumeTrue(isLinux() || isMac()); assertTrue(testDir.mkdirs()); } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/lifecycle/DesktopLifecycleModule.java b/bramble-java/src/main/java/org/briarproject/bramble/lifecycle/DesktopLifecycleModule.java index de9ca4bdb..30af46e6c 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/lifecycle/DesktopLifecycleModule.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/lifecycle/DesktopLifecycleModule.java @@ -1,20 +1,21 @@ package org.briarproject.bramble.lifecycle; import org.briarproject.bramble.api.lifecycle.ShutdownManager; -import org.briarproject.bramble.util.OsUtils; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; +import static org.briarproject.bramble.util.OsUtils.isWindows; + @Module public class DesktopLifecycleModule extends LifecycleModule { @Provides @Singleton ShutdownManager provideDesktopShutdownManager() { - if (OsUtils.isWindows()) return new WindowsShutdownManagerImpl(); + if (isWindows()) return new WindowsShutdownManagerImpl(); else return new ShutdownManagerImpl(); } } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/lifecycle/WindowsShutdownManagerImpl.java b/bramble-java/src/main/java/org/briarproject/bramble/lifecycle/WindowsShutdownManagerImpl.java index 2e9a7a2b3..094754ddf 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/lifecycle/WindowsShutdownManagerImpl.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/lifecycle/WindowsShutdownManagerImpl.java @@ -15,7 +15,6 @@ import com.sun.jna.win32.W32APIFunctionMapper; import com.sun.jna.win32.W32APITypeMapper; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.util.OsUtils; import java.util.Collections; import java.util.HashMap; @@ -29,6 +28,7 @@ import static com.sun.jna.Library.OPTION_FUNCTION_MAPPER; import static com.sun.jna.Library.OPTION_TYPE_MAPPER; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.util.LogUtils.logException; +import static org.briarproject.bramble.util.OsUtils.isWindows; @ThreadSafe @NotNullByDefault @@ -71,7 +71,7 @@ class WindowsShutdownManagerImpl extends ShutdownManagerImpl { // Locking: lock private void initialise() { - if (OsUtils.isWindows()) { + if (isWindows()) { new EventLoop().start(); } else { LOG.warning("Windows shutdown manager used on non-Windows OS"); @@ -111,7 +111,7 @@ class WindowsShutdownManagerImpl extends ShutdownManagerImpl { public void run() { try { // Load user32.dll - User32 user32 = (User32) Native.loadLibrary("user32", + User32 user32 = Native.loadLibrary("user32", User32.class, options); // Create a callback to handle the WM_QUERYENDSESSION message WindowProc proc = (hwnd, msg, wp, lp) -> { diff --git a/bramble-java/src/main/java/org/briarproject/bramble/system/DesktopSecureRandomModule.java b/bramble-java/src/main/java/org/briarproject/bramble/system/DesktopSecureRandomModule.java index 14e093287..47dfe5b0a 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/system/DesktopSecureRandomModule.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/system/DesktopSecureRandomModule.java @@ -1,20 +1,22 @@ package org.briarproject.bramble.system; import org.briarproject.bramble.api.system.SecureRandomProvider; -import org.briarproject.bramble.util.OsUtils; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; +import static org.briarproject.bramble.util.OsUtils.isLinux; +import static org.briarproject.bramble.util.OsUtils.isMac; + @Module public class DesktopSecureRandomModule { @Provides @Singleton SecureRandomProvider provideSecureRandomProvider() { - if (OsUtils.isLinux() || OsUtils.isMac()) + if (isLinux() || isMac()) return new UnixSecureRandomProvider(); // TODO: Create a secure random provider for Windows throw new UnsupportedOperationException(); 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 dea73be0f..7bce4d7eb 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 @@ -26,7 +26,7 @@ import org.briarproject.bramble.plugin.tor.CircumventionModule import org.briarproject.bramble.plugin.tor.CircumventionProvider import org.briarproject.bramble.plugin.tor.LinuxTorPluginFactory import org.briarproject.bramble.system.JavaSystemModule -import org.briarproject.bramble.util.OsUtils +import org.briarproject.bramble.util.OsUtils.isLinux import org.briarproject.bramble.util.StringUtils.fromHexString import org.briarproject.briar.headless.blogs.HeadlessBlogModule import org.briarproject.briar.headless.contact.HeadlessContactModule @@ -72,7 +72,7 @@ internal class HeadlessModule(private val appDir: File) { ): PluginConfig { val torDirectory = File(appDir, "tor") val duplex: List - if (OsUtils.isLinux()) { + if (isLinux()) { val tor = LinuxTorPluginFactory( ioExecutor, networkManager, locationUtils, eventBus, torSocketFactory, backoffFactory, resourceProvider, circumventionProvider, From bc352a2dc6f1e744bf6a200691be903e501cafba Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 23 Nov 2018 13:07:12 +0000 Subject: [PATCH 3/3] Enable Tor on Mac OS once binaries are available. --- ...LinuxTorPlugin.java => JavaTorPlugin.java} | 17 +------ .../bramble/plugin/tor/UnixTorPlugin.java | 47 +++++++++++++++++++ ...Factory.java => UnixTorPluginFactory.java} | 9 ++-- .../bramble/plugin/tor/BridgeTest.java | 6 +-- .../briar/headless/HeadlessModule.kt | 13 ++--- 5 files changed, 64 insertions(+), 28 deletions(-) rename bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/{LinuxTorPlugin.java => JavaTorPlugin.java} (81%) create mode 100644 bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java rename bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/{LinuxTorPluginFactory.java => UnixTorPluginFactory.java} (92%) diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPlugin.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java similarity index 81% rename from bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPlugin.java rename to bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java index 943702c79..75412fe55 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPlugin.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java @@ -10,7 +10,6 @@ import org.briarproject.bramble.api.system.LocationUtils; import org.briarproject.bramble.api.system.ResourceProvider; import java.io.File; -import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.security.CodeSource; @@ -19,9 +18,9 @@ import java.util.concurrent.Executor; import javax.net.SocketFactory; @NotNullByDefault -class LinuxTorPlugin extends TorPlugin { +abstract class JavaTorPlugin extends TorPlugin { - LinuxTorPlugin(Executor ioExecutor, NetworkManager networkManager, + JavaTorPlugin(Executor ioExecutor, NetworkManager networkManager, LocationUtils locationUtils, SocketFactory torSocketFactory, Clock clock, ResourceProvider resourceProvider, CircumventionProvider circumventionProvider, @@ -34,17 +33,6 @@ class LinuxTorPlugin extends TorPlugin { torDirectory); } - @Override - protected int getProcessId() { - try { - // Java 9: ProcessHandle.current().pid() - return Integer.parseInt( - new File("/proc/self").getCanonicalFile().getName()); - } catch (IOException e) { - throw new AssertionError(e); - } - } - @Override protected long getLastUpdateTime() { CodeSource codeSource = @@ -58,5 +46,4 @@ class LinuxTorPlugin extends TorPlugin { throw new AssertionError(e); } } - } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java new file mode 100644 index 000000000..e084875bf --- /dev/null +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java @@ -0,0 +1,47 @@ +package org.briarproject.bramble.plugin.tor; + +import com.sun.jna.Library; +import com.sun.jna.Native; + +import org.briarproject.bramble.api.battery.BatteryManager; +import org.briarproject.bramble.api.network.NetworkManager; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.Backoff; +import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.system.LocationUtils; +import org.briarproject.bramble.api.system.ResourceProvider; + +import java.io.File; +import java.util.concurrent.Executor; + +import javax.net.SocketFactory; + +@NotNullByDefault +class UnixTorPlugin extends JavaTorPlugin { + + UnixTorPlugin(Executor ioExecutor, NetworkManager networkManager, + LocationUtils locationUtils, SocketFactory torSocketFactory, + Clock clock, ResourceProvider resourceProvider, + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, Backoff backoff, + DuplexPluginCallback callback, String architecture, int maxLatency, + int maxIdleTime, File torDirectory) { + super(ioExecutor, networkManager, locationUtils, torSocketFactory, + clock, resourceProvider, circumventionProvider, batteryManager, + backoff, callback, architecture, maxLatency, maxIdleTime, + torDirectory); + } + + @Override + protected int getProcessId() { + return CLibrary.INSTANCE.getpid(); + } + + private interface CLibrary extends Library { + + CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); + + int getpid(); + } +} diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPluginFactory.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java similarity index 92% rename from bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPluginFactory.java rename to bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java index 5bf4dfee2..2279ef07a 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPluginFactory.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java @@ -22,14 +22,15 @@ import java.util.logging.Logger; import javax.annotation.concurrent.Immutable; import javax.net.SocketFactory; +import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.OsUtils.isLinux; @Immutable @NotNullByDefault -public class LinuxTorPluginFactory implements DuplexPluginFactory { +public class UnixTorPluginFactory implements DuplexPluginFactory { private static final Logger LOG = - Logger.getLogger(LinuxTorPluginFactory.class.getName()); + getLogger(UnixTorPluginFactory.class.getName()); private static final int MAX_LATENCY = 30 * 1000; // 30 seconds private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds @@ -49,7 +50,7 @@ public class LinuxTorPluginFactory implements DuplexPluginFactory { private final Clock clock; private final File torDirectory; - public LinuxTorPluginFactory(Executor ioExecutor, + public UnixTorPluginFactory(Executor ioExecutor, NetworkManager networkManager, LocationUtils locationUtils, EventBus eventBus, SocketFactory torSocketFactory, BackoffFactory backoffFactory, ResourceProvider resourceProvider, @@ -95,7 +96,7 @@ public class LinuxTorPluginFactory implements DuplexPluginFactory { Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, MAX_POLLING_INTERVAL, BACKOFF_BASE); - LinuxTorPlugin plugin = new LinuxTorPlugin(ioExecutor, networkManager, + UnixTorPlugin plugin = new UnixTorPlugin(ioExecutor, networkManager, locationUtils, torSocketFactory, clock, resourceProvider, circumventionProvider, batteryManager, backoff, callback, architecture, MAX_LATENCY, MAX_IDLE_TIME, torDirectory); diff --git a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java index 3901dd21d..1eaa8c07e 100644 --- a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java +++ b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java @@ -70,7 +70,7 @@ public class BridgeTest extends BrambleTestCase { private final File torDir = getTestDirectory(); private final String bridge; - private LinuxTorPluginFactory factory; + private UnixTorPluginFactory factory; public BridgeTest(String bridge) { this.bridge = bridge; @@ -108,7 +108,7 @@ public class BridgeTest extends BrambleTestCase { return singletonList(bridge); } }; - factory = new LinuxTorPluginFactory(ioExecutor, networkManager, + factory = new UnixTorPluginFactory(ioExecutor, networkManager, locationUtils, eventBus, torSocketFactory, backoffFactory, resourceProvider, bridgeProvider, batteryManager, clock, torDir); @@ -124,7 +124,7 @@ public class BridgeTest extends BrambleTestCase { DuplexPlugin duplexPlugin = factory.createPlugin(new TorPluginCallBack()); assertNotNull(duplexPlugin); - LinuxTorPlugin plugin = (LinuxTorPlugin) duplexPlugin; + UnixTorPlugin plugin = (UnixTorPlugin) duplexPlugin; LOG.warning("Testing " + bridge); try { 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 7bce4d7eb..be170446b 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 @@ -24,9 +24,10 @@ import org.briarproject.bramble.battery.DefaultBatteryManagerModule import org.briarproject.bramble.network.JavaNetworkModule import org.briarproject.bramble.plugin.tor.CircumventionModule import org.briarproject.bramble.plugin.tor.CircumventionProvider -import org.briarproject.bramble.plugin.tor.LinuxTorPluginFactory +import org.briarproject.bramble.plugin.tor.UnixTorPluginFactory import org.briarproject.bramble.system.JavaSystemModule import org.briarproject.bramble.util.OsUtils.isLinux +import org.briarproject.bramble.util.OsUtils.isMac import org.briarproject.bramble.util.StringUtils.fromHexString import org.briarproject.briar.headless.blogs.HeadlessBlogModule import org.briarproject.briar.headless.contact.HeadlessContactModule @@ -72,11 +73,11 @@ internal class HeadlessModule(private val appDir: File) { ): PluginConfig { val torDirectory = File(appDir, "tor") val duplex: List - if (isLinux()) { - val tor = LinuxTorPluginFactory( - ioExecutor, networkManager, locationUtils, eventBus, - torSocketFactory, backoffFactory, resourceProvider, circumventionProvider, - batteryManager, clock, torDirectory + if (isLinux() || isMac()) { + val tor = UnixTorPluginFactory( + ioExecutor, networkManager, locationUtils, eventBus, torSocketFactory, + backoffFactory, resourceProvider, circumventionProvider, batteryManager, clock, + torDirectory ) duplex = listOf(tor) } else {