From 2290650faab28be33cc99dc730e089de62d8421c Mon Sep 17 00:00:00 2001 From: f321x Date: Thu, 13 Feb 2025 14:55:09 +0100 Subject: [PATCH] pass proxy settings to aionostr Manager rebase on master --- electrum/submarine_swaps.py | 24 +++++++++++++++++++++--- electrum/util.py | 22 +++++++++++++--------- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py index 7392103d6..d3183e607 100644 --- a/electrum/submarine_swaps.py +++ b/electrum/submarine_swaps.py @@ -27,7 +27,8 @@ from .bitcoin import (script_to_p2wsh, opcodes, from .transaction import PartialTxInput, PartialTxOutput, PartialTransaction, Transaction, TxInput, TxOutpoint from .transaction import script_GetOp, match_script_against_template, OPPushDataGeneric, OPPushDataPubkey from .util import (log_exceptions, ignore_exceptions, BelowDustLimit, OldTaskGroup, age, ca_path, - gen_nostr_ann_pow, get_nostr_ann_pow_amount) + gen_nostr_ann_pow, get_nostr_ann_pow_amount, make_aiohttp_proxy_connector, get_running_loop, + get_asyncio_loop) from .lnutil import REDEEM_AFTER_DOUBLE_SPENT_DELAY from .bitcoin import dust_threshold, DummyAddress from .logging import Logger @@ -53,6 +54,7 @@ if TYPE_CHECKING: from .lnworker import LNWallet from .lnchannel import Channel from .simple_config import SimpleConfig + from aiohttp_socks import ProxyConnector @@ -1322,8 +1324,8 @@ class NostrTransport(SwapServerTransport): self.nostr_private_key = to_nip19('nsec', keypair.privkey.hex()) self.nostr_pubkey = keypair.pubkey.hex()[2:] self.dm_replies = defaultdict(asyncio.Future) # type: Dict[bytes, asyncio.Future] - ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=ca_path) - self.relay_manager = aionostr.Manager(self.relays, private_key=self.nostr_private_key, log=self.logger, ssl_context=ssl_context) + self.ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=ca_path) + self.relay_manager = None self.taskgroup = OldTaskGroup() self.server_relays = None @@ -1339,6 +1341,7 @@ class NostrTransport(SwapServerTransport): async def main_loop(self): self.logger.info(f'starting nostr transport with pubkey: {self.nostr_pubkey}') self.logger.info(f'nostr relays: {self.relays}') + self.relay_manager = self.get_relay_manager() await self.relay_manager.connect() connected_relays = self.relay_manager.relays self.logger.info(f'connected relays: {[relay.url for relay in connected_relays]}') @@ -1375,6 +1378,21 @@ class NostrTransport(SwapServerTransport): def relays(self): return self.network.config.NOSTR_RELAYS.split(',') + def get_relay_manager(self): + assert get_running_loop() == get_asyncio_loop(), f"this must be run on the asyncio thread!" + if not self.relay_manager: + if self.network.proxy: + proxy = make_aiohttp_proxy_connector(self.network.proxy, self.ssl_context) + else: + proxy: Optional['ProxyConnector'] = None + return aionostr.Manager( + self.relays, + private_key=self.nostr_private_key, + log=self.logger, + ssl_context=self.ssl_context, + proxy=proxy) + return self.relay_manager + def get_offer(self, pubkey): offer = self._offers.get(pubkey) return self._parse_offer(offer) diff --git a/electrum/util.py b/electrum/util.py index f505a225a..571307223 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -1313,6 +1313,18 @@ def format_short_id(short_channel_id: Optional[bytes]): + 'x' + str(int.from_bytes(short_channel_id[6:], 'big')) +def make_aiohttp_proxy_connector(proxy: 'ProxySettings', ssl_context: Optional[ssl.SSLContext] = None) -> ProxyConnector: + return ProxyConnector( + proxy_type=ProxyType.SOCKS5 if proxy.mode == 'socks5' else ProxyType.SOCKS4, + host=proxy.host, + port=int(proxy.port), + username=proxy.user, + password=proxy.password, + rdns=True, # needed to prevent DNS leaks over proxy + ssl=ssl_context, + ) + + def make_aiohttp_session(proxy: Optional['ProxySettings'], headers=None, timeout=None): if headers is None: headers = {'User-Agent': 'Electrum'} @@ -1325,15 +1337,7 @@ def make_aiohttp_session(proxy: Optional['ProxySettings'], headers=None, timeout ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=ca_path) if proxy and proxy.enabled: - connector = ProxyConnector( - proxy_type=ProxyType.SOCKS5 if proxy.mode == 'socks5' else ProxyType.SOCKS4, - host=proxy.host, - port=int(proxy.port), - username=proxy.user, - password=proxy.password, - rdns=True, # needed to prevent DNS leaks over proxy - ssl=ssl_context, - ) + connector = make_aiohttp_proxy_connector(proxy, ssl_context) else: connector = aiohttp.TCPConnector(ssl=ssl_context)