fix: prevent IP 0.0.0.0 from being published and update peers with empty ENR data (#1982)

This commit is contained in:
gabrielmer 2023-09-11 11:30:12 +03:00 committed by GitHub
parent 645b034367
commit 47ae19c104
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 43 additions and 9 deletions

View File

@ -5,7 +5,8 @@ import
./waku_core/test_namespaced_topics,
./waku_core/test_time,
./waku_core/test_message_digest,
./waku_core/test_peers
./waku_core/test_peers,
./waku_core/test_published_address
# Waku archive test suite

View File

@ -0,0 +1,27 @@
{.used.}
import
stew/shims/net as stewNet,
std/strutils,
testutils/unittests
import
../testlib/wakucore,
../testlib/wakunode
suite "Waku Core - Published Address":
test "Test IP 0.0.0.0":
let
node = newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init(
"0.0.0.0"),Port(0))
check:
($node.announcedAddresses).contains("127.0.0.1")
test "Test custom IP":
let
node = newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init(
"8.8.8.8"),Port(0))
check:
($node.announcedAddresses).contains("8.8.8.8")

View File

@ -31,10 +31,10 @@ procSuite "Waku v2 JSON-RPC API - Admin":
asyncTest "connect to ad-hoc peers":
# Create a couple of nodes
let
node1 = newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init("0.0.0.0"), Port(60600))
node2 = newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init("0.0.0.0"), Port(60602))
node1 = newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init("127.0.0.1"), Port(60600))
node2 = newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init("127.0.0.1"), Port(60602))
peerInfo2 = node2.switch.peerInfo
node3 = newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init("0.0.0.0"), Port(60604))
node3 = newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init("127.0.0.1"), Port(60604))
peerInfo3 = node3.switch.peerInfo
await allFutures([node1.start(), node2.start(), node3.start()])
@ -90,7 +90,7 @@ procSuite "Waku v2 JSON-RPC API - Admin":
asyncTest "get managed peer information":
# Create 3 nodes and start them with relay
let nodes = toSeq(0..<3).mapIt(newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init("0.0.0.0"), Port(60220+it*2)))
let nodes = toSeq(0..<3).mapIt(newTestWakuNode(generateSecp256k1Key(), ValidIpAddress.init("127.0.0.1"), Port(60220+it*2)))
await allFutures(nodes.mapIt(it.start()))
await allFutures(nodes.mapIt(it.mountRelay()))

View File

@ -4,7 +4,7 @@ else:
{.push raises: [].}
import
std/[options, sequtils],
std/[options, sequtils, strutils],
stew/results,
stew/shims/net,
libp2p/multiaddress
@ -53,6 +53,11 @@ template wsFlag(wssEnabled: bool): MultiAddress =
else: MultiAddress.init("/ws").tryGet()
proc formatListenAddress(inputMultiAdd: MultiAddress): MultiAddress =
let inputStr = $inputMultiAdd
# 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 init*(T: type NetConfig,
bindIp: ValidIpAddress,
bindPort: Port,
@ -111,7 +116,7 @@ proc init*(T: type NetConfig,
if hostExtAddress.isSome():
announcedAddresses.add(hostExtAddress.get())
else:
announcedAddresses.add(hostAddress) # We always have at least a bind address for the host
announcedAddresses.add(formatListenAddress(hostAddress)) # We always have at least a bind address for the host
# External multiaddrs that the operator may have configured
if extMultiAddrs.len > 0:

View File

@ -121,8 +121,9 @@ proc addPeer*(pm: PeerManager, remotePeerInfo: RemotePeerInfo, origin = UnknownO
discard remotePeerInfo.peerId.extractPublicKey(publicKey)
if pm.peerStore[AddressBook][remotePeerInfo.peerId] == remotePeerInfo.addrs and
pm.peerStore[KeyBook][remotePeerInfo.peerId] == publicKey:
# Peer already managed
pm.peerStore[KeyBook][remotePeerInfo.peerId] == publicKey and
pm.peerStore[ENRBook][remotePeerInfo.peerId].raw.len > 0:
# Peer already managed and ENR info is already saved
return
trace "Adding peer to manager", peerId = remotePeerInfo.peerId, addresses = remotePeerInfo.addrs