1
0

lnpeermgr: add_peer: fix check if proxy enabled

LNPeerManager.add_peer would only check if self.network.proxy is set,
which it is always as Network is initialized with self.proxy =
ProxySettings(). Instead it should check if proxy is set and enabled.
This commit is contained in:
f321x
2026-01-27 12:49:19 +01:00
parent cfe2a57f2c
commit db6b6a16f8
3 changed files with 63 additions and 2 deletions

View File

@@ -588,7 +588,7 @@ class LNPeerManager(Logger, EventListener, NetworkRetryManager[LNPeerAddr]):
host, port, timestamp = self.choose_preferred_address(list(addrs)) host, port, timestamp = self.choose_preferred_address(list(addrs))
port = int(port) port = int(port)
if not self.network.proxy: if not self.network.proxy or not self.network.proxy.enabled:
# Try DNS-resolving the host (if needed). This is simply so that # Try DNS-resolving the host (if needed). This is simply so that
# the caller gets a nice exception if it cannot be resolved. # the caller gets a nice exception if it cannot be resolved.
# (we don't do the DNS lookup if a proxy is set, to avoid a DNS-leak) # (we don't do the DNS lookup if a proxy is set, to avoid a DNS-leak)

View File

@@ -26,7 +26,7 @@ from electrum import bitcoin
from electrum import util from electrum import util
from electrum import constants from electrum import constants
from electrum import bip32 from electrum import bip32
from electrum.network import Network from electrum.network import Network, ProxySettings
from electrum import simple_config, lnutil from electrum import simple_config, lnutil
from electrum.lnaddr import lnencode, LnAddr, lndecode from electrum.lnaddr import lnencode, LnAddr, lndecode
from electrum.bitcoin import COIN, sha256 from electrum.bitcoin import COIN, sha256
@@ -71,6 +71,7 @@ class MockNetwork:
self.path_finder = LNPathFinder(self.channel_db) self.path_finder = LNPathFinder(self.channel_db)
self.lngossip = MockLNGossip() self.lngossip = MockLNGossip()
self.tx_queue = asyncio.Queue() self.tx_queue = asyncio.Queue()
self.proxy = ProxySettings()
self._blockchain = MockBlockchain() self._blockchain = MockBlockchain()
def get_local_height(self): def get_local_height(self):

60
tests/test_lnpeermgr.py Normal file
View File

@@ -0,0 +1,60 @@
import logging
import os
import socket
import asyncio
from unittest import mock
from . import ElectrumTestCase
from electrum.lntransport import ConnStringFormatError
from electrum.logging import console_stderr_handler
class TestLNPeerManager(ElectrumTestCase):
TESTNET = True
@classmethod
def setUpClass(cls):
super().setUpClass()
console_stderr_handler.setLevel(logging.DEBUG)
async def asyncSetUp(self):
lnwallet = self.create_mock_lnwallet(name='mock_lnwallet_anchors', has_anchors=True)
self.lnpeermgr = lnwallet.lnpeermgr
await super().asyncSetUp()
async def test_add_peer_conn_string_errors(self):
unknown_node_id = os.urandom(33)
peermgr = self.lnpeermgr
peermgr._add_peer = mock.Mock(side_effect=NotImplementedError)
# Trampoline enabled, unknown node (no address in trampolines)
channel_db = peermgr.network.channel_db
peermgr.network.channel_db = None
try:
with self.assertRaises(ConnStringFormatError) as cm:
await peermgr.add_peer(unknown_node_id.hex())
self.assertIn("Address unknown for node", str(cm.exception))
finally:
peermgr.network.channel_db = channel_db # re-set channel db
# Trampoline disabled, unknown node (no address in channel_db)
with mock.patch.object(peermgr.network.channel_db, 'get_node_addresses', return_value=[]):
with self.assertRaises(ConnStringFormatError) as cm:
await peermgr.add_peer(unknown_node_id.hex())
self.assertIn("Don't know any addresses for node", str(cm.exception))
# .onion address, but no proxy configured
onion_conn_str = unknown_node_id.hex() + "@somewhere.onion:9735"
self.assertFalse(peermgr.network.proxy.enabled)
with self.assertRaises(ConnStringFormatError) as cm:
await peermgr.add_peer(onion_conn_str)
self.assertIn(".onion address, but no proxy configured", str(cm.exception))
# Hostname does not resolve (getaddrinfo failed)
bad_host_conn_str = unknown_node_id.hex() + "@badhost:9735"
loop = asyncio.get_running_loop()
with mock.patch.object(loop, 'getaddrinfo', side_effect=socket.gaierror):
with self.assertRaises(ConnStringFormatError) as cm:
await peermgr.add_peer(bad_host_conn_str)
self.assertIn("Hostname does not resolve", str(cm.exception))