[tor-commits] [bridgedb/develop] Remove all remnants of #5027/#5418 bridge block parser code.

isis at torproject.org isis at torproject.org
Thu Apr 16 05:19:44 UTC 2015


commit 5e032efa39a4c00f00ca2f86460f952bf2c081a8
Author: Isis Lovecruft <isis at torproject.org>
Date:   Wed Apr 1 01:04:33 2015 +0000

    Remove all remnants of #5027/#5418 bridge block parser code.
    
     * REMOVES bridgedb.Bridges.re_ipv4.
     * REMOVES bridgedb.Bridges.re_ipv6.
     * REMOVES bridgedb.Bridges.parseCountryBlockFile().
     * REMOVES bridgedb.Bridges.BridgeBlock.
     * REMOVES bridgedb.Bridges.CountryBlock.
     * REMOVES bridgedb.Storage.Database.addBridgeBlock().
     * REMOVES bridgedb.Storage.Database.delBridgeBlock().
     * REMOVES bridgedb.Storage.Database.cleanBridgeBlocks().
     * REMOVES bridgedb.Storage.Database.getBlockingCountries().
     * REMOVES bridgedb.Storage.Database.getBlockedBridges().
     * REMOVES bridgedb.Storage.Database.isBlocked().
     * REMOVES several asserts for the above b.Storage.Database methods from
       bridgedb.test.legacy_Tests.SQLStorageTests.
     * REMOVES bridgedb.test.legacy_Tests.ParseCountryBlockFileTests.
     * FIXES #5418: https://bugs.torproject.org/5418
     * SEEALSO #5027: https://bugs.torproject.org/5027
     * FIXES part of #12505: https://bugs.torproject.org/12505
---
 lib/bridgedb/Bridges.py           |   72 -------------------------------------
 lib/bridgedb/Bucket.py            |    8 -----
 lib/bridgedb/Main.py              |   20 -----------
 lib/bridgedb/Storage.py           |   46 ------------------------
 lib/bridgedb/test/legacy_Tests.py |   40 +--------------------
 5 files changed, 1 insertion(+), 185 deletions(-)

diff --git a/lib/bridgedb/Bridges.py b/lib/bridgedb/Bridges.py
index 078cfff..0239730 100644
--- a/lib/bridgedb/Bridges.py
+++ b/lib/bridgedb/Bridges.py
@@ -40,41 +40,6 @@ ID_LEN = 20  # XXX Only used in commented out line in Storage.py
 DIGEST_LEN = 20
 PORTSPEC_LEN = 16
 
-re_ipv6 = re.compile("\[([a-fA-F0-9:]+)\]:(.*$)")
-re_ipv4 = re.compile("((?:\d{1,3}\.?){4}):(.*$)")
-
-
-def parseCountryBlockFile(f):
-    """Generator. Parses a blocked-bridges file 'f', and yields
-       a fingerprint (ID), address, a list of ports, and a list of country
-       codes where the bridge is blocked for each valid line:
-       address, port [], countrycode []"""
-    for line in f:
-        ID = address = fields = portlist = countries = None
-        line = line.strip()
-        try:
-            ID, addrspec, countries = line.split()
-            if isValidFingerprint(ID):
-                ID = fromHex(ID)
-                logging.debug("Parsed ID: %s", ID)
-            else:
-                print "failed to parse ID!"
-                continue # skip this line
-
-            for regex in [re_ipv4, re_ipv6]:
-                m = regex.match(addrspec)
-                if m:
-                    address = ipaddr.IPAddress(m.group(1))
-                    portlist = addr.PortList(m.group(2))
-                    countries = countries.split(',')
-                    logging.debug("Parsed address: %s", address)
-                    logging.debug("Parsed portlist: %s", portlist)
-                    logging.debug("Parsed countries: %s", countries)
-        except (IndexError, ValueError):
-            logging.debug("Skipping line")
-            continue # skip this line
-        if ID and address and portlist and countries:
-            yield ID, address, portlist, countries
 
 class BridgeHolder(object):
     """Abstract base class for all classes that hold bridges."""
@@ -751,40 +716,3 @@ class FilteredBridgeSplitter(BridgeHolder):
             desc = "%s %s" % (description.strip(),
                     " ".join([v for k,v in grouped.items()]).strip())
             f.write("%s %s\n"%( toHex(b.getID()), desc))
