5258 - make SMTP server configurable
5331 - Add log rotation to BridgeDB

Switches BridgeDB logger to use RotatingFileHandler.
The defaults are to keep 5 backups, of 10MB each.
Adds LOGFILE_COUNT, LOGFILE_ROTATE_SIZE to bridgedb.conf

Thanks to weasel for the patch
5331 - Add log rotation to BridgeDB

Switches BridgeDB logger to use RotatingFileHandler.
The defaults are to keep 5 backups, of 10MB each.
Adds LOGFILE_COUNT, LOGFILE_ROTATE_SIZE to bridgedb.conf, and
sets the default value for LOGLEVEL to WARNING.

Thanks to weasel for this patch.
5367 - Fix python gotcha in __init__

Python default arguments are only parsed once, therefore the
list was shared between all instances.

See: http://www.ferg.org/projects/python_gotchas.html
4297 - add draft proposal to repo

This is the draft proposal that was sent to tor-dev on Dec 5, 2011
plus the addition of the new SQL schema for storing or-addresses.
4297 - parse or-addresses from bridge descriptors

Updates parseBridgeDesc to read or-address line from bridge descriptors,
and adds a container class PortList

parseBridgeDesc adds parseORAddress which parses or-address lines.
Valid address:portspec are added to each Bridge object in a dictionary
of or-address:PortList key:values.

class PortList is a container class that represents the or-address
PORTSPEC field, which is a list of ports and port ranges.

The implementation contains an efficient representation of port-ranges,
implements __contains__ for single ports and port-ranges, and will
also squash or merge port ranges that intersect.

The getPort() function returns a single valid port (as defined by the
PORTSPEC line). Each subsequent call to getPort() will iterate over the
valid ports, so that BridgeDB may return a single 'bridge' line for
inclusion in torrc and uniformly distribute the available ports.

getConfigLine may be passed 'selectFromORAddresses=True',
which will return a valid config line from the set of addresses
and ports. Filtering for IPv6 or IPv4 addresses is supported,
if there are no matches in or-addresses BridgeDB will return
the primary ip:orport instead.

Also added is a generator 'getAllConfigLines()' which will return
every valid address:port (including expanding ranges of ports -
which may be a lot of output) combination a bridge supports, one
per line.
4297 - FilteredBridgeSplitter - sorting bridges

The FilteredBridgeSplitter sorts bridges into subrings. The subrings
are defined by filter functions. For example, to filter bridges by
ORport > 9000:

def filterBridgesOver9000(bridge):
    if bridge.orport > 9000: return True

Example in context:

d = FilteredBridgeSplitter(key)
d.addRing(BridgeRing, 'Bridges with ORPort > 9000',
		filterBridgesOver9000)

When d.insert(bridge) is called, bridges will be inserted into all
subrings whose filter function returns True.
4297 - IPBasedDistributor learns to sort bridges

IPBasedDistributor now uses the FilteredBridgeSplitter to sort
bridges into subrings based on the address class of the Bridges'
ip(s) (including addresses parsed from the new or-address spec).
4297 - Add ipv6 keyword to EmailBasedDistributor

Updates the EmailBasedDistributor to support 'ipv6' keyword
in the subject or mail body
4297 - add Tests for BridgeDB IPv6 upgrades

Test descriptor file parsing, or-address, and mixed address class
(IPv4 and IPv6) or-addresses.
Tests for IPBasedDistributor and FilteredBridgeSplitter
4297 - Update BridgeDB's front-end Server.py

Front-end's to the HTTPS and email distributors now make use
of the address class filtering available in IPBasedDistributor
4297 - Warn about bridge pools + dynamic filtering

If using dynamic bridge filtering, the IPBasedDistributor must
be suppled wth a filtering function that will select the correct pool
for the requesting IP.

The filter could be implemented in a similar fashion as the existing
approach, which is to map the requesting ip address to an
area and assign then map the areas to pools of bridges.

An alternate approach would define bridge pools by a set of
corresponding country codes. The pools may either be of roughly equal
size to simplify bridge assignment, or weighted by the aggregate bridge
users from those countries.

Presently, BridgeDB does neither. There are very few IPv6 bridges, so
bypassing bridge clustering should be OK for the short term.

Deliverables for Sponsor E require that BridgeDB be able to reassign
blocked bridges to other countries; the extensions to BridgeDB required
to implement this policy will replace the current clusters with bridge
pools that correspond to geographic regions and address the current
filter limitations.
4297 - fix indentation error
4297 - ipv6 uniformMap
4297 - Exception Oddities

Some versions (tested with 2.6.6) of Python exhibit odd exception
handling behavior; this fix corrects an issue where the parent
class exception handler was catching exceptions meant for a
subclassed exception handler
4297 - reduce warning severity for ratelimiting

Drop to INFO, because these are not WARN
4297 - fix ipv6 uniformMap

The uniformMap did not understand IPv6 addresses. The new mapper
parses IPv6 addresses, and discards the lower 64 bits.

XXX: We should evaluate this choice.
Organizations who control a /48 or larger will likely be able to
mine most/all of the https bridge pool. However, if we ignore
too many bits entire ISPs may be mapped to a single area.

Some ISPs assign a single IPv6 address (a /128) to end users.
Others may assign a /64. An individual can get a /64 from a single
linode.com VPS

Larger organizations will be assigned /48's, and ISPs /32's.
4297 - Fix python gotcha in __init__

Python default arguments are only parsed once, therefore the
dictionary was shared between all instances. Doh!

See: http://www.ferg.org/projects/python_gotchas.html
5027 - remove unused countryCode argument
5027 - add country filtering support