Skip to content

Commit 1f35971

Browse files
committed
Fix reconnection to clearnet addresses via Tor
1 parent 17ac335 commit 1f35971

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

eclair-core/src/main/scala/fr/acinq/eclair/io/ReconnectionTask.scala

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,14 @@ object ReconnectionTask {
187187
// @formatter:on
188188

189189
def selectNodeAddress(nodeParams: NodeParams, nodeAddresses: Seq[NodeAddress]): Option[NodeAddress] = {
190-
// it doesn't make sense to mix tor and clearnet addresses, so we separate them and decide whether we use one or the other
190+
// it makes perfect sense to mix tor and clearnet addresses over tor, but, we separate them when tor is not configured.
191191
val torAddresses = nodeAddresses.collect { case o: OnionAddress => o }
192192
val clearnetAddresses = nodeAddresses diff torAddresses
193193
val selectedAddresses = nodeParams.socksProxy_opt match {
194-
case Some(params) if clearnetAddresses.nonEmpty && params.useForTor && (!params.useForIPv4 || !params.useForIPv6) =>
195-
// Remote has clearnet (and possibly tor addresses), and we support tor, but we have configured it to only use
196-
// tor when strictly necessary. In this case we will only connect over clearnet.
197-
clearnetAddresses
198-
case Some(params) if torAddresses.nonEmpty && params.useForTor =>
199-
// In all other cases, if they have a tor address and we support tor, we use tor.
200-
torAddresses
194+
case Some(params) if params.useForTor =>
195+
// The SOCKS5 proxy is enabled, and specifically configured to handle tor addresses.
196+
// This is the only case when we can connect to both tor and clearnet.
197+
nodeAddresses
201198
case _ =>
202199
// Otherwise, if we don't support tor or they don't have a tor address, we use clearnet.
203200
clearnetAddresses

eclair-core/src/test/scala/fr/acinq/eclair/io/ReconnectionTaskSpec.scala

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,18 +247,29 @@ class ReconnectionTaskSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike
247247
nodeParams.socksProxy_opt returns Some(socksParams)
248248
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(clearnet)).contains(clearnet))
249249
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(tor)).contains(tor))
250-
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(clearnet, tor)).contains(clearnet))
250+
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(clearnet, tor)).exists(Set(clearnet, tor)(_)))
251251
}
252252
{
253-
// tor supported and enabled for clearnet addresses: return tor addresses when available
253+
// tor supported and enabled for clearnet addresses: return both tor and clearnet addresses when available
254254
val socksParams = mock[Socks5ProxyParams]
255255
socksParams.useForTor returns true
256256
socksParams.useForIPv4 returns true
257257
socksParams.useForIPv6 returns true
258258
nodeParams.socksProxy_opt returns Some(socksParams)
259259
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(clearnet)).contains(clearnet))
260260
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(tor)).contains(tor))
261-
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(clearnet, tor)).contains(tor))
261+
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(clearnet, tor)).exists(Set(clearnet, tor)(_)))
262+
}
263+
{
264+
// tor supported and enabled for clearnet addresses, but disabled for tor: return clearnet addresses when available
265+
val socksParams = mock[Socks5ProxyParams]
266+
socksParams.useForTor returns false
267+
socksParams.useForIPv4 returns true
268+
socksParams.useForIPv6 returns true
269+
nodeParams.socksProxy_opt returns Some(socksParams)
270+
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(clearnet)).contains(clearnet))
271+
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(tor)).isEmpty)
272+
assert(ReconnectionTask.selectNodeAddress(nodeParams, List(clearnet, tor)).contains(clearnet))
262273
}
263274
}
264275

0 commit comments

Comments
 (0)