-
-class BridgeBlock(object):
-    """Base class that abstracts bridge blocking.
-
-    .. TODO:: This should be a zope.interface specification.
-    """
-    def __init__(self):
-        pass
-
-    def insert(self, fingerprint, blockingRule):
-        raise NotImplementedError
-
-    def clear(self):
-        pass
-
-class CountryBlock(BridgeBlock):
-    """Countrywide bridge blocking"""
-    def __init__(self):
-        self.db = bridgedb.Storage.getDB()
-
-    def clear(self):
-        assert self.db
-        self.db.cleanBridgeBlocks()
-        self.db.commit()
-
-    def insert(self, fingerprint, blockingRule):
-        """ insert a country based blocking rule """
-        assert self.db
-        countryCode = blockingRule
-        self.db.addBridgeBlock(fingerprint, countryCode)
-        self.db.commit()
-
-    def getBlockingCountries(self, fingerprint):
-        """ returns a list of country codes where this fingerprint is blocked"""
-        assert self.db
-        if fingerprint is not None:
-            return self.db.getBlockingCountries(fingerprint) 
diff --git a/lib/bridgedb/Bucket.py b/lib/bridgedb/Bucket.py
index 5e7f61b..1382188 100644
--- a/lib/bridgedb/Bucket.py
+++ b/lib/bridgedb/Bucket.py
@@ -242,14 +242,6 @@ class BucketManager(object):
                     bridgeHistories.sort(lambda x,y: cmp(x.weightedFractionalUptime,
                                      y.weightedFractionalUptime))
 
-            # for a bridge, get the list of countries it might not work in
-            blocklist = dict()
-            if getattr(self.cfg, "COUNTRY_BLOCK_FILE", None) is not None:
-                f = open(self.cfg.COUNTRY_BLOCK_FILE, 'r')
-                for ID,address,portlist,countries in bridgedb.Bridges.parseCountryBlockFile(f):
-                    blocklist[toHex(ID)] = countries
-                f.close()
-
             try:
                 f = open(filename, 'w')
                 if self.cfg.COLLECT_TIMESTAMPS:
diff --git a/lib/bridgedb/Main.py b/lib/bridgedb/Main.py
index 3b018f9..d5f4c24 100644
--- a/lib/bridgedb/Main.py
+++ b/lib/bridgedb/Main.py
@@ -175,26 +175,6 @@ def load(state, splitter, clear=False):
                           "but could not find bridge with that fingerprint.")
                          % router.fingerprint)
 
-    # XXX TODO refactor the next block according with new parsers for OONI
-    # bridge-reachability reports:
-    if state.COUNTRY_BLOCK_FILE:  # pragma: no cover
-        logging.info("Opening Blocking Countries file %s"
-                     % state.COUNTRY_BLOCK_FILE)
-        f = open(state.COUNTRY_BLOCK_FILE)
-        # Identity digest, primary OR address, portlist, country codes
-        for ID, addr, portlist, cc in Bridges.parseCountryBlockFile(f):
-            if ID in bridges.keys() and bridges[ID].running:
-                for port in portlist:
-                    addrport = "{0}:{1}".format(addr, port)
-                    logging.debug(":'( Tears! %s blocked bridge %s at %s"
-                                  % (cc, bridges[ID].fingerprint, addrport))
-                    try:
-                        bridges[ID].blockingCountries[addrport].update(cc)
-                    except KeyError:
-                        bridges[ID].blockingCountries[addrport] = set(cc)
-        logging.debug("Closing blocking-countries document")
-        f.close()
-
     inserted = 0
     logging.info("Inserting %d bridges into splitter..." % len(bridges))
     for fingerprint, bridge in bridges.items():
diff --git a/lib/bridgedb/Storage.py b/lib/bridgedb/Storage.py
index 1efb139..439634f 100644
--- a/lib/bridgedb/Storage.py
+++ b/lib/bridgedb/Storage.py
@@ -243,52 +243,6 @@ class Database(object):
         cur.execute("UPDATE Bridges SET distributor = ? WHERE hex_key = ?",
                     (distributor, hex_key))
 
