From a5b1cfd0244c1715b732438281b21d4aa0e5f3e1 Mon Sep 17 00:00:00 2001 From: gabrielmer <101006718+gabrielmer@users.noreply.github.com> Date: Tue, 17 Oct 2023 12:53:41 +0300 Subject: [PATCH] fix: consider WS extMultiAddrs before publishing host address (#2122) --- tests/test_waku_netconfig.nim | 23 +++++++++++++++++++++++ waku/node/config.nim | 15 +++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/tests/test_waku_netconfig.nim b/tests/test_waku_netconfig.nim index 5ecbd258f..0c02afab1 100644 --- a/tests/test_waku_netconfig.nim +++ b/tests/test_waku_netconfig.nim @@ -338,3 +338,26 @@ suite "Waku NetConfig": check: netConfig.enrMultiaddrs.contains(dns4TcpEndPoint(dns4DomainName, extPort)) + asyncTest "wsHostAddress is not announced if a WS address is provided in extMultiAddrs": + + let + conf = defaultTestWakuNodeConf() + extAddIp = ValidIpAddress.init("1.2.3.4") + extAddPort = Port(1234) + wssEnabled = false + extMultiAddrs = @[(ip4TcpEndPoint(extAddIp, extAddPort) & wsFlag(wssEnabled))] + + let netConfigRes = NetConfig.init( + bindIp = conf.listenAddress, + bindPort = conf.tcpPort, + extMultiAddrs = extMultiAddrs + ) + + assert netConfigRes.isOk(), $netConfigRes.error + + let netConfig = netConfigRes.get() + + check: + netConfig.announcedAddresses.len == 2 # Bind address + extAddress + netConfig.announcedAddresses[1] == extMultiAddrs[0] + diff --git a/waku/node/config.nim b/waku/node/config.nim index 71cfaf8bc..f90aaff1d 100644 --- a/waku/node/config.nim +++ b/waku/node/config.nim @@ -7,7 +7,7 @@ import std/[options, sequtils, strutils], stew/results, stew/shims/net, - libp2p/multiaddress + libp2p/[multiaddress, multicodec] import ../../waku/waku_core/peers import @@ -59,6 +59,16 @@ proc formatListenAddress(inputMultiAdd: MultiAddress): MultiAddress = # If MultiAddress contains "0.0.0.0", replace it for "127.0.0.1" return MultiAddress.init(inputStr.replace("0.0.0.0", "127.0.0.1")).get() +proc isWsAddress(ma: MultiAddress): bool = + let + isWs = ma.contains(multiCodec("ws")).get() + isWss = ma.contains(multiCodec("wss")).get() + + return isWs or isWss + +proc containsWsAddress(extMultiAddrs: seq[MultiAddress]): bool = + return extMultiAddrs.filterIt( it.isWsAddress() ).len > 0 + proc init*(T: type NetConfig, bindIp: ValidIpAddress, bindPort: Port, @@ -126,7 +136,8 @@ proc init*(T: type NetConfig, if wsExtAddress.isSome(): announcedAddresses.add(wsExtAddress.get()) - elif wsHostAddress.isSome(): + elif wsHostAddress.isSome() and not containsWsAddress(extMultiAddrs): + # Only publish wsHostAddress if a WS address is not set in extMultiAddrs announcedAddresses.add(wsHostAddress.get()) let