From 64c6e3d7832766e0feb3170ad2982b497988d87a Mon Sep 17 00:00:00 2001 From: Florian Reimair Date: Sat, 17 Nov 2018 12:06:15 +0100 Subject: [PATCH] Connect with CookieAuthentication --- .../main/java/bisq/core/app/BisqEnvironment.java | 13 ++++++++++++- .../src/main/java/bisq/core/app/BisqExecutable.java | 9 +++++++++ .../main/java/bisq/network/NetworkOptionKeys.java | 2 ++ .../java/bisq/network/p2p/NetworkNodeProvider.java | 6 ++++-- p2p/src/main/java/bisq/network/p2p/P2PModule.java | 2 ++ .../java/bisq/network/p2p/network/RunningTor.java | 9 ++++++++- 6 files changed, 37 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/bisq/core/app/BisqEnvironment.java b/core/src/main/java/bisq/core/app/BisqEnvironment.java index 5e5610fadd..b7ddc32faa 100644 --- a/core/src/main/java/bisq/core/app/BisqEnvironment.java +++ b/core/src/main/java/bisq/core/app/BisqEnvironment.java @@ -193,9 +193,11 @@ public class BisqEnvironment extends StandardEnvironment { protected final String btcNodes, seedNodes, ignoreDevMsg, useDevPrivilegeKeys, useDevMode, useTorForBtc, rpcUser, rpcPassword, rpcPort, rpcBlockNotificationPort, dumpBlockchainData, fullDaoNode, myAddress, banList, dumpStatistics, maxMemory, socks5ProxyBtcAddress, - torRcFile, torRcOptions, externalTorControlPort, externalTorPassword, + torRcFile, torRcOptions, externalTorControlPort, externalTorPassword, externalTorCookieFile, socks5ProxyHttpAddress, useAllProvidedNodes, numConnectionForBtc, genesisTxId, genesisBlockHeight, referralId, daoActivated; + protected final boolean externalTorUseSafeCookieAuthentication; + public BisqEnvironment(OptionSet options) { this(new JOptCommandLinePropertySource(BISQ_COMMANDLINE_PROPERTY_SOURCE_NAME, checkNotNull( options))); @@ -279,6 +281,12 @@ public class BisqEnvironment extends StandardEnvironment { externalTorPassword = commandLineProperties.containsProperty(NetworkOptionKeys.EXTERNAL_TOR_PASSWORD) ? (String) commandLineProperties.getProperty(NetworkOptionKeys.EXTERNAL_TOR_PASSWORD) : ""; + externalTorCookieFile = commandLineProperties.containsProperty(NetworkOptionKeys.EXTERNAL_TOR_COOKIE_FILE) ? + (String) commandLineProperties.getProperty(NetworkOptionKeys.EXTERNAL_TOR_COOKIE_FILE) : + ""; + externalTorUseSafeCookieAuthentication = commandLineProperties.containsProperty(NetworkOptionKeys.EXTERNAL_TOR_USE_SAFECOOKIE) ? + true : + false; //RpcOptionKeys rpcUser = commandLineProperties.containsProperty(DaoOptionKeys.RPC_USER) ? @@ -451,6 +459,9 @@ public class BisqEnvironment extends StandardEnvironment { setProperty(NetworkOptionKeys.TORRC_OPTIONS, torRcOptions); setProperty(NetworkOptionKeys.EXTERNAL_TOR_CONTROL_PORT, externalTorControlPort); setProperty(NetworkOptionKeys.EXTERNAL_TOR_PASSWORD, externalTorPassword); + setProperty(NetworkOptionKeys.EXTERNAL_TOR_COOKIE_FILE, externalTorCookieFile); + if (externalTorUseSafeCookieAuthentication) + setProperty(NetworkOptionKeys.EXTERNAL_TOR_USE_SAFECOOKIE, "true"); setProperty(AppOptionKeys.APP_DATA_DIR_KEY, appDataDir); setProperty(AppOptionKeys.DESKTOP_WITH_HTTP_API, desktopWithHttpApi); diff --git a/core/src/main/java/bisq/core/app/BisqExecutable.java b/core/src/main/java/bisq/core/app/BisqExecutable.java index 70f13da626..c2adbe7e2b 100644 --- a/core/src/main/java/bisq/core/app/BisqExecutable.java +++ b/core/src/main/java/bisq/core/app/BisqExecutable.java @@ -372,6 +372,15 @@ public abstract class BisqExecutable implements GracefulShutDownHandler { description("The password for controlling the already running Tor service.", "")) .availableIf(NetworkOptionKeys.EXTERNAL_TOR_CONTROL_PORT) .withRequiredArg(); + parser.accepts(NetworkOptionKeys.EXTERNAL_TOR_COOKIE_FILE, + description("The cookie file for authenticating against the already running Tor service. Use in conjunction with --" + NetworkOptionKeys.EXTERNAL_TOR_USE_SAFECOOKIE, "")) + .availableIf(NetworkOptionKeys.EXTERNAL_TOR_CONTROL_PORT) + .availableUnless(NetworkOptionKeys.EXTERNAL_TOR_PASSWORD) + .withRequiredArg() + .withValuesConvertedBy(new PathConverter(PathProperties.FILE_EXISTING, PathProperties.READABLE)); + parser.accepts(NetworkOptionKeys.EXTERNAL_TOR_USE_SAFECOOKIE, + description("Use the SafeCookie method when authenticating to the already running Tor service.", "")) + .availableIf(NetworkOptionKeys.EXTERNAL_TOR_COOKIE_FILE); //AppOptionKeys parser.accepts(AppOptionKeys.USER_DATA_DIR_KEY, diff --git a/p2p/src/main/java/bisq/network/NetworkOptionKeys.java b/p2p/src/main/java/bisq/network/NetworkOptionKeys.java index 0adbb96526..c92ab86e59 100644 --- a/p2p/src/main/java/bisq/network/NetworkOptionKeys.java +++ b/p2p/src/main/java/bisq/network/NetworkOptionKeys.java @@ -33,4 +33,6 @@ public class NetworkOptionKeys { public static final String TORRC_FILE = "torrcFile"; public static final String EXTERNAL_TOR_CONTROL_PORT = "torControlPort"; public static final String EXTERNAL_TOR_PASSWORD = "torControlPassword"; + public static final String EXTERNAL_TOR_COOKIE_FILE = "torControlCookieFile"; + public static final String EXTERNAL_TOR_USE_SAFECOOKIE = "torControlUseSafeCookieAuth"; } diff --git a/p2p/src/main/java/bisq/network/p2p/NetworkNodeProvider.java b/p2p/src/main/java/bisq/network/p2p/NetworkNodeProvider.java index 09d1aa7288..69c3c37d7c 100644 --- a/p2p/src/main/java/bisq/network/p2p/NetworkNodeProvider.java +++ b/p2p/src/main/java/bisq/network/p2p/NetworkNodeProvider.java @@ -48,12 +48,14 @@ public class NetworkNodeProvider implements Provider { @Named(NetworkOptionKeys.TORRC_FILE) String torrcFile, @Named(NetworkOptionKeys.TORRC_OPTIONS) String torrcOptions, @Named(NetworkOptionKeys.EXTERNAL_TOR_CONTROL_PORT) String controlPort, - @Named(NetworkOptionKeys.EXTERNAL_TOR_PASSWORD) String password) { + @Named(NetworkOptionKeys.EXTERNAL_TOR_PASSWORD) String password, + @Named(NetworkOptionKeys.EXTERNAL_TOR_COOKIE_FILE) String cookieFile, + @Named(NetworkOptionKeys.EXTERNAL_TOR_USE_SAFECOOKIE) boolean useSafeCookieAuthentication ) { networkNode = useLocalhostForP2P ? new LocalhostNetworkNode(address, port, networkProtoResolver) : new TorNetworkNode(port, torDir, networkProtoResolver, bridgeAddressProvider, !controlPort.isEmpty() ? - new RunningTor(torDir, Integer.parseInt(controlPort), password) : + new RunningTor(torDir, Integer.parseInt(controlPort), password, cookieFile, useSafeCookieAuthentication) : new NewTor(torDir, torrcFile, torrcOptions, bridgeAddressProvider.getBridgeAddresses())); } diff --git a/p2p/src/main/java/bisq/network/p2p/P2PModule.java b/p2p/src/main/java/bisq/network/p2p/P2PModule.java index ef0d3b36f8..dfd677cd22 100644 --- a/p2p/src/main/java/bisq/network/p2p/P2PModule.java +++ b/p2p/src/main/java/bisq/network/p2p/P2PModule.java @@ -92,5 +92,7 @@ public class P2PModule extends AppModule { bindConstant().annotatedWith(named(NetworkOptionKeys.TORRC_OPTIONS)).to(environment.getRequiredProperty(NetworkOptionKeys.TORRC_OPTIONS)); bindConstant().annotatedWith(named(NetworkOptionKeys.EXTERNAL_TOR_CONTROL_PORT)).to(environment.getRequiredProperty(NetworkOptionKeys.EXTERNAL_TOR_CONTROL_PORT)); bindConstant().annotatedWith(named(NetworkOptionKeys.EXTERNAL_TOR_PASSWORD)).to(environment.getRequiredProperty(NetworkOptionKeys.EXTERNAL_TOR_PASSWORD)); + bindConstant().annotatedWith(named(NetworkOptionKeys.EXTERNAL_TOR_COOKIE_FILE)).to(environment.getRequiredProperty(NetworkOptionKeys.EXTERNAL_TOR_COOKIE_FILE)); + bindConstant().annotatedWith(named(NetworkOptionKeys.EXTERNAL_TOR_USE_SAFECOOKIE)).to(environment.containsProperty(NetworkOptionKeys.EXTERNAL_TOR_USE_SAFECOOKIE) ? true : false); } } diff --git a/p2p/src/main/java/bisq/network/p2p/network/RunningTor.java b/p2p/src/main/java/bisq/network/p2p/network/RunningTor.java index f06f6034de..62c5f43b10 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/RunningTor.java +++ b/p2p/src/main/java/bisq/network/p2p/network/RunningTor.java @@ -43,12 +43,17 @@ public class RunningTor extends TorMode { private final int controlPort; private final String password; private final String torDir; + private final File cookieFile; + private final boolean useSafeCookieAuthentication; - public RunningTor(final File torDir, final int controlPort, final String password) { + public RunningTor(final File torDir, final int controlPort, final String password, final String cookieFile, + final boolean useSafeCookieAuthentication) { this.torDir = torDir.getAbsolutePath(); this.controlPort = controlPort; this.password = password; + this.cookieFile = new File(cookieFile); + this.useSafeCookieAuthentication = useSafeCookieAuthentication; } @Override @@ -60,6 +65,8 @@ public class RunningTor extends TorMode { Tor result; if (!password.isEmpty()) result = new ExternalTor(controlPort, password); + else if (cookieFile.exists()) + result = new ExternalTor(controlPort, cookieFile, useSafeCookieAuthentication); else result = new ExternalTor(controlPort);