tinterface: fix connecting to raw IPv6 (as hostname) on Windows - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit a13344938f0f8308651612efc86921a0e9b97602 DIR parent cee208313494ed5978e7a6c62c3b13c9583c6c93 HTML Author: SomberNight <somber.night@protonmail.com> Date: Wed, 27 Nov 2019 13:08:22 +0100 interface: fix connecting to raw IPv6 (as hostname) on Windows Changed cert pinning filename as on Windows paths cannot contain a colon ':'. Diffstat: M electrum/interface.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) --- DIR diff --git a/electrum/interface.py b/electrum/interface.py t@@ -55,6 +55,7 @@ from .logging import Logger if TYPE_CHECKING: from .network import Network + from .simple_config import SimpleConfig ca_path = certifi.where() t@@ -206,6 +207,18 @@ def serialize_server(host: str, port: Union[str, int], protocol: str) -> str: return str(':'.join([host, str(port), protocol])) +def _get_cert_path_for_host(*, config: 'SimpleConfig', host: str) -> str: + filename = host + try: + ip = ip_address(host) + except ValueError: + pass + else: + if isinstance(ip, IPv6Address): + filename = f"ipv6_{ip.packed.hex()}" + return os.path.join(config.path, 'certs', filename) + + class Interface(Logger): LOGGING_SHORTCUT = 'i' t@@ -218,7 +231,7 @@ class Interface(Logger): self.port = int(self.port) Logger.__init__(self) assert network.config.path - self.cert_path = os.path.join(network.config.path, 'certs', self.host) + self.cert_path = _get_cert_path_for_host(config=network.config, host=self.host) self.blockchain = None # type: Optional[Blockchain] self._requested_chunks = set() self.network = network