[tor-commits] [ooni-probe/master] Fix up @torify decorator by making it a descriptor

art at torproject.org art at torproject.org
Sat Feb 11 14:18:55 UTC 2012


commit 78e3bdd22288eed3ac5431f23060cb3b74f5f901
Author: Arturo Filastò <hellais at gmail.com>
Date:   Sat Feb 11 15:18:20 2012 +0100

    Fix up @torify decorator by making it a descriptor
---
 refactor/ooni-probe.conf  |    1 +
 refactor/plugoo.py        |   28 ++++++++++++++++++----------
 refactor/tests/bridget.py |   12 +++++++++++-
 3 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/refactor/ooni-probe.conf b/refactor/ooni-probe.conf
index 2e22961..e74b241 100644
--- a/refactor/ooni-probe.conf
+++ b/refactor/ooni-probe.conf
@@ -9,6 +9,7 @@ assetdir = assets/
 testdir = tests/
 
 loglevel = DEBUG
+proxyaddress = 127.0.0.1:9050
 
 # These are configurations specific to the tests that should be
 # run by ooni-probe
diff --git a/refactor/plugoo.py b/refactor/plugoo.py
index 20b418d..49b3e16 100644
--- a/refactor/plugoo.py
+++ b/refactor/plugoo.py
@@ -315,19 +315,27 @@ class Plugoo():
                     job.kill()
                 jobs = []
 
-def torify(socksaddr, modules=None):
+class torify(object):
     """This is the torify decorator. It should be used to
     decorate functions that should use to for connecting to
     the interwebz. The suggary syntax is the following:
-    @torify("127.0.0.1:9050", [urllib2])
+    @torify([urllib2])
     def myfunction():
         f = urllib2.urlopen('https://torproject.org/')
+    remember to set the proxyaddress in the config file.
     """
-    def decorator(target):
-        host, port = socksaddr.split(":")
-        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, host, int(port))
-        # Wrap the modules into socks
-        for module in modules:
-            socks.wrapmodule(module)
-        return target
-    return decorator
+    def __init__(self, f):
+        print f
+        self.f = f
+
+    def __get__(self, instance, owner):
+        self.modules = instance.modules
+        def decorator(*args):
+            print instance.config.main.proxyaddress
+            host, port = instance.config.main.proxyaddress.split(":")
+            socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, host, int(port))
+            # Wrap the modules into socks
+            for module in self.modules:
+                socks.wrapmodule(module)
+            return self.f(instance, *args)
+        return decorator
diff --git a/refactor/tests/bridget.py b/refactor/tests/bridget.py
index 2f6df2c..5ad16c0 100644
--- a/refactor/tests/bridget.py
+++ b/refactor/tests/bridget.py
@@ -23,7 +23,8 @@ import plugoo
 import gevent
 from gevent import socket
 import fcntl
-from plugoo import Plugoo, Asset
+from plugoo import Plugoo, Asset, torify
+import urllib2
 
 try:
     from TorCtl import TorCtl
@@ -38,6 +39,8 @@ class BridgeT(Plugoo):
     # This is the timeout value after which
     # we will give up
     timeout = 20
+    # These are the modules that should be torified
+    modules = [urllib2]
 
     def writetorrc(self, bridge):
         # register Tor to an ephemeral port
@@ -81,11 +84,18 @@ usemicrodescriptors 0
                 ret[cfield[0]] = ' '.join(cfield[1:])
         return ret
 
+    @torify
+    def download_file(self):
+        f = urllib2.urlopen('http://check.torproject.org')
+        print f.readlines()
+
+
     def connect(self, bridge, timeout=None):
         if not timeout:
             if self.config.tests.tor_bridges_timeout:
                 self.timeout = self.config.tests.tor_bridges_timeout
             timeout = self.timeout
+        self.download_file()
         torrc, tordir, controlport = self.writetorrc(bridge)
         cmd = ["tor", "-f", torrc]
 



More information about the tor-commits mailing list