[tor-commits] [stem/master] Fixing a bunch of things after cr #6951

atagar at torproject.org atagar at torproject.org
Mon Sep 24 16:03:45 UTC 2012


commit ddf7aa7a21bfc8418488b27e05fa7e53ef4f514c
Author: Ravi Chandra Padmala <neenaoffline at gmail.com>
Date:   Mon Sep 24 20:16:18 2012 +0530

    Fixing a bunch of things after cr #6951
    
    https://trac.torproject.org/projects/tor/ticket/6951
---
 stem/control.py                  |    3 +-
 stem/response/mapaddress.py      |    9 +++--
 test/integ/control/controller.py |    8 +++-
 test/runner.py                   |    2 +-
 test/settings.cfg                |    1 -
 test/unit/response/mapaddress.py |    3 +-
 test/util.py                     |   66 ++++++++++++++++++++++++++++++++++++++
 test/utils.py                    |   61 -----------------------------------
 8 files changed, 82 insertions(+), 71 deletions(-)

diff --git a/stem/control.py b/stem/control.py
index 8b407cb..a5a7868 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -1148,7 +1148,8 @@ class Controller(BaseController):
     :returns: dictionary with original -> replacement address mappings
     """
     
-    response = self.msg("MAPADDRESS %s" % " ".join([k + "=" + mapping[k] for k in mapping.iterkeys()]))
+    mapaddress_arg = " ".join(["%s=%s" % (k, v) for (k, v) in mapping.items()])
+    response = self.msg("MAPADDRESS %s" % mapaddress_arg)
     stem.response.convert("MAPADDRESS", response)
     
     return response.entries
diff --git a/stem/response/mapaddress.py b/stem/response/mapaddress.py
index 2d1a498..d4e33de 100644
--- a/stem/response/mapaddress.py
+++ b/stem/response/mapaddress.py
@@ -31,8 +31,9 @@ class MapAddressResponse(stem.response.ControlMessage):
     
     for code, _, message in self.content():
       if code == "250":
-        try: key, value = message.split("=", 1)
-        except ValueError: raise stem.socket.ProtocolError(None, "Not a mapping")
-        
-        self.entries[key] = value
+        try:
+          key, value = message.split("=", 1)
+          self.entries[key] = value
+        except ValueError:
+          raise stem.socket.ProtocolError(None, "MAPADDRESS returned '%s', which isn't a mapping" % message)
 
diff --git a/test/integ/control/controller.py b/test/integ/control/controller.py
index f8fd56e..2af68c3 100644
--- a/test/integ/control/controller.py
+++ b/test/integ/control/controller.py
@@ -409,6 +409,7 @@ class TestController(unittest.TestCase):
   def test_mapaddress(self):
     
     if test.runner.require_control(self): return
+    elif test.runner.require_online(self): return
     
     runner = test.runner.get_runner()
     
@@ -418,9 +419,12 @@ class TestController(unittest.TestCase):
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       s.connect(('127.0.0.1', int(controller.get_conf('SocksPort'))))
       test.utils.negotiate_socks(s, '1.2.1.2', 80)
-      s.sendall(test.utils.ip_request)
+      s.sendall(test.utils.ip_request) # make the http request for the ip address
       response = s.recv(1000)
+      
+      # everything after the blank line is the 'data' in a HTTP response.
+      # The response data for our request for request should be an IP address + '\n'
       ip_addr = response[response.find("\r\n\r\n"):].strip()
       
-      socket.inet_aton(ip_addr) # validate IP
+      stem.util.connection.is_valid_ip_address(ip_addr)
 
diff --git a/test/runner.py b/test/runner.py
index b748bfe..a372c42 100644
--- a/test/runner.py
+++ b/test/runner.py
@@ -69,7 +69,7 @@ ERROR_ATTR = (term.Color.RED, term.Attr.BOLD)
 
 BASE_TORRC = """# configuration for stem integration tests
 DataDirectory %s
