[flashproxy/master] Rename proxy_addr → remote_addr because it could be a proxy or a client.

dcf at torproject.org dcf at torproject.org
Thu Dec 20 02:33:53 UTC 2012


commit fe80b0fd55a2a5a0c091edb6aadf61595a144667
Author: David Fifield <david at bamsoftware.com>
Date:   Wed Dec 19 18:31:17 2012 -0800

    Rename proxy_addr → remote_addr because it could be a proxy or a client.
---
 facilitator/facilitator     |   29 +++++++++++++++++++++++++++--
 facilitator/facilitator.cgi |   10 +++++-----
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/facilitator/facilitator b/facilitator/facilitator
index af2c04c..bc47281 100755
--- a/facilitator/facilitator
+++ b/facilitator/facilitator
@@ -234,7 +234,30 @@ class Handler(SocketServer.StreamRequestHandler):
         print >> self.wfile, "ERROR"
 
     def do_GET(self, params):
-        reg = REGS.fetch()
+        # Get the proxy's address so we know what kind of client to give it
+        # (IPv4 or IPv6).
+        proxy_spec = fac.param_first("FROM", params)
+        if proxy_spec is None:
+            log(u"GET missing FROM param")
+            self.send_error()
+            return False
+        try:
+            _, _, af = fac.parse_addr_spec_af(proxy_spec, defport=0)
+        except ValueError, e:
+            log(u"syntax error in proxy address %s: %s" % (safe_str(repr(proxy_spec)), safe_str(repr(str(e)))))
+            self.send_error()
+            return False
+
+        if af == socket.AF_INET:
+            regs = REGS_IPV4
+        elif af == socket.AF_INET6:
+            regs = REGS_IPV6
+        else:
+            log(u"unknown address family %d in proxy address %s" % (af, safe_str(repr(proxy_spec))))
+            self.send_error()
+            return False
+
+        reg = regs.fetch()
         if reg:
             log(u"proxy gets %s, relay %s (now %d)" %
                 (safe_str(unicode(reg)), options.relay_spec, len(REGS)))
@@ -273,7 +296,9 @@ class Handler(SocketServer.StreamRequestHandler):
 class Server(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
     allow_reuse_address = True
 
-REGS = RegSet()
+# Separate pools for IPv4 and IPv6 clients.
+REGS_IPV4 = RegSet()
+REGS_IPV6 = RegSet()
 
 def main():
     opts, args = getopt.gnu_getopt(sys.argv[1:], "dhl:p:r:",
diff --git a/facilitator/facilitator.cgi b/facilitator/facilitator.cgi
index f35c9a3..c21e67d 100755
--- a/facilitator/facilitator.cgi
+++ b/facilitator/facilitator.cgi
@@ -17,10 +17,10 @@ Status: %d\r
     sys.exit()
 
 method = os.environ.get("REQUEST_METHOD")
-proxy_addr = (os.environ.get("REMOTE_ADDR"), None)
+remote_addr = (os.environ.get("REMOTE_ADDR"), None)
 path_info = os.environ.get("PATH_INFO") or "/"
 
-if not method or not proxy_addr[0]:
+if not method or not remote_addr[0]:
     exit_error(400)
 
 fs = cgi.FieldStorage()
@@ -29,7 +29,7 @@ def do_get():
     if path_info != "/":
         exit_error(400)
     try:
-        reg = fac.get_reg(FACILITATOR_ADDR, proxy_addr) or ""
+        reg = fac.get_reg(FACILITATOR_ADDR, remote_addr) or ""
     except:
         exit_error(500)
     # Allow XMLHttpRequest from any domain. http://www.w3.org/TR/cors/.
@@ -49,10 +49,10 @@ def do_post():
         exit_error(400)
     client_spec = client_specs[0].strip()
     try:
-        client_addr = fac.parse_addr_spec(client_spec, defhost=proxy_addr[0])
+        client_addr = fac.parse_addr_spec(client_spec, defhost=remote_addr[0])
     except ValueError:
         exit_error(400)
-    if not fac.put_reg(FACILITATOR_ADDR, client_addr, proxy_addr):
+    if not fac.put_reg(FACILITATOR_ADDR, client_addr, remote_addr):
         exit_error(500)
     print """\
 Status: 200\r





More information about the tor-commits mailing list