commit 1bcaf8328e5285b3648f9714d0cd15d3ba183d32 Author: aagbsn aagbsn@extc.org Date: Thu May 24 16:20:54 2012 -0700
4297 - Move filter functions to Filters.py --- lib/bridgedb/Dist.py | 30 ++++------------------- lib/bridgedb/Filters.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++ lib/bridgedb/Server.py | 25 ++----------------- lib/bridgedb/Tests.py | 45 ++++------------------------------- 4 files changed, 73 insertions(+), 86 deletions(-)
diff --git a/lib/bridgedb/Dist.py b/lib/bridgedb/Dist.py index d393ee2..c151bbc 100644 --- a/lib/bridgedb/Dist.py +++ b/lib/bridgedb/Dist.py @@ -14,6 +14,9 @@ import re import time from ipaddr import IPv6Address, IPAddress
+from bridgedb.Filters import filterAssignBridgesToRing +from bridgedb.Filters import filterBridgesByRules + def uniformMap(ip): """Map an IP to an arbitrary 'area' string, such that any two /24 addresses get the same string. @@ -54,24 +57,15 @@ class IPBasedDistributor(bridgedb.Bridges.BridgeHolder): key4 = bridgedb.Bridges.get_hmac(key, "Assign-Areas-To-Rings") self.areaClusterHmac = bridgedb.Bridges.get_hmac_fn(key4, hex=True)
- # add splitter and cache the default rings - # plus leave room for dynamic filters + # add splitter and cache the default rings + # plus leave room for dynamic filters ring_cache_size = nClusters + len(ipCategories) + 5 self.splitter = bridgedb.Bridges.FilteredBridgeSplitter(key2, max_cached_rings=ring_cache_size)
logging.debug("added splitter %s" % self.splitter)
- # assign bridges using a filter function - def filterAssignBridgesToRing(hmac, numRings, assignedRing): - def f(bridge): - digest = hmac(bridge.getID()) - pos = long( digest[:8], 16 ) - which = pos % numRings - if which == assignedRing: return True - return False - return f - + # assign bridges using a filter function for n in xrange(nClusters): key1 = bridgedb.Bridges.get_hmac(key, "Order-Bridges-In-Ring-%d"%n) ring = bridgedb.Bridges.BridgeRing(key1, answerParameters) @@ -139,12 +133,6 @@ class IPBasedDistributor(bridgedb.Bridges.BridgeHolder): _,ring = self.splitter.filterRings[ruleset] else: logging.debug("Cache miss %s" % ruleset) - def filterBridgesByRules(rules): - def g(x): - r = [f(x) for f in rules] - if False in r: return False - return True - return g # add new ring #XXX what key do we use here? does it matter? key1 = bridgedb.Bridges.get_hmac(self.splitter.key, str(bridgeFilterRules)) @@ -365,12 +353,6 @@ class EmailBasedDistributor(bridgedb.Bridges.BridgeHolder): else: # cache miss, add new ring logging.debug("Cache miss %s" % ruleset) - def filterBridgesByRules(rules): - def g(x): - r = [f(x) for f in rules] - if False in r: return False - return True - return g # add new ring #XXX what key do we use here? does it matter? key1 = bridgedb.Bridges.get_hmac(self.splitter.key, diff --git a/lib/bridgedb/Filters.py b/lib/bridgedb/Filters.py new file mode 100644 index 0000000..72e9004 --- /dev/null +++ b/lib/bridgedb/Filters.py @@ -0,0 +1,59 @@ +# BridgeDB by Nick Mathewson. +# Copyright (c) 2007-2012, The Tor Project, Inc. +# See LICENSE for licensing information + +from ipaddr import IPv6Address, IPv4Address + +def filterAssignBridgesToRing(hmac, numRings, assignedRing): + def f(bridge): + digest = hmac(bridge.getID()) + pos = long( digest[:8], 16 ) + which = pos % numRings + if which == assignedRing: return True + return False + return f + +def filterBridgesByRules(rules): + def g(x): + r = [f(x) for f in rules] + if False in r: return False + return True + return g + +def filterBridgesByIP4(bridge): + try: + if IPv4Address(bridge.ip): return True + except ValueError: + pass + + for k in bridge.or_addresses.keys(): + if type(k) is IPv4Address: + return True + return False + +def filterBridgesByIP6(bridge): + try: + if IPv6Address(bridge.ip): return True + except ValueError: + pass + + for k in bridge.or_addresses.keys(): + if type(k) is IPv6Address: + return True + return False + +def filterBridgesByOnlyIP4(bridge): + for k in bridge.or_addresses.keys(): + if type(k) is IPv6Address: + return False + if type(k) is IPv4Address: + return True + return False + +def filterBridgesByOnlyIP6(bridge): + for k in bridge.or_addresses.keys(): + if type(k) is IPv4Address: + return False + if type(k) is IPv6Address: + return True + return False diff --git a/lib/bridgedb/Server.py b/lib/bridgedb/Server.py index a2460b8..2de1289 100644 --- a/lib/bridgedb/Server.py +++ b/lib/bridgedb/Server.py @@ -33,6 +33,9 @@ import base64 import textwrap from ipaddr import IPv4Address, IPv6Address from bridgedb.Dist import BadEmail, TooSoonEmail, IgnoreEmail + +from bridgedb.Filters import filterBridgesByIP6 +from bridgedb.Filters import filterBridgesByIP4
try: import GeoIP @@ -676,25 +679,3 @@ def getCCFromRequest(request): if len(path) == 2: return path.lower() return None - -def filterBridgesByIP4(bridge): - try: - if IPv4Address(bridge.ip): return True - except ValueError: - pass - - for k in bridge.or_addresses.keys(): - if type(k) is IPv4Address: - return True - return False - -def filterBridgesByIP6(bridge): - try: - if IPv6Address(bridge.ip): return True - except ValueError: - pass - - for k in bridge.or_addresses.keys(): - if type(k) is IPv6Address: - return True - return False diff --git a/lib/bridgedb/Tests.py b/lib/bridgedb/Tests.py index ead36fc..d989f7d 100644 --- a/lib/bridgedb/Tests.py +++ b/lib/bridgedb/Tests.py @@ -19,6 +19,11 @@ import bridgedb.Storage import re import ipaddr
+from bridgedb.Filters import filterBridgesByIP4 +from bridgedb.Filters import filterBridgesByIP6 +from bridgedb.Filters import filterBridgesByOnlyIP4 +from bridgedb.Filters import filterBridgesByOnlyIP6 + def suppressWarnings(): warnings.filterwarnings('ignore', '.*tmpnam.*')
@@ -201,12 +206,6 @@ class IPBridgeDistTests(unittest.TestCase): d.insert(fakeBridge6(or_addresses=True)) d.insert(fakeBridge(or_addresses=True))
- def filterBridgesByIP6(bridge): - for k in bridge.or_addresses.keys(): - if type(k) is ipaddr.IPv6Address: - return True - return False - for i in xrange(500): b = d.getBridgesForIP(randomIP(), "x", 1, bridgeFilterRules=[filterBridgesByIP6]) assert filterBridgesByIP6(random.choice(b)) @@ -217,12 +216,6 @@ class IPBridgeDistTests(unittest.TestCase): d.insert(fakeBridge6(or_addresses=True)) d.insert(fakeBridge(or_addresses=True))
- def filterBridgesByIP4(bridge): - for k in bridge.or_addresses.keys(): - if type(k) is ipaddr.IPv4Address: - return True - return False - for i in xrange(500): b = d.getBridgesForIP(randomIP(), "x", 1, bridgeFilterRules=[filterBridgesByIP4]) assert filterBridgesByIP4(random.choice(b)) @@ -233,18 +226,6 @@ class IPBridgeDistTests(unittest.TestCase): d.insert(fakeBridge6(or_addresses=True)) d.insert(fakeBridge(or_addresses=True))
- def filterBridgesByIP4(bridge): - for k in bridge.or_addresses.keys(): - if type(k) is ipaddr.IPv4Address: - return True - return False - - def filterBridgesByIP6(bridge): - for k in bridge.or_addresses.keys(): - if type(k) is ipaddr.IPv6Address: - return True - return False - for i in xrange(50): b = d.getBridgesForIP(randomIP(), "x", 1, bridgeFilterRules=[ filterBridgesByIP4, filterBridgesByIP6]) @@ -259,22 +240,6 @@ class IPBridgeDistTests(unittest.TestCase): d.insert(fakeBridge6(or_addresses=True)) d.insert(fakeBridge(or_addresses=True))
- def filterBridgesByOnlyIP4(bridge): - for k in bridge.or_addresses.keys(): - if type(k) is ipaddr.IPv6Address: - return False - if type(k) is ipaddr.IPv4Address: - return True - return False - - def filterBridgesByOnlyIP6(bridge): - for k in bridge.or_addresses.keys(): - if type(k) is ipaddr.IPv4Address: - return False - if type(k) is ipaddr.IPv6Address: - return True - return False - for i in xrange(5): b = d.getBridgesForIP(randomIP(), "x", 1, bridgeFilterRules=[ filterBridgesByOnlyIP4, filterBridgesByOnlyIP6])
tor-commits@lists.torproject.org