-SocksPort 29327
+SocksPort 1112
 DownloadExtraInfo 1
 """
 
diff --git a/test/settings.cfg b/test/settings.cfg
index 75d5078..44e28ab 100644
--- a/test/settings.cfg
+++ b/test/settings.cfg
@@ -76,7 +76,6 @@ target.prereq RUN_PTRACE => TORRC_DISABLE_DEBUGGER_ATTACHMENT
 # means that each of these targets will have a dedicated integration test run.
 
 target.torrc RUN_NONE     => 
-target.torrc ONLINE       => PORT
 target.torrc RUN_OPEN     => PORT
 target.torrc RUN_PASSWORD => PORT, PASSWORD
 target.torrc RUN_COOKIE   => PORT, COOKIE
diff --git a/test/unit/response/mapaddress.py b/test/unit/response/mapaddress.py
index b8045c1..3c2a372 100644
--- a/test/unit/response/mapaddress.py
+++ b/test/unit/response/mapaddress.py
@@ -62,8 +62,8 @@ class TestMapAddressResponse(unittest.TestCase):
     
     control_message = mocking.get_message(UNRECOGNIZED_KEYS_RESPONSE)
     self.assertRaises(stem.socket.InvalidRequest, stem.response.convert, "MAPADDRESS", control_message)
-    control_message = mocking.get_message(UNRECOGNIZED_KEYS_RESPONSE)
     expected = { "23": "324" }
+    
     control_message = mocking.get_message(PARTIAL_FAILURE_RESPONSE)
     stem.response.convert("MAPADDRESS", control_message)
     self.assertEqual(expected, control_message.entries)
@@ -77,6 +77,7 @@ class TestMapAddressResponse(unittest.TestCase):
     
     control_message = mocking.get_message(INVALID_EMPTY_RESPONSE)
     self.assertRaises(stem.socket.ProtocolError, stem.response.convert, "MAPADDRESS", control_message)
+    
     control_message = mocking.get_message(INVALID_RESPONSE)
     self.assertRaises(stem.socket.ProtocolError, stem.response.convert, "MAPADDRESS", control_message)
 
diff --git a/test/util.py b/test/util.py
new file mode 100644
index 0000000..51e9bd9
--- /dev/null
+++ b/test/util.py
@@ -0,0 +1,66 @@
+import struct
+import socket
+
+from stem.socket import ProtocolError
+import test.runner
+
+error_msgs = {
+  0x5a: "SOCKS4A request granted",
+  0x5b: "SOCKS4A request rejected or failed",
+  0x5c: "SOCKS4A request failed because client is not running identd (or not reachable from the server)",
+  0x5d: "SOCKS4A request failed because client's identd could not confirm the user ID string in the request",
+}
+
+ip_request = """GET /ip HTTP/1.0
+Host: ifconfig.me
+Accept-Encoding: identity
+
+"""
+
+def external_ip(sock):
+  """
+  Returns the externally visible IP address when using a SOCKS4a proxy.
+  Negotiates the socks connection, connects to ipconfig.me and requests
+  http://ifconfig.me/ip to find out the externally visible IP.
+  
+  :param socket sock: socket connected to a SOCKS4a proxy server
+  
+  :returns: externally visible IP address, or None if it isn't able to
+  """
+  
+  try:
+    negotiate_socks(sock, "ifconfig.me", 80)
+    s.sendall(req)
+    response = s.recv(1000)
+    
+    # everything after the blank line is the 'data' in a HTTP response
+    # The response data for our request for request should be an IP address + '\n'
+    return response[response.find("\r\n\r\n"):].strip()
+  except:
+    pass
+
+def negotiate_socks(sock, host, port):
+  """
+  Negotiate with a socks4a server. Closes the socket and raises an exception on
+  failure.
+  
+  :param socket sock: socket connected to socks4a server
+  :param str host: host to connect to
+  :param int port: port to connect to
+  
+  :raises: :class:`stem.socket.ProtocolError` if the socks server doesn't grant our request
+  
+  :returns: a list with the IP address and the port that the proxy connected to
+  """
+  
+  # SOCKS4a request here - http://en.wikipedia.org/wiki/SOCKS#Protocol
+  request = "\x04\x01" + struct.pack("!H", port) + "\x00\x00\x00\x01" + "\x00" + host + "\x00"
+  sock.sendall(request)
+  response = sock.recv(8)
+  
+  if len(response) != 8 or response[0] != "\x00" or response[1] != "\x5a":
+    sock.close()
+    raise ProtocolError(error_msgs.get(response[1], "SOCKS server returned unrecognized error code"))
+  
+  return [socket.inet_ntoa(response[4:]), struct.unpack("!H", response[2:4])[0]]
+
diff --git a/test/utils.py b/test/utils.py
deleted file mode 100644
index 8ed9297..0000000
--- a/test/utils.py
+++ /dev/null
@@ -1,61 +0,0 @@
-import struct
-import socket
-
-from stem.socket import ProtocolError
-import test.runner
-
-error_msgs = {
-  0x5a: "SOCKS4A request granted",
-  0x5b: "SOCKS4A request rejected or failed",
-  0x5c: "SOCKS4A request failed because client is not running identd (or not reachable from the server)",
-  0x5d: "SOCKS4A request failed because client's identd could not confirm the user ID string in the request",
-}
-
-ip_request = """GET /ip HTTP/1.0
-Host: ifconfig.me
-Accept-Encoding: identity
-
-"""
-
-def external_ip(sock):
-  """
-  Returns the externally visible IP address when using a SOCKS4a proxy.
-  
-  :param socket sock: socket connected to a SOCKS4a proxy server
-  
-  :returns: externally visible IP address, or None if it isn't able to
-  """
-  
-  try:
-    negotiate_socks(sock, "ifconfig.me", 80)
-    s.sendall(req)
-    response = s.recv(1000)
-    
-    return response[response.find("\n\n"):].strip()
-  except:
-    pass
-
-def negotiate_socks(sock, host, port):
-  """
-  Negotiate with a socks4a server. Closes the socket and raises an exception on
-  failure.
-  
-  :param socket sock: socket connected to socks4a server
-  :param str host: host to connect to
-  :param int port: port to connect to
-  
-  :raises: :class:`stem.socket.ProtocolError` if the socks server doesn't grant our request
-  
-  :returns: a list with the IP address and the port that the proxy connected to
-  """
-  
-  request = "\x04\x01" + struct.pack("!H", port) + "\x00\x00\x00\x01" + "\x00" + host + "\x00"
-  sock.sendall(request)
-  response = sock.recv(8)
-  
-  if len(response) != 8 or response[0] != "\x00" or response[1] != "\x5a":
-    sock.close()
-    raise ProtocolError(error_msgs.get(response[1], "SOCKS server returned unrecognized error code"))
-  
-  return [socket.inet_ntoa(response[4:]), struct.unpack("!H", response[2:4])[0]]
-





More information about the tor-commits mailing list