[tor-commits] [bridgedb/master] Add bridgerequest module for abstracting info about bridge types requested.
isis at torproject.org
isis at torproject.org
Fri May 16 18:52:52 UTC 2014
commit 92ca7cbefe7eec0fe30452e47e752bd4fb820839
Author: Isis Lovecruft <isis at torproject.org>
Date: Mon May 5 19:13:39 2014 +0000
Add bridgerequest module for abstracting info about bridge types requested.
---
lib/bridgedb/bridgerequest.py | 128 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 128 insertions(+)
diff --git a/lib/bridgedb/bridgerequest.py b/lib/bridgedb/bridgerequest.py
new file mode 100644
index 0000000..4f32f67
--- /dev/null
+++ b/lib/bridgedb/bridgerequest.py
@@ -0,0 +1,128 @@
+# -*- coding: utf-8 ; test-case-name: bridgedb.test.test_bridgerequest ; -*-
+#_____________________________________________________________________________
+#
+# This file is part of BridgeDB, a Tor bridge distribution system.
+#
+# :authors: Isis Lovecruft 0xA3ADB67A2CDB8B35 <isis at torproject.org>
+# please also see AUTHORS file
+# :copyright: (c) 2007-2014, The Tor Project, Inc.
+# (c) 2014, Isis Lovecruft
+# :license: see LICENSE for licensing information
+#_____________________________________________________________________________
+
+
+import logging
+
+import ipaddr
+
+from zope.interface import implements
+from zope.interface import Attribute
+from zope.interface import Interface
+
+from bridgedb import Filters
+
+
+class IBridgeRequest(Interface):
+ """Interface specification of client options for requested bridges."""
+
+ addressClass = Attribute(
+ "The IP version of bridges addresses to distribute to the client.")
+ filters = Attribute(
+ "A list of callables used to filter bridges from a hashring.")
+ transports = Attribute(
+ "A list of strings of Pluggable Transport types requested.")
+ notBlockedIn = Attribute(
+ "A list of 2-4 letter country codes. The distributed bridges should "
+ "not be blocked in these countries.")
+ valid = Attribute(
+ "A boolean. Should be ``True`` if the client's request was valid.")
+
+ def addFilter():
+ """Add a filter to the list of ``filters``."""
+
+ def clearFilters():
+ """Clear the list of ``filters``."""
+
+ def generateFilters():
+ """Build the list of callables, ``filters``, according to the current
+ contents of the lists of ``transports``, ``notBlockedIn``, and the
+ ``addressClass``.
+ """
+
+ def isValid():
+ """Determine if the request is ``valid`` according to some parameters."""
+
+ def withIPv4():
+ """Set the ``addressClass`` to IPv4."""
+
+ def withIPv6():
+ """Set the ``addressClass`` to IPv6."""
+
+ def withPluggableTransportType(typeOfPT):
+ """Add this **typeOfPT** to the list of requested ``transports``."""
+
+ def withoutBlockInCountry(countryCode):
+ """Add this **countryCode** to the list of countries which distributed
+ bridges should not be blocked in (``notBlockedIn``).
+ """
+
+
+class BridgeRequestBase(object):
+ """A generic base class for storing options of a client bridge request."""
+ implements(IBridgeRequest)
+
+ def __init__(self, addressClass=None):
+ self.addressClass = addressClass
+ if not isinstance(self.addressClass,
+ (ipaddr.IPv4Address, ipaddr.IPv6Address)):
+ self.addressClass = ipaddr.IPv4Address
+ self.filters = list()
+ self.transports = list()
+ self.notBlockedIn = list()
+ self.valid = False
+
+ def isValid(self):
+ pass
+
+ def withIPv4(self):
+ self.addressClass = ipaddr.IPv4Address
+
+ def withIPv6(self):
+ self.addressClass = ipaddr.IPv6Address
+
+ def withoutBlockInCountry(self, country):
+ self.notBlockedIn.append(country)
+
+ def withPluggableTransportType(self, pt):
+ self.transports.append(pt)
+
+ def addFilter(self, filtre):
+ self.filters.append(filtre)
+
+ def clearFilters(self):
+ self.filters = []
+
+ def justOnePTType(self):
+ """Get just one bridge PT type at a time!"""
+ ptType = None
+ try:
+ ptType = self.transports[-1] # Use the last PT requested
+ except IndexError:
+ logging.debug("No pluggable transports were requested.")
+ return ptType
+
+ def generateFilters(self):
+ if self.addressClass is ipaddr.IPv6Address:
+ self.addFilter(Filters.filterBridgesByIP6)
+ else:
+ self.addFilter(Filters.filterBridgesByIP4)
+
+ transport = self.justOnePTType()
+ if transport:
+ self.clearFilters()
+ self.addFilter(Filters.filterBridgesByTransport(transport,
+ self.addressClass))
+ for country in self.notBlockedIn:
+ self.addFilter(Filters.filterBridgesByNotBlockedIn(country,
+ self.addressClass,
+ transport))
More information about the tor-commits
mailing list