diff --git a/electrum/interface.py b/electrum/interface.py index 9cf0d5a0b5b4..12802111fa6b 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -28,6 +28,7 @@ import sys import traceback import asyncio +import secrets import socket from typing import Tuple, Union, List, TYPE_CHECKING, Optional from collections import defaultdict @@ -62,6 +63,15 @@ BUCKET_NAME_OF_ONION_SERVERS = 'onion' +# Random authentication is useful when used with Tor for stream isolation. +class SOCKSRandomAuth(aiorpcx.socks.SOCKSUserAuth): + def __getitem__(self, key): + return secrets.token_hex(32) + + +SOCKSRandomAuth.__new__.__defaults__ = (None, None) + + class NetworkTimeout: # seconds class Generic: @@ -252,7 +262,7 @@ def _set_proxy(self, proxy: dict): if proxy: username, pw, isolate = proxy.get('user'), proxy.get('password'), proxy.get('isolate') if isolate: - auth = aiorpcx.socks.SOCKSRandomAuth() + auth = SOCKSRandomAuth() elif not username or not pw: auth = None else: