[tor-commits] [stem/master] netstat support for ipv6 addresses

atagar at torproject.org atagar at torproject.org
Sun Jan 24 23:40:06 UTC 2016


commit fc96d4528f26abc9c1a992177c51a92b8c3b04c8
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Jan 24 12:34:34 2016 -0800

    netstat support for ipv6 addresses
    
    Supporting ipv6 addresses for the netstat resolver. Only bits we needed was the
    '-W' flag to avoid address truncation and converting 'tcp6' to 'tcp'. Thanks to
    both cypherpunks and toralf on...
    
      https://trac.torproject.org/projects/tor/ticket/18079#comment:11
---
 stem/util/connection.py      |   11 ++++++-----
 test/unit/util/connection.py |   23 +++++++++++++++++++++++
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/stem/util/connection.py b/stem/util/connection.py
index 567ca9e..ea7819e 100644
--- a/stem/util/connection.py
+++ b/stem/util/connection.py
@@ -84,8 +84,8 @@ PORT_USES = None  # port number => description
 RESOLVER_COMMAND = {
   Resolver.PROC: '',
 
-  # -n = prevents dns lookups, -p = include process
-  Resolver.NETSTAT: 'netstat -np',
+  # -n = prevents dns lookups, -p = include process, -W = don't crop addresses (needed for ipv6)
+  Resolver.NETSTAT: 'netstat -npW',
 
   # -a = show all TCP/UDP connections, -n = numeric addresses and ports, -o = include pid
   Resolver.NETSTAT_WINDOWS: 'netstat -ano',
@@ -154,9 +154,7 @@ def get_connections(resolver, process_pid = None, process_name = None):
   .. versionadded:: 1.1.0
 
   .. versionchanged:: 1.5.0
-     Basic IPv6 support. This is incomplete in that resolver commands we run
-     may not surface IPv6 connections. But when present this function now
-     includes them in our results.
+     IPv6 support when resolving via netstat, lsof, or ss.
 
   :param Resolver resolver: method of connection resolution to use
   :param int process_pid: pid of the process to retrieve
@@ -243,6 +241,9 @@ def get_connections(resolver, process_pid = None, process_name = None):
 
       protocol = attr['protocol'].lower()
 
+      if protocol == 'tcp6':
+        protocol = 'tcp'
+
       if protocol not in ('tcp', 'udp'):
         _log('Unrecognized protocol (%s): %s' % (protocol, line))
         continue
diff --git a/test/unit/util/connection.py b/test/unit/util/connection.py
index 2baedc5..e645c72 100644
--- a/test/unit/util/connection.py
+++ b/test/unit/util/connection.py
@@ -32,6 +32,16 @@ unix  3      [ ]         STREAM     CONNECTED     34164276 15843/tor
 unix  3      [ ]         STREAM     CONNECTED     7951     -
 """
 
+NETSTAT_IPV6_OUTPUT = """\
+Active Internet connections (w/o servers)
+Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
+tcp6       0      0 5.9.158.75:5222         80.171.220.248:48910    ESTABLISHED 9820/beam
+tcp6       0      0 2a01:4f8:190:514a::2:443 2001:638:a000:4140::ffff:189:41046 ESTABLISHED 1904/tor
+tcp6       0      0 5.9.158.75:5269         146.255.57.226:38703    ESTABLISHED 9820/beam
+tcp6       0      0 2a01:4f8:190:514a::2:443 2001:858:2:2:aabb:0:563b:1526:38260 ESTABLISHED 1904/tor
+tcp6       0      0 5.9.158.75:5222         80.171.220.248:48966    ESTABLISHED 9820/beam
+"""
+
 NETSTAT_WINDOWS_OUTPUT = """\
 Active Connections
 
@@ -215,6 +225,19 @@ class TestConnection(unittest.TestCase):
     call_mock.side_effect = OSError('Unable to call netstat')
     self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.NETSTAT, process_pid = 1111)
 
+  @patch('stem.util.system.call', Mock(return_value = NETSTAT_IPV6_OUTPUT.split('\n')))
+  def test_get_connections_by_netstat_ipv6(self):
+    """
+    Checks the get_connections function with the netstat resolver for IPv6.
+    """
+
+    expected = [
+      Connection('2a01:4f8:190:514a::2', 443, '2001:638:a000:4140::ffff:189', 41046, 'tcp', True),
+      Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526', 38260, 'tcp', True),
+    ]
+
+    self.assertEqual(expected, stem.util.connection.get_connections(Resolver.NETSTAT, process_pid = 1904, process_name = 'tor'))
+
   @patch('stem.util.system.call')
   def test_get_connections_by_windows_netstat(self, call_mock):
     """





More information about the tor-commits mailing list