2.18 "Bubba Ho-tep" (released 1.6.2004)
  * rename local var 'data' to correct name 'content'
    Type: bugfix
    Changed: wc/proxy/Headers.py

  * install blocked.js and blocked.swf
    Type: bugfix
    Changed: setup.py

  * fix --configdir option handling in webcleaner script
    Type: bugfix
    Changed: webcleaner

  * add --no-file-logs option to webcleaner script
    Type: feature
    Changed: webcleaner, webcleaner.1, wc/__init__.py, wc/win32start.py,
      service/webcleaner/run2

2.17 "Ong-bak" (released 29.5.2004)
  * Added release names. Due to the somewhat shaky past releases,
    those names should render each release a pearl of uniqueness.
    Now all one has to do is look at the name - which will always be
    a name of a really good movie - and watch this movie. After that,
    any error in the release will be a little less bad :)

  * doh, add docs to DIST_SUBDIRS
    Type: bugfix
    Changed: Makefile.am

  * make all hosts lowercase in dns config
    Type: bugfix
    Changed: wc/network/*.py, tests/TestDns.py

  * really remove old wcheaders stuff
    Type: code cleanup
    Removed: config/wcheaders.{conf,dtd}
    Changed: setup.py

  * add bgsound to old html tags
    Type: feature
    Changed: wc/filter/HtmlTags.py

  * show adminpass.html page when a non-public local page has been
    requested without having set an admin password
    Type: feature
    Changed: wc/proxy/HttpClient.py

2.16 (released 26.5.2004)
  * parse and quote query parts of urls
    Type: bugfix
    Changed: wc/url.py

  * added all allowed blocked pages to public documents
    Type: bugfix
    Changed: wc/proxy/Allowed.py

  * always check for public documents in local pages
    Type: bugfix
    Changed: wc/proxy/HttpClient.py

  * fix urls with (leading) backslashes or double slashes in the path
    Type: bugfix
    Changed: wc/url.py

  * when url had backslashes, give a 302 redirect to correct url
    Type: feature
    Changed: wc/proxy/HttpClient.py

  * sanitize JavaScript urls before background download, fixes "invalid
    script src" errors
    Type: bugfix
    Changed: wc/filter/JSFilter.py

  * add Host: header, not host: on client requests
    Type: bugifx
    Changed: wc/proxy/Headers.py

  * added new network package with ability to find all configured
    local ip addresses in a system
    Type: feature
    Added: wc/network/*.py
    Moved: wc/ip.py -> wc/network/ip.py
    Changed: setup.py, Makefile.am

  * reread DNS config every minute
    Type: feature
    Changed: wc/proxy/dns_lookups.py

  * do not build documentation per default, fixes install problems on
    some platforms
    Type: bugfix
    Changed: Makefile.am

  * move special container classes into own submodule and use them
    Type: feature
    Added: wc/containers.py
    Moved: tests/TestSortedDict.py -> tests/TestContainers.py
    Changed: wc/parser/{htmllex.l,htmlparse.y,htmlsax.h},
      wc/network/__init__.py

  * fix configfile writing
    Type: bugfix
    Changed: wc/__init__.py

  * set default config dir in win32start handler
    Type: bugfix
    Changed: wc/win32start.py

  * only apply non-empty config dir to win32start handler
    Type: bugfix
    Changed: webcleaner

  * fixed and better logging of rating and filter updaters
    Type: bugfix
    Changed: wc/update.py, wc/webgui/context/update_doit_html.py

2.15 (released 22.5.2004)
  * set default config dir in webcleaner script
    Type: bugfix
    Changed: webcleaner

2.14 (released 22.5.2004)
  * honor unreadable state in StatefulConnection.readable()
    Type: bugfix
    Changed: wc/proxy/StatefulConnection.py

  * use out.write() in tagbuffer output directly instead of putting
    together a string; solves encoding problems
    Type: bugfix
    Changed: wc/filter/rules/RewriteRule.py

  * fix challenge writing when given a wrong password
    Type: bugfix
    Changed: wc/proxy/HttpClient.py

  * merge upstream CVS changes of libjs (spidermonkey) as of 20040522
    Type: feature
    Changed: libjs/*

  * use wc.log, not "from wc.log import *"
    Type: code cleanup
    Changed: *.py

  * do not bail out on I/O errors (eg gzip error) when reading
    configuration files
    Type: bugfix
    Changed: wc/filter/Blocker.py

  * new function applyfilters to apply filters of multiple levels
    Type: feature
    Changed: wc/filter/__init__.py, wc/proxy/Http{Client,Server}.py

  * changed command line options: webcleaner and webcleaner-certificates
    accept both now a --configdir option
    Type: feature
    Changed: webcleaner{,.1}, webcleaner-certificates{,.1}

2.13 (released 11.5.2004)
  * remove all old simpletal imports
    Type: bugfix
    Changed: wc/webgui/simpletal/simpleTAL.py

  * added docutils to requirements
    Type: bugfix
    Changed: docs/install.txt

  * more encoding fixes
    Type: bugfix
    Changed: wc/filter/rules/*.py, wc/webgui/context/*.py

  * add charset to filter attrs
    Type: bugfix
    Changed: wc/proxy/HttpClient.py

  * add charset to content type header
    Type: bugfix
    Changed: wc/webgui/__init__.py

2.12 (released 8.5.2004)
  * do not assume zero content size if Content-Length header is
    missing in a server reply
    Type: bugfix
    Changed: wc/proxy/{HttpServer,Header}.py

  * handle HTTP servers were both response line and headers are
    missing
    Type: feature
    Changed: wc/proxy/HttpServer.py

  * fixed HTML comment parsing
    Type: bugfix
    Changed: wc/parser/htmllex.l

  * fixed webcleaner -h call of print_help
    Type: bugfix
    Changed: webcleaner

  * fixed win32 startup
    Type: bugfix
    Changed: webcleaner

  * enable py2exe inclusion
    Type: feature
    Changed: setup.py

  * updated simpletal to upstream version 3.9, use unicode strings in
    context vars and filters
    Type: feature
    Changed: wc/webgui/simpletal/*, wc/__init__.py, wc/webgui/__init__.py
      wc/webgui/context/*, wc/filter/{__init__,Replacer}.py

  * merge upstream CVS changes of libjs (spidermonkey) as of 20040505
    Type: feature
    Changed: libjs/*

  * updated squidguard blacklists
    Type: feature
    Changed: config/blacklist/*, config/blacklist_*.zap

2.11 (released 25.4.2004)
  * - preserve the order in which HTML attributes have been parsed
    - cope with trailing space in HTML comments
    Type: feature
    Changed: wc/parser/{__init__.py,htmllex.l}

  * fix rewrite rule filtering when only the tag name should be
    replaced
    Type: bugfix
    Changed: wc/filter/rule/RewriteRule.py, wc/filter/HTMLFilter.py

  * correct ".." typos in domain names on DNS resolving
    Type: feature
    Changed: wc/proxy/dns_lookups.py

  * do not quote commas in url paths, solves "Access forbidden"
    problems on some servers
    Type: bugfix
    Changed: wc/url.py

  * allow JavaScript urls to connect to port 80 (default), 8000 (used
    in test scripts) and 8080 (for proxies).
    Type: feature
    Changed: wc/url.py

  * merge upstream CVS changes of libjs (spidermonkey) as of 20040425
    Type: feature
    Changed: libjs/*

  * change default socket timeout to 10 seconds, and apply it only
    to server sockets, added correct timeout error code
    Type: bugfix
    Changed: config/webcleaner.conf, wc/__init__.py, wc/proxy/SslServer.py,
      wc/proxy/HttpsServer.py, wc/

  * filter background JavaScript download urls
    Type: feature
    Changed: wc/proxy/HttpProxyClient.py, wc/filter/Blocker.py
    Added: templates/classic/blocked.js

  * remove 404 "Not found" from the list of errors to display the google
    search possibilities on
    Type: feature
    Changed: wc/google.py

  * added a virus filter module using the clamav virus scanner
    Type: feature
    Changed: wc/__init__.py, wc/webgui/context/filterconfig_html.py,
      templates/classic/macors/rules.html
    Added: wc/filter/VirusFilter.py, wc/filter/rules/AntivirusRule.py,
      tests/TestClamdScanner.py, test/virus/*

  * fixed the magic(5) rule checking for string types
    Type: bugfix
    Changed: wc/magic/{convert,magic}.py

  * prevent CAN-2004-0380 (Microsoft ITS protocol vulnerability)
    Type: feature
    Changed: wc/filter/HtmlSecurity.py, tests/TestRewriter.py

  * fix proxy crash when connect() raised socket error or timeout
    Type: bugfix
    Changed: wc/proxy/{Http,Ssl}Server.py

  * The ``webcleaner`` script accepts new commandline options
    --config and --filterdir to be able to specify custom configuration
    and filter definitions.
    Type: feature
    Changed: webcleaner, wc/__init__.py


2.10 (released 27.3.2004)
  * merge upstream CVS changes of libjs (spidermonkey) as of 20040323
    Type: feature
    Changed: libjs/*

  * move psyco initialization to after startup, just before the proxy
    mainloop starts. this speeds up the startup a bit when psyco is
    used.
    Type: optimization
    Changed: webcleaner, wc/__init__.py

  * do not use locals(), this does not work for psyco-compiled functions
    Type: bugfix
    Changed: wc/proxy/auth/digest.py

  * filter unreadable or unwritable sockets from socket handler list
    Type: bugfix
    Changed: wc/proxy/__init__.py

  * new header rule attribute allowing to specify to only filter headers
    in request, response or both
    Type: feature
    Changed: config/filter.dtd, wc/filter/Header.py,
      wc/filter/rules/HeaderRule.py

  * webgui config for new header attribute
    Type: feature
    Changed: wc/webgui/context/filterconfig_html.py,
      templates/classic/macros/rule.html

  * new url validity check function allowing queries, used to check
    JavaScript source links
    Type: feature
    Changed: wc/url.py, wc/filter/JSFilter.py, tests/TestUrl.py

  * added `htmlpromo' to the known invalid html tags
    Type: feature
    Changed: wc/filter/HtmlTags.py

  * added SSL gateway functionality, starting a local SSL server
    to handle and filter https connections. This feature is still
    considered in development, since SSL certificates are not verified.
    Type: feature
    Changed: wc/__init__.py, wc/proxy/{__init__,ClientServerMatchmaker}.py
    Added: wc/proxy/{HttpsServer,SslClient,SslServer}.py, test/getssl.py,
      webcleaner-certificates*

  * web gui configuration for ssl gateway
    Type: feature
    Changed: wc/webgui/context/config_html.py, templates/classic/config.html

  * the "no filter hosts" list is now a list of domains, equivalent to
    Mozillas "no proxy for" domain list
    Type: feature
    Changed: wc/{url,ip,__init__}.py, wc/webgui/context/config_html.py

  * the "allowed hosts" list is now DNS resolved
    Type: feature
    Changed: wc/ip.py

  * the "edit rule" in blocked HTML pages has now a "_top" target,
    removing any parent frames.
    Type: feature
    Changed: templates/classic/blocked.html

  * decouple NT service install from setup.py, and proper wait for NT
    service to start up, then open web config. this fixes the Windows
    install.
    Type: bugfix
    Added: webcleaner-service
    Changed: setup.py

  * handle and correct missing start quotes in HTML attributes
    Type: feature
    Changed: wc/parser/htmllex.l


2.9 (released 1.3.2004)
  * do not ship _webcleaner2_configdata.py, and adjust file permissions
    for the tarball
    Changed: MANIFEST.in, Makefile.am
  * break cyclic references in configuration parsers
    Changed: wc/__init__.py
  * break cyclic references in simpleTAL compilers
    Changed: wc/webgui/simpletal/simpleTAL.py
  * removed HtmlParser class in favor of pure handler class, the combined
    parser/handler classes are now splitted.
    Changed: wc/parser/htmllib.py, wc/filter/{Rewriter,HtmlParser}.py
    Added: wc/filter/{JS,Html}Filter.py
  * HTML parser and JS environment objects are now subclassable and
    collectable by the cyclic garbage collector
    Changed: wc/parser/htmlparse.y, wc/js/jslib.c
  * added note that the web configuration needs write permissions in
    the configuration directory
    Changed: README
  * line and column counting has been added to the HTML parser
    Changed: wc/parser/{htmlparse.y,htmllex.l,htmlsax.h}
  * merge upstream CVS changes of libjs (spidermonkey) as of 20040216
    Changed: libjs/*
  * simplyfied Connection close handling, and ship our own Dispatcher
    class
    Added: wc/proxy/Dispatcher.py
    Changed: wc/proxy/{Connection,HttpClient,Server,HttpServer,
      ClientServerMatchmaker,HttpProxyClient}.py
  * a block/allow domain rule is only matched against the url domain, not
    against the complete url anymore
    Changed: wc/filter/Blocker.py
  * The standard block page displays a link to edit the rule responsible
    for the blocked page.
    Changed: templates/classic/blocked.html, wc/filter/Blocker.py,
      wc/webgui/context/blocked_html.py
  * translation improvements in the TAL interpreter
    Changed: wc/webgui/simpletal/simpleTAL.py
  * translatable rule title and description
    Changed: wc/filter/rules/*.py, wc/__init__.py, config/filter.dtd,
      config/*.{zap,py}
  * added a rating update service to the filter update page
    Changed: wc/filter/Rating.py, wc/update.py,
      templates/classic/update.html
  * service supervision is done by the runit tools instead of the
    daemontools.
    Changed: service/*, debian/{control,webcleaner.init}
  * added another easter egg. I like eggs 8-)

2.8 (released 15.1.2004)
  * removed old webcleanerconf gui and wcheaders tool; the preferred way
    to configure webcleaner is over the web interface.
    Removed: wc/gui/*, webcleanerconf*, wcheaders*
    Changed: setup.py, MANIFEST.in, debian/control, debian/rules
  * remove own daemon functions in favor of daemontools on Unix/Linux
    and NT services on windows.
    Removed: wc/daemon/*.py
    Changed: webcleaner, wc/__init__.py, wc/proxy/__init__.py
    Added: wc/win32start.py
  * added separate administrator user/password for the configuration
    interface
    Changed: wc/__init__.py, wc/proxy/HttpClient.py,
      wc/proxy/ClientServerMatchmaker.py, wc/webgui/config_html.py,
      templates/classic/config.html, FAQ
  * disable the proxy until an administrator password was given.
    Changed: wc/proxy/HttpClient.py
    Added: templates/classic/adminpass.html,
      wc/webgui/context/adminpass_html.py
  * added rating config interface
    Added: templates/classic/rating.html, wc/webgui/context/rating_html.py
  * updated magic database to newest upstream
    Changed: config/magic.mime
  * added dhcp nameserver config support on windows dns resolver
    Changed: wc/proxy/dns_lookups.py
  * import everything from _winreg in windows registry wrapper
    Changed: wc/proxy/winreg.py
  * fixed and documented the windows installation procedure
    Changed: INSTALL, setup.py
  * added note nedding zlib support for python
    Changed: INSTALL
    Closes: SF #869424
  * added help for the web gui
    Added: templates/classic/help.html, wc/webgui/context/help_html.py
    Changed: templates/classic/macros/standard.html
  * merge upstream CVS changes of libjs (spidermonkey) as of 20031222
    Changed: libjs/*
  * added conflict for unstable psyco versions (I am using a cvs version
    of psyco)
    Changed: debian/control
  * do not (un)quote query parts of urls
    Changed: wc/proxy/__init__.py
    Closes: SF #868823
  * unquote network ips in configuration interface
    Changed: wc/ip.py, wc/webgui/context/config_html.py
    Closes: SF #868811, SF #877191
  * enclosed block matches can match complete HTML markup, not only data
    Changed: wc/filter/rule/RewriteRule.py
  * Accept all 2xx responses in background downloading, not only 200
    Changed: wc/proxy/HttpProxyClient.java
  * write new proxy config on all changes
    Changed: wc/webgui/context/config_html.py
  * after changing filter rules or folders all the filter modules are
    reinitialized
    Changed: wc/webgui/context/filterconfig_html.py
  * fix script src urls with broken base href
    Changed: wc/filter/HtmlParser.py
  * accept empty url in _has_lots_of_percents
    Changed: wc/filter/HtmlSecurity.py

2.7 (released 04.12.2003)
  * updated filters:
    - remove _top targets
    - mark <a href> custom targets with a dashed line
    - squidguard blacklist filters as of 20031204
    Changed: config/blacklists/*, config/misc.zap
  * prevent Opera vulnerability CAN-2003-0870
    Changed: wc/filter/HtmlSecurity.py
  * do not accept encoded pages for JavaScript background downloading
    Changed: wc/filter/HtmlParser.py, wc/proxy/HttpProxyClient.java
  * remove unused compress parameter
    Changed: wc/proxy/Http{Client,Server}.py,
      wc/proxy/ClientServerMatchmaker.py
  * new file(1)-like content guessing with a magic(5) database
    Added: wc/magic/*, config/magic.mime
    Changed: MANIFEST.in, setup.py, Makefile.am
  * wc.magic package enables correction of some wrong advertised file types.
    This also prevents exploits like those found in CVE-2002-0025 and
    CVE-2002-0024.
    Changed: wc/proxy/{Headers,HttpServer}.py
  * improved url norming, the url is no always unquoted before matching
    Changed: wc/proxy/__init__.py
  * new utility test/magic.py for commandline magic testing
    Added: test/magic.py
  * new utility test/get.py for download test
    Added: test/get.py
  * new test test_url for url norming tests
    Added: test/test_url.py, test/output/test_url
  * merge upstream CVS changes of libjs (spidermonkey) as of 20031126
    Changed: libjs/*
  * correct stopwatch message output
    Changed: wc/daemon/_posix.py
  * - properly initialize a RewriteRule added over the web interface
    - allow regex back references also in attribute value replacement
    Changed: wc/filter/rule/RewriteRule.py
  * fix xml output and parsing name typos in replace rule
    Changed: wc/filter/ReplaceRule.py
  * introduced a Py_RETURN_NONE macro
    Changed: wc/parser/{htmlsax.h,htmlparse.y}

2.6 (released 25.11.2003)
  * fixed background downloading with 30x redirects
    Changed: wc/proxy/HttpProxyClient.py
  * merge upstream CVS changes of libjs (spidermonkey) as of 20031125
    Changed: libjs/*
  * do not quote HTML attributes in the parser
    Changed: wc/parser/htmllex.[lc]
  * quote all HTML attributes after filtering
    Changed: wc/filter/HtmlParser.py, wc/parser/htmllib.py
  * fixed stop() and stopwatch() daemon functions
    Changed: webcleaner, wc/daemon/*.px
  * write changed filtermodules in web gui into config
    Changed: wc/webgui/context/config_html.py
  * dynamic filter attributes are now acquired only for used filter
    stages, not for all
    Changed: wc/filter/*.py, wc/proxy/Http{Server,Client}.py

2.5 (released 15.11.2003)
  * updated blacklist filters
    Changed: config/blacklist*, config/bl2wc.py
  * make AllowRule a subclass of UrlRule
    Changed: wc/filter/rule/AllowRule.py, wc/filter/Blocker.py,
      templates/classic/macros/rules.html
  * remove unnecessary bits from the dns library
    Removed: wc/proxy/dns/{lazy,Base,win32dns}.py
    Changed: wc/proxy/dns/*.py
  * corrected the reversed google cache urls
    Changed: templates/classic/google.html
  * merge upstream CVS changes of libjs (spidermonkey) as of 20031114
    Changed: libjs/*
  * FILTER_REQUEST must have the complete request for filtering, not
    only the URL
    Changed: wc/proxy/HttpClient.py, wc/filter/Blocker.py
  * improved get_user():
    - does not use getlogin() anymore
    - checks the sanity of the username before returning it, since it
      is used as a filename part
    Changed: wc/daemon/__init__.py
  * get rid of sys.path.insert, use PYTHONPATH instead
    Changed: all scripts
  * filtered requests must change previously stored data
    Changed: wc/proxy/ClientServerMatchmaker.py
  * fixed the rule merging
    Changed: wc/update.py, wc/__init__.py
  * make parsing of <? ?> html more tolerant
    Changed: wc/parser/htmllex.[lc]
  * ignore self.mime type on error
    Changed: wc/proxy/HttpServer.py

2.4 (released 1.11.2003)
  * merge upstream CVS changes of libjs (spidermonkey) as of 20031101
    Changed: libjs/*
  * enabled persistent client connections
    Changed: wc/proxy/{HttpClient,Connection}.py
  * new connection logger for printing all sent/received connection
    data for debugging
    Changed: wc/log.py, wc/proxy/Connection.py, config/logging.conf
  * enabled CONNECT tunneling; WebCleaner can now be a HTTPS proxy
    Changed: wc/proxy/[ClientServerMatchmaker,HttpClient,HttpServer}.py
  * updated .zap filter for https urls
    Changed: config/adverts{_specific,}.zap
  * added script to parser AdZapper squid_redirect files
    Added: config/adzap2wc.py
  * use python regex backreference expanding instead of named groups
    Changed: config/redirects.zap, wc/filter/rule/RewriteRule.py
  * in Block/AllowRule merge all url attributes into a single url regex
    Changed: wc/filter/rule/*.py, config/filter.dtd,
      templates/classic/macros/rules.html,
      templates/classic/filterconfig.html,
      wc/gui/FX{Allow,Block}RuleFrame.py,
      wc/webgui/context/filterconfig_html.py
  * fix bug in XML character data decoding
    Changed: wc/__init__.py, wc/filter/rule/*.py
  * optimize rule sorting; sort only once after config read; rule.oid
    is now generated dynamically, updated *.zap files accordingly
    Changed: wc/__init__.py, wc/filter/__init__.py, wc/filter/rules/*.py,
      config/filter.dtd, config/*.zap
  * limit number of displayed folder rules, added prev/next stuff
    Changed: wc/webgui/context/filterconfig_html.py,
      templates/classic/filterconfig.html

2.3 (released 21.10.2003)
  * oops, add some mising files to distribution
    Changed: setup.py, MANIFEST.in

2.2 (released 19.10.2003)
  * removed unused imports, better debugging
    Changed: wc/*.py, config/logging.conf
  * updated filters, whitelists removed due to conflict with GPL
    Changed: config/*.zap
  * parser fixes:
    - fixed parsing of end tags with trailing garbage
    - fixed parsing of script single comment lines
    - do not #include <stdint.h>, fixes build on some FreeBSD, Windows
      and Solaris/SunOS platforms
    - ignore first leading invalid backslash in a=\"b\" attributes
    - fixed parsing of script with \r line endings
    Changed: wc/parser/htmllex.{l,c}
  * cope with falsely advertised GIF images, the GIF parser skips
    invalid GIF data now
    Changed: wc/filter/GifImage.py
  * - fixed setting of missing host header
    - fixed redirection response data
    Changed: wc/proxy/ClientServerMatchmaker.py
  * Javascript engine initialization improvements:
    - set navigator.plugins['Shockwave Flash'] object
    - set location.hostname and document.location.hostname properties
    - add alert() function (doing nothing)
    - recognize IE window.createPopup() as a popup function
  * fixed parent proxy authentication in Basic and Digest mode
    Changed: wc/proxy/{basic,digest}.py, wc/proxy/HttpServer.py
  * added NTLM proxy authentication (UNTESTED)
    Changed: wc/proxy/Http{Client,Server}.py, wc/proxy/auth/__init__.py
    Added: wc/proxy/auth/{ntlm,des,des_c,des_data,md4,utils}.py
  * increase requested read/write data size on sockets to 4kB
    Changed: wc/proxy/Connection.py
  * use WcMessage always for headers which copes with header entries
    that have identical names
    Changed: wc/proxy/Headers.py
  * Security additions:
    - prevent CAN-2003-0238, table width=-1 crashes ICQ client
    - prevent CVE-2002-0823, WinHlp overflow bug
    - prevent CVE-2002-0153, local file redirection bug
    - prevent CVE-2002-0022, IE filename overflow crash
    - prevent CVE-2001-0130, Lotus Domino font size overflow crash
    Changed: wc/filter/HtmlParser.py
    Added: wc/filter/HtmlSecurity.py
  * norm the path of urls in request and script src tags
    Changed: wc/proxy/HttpClient.py, wc/filter/HtmlParser.py
  * use Python 2.3.1, fixes socket host name mem leak, and adds
    cStringIO().closed attribute
    Changed: INSTALL, wc/filter/ImageSize.py
  * for non-existing .com and .net hosts, the DNS server returns valid
    "host not found" messages, fixing the verisign wildcard DNS change
    Changed: wc/proxy/dns_lookups.py
  * new option "try_google": for invalid pages display an option page
    with google links
    Added: wc/google.py, templates/classic/google.html,
      wc/webgui/context/google_html.py
    Changed: wc/proxy/HttpClient.py
  * merge upstream changes of simpleTAL 3.5 and 3.6
    Changed: wc/webgui/simpletal/*.py, templates/classic/filterconfig.html
  * merge upstream CVS changes of libjs (spidermonkey) as of 20031016
    Changed: js/*
  * try to use psyco for speedup; see http://psyco.sf.net/ for more info
    Changed: webcleaner
  * do not try to write bytes when there is nothing to send (ie do
    not send 0 bytes)
    Changed: wc/proxy/Connection.py

2.1
  * lots of minor bugs fixed running pychecker
    Changed: a lot of .py files
  * make mimelist of filter modules to class variables
    Changed: wc/filter/*.py
  * you can now have a priority in a filter
    Changed: wc/__init__.py, wc/filter/Filter.py
  * fix some bugs with not detecting changed config values
    Changed: wc/webgui/context/config.py
  * improved footnote text in proxy configuration
    Changed: templates/classic/config.html
  * remove i18n from web context files, use i18n:translate in templates
    Changed: wc/webgui/context/*.py, templates/classic/*.html
  * wait until enough image data is available to get size info, this
    fixes the "could not get image size" errors
    Changed: wc/filter/ImageSize.py
  * added from glib project the detection of va_copy macro to configure.in
    and use that for compiling the JS library
    Changed: configure.in, libjs/jsprf.c, libjs/jsprf.h, libjs/Makefile.am
    Closes: SF bug #788040
  * fixed parent proxy authentication, added Digest authentication
    (both client and server authentication)
    Added: wc/proxy/auth/parse.py
    Changed: wc/proxy/auth/{digest,basic,__init__}.py,
      wc/proxy/ClientServerMatchmaker.py
  * fix parsing of JavaScript multi-line comments
    Changed: wc/parser/htmllex.l
  * handle JS background fetching more gracefully and consistent
    Changed: wc/proxy/HttpProxyClient.py, wc/filter/HtmlParser.py

2.0
  * require and use python 2.3
    Changed: a lot config and build files
  * remove -std=gnu99 option from compiler call, fixes compilation on
    platforms which do not have GNU gcc 3.x.
    Changed: setup.py
    Closes: SF bug #757361
  * do not setuid/setgid any more to enable web configuration
    Changed: wc/__init__.py
  * updated simpleTAL to 3.4
    Changed: wc/webgui/simpletal/*.py
  * - fix blocking filter
    - burn gif and switch to blocked.png
    Changed: wc/filter/Blocker.py, wc/webgui/__init__.py
    Added: templates/classic/blocked.png
  * - CAN-???: detect and prevent IE <input type> crash
    - CAN-???: detect and prevent Mozilla <fieldset style> crash
    - CAN-2003-0469: detect and prevent IE <hr align> crash
    - CAN-2003-0344: detect and prevent <object type> crash
    Changed: wc/filter/HtmlParser.py
  * added a web configuration interface with "classic" theme
    Added: templates/classic/*,
           wc/webgui/context/*.py,
  * added a templating mechanism
    Added: wc/webgui/*.py
  * new filter module ImageSize that filters images by size
    Added: wc/filter/ImageSize.py
  * - parse JS strings and comments
    - accept "<!- " as comment begin
    - allow colons in attribute names for namespaces
    Changed: wc/parser/htmlex.l
  * - handle empty status messages like 'HTTP/1.1 302 \r\n'
    - fix Message.get() usage by always providing default value
    - set statuscode for all http versions, even with missing response
      line
    Changed: wc/proxy/HttpServer.py
    Closes: SF bug #760434
  * added a new filter update mechanism that actually works
    Closes: SF bug #776076
    Added: wc/update.py

1.13
  * - when the HTTP server closes, flush any existing data
    - limit the time we wait for background javascript downloads
    Changed files: wc/proxy/HttpServer.py
  * more template stuff, minor debug updates
    Changed files: various

1.12
  * distribution fixes:
    - install template files
    - generate md5sums and gpg signatures for dist file
    - removed unused make targets
    - add misssing files to MANIFEST
    Changed files: Makefile.am, setup.py, MANIFEST.in

1.11
  * added "What you can do" entry
    Changed files: README
  * Filter rule updates:
    - remove <body ondragstart, oncontextmenu, onselectstart, onkeydown>
    - prevent document.onmousedown rebinding
    - some ad filter updates
    - remove more headers with client infos
    - updated blacklists and whitelists
    Changed files: config/{scripting,adverts,misc}.zap
  * Html filtering:
    - fixed nasty bug in HTML filter buffer handling which resulted in
      lost HTML data
    - also apply filter rules to document.write content
    - support <base href> for JS src fetching
    - wrap all javascript code in <!-- ... //--> comment
    Changed files: wc/filter/HtmlParser.py
  * HTML parser:
    - handle missing > in "</a <a b=c>"
    Changed files: wc/parser/htmllex.l
  * fix return types in the daemon package
    Changed files: wc/daemon/_posix.py
  * use builtin dict type for configuration
    Changed files: wc/__init__.py
  * convert install paths to platform specific representation
    Changed files: setup.py
  * 100 continue: switch back to response state only after reading headers
    Changed files: wc/proxy/HttpServer.py
  * be more HTTP/1.1 conform:
    - remove hop-by-hop headers
    - add Connection: Keep-Alive header for persistent connections
    - some header values are parsed with better error recovery
    Changed files: wc/proxy/{__init__, HttpClient, HttpServer}.py,
       wc/__init__.py
    Added files: wc/proxy/Headers.py
  * handle partial proxy request uris
    Changed files: wc/proxy/{__init__,ClientServerMatchmaker}.py
  * embedded the spidermonkey javascript engine to reduce dependencies
    Added files: libjs/*, configure.in, autogen.sh, Makefile.am
    Removed files: Makefile
  * use python logging module framework
    Added files: wc/log.py, config/logging.conf
    Changed files: a lot
    Removed files: wc/debug.py
  * local html pages use TAL templates and simpleTAL
    Added files: wc/webgui/{simpletal, context}
    Changed files: wc/proxy/HttpClient.py
    Removed files: old Zope TAL packages in wc/webgui

1.10
  * fix rule title updating (again)
    Changed files: wc/gui/FXRuleFrame.py
  * Add PICS rating system
    Added files: wc/filter/{PICS, PicsHeader}.py,
      wc/filter/rules/PicsRule.py, wc/gui/FXPicsRuleFrame.py,
      config/pics_raiting.zap
    Changed files: wc/filter/Rewriter.py, wc/__init__.py,
      wc/gui/FXRuleFrameFactory.py
  * - correctly propagate and display parsing errors
    - really cope with missing ">" end tags
    - enable yydebug on debug() call
    - minor cleanups
    Changed files: wc/parser/html{lex.*, parse.*}
  * Do not add Content-Length: 0 header to client requests, only if
    length is > 0. This makes WebCleaner compatible with publicfile
    servers again.
    Changed files: wc/proxy/HttpClient.py
  * add mime hints
    Changed files: wc/proxy/{HttpServer.py, ClientServerMatchmaker.py}
  * cope with b0rked servers not sending any response or header lines,
    just the plain content
    Changed files: wc/proxy/HttpServer.py
  * use levenshtein distance function to correct misspelled tag names
    Added files: wc/levenshtein.c, wc/filter/HtmlTags.py
    Changed files: wc/filter/HtmlParser.py

1.9
  * use the original headers list in rfc822 Message objects to preserve
    header case sensitivity; some servers dont like lowercase headers
    Changed files: wc/proxy/HttpServer.py
  * javascript handling:
    - unescape inlined javascripts before execution
    - add error callback to javascript listeners
    - dont execute setTimeout callback recursively (avoids endless loop)
    Changed files: wc/js/{jslib.c,JSListener.py}, wc/filter/Rewriter.py
  
1.8
  * add document.layers property to jslib
  * escape inlined javascript
  * add wc.js to packages in setup.py

1.7
  * parser changes:
    - rebuild with flex 2.5.27 and bison 1.875a
    - remove stpcpy declaration, fixes compile error on RedHat 7.x
    - use python2.2 headers for parser compile, not 2.1.
    - resolve &#XY; numeric entities in attribute values
    Changed files: wc/parser/*
  * fix replacing of attributes with non-empty values
    Changed files: wc/filter/rules/RewriteRule.py
  * updated filters:
    o remove _blank and _new targets
    o remove frame(set) onunload attribute
    o prevent javascript top frame bashing
    o use Calzilla/6.0 as user agent
    o more ad filters
    o remove From: header
    Changed files: config/*.zap
  * Removed unneeded guruguru.bmp
  * #define YY_NO_UNISTD_H on Windows systems, fixes build error with
    Visual Studio compiler
    Changed files: setup.py
  * handle missing HTTP response header line
    Changed files: wc/proxy/HttpServer.py
  * chunked encoding:
    - handle client requests
    - ignore chunk extensions
    - fixed chunk size matching
    Changed files: wc/proxy/{HttpClient.py,HttpServer.py,UnchunkStream.py}
  * fix some typos and grammar
    Changed files: FAQ, README*
  * add javascript interpreter wrapper library. This filters popups
    and executes scripts
    Added files: wc/js/*, test/test_js.py, wc/filter/rule/JavascriptRule.py,
      wc/gui/FXJavascriptRuleFrame.py
    Changed files: wc/filter/Rewriter.py, conf/{filter.dtd,scripting.zap},
      wc/gui/FXRuleFrameFactory.py
  * rule renaming does not remove the rule type anymore
    Changed files: wc/gui/FXRuleFrame.py

1.6
  * updated filters:
    o remove more ads
    o replace <marquee> with <span>
    o Love and Peace!
    o rewrite Sourceforge download links
    o replace bllnk with blink at indian radio site
    Changed files: config/*.zap
  * Reorganize some code
    Changed files: a lot
    Added files: wc/i18n.py, wc/AnsiColor.py, wc/debug.py,
      wc/XmlUtils.py
    Removed files: wc/debug_levels.py
  * Parse config files with ISO-8859-1
    Changed files: wc/__init__.py
  * working TAL template example, lets see how this integrates into
    WebCleaner local file handling. Anyway, most of the custom
    handlers except error handling is now in the webgui package.
  * parser changes:
    o use yy_size_t for parser alloc definitions, fixes build errors on 64bit
      architectures
    o recognise "<! --" HTML comments (seen at Eonline)
    o recognise "<! !>" HTML comments (seen at www.nba.com)
    o rebuild with flex 2.5.26
    Changed files: wc/parser/htmllex.[lc]
  * Improve error message for failing htmlsax module import
    Changed files: wc/parser/htmllib.py
  * rebuild parser with bison 1.875
    Changed files: wc/parser/htmlparser.c
  * turn on TCP_NODELAY to disable the Nagle Algorithm; no bad experiences
    so far (but lagging a real profiling). I leave TCP_NODELAY turned
    on for the moment, you can report success or failure with this option
    to me.
    Changed files: wc/proxy/{dns_lookups,HttpServer}.py
  * new module ImageReducer which converts all images into a low quality
    JPEG file to save bandwidth (usually 70%-80%).
    The Python Image Library (PIL) is required for this!
    Unfortunately the complete image has to be loaded before it is
    converted, so use this only when the proxy has a fast internet
    connection (eg. your university) and you yourself are surfing over
    a modem.
    Added files: wc/filter/ImageReducer.py, test/imagereduce.py
    Changed files: wc/gui/ConfWindow.py
  * 1k recv and send buffer (instead of 8k) to improve responsiveness
    for slow connections.
    Changed files: wc/proxy/Connection.py
  * updated german translation
    Changed files: po/de.po

1.5
  * - increase TCP dns query timeout from 10 to 20 seconds
    - remember dns errors and return them
    Changed files: wc/proxy/dns_lookups.py
  * recognize .ico and .jpeg as images
    Changed files: wc/filter/Blocker.py
  * - updated and reorganized filters
    - remove onmouseover redirects
    Changed files: config/*.zap, config/bl2wc.py
  * - when type/encoding header is not what we guessed, fix only some
      contents, not all
    - dont guess type/encoding on 304 Not Modified answers, this info
      is already cached
    Changed files: wc/proxy/HttpServer.py
  * - use flex memory management interface
    - use only double quotes for attribute quoting
    - check quoting of all attributes
    Changed files: wc/parser/htmllex.l
  * add TAL packages for web configuration
    Added files: wc/webgui/*
  * add header test fetcher
    Added files: test/head.py

1.4
  * blocked.html has no content anymore and displays much cleaner
    Changed files: config/blocked.html
  * remove old and superfluous options from webcleanerconf, added
    tooltip help, fixed host config parsing
    Changed files: wc/gui/*.py, wc/__init__.py
  * - ignore invalid html attribute characters
    - ignore trailing garbage on html end tags
    - fixed debugging code with flex
    Changed files: wc/parser/htmllex.l
  * build with flex 2.5.25
    Changed files: wc/parser/{Makefile, htmllex.c}

1.3
  * Updated advert filters
    Changed files: config/adverts.zap
  * Local HTML configuration
    Changed files: wc/proxy/ClientServerMatchMaker.py
    Added files: wc/webgui/{__init__.py, WebConfig.py}
  * Added README.parser and README.sshtunnel to documents
  * import DeflateStream, fixes pages with content-encoding: deflate
    Changed files: wc/proxy/HttpServer.py
  * Add netmask support for allowed/denied host configuration
    Changed files: wc/__init__.py
    Added files: wc/ip.py

1.2
  * quote attribute values ending in '/'
    Changed files: wc/parser/htmllex.l

1.1
  * Dont try to remove the .pid file on startup errors, because we
    might already have dropped root privileges

1.0
  * Print access denied messages on stderr
    Changed files: wc/proxy/HttpClient.py
  * Remove unsupported timeout and obfuscateip config options
    Changed files: wc/gui/ConfWindow.py, wc/__init__.py, README,
      config/webcleaner.conf
  * Updated ssh tunnel scripts
    Changed files: README.sshtunnel
  * fixed the reloading on SIGHUP
    Changed files: wc/__init__.py
  * Updated README and FAQ
  * Updated filter block lists with config/bl2wc.py script.
    Changed files: config/*.zap, config/bl2wc.py
    New files: config/dmozfilter.py
  * Dont yet use True and False constants - they are only in most
    recent Python versions (2.2.2, 2.3pre)
    Changed files: wc/__init__.py, wc/proxy/GunzipStream.py,
    wc/proxy/HttpServer.py, wc/proxy/ClientServerMatchmaker.py,
    wc/proxy/__init__.py

0.60
  * Dont filter comments in *.oreillynet.com - they have some funky
    JavaScript stuff and Mozilla renders the page not good if there
    are no HTML comments.
    Changed files: config/misc.zap
  * Use lists and "".join(list) in HtmlFilter.buffer2data, which gives
    a pretty good speedup when filtering big HTML files.
    Changed files: wc/filter/Rewriter.py
  * Always send our Accept-Encoding header, but remember what the
    client could understand.
    Changed files: wc/proxy/HttpClient.py, wc/proxy/HttpServer.py,
      wc/proxy/ClientServerMatchmaker.py
  * Only compress files when the client accepts the gzip encoding.
    Changed files: wc/filter/Compress.py
  * Some b0rked servers send a gzip encoding when the file is not
    compressed. So the decoding disables the decompression when such
    an error is encountered.
    Changed files: wc/proxy/GunzipStream.py
  * updated documentation and german translation
    Changed files: README, FAQ, po/de.po

0.59
  * - add missing import of _
    - correct warning of unknown encoding
    - use precompiled _http_re to match request lines
    - use content-length also if rewriting
    - syntax cleanups
    Changed files: wc/proxy/HttpServer.py
  * remove unsupported "compress" encoding from Accept-Encodings header
    Changed files: wc/proxy/HttpClient.py
  * import errno
    Changed files: wc/proxy/Connection.py
  * import sys
    Changed files: wc/proxy/Listener.py
  * use tuple of allowed Content-Encodings instead of regex
    Changed files: wc/filter/Compress.py
  * updated squid example config with no-digest peer option
    Changed files: README.squid
  * recompile HTML parser with bison 1.50 and flex 2.5.22
    Changed files: wc/parser/Makefile, wc/parser/htmllex.c,
      wc/parser/htmlparse.c wc/parser/htmlparse.h
  * enable the referrer HTTP header filter per default
    Changed files: config/header.zap
  * add allowed host acls for client connects
    Changed files: wc/proxy/HttpClient.py, wc/gui/ConfWindow.py,
      config/webcleaner.conf, wc/__init__.py, README, setup.py,
      debian/control

0.58:
  * Set the 'Via' HTTP header when forwarding requests/responses
  * Remove the Via header in the default filter configuration,
    so the above is not even noticed :)
  * Add a 'Warning' HTTP header when content-encoding is changed
  * Honor the 'Max-Forwards' HTTP header for OPTIONS requests
  * Adjust empty paths in requests to be '/'. This was causing
    "puzzling header received" errors.
  * Updated german translation

0.57:
  * Oopsie, fix umask to 0177

0.56:
  * fix dropping of root privileges if run as root
  * set umask to 0277
  * dont compress if no appropriate Accept-Encoding header is found

0.55:
  * Also support Content-Encoding: deflate and identity
  * Updated german translations

0.54:
  * add <area> to tags-with-no-end-tag in Rewriter rule
  * added more advert filters
  * remove unused blacklist zappers from CVS
  * fix string joining in wc.__init__.text_status()
  * really remove Content-Length header for rewritten content
  * only rely on mime type guessing values if both encoding and
    mime type were found

0.53:
  * only filter some <meta name> tags, not all
  * README.squid, a sample squid configuration file to use with
    WebCleaner, was added
  * added some more advertising urls to filter
  * minor code cleanups
  * guess mime types non-strict (see Python docs)
  * use True/False boolean constants, which makes us...
  * ...Require Python >= 2.2
