From 4d1fb1a2d9651d01c95263a4d6c0aeed9dcb60bc Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Fri, 1 Oct 2021 11:21:22 +0200 Subject: [PATCH] Store private key and address of hidden service --- .../mailbox/core/tor/AndroidTorModule.kt | 3 ++ .../mailbox/core/tor/AndroidTorPlugin.java | 14 ++++--- .../mailbox/core/tor/JavaTorModule.kt | 3 ++ .../mailbox/core/tor/JavaTorPlugin.java | 4 +- .../briarproject/mailbox/core/CoreModule.kt | 2 + .../mailbox/core/tor/TorConstants.java | 24 ++---------- .../mailbox/core/tor/TorPlugin.java | 39 ++++++++++++++----- 7 files changed, 53 insertions(+), 36 deletions(-) diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorModule.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorModule.kt index 38375943..369f926c 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorModule.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorModule.kt @@ -10,6 +10,7 @@ import dagger.hilt.components.SingletonComponent import org.briarproject.mailbox.core.event.EventBus import org.briarproject.mailbox.core.lifecycle.IoExecutor import org.briarproject.mailbox.core.lifecycle.LifecycleManager +import org.briarproject.mailbox.core.settings.SettingsManager import org.briarproject.mailbox.core.system.AndroidWakeLockManager import org.briarproject.mailbox.core.system.Clock import org.briarproject.mailbox.core.system.LocationUtils @@ -43,6 +44,7 @@ internal class AndroidTorModule { fun provideAndroidTorPlugin( @ApplicationContext app: Context, @IoExecutor ioExecutor: Executor, + settingsManager: SettingsManager, networkManager: NetworkManager, locationUtils: LocationUtils, clock: Clock, @@ -55,6 +57,7 @@ internal class AndroidTorModule { ) = AndroidTorPlugin( ioExecutor, app, + settingsManager, networkManager, locationUtils, clock, diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorPlugin.java b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorPlugin.java index 0992a467..a29caa93 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorPlugin.java +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/core/tor/AndroidTorPlugin.java @@ -1,16 +1,12 @@ package org.briarproject.mailbox.core.tor; -import static android.os.Build.VERSION.SDK_INT; -import static org.briarproject.mailbox.core.util.LogUtils.info; -import static org.slf4j.LoggerFactory.getLogger; -import static java.util.Arrays.asList; - import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Build; +import org.briarproject.mailbox.core.settings.SettingsManager; import org.briarproject.mailbox.core.system.AndroidWakeLock; import org.briarproject.mailbox.core.system.AndroidWakeLockManager; import org.briarproject.mailbox.core.system.Clock; @@ -31,6 +27,11 @@ import java.util.zip.ZipInputStream; import javax.annotation.Nullable; +import static android.os.Build.VERSION.SDK_INT; +import static java.util.Arrays.asList; +import static org.briarproject.mailbox.core.util.LogUtils.info; +import static org.slf4j.LoggerFactory.getLogger; + public class AndroidTorPlugin extends TorPlugin { private static final List<String> LIBRARY_ARCHITECTURES = @@ -47,6 +48,7 @@ public class AndroidTorPlugin extends TorPlugin { AndroidTorPlugin(Executor ioExecutor, Context ctx, + SettingsManager settingsManager, NetworkManager networkManager, LocationUtils locationUtils, Clock clock, @@ -56,7 +58,7 @@ public class AndroidTorPlugin extends TorPlugin { Backoff backoff, @Nullable String architecture, File torDirectory) { - super(ioExecutor, networkManager, locationUtils, clock, resourceProvider, circumventionProvider, backoff, architecture, torDirectory); + super(ioExecutor, settingsManager, networkManager, locationUtils, clock, resourceProvider, circumventionProvider, backoff, architecture, torDirectory); this.ctx = ctx; wakeLock = wakeLockManager.createWakeLock("TorPlugin"); String nativeLibDir = ctx.getApplicationInfo().nativeLibraryDir; diff --git a/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaTorModule.kt b/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaTorModule.kt index 4454de7d..051edfe6 100644 --- a/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaTorModule.kt +++ b/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaTorModule.kt @@ -7,6 +7,7 @@ import dagger.hilt.components.SingletonComponent import org.briarproject.mailbox.core.event.EventBus import org.briarproject.mailbox.core.lifecycle.IoExecutor import org.briarproject.mailbox.core.lifecycle.LifecycleManager +import org.briarproject.mailbox.core.settings.SettingsManager import org.briarproject.mailbox.core.system.Clock import org.briarproject.mailbox.core.system.LocationUtils import org.briarproject.mailbox.core.system.ResourceProvider @@ -37,6 +38,7 @@ internal class JavaTorModule { @Singleton fun provideJavaTorPlugin( @IoExecutor ioExecutor: Executor, + settingsManager: SettingsManager, networkManager: NetworkManager, locationUtils: LocationUtils, clock: Clock, @@ -51,6 +53,7 @@ internal class JavaTorModule { val torDir = File(mailboxDir, "tor") return JavaTorPlugin( ioExecutor, + settingsManager, networkManager, locationUtils, clock, diff --git a/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaTorPlugin.java b/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaTorPlugin.java index c9ce0a9e..e097d26e 100644 --- a/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaTorPlugin.java +++ b/mailbox-cli/src/main/java/org/briarproject/mailbox/core/tor/JavaTorPlugin.java @@ -3,6 +3,7 @@ package org.briarproject.mailbox.core.tor; import com.sun.jna.Library; import com.sun.jna.Native; +import org.briarproject.mailbox.core.settings.SettingsManager; import org.briarproject.mailbox.core.system.Clock; import org.briarproject.mailbox.core.system.LocationUtils; import org.briarproject.mailbox.core.system.ResourceProvider; @@ -18,6 +19,7 @@ import javax.annotation.Nullable; public class JavaTorPlugin extends TorPlugin { JavaTorPlugin(Executor ioExecutor, + SettingsManager settingsManager, NetworkManager networkManager, LocationUtils locationUtils, Clock clock, @@ -26,7 +28,7 @@ public class JavaTorPlugin extends TorPlugin { Backoff backoff, @Nullable String architecture, File torDirectory) { - super(ioExecutor, networkManager, locationUtils, clock, resourceProvider, + super(ioExecutor, settingsManager, networkManager, locationUtils, clock, resourceProvider, circumventionProvider, backoff, architecture, torDirectory); } diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/CoreModule.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/CoreModule.kt index 229da7f2..740fbdc0 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/CoreModule.kt +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/CoreModule.kt @@ -8,6 +8,7 @@ import org.briarproject.mailbox.core.db.DatabaseModule import org.briarproject.mailbox.core.event.EventModule import org.briarproject.mailbox.core.lifecycle.LifecycleModule import org.briarproject.mailbox.core.server.WebServerModule +import org.briarproject.mailbox.core.settings.SettingsModule import org.briarproject.mailbox.core.system.Clock import org.briarproject.mailbox.core.tor.TorModule import javax.inject.Singleton @@ -18,6 +19,7 @@ import javax.inject.Singleton LifecycleModule::class, DatabaseModule::class, WebServerModule::class, + SettingsModule::class, TorModule::class, ] ) diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorConstants.java b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorConstants.java index f0a2b52b..37bbcff8 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorConstants.java +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorConstants.java @@ -2,28 +2,12 @@ package org.briarproject.mailbox.core.tor; public interface TorConstants { - // Transport properties - String PROP_ONION_V3 = "onion3"; + // Settings + String SETTINGS_NAMESPACE = "Tor"; + String HS_PRIVATE_KEY_V3 = "onionPrivKey3"; + String HS_ADDRESS_V3 = "onionAddress3"; int SOCKS_PORT = 59050; int CONTROL_PORT = 59051; - int CONNECT_TO_PROXY_TIMEOUT = 5000; // Milliseconds - int EXTRA_SOCKET_TIMEOUT = 30000; // Milliseconds - - // Local settings (not shared with contacts) - String HS_PRIVATE_KEY_V3 = "onionPrivKey3"; - String HS_V3_CREATED = "onionPrivKey3Created"; - - // Values for PREF_TOR_NETWORK - int PREF_TOR_NETWORK_AUTOMATIC = 0; - int PREF_TOR_NETWORK_WITHOUT_BRIDGES = 1; - int PREF_TOR_NETWORK_WITH_BRIDGES = 2; - - // Default values for local settings - boolean DEFAULT_PREF_PLUGIN_ENABLE = true; - int DEFAULT_PREF_TOR_NETWORK = PREF_TOR_NETWORK_AUTOMATIC; - boolean DEFAULT_PREF_TOR_MOBILE = true; - boolean DEFAULT_PREF_TOR_ONLY_WHEN_CHARGING = false; - } diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java index 1ec14a2e..05929a6e 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/tor/TorPlugin.java @@ -4,12 +4,15 @@ import net.freehaven.tor.control.EventHandler; import net.freehaven.tor.control.TorControlConnection; import org.briarproject.mailbox.core.PoliteExecutor; +import org.briarproject.mailbox.core.db.DbException; import org.briarproject.mailbox.core.event.Event; import org.briarproject.mailbox.core.event.EventListener; import org.briarproject.mailbox.core.lifecycle.IoExecutor; import org.briarproject.mailbox.core.lifecycle.Service; import org.briarproject.mailbox.core.lifecycle.ServiceException; import org.briarproject.mailbox.core.server.WebServerManager; +import org.briarproject.mailbox.core.settings.Settings; +import org.briarproject.mailbox.core.settings.SettingsManager; import org.briarproject.mailbox.core.system.Clock; import org.briarproject.mailbox.core.system.LocationUtils; import org.briarproject.mailbox.core.system.ResourceProvider; @@ -44,6 +47,9 @@ import static java.util.Objects.requireNonNull; import static net.freehaven.tor.control.TorControlCommands.HS_ADDRESS; import static net.freehaven.tor.control.TorControlCommands.HS_PRIVKEY; import static org.briarproject.mailbox.core.tor.TorConstants.CONTROL_PORT; +import static org.briarproject.mailbox.core.tor.TorConstants.HS_ADDRESS_V3; +import static org.briarproject.mailbox.core.tor.TorConstants.HS_PRIVATE_KEY_V3; +import static org.briarproject.mailbox.core.tor.TorConstants.SETTINGS_NAMESPACE; import static org.briarproject.mailbox.core.tor.TorPlugin.State.ACTIVE; import static org.briarproject.mailbox.core.tor.TorPlugin.State.DISABLED; import static org.briarproject.mailbox.core.tor.TorPlugin.State.ENABLING; @@ -70,6 +76,7 @@ abstract class TorPlugin implements Service, EventHandler, EventListener { private final Executor ioExecutor; private final Executor connectionStatusExecutor; + private final SettingsManager settingsManager; private final NetworkManager networkManager; private final LocationUtils locationUtils; private final Clock clock; @@ -92,6 +99,7 @@ abstract class TorPlugin implements Service, EventHandler, EventListener { protected abstract long getLastUpdateTime(); TorPlugin(Executor ioExecutor, + SettingsManager settingsManager, NetworkManager networkManager, LocationUtils locationUtils, Clock clock, @@ -101,6 +109,7 @@ abstract class TorPlugin implements Service, EventHandler, EventListener { @Nullable String architecture, File torDirectory) { this.ioExecutor = ioExecutor; + this.settingsManager = settingsManager; this.networkManager = networkManager; this.locationUtils = locationUtils; this.clock = clock; @@ -320,9 +329,16 @@ abstract class TorPlugin implements Service, EventHandler, EventListener { @IoExecutor private void publishHiddenService(String port) { if (!state.isTorRunning()) return; - // TODO get stored key - String privKey3 = null; - publishV3HiddenService(port, privKey3); + + Settings s; + try { + s = settingsManager.getSettings(SETTINGS_NAMESPACE); + } catch (DbException e) { + logException(LOG, e); + s = new Settings(); + } + String privateKey3 = s.get(HS_PRIVATE_KEY_V3); + publishV3HiddenService(port, privateKey3); } @IoExecutor @@ -350,16 +366,21 @@ abstract class TorPlugin implements Service, EventHandler, EventListener { LOG.warn("Tor did not return a private key"); return; } + Settings s = new Settings(); String onion3 = response.get(HS_ADDRESS); + s.put(HS_ADDRESS_V3, onion3); info(LOG, () -> "V3 hidden service " + scrubOnion(onion3)); - // TODO remove + + // TODO remove before release LOG.warn("V3 hidden service: http://" + onion3 + ".onion"); + if (privKey == null) { - // TODO Save the hidden service's onion hostname -// p.put(PROP_ONION_V3, onion3); - // TODO Save the hidden service's private key for next time -// s.put(HS_PRIVATE_KEY_V3, response.get(HS_PRIVKEY)); -// s.put(HS_V3_CREATED, String.valueOf(clock.currentTimeMillis())); + s.put(HS_PRIVATE_KEY_V3, response.get(HS_PRIVKEY)); + } + try { + settingsManager.mergeSettings(s, SETTINGS_NAMESPACE); + } catch (DbException e) { + logException(LOG, e); } } -- GitLab