[tor-commits] [stem/master] Allow control connection to IPv6 addresses

atagar at torproject.org atagar at torproject.org
Fri Sep 11 01:26:40 UTC 2020


commit 1087ebf6dadad2cc3ee81ad5ba8dc35e327cb665
Author: Damian Johnson <atagar at torproject.org>
Date:   Thu Sep 10 18:20:04 2020 -0700

    Allow control connection to IPv6 addresses
    
    Controller.from_port() improperly rejects IPv6 addresses as invalid...
    
      https://github.com/torproject/stem/issues/74
    
    This expands a few other methods to allow IPv6 addresses as well.
---
 docs/change_log.rst | 1 +
 stem/connection.py  | 4 ++--
 stem/control.py     | 8 ++++----
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/docs/change_log.rst b/docs/change_log.rst
index bbd13ef5..5a9a8928 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -61,6 +61,7 @@ The following are only available within Stem's `git repository
   * Socket based control connections often raised BrokenPipeError when closed
   * Added :func:`~stem.control.Controller.add_hidden_service_auth`, :func:`~stem.control.Controller.remove_hidden_service_auth`, and :func:`~stem.control.Controller.list_hidden_service_auth` to the :class:`~stem.control.Controller`
   * Incorrect filesystem encoding broke latin-1 cookie path (:ticket:`57`)
+  * Allow control connection to IPv6 addresses (:ticket:`74`)
 
  * **Descriptors**
 
diff --git a/stem/connection.py b/stem/connection.py
index f5f92464..68cfda45 100644
--- a/stem/connection.py
+++ b/stem/connection.py
@@ -357,8 +357,8 @@ async def connect_async(control_port: Tuple[str, Union[str, int]] = ('127.0.0.1'
   elif control_port:
     if len(control_port) != 2:
       raise ValueError('The control_port argument for connect() should be an (address, port) tuple.')
-    elif not stem.util.connection.is_valid_ipv4_address(control_port[0]):
-      raise ValueError("'%s' isn't a vaid IPv4 address" % control_port[0])
+    elif not stem.util.connection.is_valid_ipv4_address(control_port[0]) and not stem.util.connection.is_valid_ipv6_address(control_port[0]):
+      raise ValueError("'%s' isn't a vaid address" % control_port[0])
     elif control_port[1] != 'default' and not stem.util.connection.is_valid_port(control_port[1]):
       raise ValueError("'%s' isn't a valid port" % control_port[1])
 
diff --git a/stem/control.py b/stem/control.py
index a232f4db..9a387f55 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -1072,7 +1072,7 @@ class Controller(BaseController):
 
     import stem.connection
 
-    if not stem.util.connection.is_valid_ipv4_address(address):
+    if not stem.util.connection.is_valid_ipv4_address(address) and not stem.util.connection.is_valid_ipv6_address(address):
       raise ValueError('Invalid IP address: %s' % address)
     elif port != 'default' and not stem.util.connection.is_valid_port(port):
       raise ValueError('Invalid port: %s' % port)
@@ -2611,7 +2611,7 @@ class Controller(BaseController):
 
         if not stem.util.connection.is_valid_port(port):
           raise stem.ProtocolError('GETCONF provided an invalid HiddenServicePort port (%s): %s' % (port, content))
-        elif not stem.util.connection.is_valid_ipv4_address(target_address):
+        elif not stem.util.connection.is_valid_ipv4_address(target_address) and not stem.util.connection.is_valid_ipv6_address(target_address):
           raise stem.ProtocolError('GETCONF provided an invalid HiddenServicePort target address (%s): %s' % (target_address, content))
         elif not stem.util.connection.is_valid_port(target_port):
           raise stem.ProtocolError('GETCONF provided an invalid HiddenServicePort target port (%s): %s' % (target_port, content))
@@ -2722,8 +2722,8 @@ class Controller(BaseController):
 
     if not stem.util.connection.is_valid_port(port):
       raise ValueError("%s isn't a valid port number" % port)
-    elif target_address and not stem.util.connection.is_valid_ipv4_address(target_address):
-      raise ValueError("%s isn't a valid IPv4 address" % target_address)
+    elif target_address and not stem.util.connection.is_valid_ipv4_address(target_address) and not stem.util.connection.is_valid_ipv6_address(target_address):
+      raise ValueError("%s isn't a valid IP address" % target_address)
     elif target_port is not None and not stem.util.connection.is_valid_port(target_port):
       raise ValueError("%s isn't a valid port number" % target_port)
     elif auth_type not in (None, 'basic', 'stealth'):



More information about the tor-commits mailing list