-    def addBridgeBlock(self, fingerprint, countryCode):
-        cur = self._cur
-        cur.execute("INSERT OR REPLACE INTO BlockedBridges "
-                    "(hex_key,blocking_country) VALUES (?,?)",
-                    (fingerprint, countryCode))
-
-    def delBridgeBlock(self, fingerprint, countryCode):
-        cur = self._cur
-        cur.execute("DELETE FROM BlockedBridges WHERE hex_key = ? "
-                    "AND blocking_country = ?", (fingerprint, countryCode))
-
-    def cleanBridgeBlocks(self):
-        cur = self._cur
-        cur.execute("DELETE FROM BlockedBridges")
-
-    def getBlockingCountries(self, fingerprint):
-        cur = self._cur
-        cur.execute("SELECT hex_key, blocking_country FROM BlockedBridges WHERE hex_key = ? ",
-                    (fingerprint,))
-        v = cur.fetchall()
-        if v is None:
-            return None
-
-        # return list of country-codes
-        return [ str(result[1]) for (result) in v ]
-
-    def getBlockedBridges(self, countryCode):
-        cur = self._cur
-        cur.execute("SELECT hex_key, blocking_country FROM BlockedBridges WHERE blocking_country = ? ",
-                    (countryCode,))
-        v = cur.fetchall()
-        if v is None:
-            return None
-        # return list of fingerprints
-        return [ str(result[0]) for (result) in v ]
-
-    def isBlocked(self, fingerprint, countryCode):
-        cur = self._cur
-        cur.execute("SELECT hex_key, blocking_country FROM BlockedBridges WHERE "
-                    "hex_key = ? AND blocking_country = ?",
-                    (fingerprint, countryCode))
-        v = cur.fetchone()
-        if v is None:
-            return False
-        return True 
-
     def getWarnedEmail(self, addr):
         addr = hashlib.sha1(addr).hexdigest()
         cur = self._cur
diff --git a/lib/bridgedb/test/legacy_Tests.py b/lib/bridgedb/test/legacy_Tests.py
index cd0c6de..4d0c53c 100644
--- a/lib/bridgedb/test/legacy_Tests.py
+++ b/lib/bridgedb/test/legacy_Tests.py
@@ -501,23 +501,6 @@ class SQLStorageTests(unittest.TestCase):
         cur.execute("SELECT * FROM EmailedBridges")
         self.assertEquals(len(cur.fetchall()), 1)
 
-        db.addBridgeBlock(b2.fingerprint, 'us')
-        self.assertEquals(db.isBlocked(b2.fingerprint, 'us'), True)
-        db.delBridgeBlock(b2.fingerprint, 'us')
-        self.assertEquals(db.isBlocked(b2.fingerprint, 'us'), False)
-        db.addBridgeBlock(b2.fingerprint, 'uk')
-        db.addBridgeBlock(b3.fingerprint, 'uk')
-        self.assertEquals(set([b2.fingerprint, b3.fingerprint]),
-                set(db.getBlockedBridges('uk')))
-
-        db.addBridgeBlock(b2.fingerprint, 'cn')
-        db.addBridgeBlock(b2.fingerprint, 'de')
-        db.addBridgeBlock(b2.fingerprint, 'jp')
-        db.addBridgeBlock(b2.fingerprint, 'se')
-        db.addBridgeBlock(b2.fingerprint, 'kr')
-
-        self.assertEquals(set(db.getBlockingCountries(b2.fingerprint)),
-                set(['uk', 'cn', 'de', 'jp', 'se', 'kr']))
         self.assertEquals(db.getWarnedEmail("def at example.com"), False)
         db.setWarnedEmail("def at example.com")
         self.assertEquals(db.getWarnedEmail("def at example.com"), True)
@@ -529,27 +512,6 @@ class SQLStorageTests(unittest.TestCase):
         db.cleanWarnedEmails(t+200)
         self.assertEquals(db.getWarnedEmail("def at example.com"), False)
 
-class ParseCountryBlockFileTests(unittest.TestCase):
-
-    def testParseCountryBlockFile(self):
-        simpleBlock = "%s:%s %s\n"
-        countries = ['us', 'nl', 'de', 'cz', 'sk', 'as', 'si', 'it']
-        test = str()
-        for i in range(100):
-            test += simpleBlock % (randomIPString(), randomPort(),
-                    randomCountrySpec())
-            test+=gettimestamp()
-
-        for a,p,c in bridgedb.Bridges.parseCountryBlockFile(test.split('\n')):
-            assert type(a) in (ipaddr.IPv6Address, ipaddr.IPv4Address)
-            assert isinstance(p, addr.PortList)
-            assert isinstance(c, list)
-            assert len(c) > 0
-            for y in c:
-                assert y in countries
-            #print "address: %s" % a
-            #print "portlist: %s" % p
-            #print "countries: %s" % c
 
 class BridgeStabilityTests(unittest.TestCase):
     def setUp(self):
@@ -689,7 +651,7 @@ def testSuite():
     loader = unittest.TestLoader()
 
     for klass in [IPBridgeDistTests, SQLStorageTests, EmailBridgeDistTests,
-                  ParseCountryBlockFileTests, BridgeStabilityTests]:
+                  BridgeStabilityTests]:
         suite.addTest(loader.loadTestsFromTestCase(klass))
 
     for module in [ bridgedb.Bridges,





More information about the tor-commits mailing list