ldaptor (0.0.39) unstable; urgency=low

  * Cleanups:
    - Sort results before comparison in unit tests. Avoid spurious errors
      in test_ldiftree.Tree.test_children_twoChildren. Make unit tests
      explicitly shuffle results to avoid such false negative tests in the
      future. Closes: #307101.

 -- Tommi Virtanen <tv@debian.org>  Fri,  6 May 2005 14:46:31 +0300

ldaptor (0.0.38) unstable; urgency=low

  * Bugfixes:
    - WebUI:
      - rewrite webui search DN linking to be more nevowy and not assume
        ldaptor is the root resource.

 -- Tommi Virtanen <tv@debian.org>  Fri,  4 Mar 2005 14:46:28 +0200

ldaptor (0.0.37) unstable; urgency=low

  * Bugfixes:
    - ldaptor.checkers:
      - trap LDAPUnwillingToPerform and make it just an UnauthorizedLogin
        in LDAPBindingChecker.
    - WebUI:
      - do not stringify i18n PlaceHolder, just pass it through to
        flattening.
      - Port nevow commits r1252 and r1253: handle interpolation of i18n
        strings better.
      - Make zebra tables not reverse colors on refresh, by moving state
        from resource to request.

  * Cleanups:
    - Remove dead code.
    - Use CSS in webui service password changing layout.

 -- Tommi Virtanen <tv@debian.org>  Wed, 23 Feb 2005 23:00:57 +0200

ldaptor (0.0.36) unstable; urgency=low

  * Applications changes:
    - Enforce validFrom and validUntil in ServiceBindingProxy. Closes:
      ldaptor#22.
    - I18n support in webui and translation to finnish.

  * API changes:
    - Do not parallelize password setting, abort on first error.
    - When aborting password setting, use a real exception and not a
      string as explanation.

  * Refactorings to adapt to Twisted/Nevow APIs:
    - In webui, use annotate.Choice in a way that works with nevow 0.3 and
      0.4pre.

  * Bugfixes:
    - Add ldaptor.protocols.ldap.autofill that was missed earlier.
    - Clean up and python2.4-proof LDAPAttributeTypeAndValue parsing.
    - Do not repeat the form error message for each argument in webui
      change_password.

  * Cleanups:
    - WebUI:
      - refactor to separate service password setting, for reuse
        elsewhere.
      - make zebra tables set CSS styles, not just background colors.
      - redo webui service password changing form layout.
      - avoid annotate.Password in webui password changing, it
        results in poor layout.
      - use table for nicer layout of service password controls.

  * Packaging:
    - Add missing depends on python2.3-pyopenssl, python2.3-crypto.

  * Administrivia:
    - Run unit tests after the install target, with the installed code
      base.

 -- Tommi Virtanen <tv@debian.org>  Wed, 23 Feb 2005 11:13:08 +0200

ldaptor (0.0.35) unstable; urgency=low

  * Bugfixes:
    - Fix LDAPServer to understand new e.bind() semantics from r196.

  * Packaging:
    - Bumped standards version to 3.6.1.

 -- Tommi Virtanen <tv@debian.org>  Fri, 28 Jan 2005 19:49:24 +0200

ldaptor (0.0.34) unstable; urgency=low

  * Brown paper bag time, 0.0.33 was never uploaded. Epydoc --check only
    check and generates no output, reverting back to do not complain about
    missing docstrings.

 -- Tommi Virtanen <tv@debian.org>  Sun, 23 Jan 2005 03:32:46 +0200

ldaptor (0.0.33) unstable; urgency=low

  * Conceptual changes:
    - Add our own LDAP schema file. To use in slapd, add line "include
      /etc/ldaptor/ldaptor.schema" to /etc/ldap/slapd.conf.
    - Switch service-specific password support in svcbindproxy and webui
      change_password to use new-style password entries, for nicer slapd
      ACLs. Closes: ldaptor#20.

  * API changes:
    - Add a pumpingDeferredError to test utils, for consistency.
    - Allow overriding things by subclassing LDAPConfig and setting
      attributes.
    - Allow overriding identity search filter at LDAPConfig instantiation
      time.
    - Change e.bind() semantics to defer more, and return self or raise.
    - Add LDAPEntryWithClient.bind() that sends a BindRequest to the
      server.
    - Deprecate LDAPClient.bind(dn, auth) in favor of e.bind(auth).
    - Proxy now takes an ILDAPConfig parameter to init and not just
      overrides.

  * Bugfixes:
    - Escape "=" in RDN values.
    - Remove ldaptor.protocols.ldap.__all__, it's unnecessary and had
      wrong content.

  * Cleanups:
    - Convert U32 to unix-style newlines.
    - Epydoc formatting fixes.
    - Make epydoc complain about missing docstrings.
    - Fix API doc home page URL.

  * Packaging:
    - When running unit tests from debian/rules, ensure PYTHONPATH gets an
      explicit . in it -- for the poor guy running a build as root.
      Closes: #291615.
    - Include everything needed for successful unit test run in
      Build-Depends-Indep. Closes: #290236, #291618.

 -- Tommi Virtanen <tv@debian.org>  Sun, 23 Jan 2005 02:52:56 +0200

ldaptor (0.0.32) unstable; urgency=low

  * Conceptual changes:
    - Client-side STARTTLS support. Closes: ldaptor#1.

  * Applications changes:
    - The following now use the configuration, making --base optional:
      - ldaptor-ldap2maradns
      - ldaptor-search
      - ldaptor-ldap2pdns
      - ldaptor-ldap2passwd
      - ldaptor-ldap2dhcpconf
    - ldaptor-ldap2pdns now reconnects when needed.
    - WebUI:
    - Server:

  * API changes:
    - Remove ldapclient.LDAPSearch in favor of e.search().
    - Switch from LDAPClient.queue() to one of the following. Needed to
      notify in flight operations of lost connection, and all around
      prettier.
      - d=c.send(op)
      - d=c.send_multiResponse(op, fn, ..)
      - c.send_noResponse(op)
    - Add LDAPEntryWithClient.lookup() that was accidentally left out.
    - Add BaseLDAPEntry.hasMember().

  * Refactorings to adapt to Ldaptor APIs:
    - Refactor to avoid LDAPSearch, use ldapsyntax, config and
      ldapconnector:
      - ldaptor-ldap2maradns
      - ldaptor-search
      - ldaptor-ldap2pdns
      - ldaptor-ldap2dhcpconf
      - ldaptor-ldap2passwd
      - ldaptor-rename

  * Bugfixes:
    - In ldaptor-ldap2maradns, make sure the netmask.* A record is in
      octet format (and not as number of bits).
    - Refactor LDAPClient.bind() so it acknowledges completion of the
      request, removing it from onwire message tracking.
    - Fix cut-paste code: ldaptor-ldap2passwd took attributes arguments,
      which only made it break.
    - Make LDAPConnector fail nicely on DNs with no equivalent DNS domain,
      and no override.
    - Make .commit() not break the ldapsyntax entry journal.
    - Nicer error handling in LDAPBindingChecker; now passes
      LDAPInvalidCredentials to the caller as UnauthorizedLogin.

  * Cleanups:
    - Avoid buffering results in ldaptor-ldap2maradns.
    - Extract common DNS utility functions to ldaptor.dns.

  * Administrivia:
    - Make non-script executable files have mode 0644, not 0755.
    - Clean up generated files in doc/.

 -- Tommi Virtanen <tv@debian.org>  Wed, 12 Jan 2005 00:02:56 +0200

ldaptor (0.0.31) unstable; urgency=low

  * Conceptual changes:
    - Service-specific passwords: added a mechanism that allows having
      "subpasswords" that are only used with particular services; e.g.
      let the userPassword attribute be used only for SSH logins, and use
      additional "mail" and "web" password, stored in an attribute called
      "servicePassword". The value is two whitespace-separated fields:
      service name and userPassword-style password digest. See
      ServiceBindingProxy for more.
    - LDIFTree allows LDAP server data storage an a one entry per file
      format, with nice unixy semantics.

  * Applications changes:
    - WebUI:
      - Add pretty label to search form submit button.
      - Service-specific password editing support. Closes: ldaptor#17.
    - Server:
      - New LDIFTree storage backend, storing the LDAP as a filesystem
        directory tree, with one entry per file in LDIF format.
      - Add LDAP proxy support.
      - Add ServiceBindingProxy, an LDAP proxy that handles non-anonymous
        bind requests specially. Closes: ldaptor#15.

  * API changes:
    - Get rid of MutableString:
      - Add pureber.berDecodeObject, remove pureber.ber2object.
      - Add pureber.berDecodeLength, remove pureber.berlen2int.
      - Switch LDAPClient and LDAPServer buffers to be plain strings.
      - Remove MutableString.
    - Change the BER decoding mechanism:
      - Add classmethod fromBER instead of using __init__ in two
        roles.
      - Remove old-style decode support.
    - Add pureber.berDecodeMultiple, mainly for use by subclasses of
      BERSequence.
    - Large lengths appeared to be negative, switched berlen2int to
      using longs.
    - Split LDAPServer to BaseLDAPServer, so one has a choice of
      inheriting something without any handle_* methods.
    - Make ldapsyntax.LDAPEntryWithClient.move() remove the old RDN.
    - Make ldapsyntax.LDAPEntryWithClient.move() change the entry's idea
      of its own DN.

  * Refactorings to adapt to Ldaptor APIs:
    - Use connectAnonymously in parallelsearch example.

  * Refactorings to adapt to Twisted/Nevow APIs:
    - Nevow ISerializable is deprecated.
    - ctx.{allPatterns,patternGenerator} are now called
      ctx.tag.allPatterns etc.
    - all IRequest APIs take a context.
    - switch from getDynamicChild to childFactory.
    - addSlash where appropriate.
    - return URLs instead of explicit redirects.
    - switch from renderHTTP to child_.
    - switch from locateChild to childFactory.
    - Twisted >1.3 moves SRVConnector to twisted.names.srvconnect.

  * Bugfixes:
    - Fix BER length encoding for lengths greater than 127, add unit
      tests.
    - Make many __repr__'s work even when __init__ failed.
    - Make sure every LDAP wire class takes a tag argument.
    - Make LDAPDelRequest also understand keyword argument value, as
      that is what LDAPString uses.
    - Fix and test handling of unknown match types.
    - Fix and unit test saltless non-client setPassword.
    - Fix DistinguishedName order comparison.
    - Make sure configuration does not interfere with the lmPasswords in
      the unit tests.
    - Make nevow data access to LDAP entry attributes work.
    - Add items() to LDAPEntry IContainer adapter's attributes child;
      webui search needs it.
    - Webui edit can now edit attributes that are in the RDN. Closes:
      ldaptor#5.
    - Improve handling of missing baseDN in configuration.

  * Cleanups:
    - Remove dead code.
    - Remove the hack-and-slashed RFC file that served as a TODO note.
    - Override IOPump to pass around more than one byte at a time, saves
      >10 seconds in unit tests and protocol decoding of partial messages
      is unit tested elsewhere anyway.
    - Improve ldaptor.testutil error messages, accept any true/false value
      and not just 1 and 0.
    - Clean up LDAPServer.handleUnknown.
    - Prettify LDAPMessage.__repr__
    - Prettify LDAPResult.__repr__
    - If ldapsyntax.LDAPEntryWithClient.search gets a bad response from
      the LDAP server, raise a real exception and not an assert.
    - When converting delta Modifications to LDAP, convert them to basic
      data types for easier debugging and unit testing.
    - Be consistent and use "ctx" everywhere in webui change_password.
    - Add nevow renderer that produces zebra tables.
    - Make ldapsyntax.LDAPEntryWithClient.move() accept strings etc. as
      newDN, add unit test.
    - Make epydoc happy.
    - Simplify ldap-intro document generation.

  * Packaging:
    - Depend on Nevow v0.3.0 or later.
    - Depend on Twisted v1.3.0 or later.
    - Switch to CDBS.
    - Add an ldaptor-common package to contain conffiles.
    - Run unit tests before building debs.
    - Include the unit tests in the distributed files.

  * Administrivia:
    - Add TODO notes.
    - Update ignore file lists to match currently generated files.
    - Export dia files to format png-libart, not just png. This makes the
      export reliable. Hint from Debian bug#275959.

 -- Tommi Virtanen <tv@debian.org>  Fri, 10 Dec 2004 17:39:36 +0200

ldaptor (0.0.30) unstable; urgency=low

  * Install the webui template and CSS files that were missing
    from the deb. Unit tests really don't cover everything :(

 -- Tommi Virtanen <tv@debian.org>  Tue, 17 Aug 2004 17:06:07 +0300

ldaptor (0.0.29) unstable; urgency=low

  * Brown paper bag time; 0.0.28 was never uploaded.
  * Remove nevow dependency from ILDAPConfig, it seems to work just fine
    as just a components.Interface. This is the real fix, I
    promise. Closes: #264179.

 -- Tommi Virtanen <tv@debian.org>  Tue, 17 Aug 2004 16:48:42 +0300

ldaptor (0.0.28) unstable; urgency=low

  * Applications changes:
    - Support smarter object creation plugins in webui add.
  * Cleanups:
    - Remove references to dead code.
    - Make sure LDAPAttributeTypeAndValue repr works even if
      __init__ raised an exception.
    - Make sambaSamAccount autofiller actually useful, add unit tests.
  * Packaging:
    - Make ldaptor-webui depend on python2.3-nevow. Closes: #264179.

 -- Tommi Virtanen <tv@debian.org>  Tue, 17 Aug 2004 16:32:03 +0300

ldaptor (0.0.27) unstable; urgency=low

  * Applications changes:
    - WebUI:
      - ldaptor-webui has been ported to nevow.
      - move now acts more like a shopping cart.
      - Move most of the command line options of ldaptor-webui to
        configuration file only; please switch to using a .tac file.
    - Server:
      - Support fetching the rootDSE.
      - Claim to support the extended operation for password changing.
      - Support non-anonymous bind against SSHA passwords stored in
        userPassword attributes.
      - Handle entry deletion.
    - Add configuration file support. See files
      /usr/share/doc/ldaptor-{doc,webui}/examples/global.cfg in packages
      ldaptor-doc and ldaptor-webui.
    - New-style Samba schema support, with objectClass sambaSamAccount.
    - Add support for Samba LanMan password hashes, disabled by
      default but configurable.
    - Drop python 2.2 support, using 2.3 features.
    - Allow serviceLocationOverride to have the empty DN ("") as
      key, overriding default location (DNS SRV records) for everything.

  * Documentation changes:
    - Terminate addressbook example LDIFs with empty line so they
      are actually valid LDIF.
    - Modernize addressbook example files.

  * API changes:
    - Generic:
      - Add ldapfilter.parseMaybeSubstring(), which takes attributeType and
        partial filter as arguments, and allows e.g.  easily searching one
        attributeType based on user input, without user having to understand
        LDAP filters.
      - Make DistinguishedName and RelativeDistingushedName do the right
        thing even without explicit stringValue and listOfRDN keyword
        arguments.
      - Add comparison operators to schema.ObjectClassDescription, so they
        can be sorted.
      - Make DistinguishedNames equal their canonical string
        representations and hash identically.
      - Rename ReadOnlyInmemoryLDAPEntry.putChild to .addChild, make
        it accept rdn also as a string.
      - Added setPassword support to inmemory.
      - Added ILDAPConfig.
    - Client:
      - Make LDAPClient.queue take extra arguments and pass them to the
        callback given. Minimizes need for lambdas.
      - Add ldapsyntax.LDAPEntryWithClient.addChild().
      - Remove ldapclient.LDAPAddEntry, it is now unused.
      - LDAPEntryWithClient.search() now understands attributes=None
        to mean do not return any attributes.
    - Server:
      - Allow returning None from the message handler.
      - handle_* API changed: now handlers can happily just
        raise whatever they want, and fail_* (or failDefault) are used
        to map the exception to LDAP errors.
      - Added function checkControls() that all handlers should call
        with unsupported controls. It raises error if unsupported
        controls include any critical controls.

  * Refactorings to adapt to Ldaptor APIs:
    - Make webui edit use entry.fetch() instead of
      ldapclient.LDAPSearch.

  * Refactorings to adapt to Twisted/nevow APIs:
    - Tell nevow how to serialize DistinguishedNames.
    - Tell nevow how to serialize LDAP entries.
    - Create an IContainer adaptor for LDAPEntries.
    - Switch webui to use ISession.
    - Follow Twisted DNS resolver API changes in
      ldaptor-find-server.

  * Bugfixes:
    - Fix bug where entry.undo() switched off journaling and thus
      sending any further updates to the server.
    - In server, make failing searches indicate why they failed.
    - Make sure LDAPFilter_and and LDAPFilter_or know how to decode
      filter elements.
    - Initialize BaseLDAPEntry attributes early so __repr__ works
      even when __init__ was buggy.
    - Protect against passing None to DistinguishedName.
    - Raise LDAPOther, not LDAPUnknownError; unknown errors should
      only be created by ldaperrors.get().
    - Protect against no subschemaSubentry attribute in fetchschema.
    - Make LDAPEntryWithClient repr work even in invalid state.
    - Fix wrong number of arguments in handling unknown requests in
      server. (Closes: #261837)
    - Make sure LDAPEntryWithClient.delete can handle all kinds of
      errors and not just LDAPDelResponse.
    - In webui, protect against issue74 in nevow.guard. Can only be
      triggered by adjusting the URL manually.
    - Support LDAP controls in ldapserver, but only by ignoring
      non-critical ones and triggering an error on critical ones.
      (Closes: #263210)

  * Cleanups:
    - Remove dead imports, code, TODO entries etc.
    - Improve unit test coverage:
      - Test ldapfilter parsing whitespace handling.
      - Add a simple unit test for callable serviceLocationOverride.
      - Do automated testing of webui.
      - Add unit tests for fetchschema.
      - Test that the server can provide schemas, if the data is
        right.
      - Test failing searches in ldapsyntax.
      - Test failing delete in ldapsyntax.
      - In pureldap unit tests, use pureber.ber2object() instead of
        instantiating the class directly, to simulate real use better.
      - Allow overriding the BERDecoderContext to use in pureldap unit
        tests.
      - Unit test serialize/unserialize of pureldap.LDAPMessage.
    - Prettify:
      - Use pyparsing .setName() in ldapfilter parsing for nicer
        debugging.
      - Make PasswordSetAggregateError stringify itself nicely.
      - Rename webui change_password action "Choose Password" to "Set
        Password", it describes the action better.
      - Add a more helpful assertion message.
      - Avoid periods at end of error messages, they can be added when
        doing actual outputting.
      - Show pretty error when invalid DN is given to
        --service-location= command line parameter.
      - Nicer repr for pureber.BERDecoderContext.
      - Nicer exception when pureber.ber2object sees an unknown tag.
    - Code readability and cleanliness:
      - Use constants from string module in LDAP filter parsing.
      - Use pyparsing.delimitedList in ldapfilter parsing.
      - Use "bool()" instead of "not not".
      - Clean up dn handling in BaseLDAPEntry.
      - Clean up webui delete and improve error handling.
      - Modernize ldaptor-fetchschema.
      - Modernize ldaptor-getfreenumber.
      - Make autofillers share code.
    - Developments support:
      - LDAPClient and LDAPServer can now toggle debug output
        dynamically.
    - Do Things Right:
      - Switch to relative URLs when referring to CSS stylesheets.
      - domainComponent is an attributeType, not an objectClass.
        Replace with dcObject.

  * Packaging:
    - Drop python 2.2 support.

 -- Tommi Virtanen <tv@debian.org>  Thu,  5 Aug 2004 23:05:11 +0300

ldaptor (0.0.26) unstable; urgency=low

  * Documentation changes:
    - Archive sketch of the interfaces (with no explanation :).

  * Bugfixes:
    - Override __eq__ and __ne__ in pureber.BERBase too, otherwise
      UserList's implementation of those overrode BERBase.__cmp__ and
      caused false equalities.
    - Reimplement ldapfilter, with Unit Test flavor. Use pyparsing
      to make it really handle extra data and backslash escaping.
    - When calling filt.asText() for LDAP filters, make sure to
      backslash escape special characters.

  * Cleanups:
    - Typo in docstring.
    - Add nicer repr of pureldap.LDAPMatchingRuleAssertion, to make the
      problem easier to spot.

  * Packaging:
    - Depend on pythonX.Y-pyparsing.
    - New enough dia is in unstable, so upload to unstable again.

  * Administrivia:
    - Add TODO notes.

 -- Tommi Virtanen <tv@debian.org>  Sat, 26 Jun 2004 14:34:06 +0300

ldaptor (0.0.25) experimental; urgency=low

  * Pre-generate documentation in build target, don't wait until
    install target. Makes dia work with dpkg-buildpackage
    -rfakeroot, because "debian/rules build" is run without
    fakeroot, and then dia can scribble in the home directory of
    the real user, not /root/.dia. Ungh. I'm filing a bug on dia.

 -- Tommi Virtanen <tv@debian.org>  Mon, 17 May 2004 19:51:11 +0300

ldaptor (0.0.24) experimental; urgency=low

  * Applications changes:
    - Can now generate diffs of two LDAP entries, or even two full trees,
      and use that either to modify LDAP entries at a server, or generate
      LDIF modification commands. Can also parse LDIF modification files.
      See ldaptor-ldifdiff, ldaptor-ldifpatch.

  * Documentation changes:
    - Addressbook example source:
      - Bugfixes and cleanups.
      - Rewrite addressbook examples to use nevow instead of woven
        and make them runnable via .tac files.
    - Modernize addressbook-slides:
      - Remove htmldiff hack, use meld instead. Simplify things a bit.
      - Add new addressbook-slides-server.tac that launches meld
        automatically when you load that page, useful for presentations.
      - Add CSS stylesheet.
      - New DTD version, fix to conform to DTD.
      - Split 01_repl into screen-size chunks.
    - In addressbook slides, use smaller pictures to make sure they fit on
      screen.
    - In addressbook examples, let one user have a valid password and edit
      access, so the same server can be used to demo ldaptor-webui.
    - Note in ldap-intro documentation that OpenLDAP doesn't allow
      changing objectClasses of existing objects.
    - Fix typo in doc/examples/ldif2ldif.
    - Docstring cleanup.
    - Switch from graphviz to dia for figures. (Closes: #242147)
    - In example LDIFs, rename Erkki Esim to Ample Exam, for i18n.

  * API changes:
    - First stages of LDIFTree work; initial support for storing LDIFs in a
      tree form.
    - Add inmemory data backend.
    - Start using interfaces, abstract common LDAP entry things into
      ldaptor.entry, ldaptor.attributeset.
    - Add module ldaptor.delta.
    - Add LDAPEntry.match().
    - Add IConnectedLDAPEntry.lookup().
    - The LDAP server prototype code has changed a lot, not summarizing
      here.
    - Rename ldifprotocol.LDIF.completed() to more specific
      gotEntry(), so inmemory DB loading can have .gotDatabase() or
      something, and .completed() won't look confusing there.
    - Switch ldifprotocol into producing BaseLDAPEntries.
    - Add ldaptor.entry.EditableLDAPEntry, make
      ldapsyntax.LDAPEntryWithClient inherit EditableLDAPEntry.
    - Make LDAPConnector accepts dns also as strings.
    - LDAPConnector accepts overrides that are callable, and lets them
      take control of the connecting. This is mostly meant for unit
      testing.

  * Internal refactorings:
    - Refactor to remove client-specific details from LDAPAttributeSet and
      to generalize the concept of a Modification so it can be used with
      LDIF also.
    - Refactor LDAPAttributeSet to interits Set.
    - Switch BaseLDAPEntry to a be a new-style class.

  * Bugfixes:
    - Fix webui search basedn navilinks.
    - In ldaptor-fetchschema, start logging so errors are reported to the
      user.
    - Ignore case in attributeType names.
    - LDIF parsing:
      - Support splitted lines in ldifprotocol.LDIF.
      - Fix LDIF parsing when values have no leading space.
      - Protect against "<" values (external URL) in LDIF parsing.
      - Make ldifprotocol support versioned LDIF files.
    - Make LDAPServer error handling to actually talk sane
      things on the wire.
    - Detect truncated LDIF files, raise
      ldifprotocol.LDIFTruncatedError.
    - Handle different capitalizations of 'objectClass' in
      BaseLDAPEntry.
    - Finish schema parsing.
    - Fix bug where ldapserver raises an exception on non-anonymous
      binds. It was missed in ldaperrors refactor, add unit tests so it
      will not be missed again. (Closes: #244543)
    - When LDAPServer receives unknown protocol requests, reply sanely and
      do not close the connection. Thanks to Guido Trotter.
      (Closes: #244861)
    - Notice differences in attributeType when comparing
      LDAPAttributeSets.
    - In LDAPAttributeSet, override those parts of sets.Set which
      assume class creation works without arguments (as we need the
      key always).

  * Cleanups:
    - Start gathering unit tests for the server protocol.
    - Stringify MutableStrings to simplify things. MutableStrings
      shouldn't leak out of pureber and pureldap.
    - Use the canonical way to write objectClass in
      pureldap.LDAPFilterMatchAll; especially needed as the server code is
      currently case-dependent.
    - Nicer repr for LDAPAttributeSets.
    - Make sure BaseLDAPEntry LDIFfication lists attribute values in
      sorted order for reproducability.
    - Add comparisons to RelativeDistingushedName in order to have
      stable unit test results.

  * Packaging:
    - Build-depend on dia (new enough dia to not need X11 at build time)
      => uploading to experimental.

 -- Tommi Virtanen <tv@debian.org>  Mon, 17 May 2004 19:27:00 +0300

ldaptor (0.0.23) unstable; urgency=low

  * Bugfixes:
    - Fix a totally embarassing bug that left ldaptor-webui.deb
      almost empty.

 -- Tommi Virtanen <tv@debian.org>  Fri, 12 Mar 2004 17:20:03 +0200

ldaptor (0.0.22) unstable; urgency=low

  * Applications changes:
    - Partial rewrite of ldaptor-webui add to handle structural
      objectclasses separately from auxiliary objectclasses.

  * Documentation changes:
    - Add an example of using ldaptor-webui via twisted-web.

  * API changes:
    - Removed ldaptor.cred, it is no longer used.

  * Refactorings to adapt to Twisted APIs:
    - Switch from twisted.web.static.redirectTo() to
      twisted.web.util.redirectTo(), don't import static anymore.

  * Internal refactorings:
    - Move resource creation from ldaptor-webui script to library.

  * Bugfixes:
    - Make sure errors in ldaptor-webui add are passed along.
    - Explicitly fail when schema objectclasses refer to unknown
      attributetypes.
    - Make ldaptor-webui baseDN form work even when it's not at the root
      of the web server.

  * Cleanups:
    - Remove unused import in ldaptor-webui.

 -- Tommi Virtanen <tv@debian.org>  Fri, 12 Mar 2004 16:58:12 +0200

ldaptor (0.0.21) unstable; urgency=low

  * Documentation changes:
    - Added document "Introduction to LDAP".
    - Added example web-based application, a simple addressbook
      search, and slides demonstrating how one might write one
      incrementally. These might not make much sense without
      the talk (or even with it), my apologies for that.
    - Upgrade to docbook-slides 3.2.0.
    - Allow xsltproc to use net in case the XML catalog isn't well
      setup -- will re-enable --nonet when docbook-slides registers
      with xml-core.

  * API changes:
    - Add a new utility function
      ldapconnector.LDAPClientCreator.connectAnonymously(), which does
      an anonymous bind on behalf of the caller.
    - Allow ldaptor.apps.webui.htmlify.htmlify_attributes() to work on
      sets and sequences alike.
    - Search supports new sizeLimitIsNonFatal flag, that makes
      sizeLimitExceeded errors from server just truncate the result
      list instead of aborting the search.
    - Implement LDAPExtendedResponse.

  * Refactorings to adapt to Ldaptor APIs:

  * Refactorings to adapt to Twisted APIs:
    - Adapt to Twisted changing Options superclass from UserDict to
      dict: Options mixins can no longer inherit Options, as otherwise
      python2.3 throws a TypeError: Cannot create a consistent method
      resolution order (MRO) for bases. Closes: #232255, 223632,
      232022.
    - Add twisted newcred support.
    - Partial woven support (twisted.web.widgets is deprecated, but
      now woven is deprecated too, in favor of newov! I can't keep
      up!)
      - Woven integration of the basic LDAP objects.
      - ldaptor-webui search, delete and change_password
    - Ldaptor-webui refactoring
      - newcred and simpleguard
      - get rid of twisted.internet.app

  * Internal refactorings:
    - Refactor LDAP filter parsing to have all the things looking like
      (key=...) in one function.
    - Refactor ldaperrors to actually use the exception classes.
    - Modularize the experimental LDAP server implementation.

  * Bugfixes:
    - Fix webui moves: typo in variable name, handle
      distinguishednames as objects and not strings.
    - Make sure the port number is an integer before using it in
      LDAPConnector.
    - Add proper stringification to LDAPClientConnectionLostException;
      used to cause tuple index errors in LDAPException.__str__().
    - Make URLs like http://localhost:38980/dc=example,dc=com (no
      trailing slash) work in ldaptor-webui.
    - In ldaptor-webui search, do not show the default twisted form
      error screen when there was no form submitted. Ugly workaround
      that provides default values instead of '', I can't seem to find
      a nicer way.

  * Cleanups:
    - Remove unused methods and imports.
    - Remove BidirDict, it's not used anymore.
    - Remove debug prints.
    - Move from equality comparison to identity comparison when
      comparing against None. Cleaner and should even be faster.
    - Cleanup doc/Makefile
      - split the massive "do all" target into smaller targets
      - protect targets against missing parent directories of target
        file
      - move the HTML diff files and such out of doc/examples/
    - Cleanup LDAPException stringification, protect against
      exceptions with neither arguments nor class attribute name.
    - Cleanup indentation.
    - Pychecker cleanups.

  * Packaging:
    - Add build-depends needed for generating the documentation.
    - Move examples/ to doc/examples/
    - Make sure the documents can be built automatically.
    - Build-Depend on things needed for generating the documentation.
    - Add a new binary package, ldaptor-doc, that will contain the
      documentation.
    - Depend on a new enough version of Twisted.

  * Administrivia:
    - Edit TODO notes.
    - Ignore documentation generated files.
    - Add unit test coverage checking.
    - When rsyncing documentation to pyramid.twistedmatrix.com, rsync
      the full directories of slides, not just the index.html.

 -- Tommi Virtanen <tv@debian.org>  Sun, 29 Feb 2004 00:23:15 +0200

ldaptor (0.0.20) unstable; urgency=low

  * Applications changes:
    - Whoops, the syntax for singe-element tuple literals bit me
      again. Switch webui change_password to using lists, it's what Guido
      wants.

  * Bugfixes:
    - Explicitly stringify the dn to transparently work with
      DistinguishedName objects.

  * Packaging:
    - Drop python2.1, Twisted no longer supports it. Closes: #196038.
    - Let dh_python handle removing *.pyc from the deb and generating them
      in postinst (and use dh_clean to clean up after it). Make
      python-ldaptor's dependency to python be a versioned one. Not using
      dh_python's automagic, as it doesn't seem to work right. Closes:
      #205398.

  * Administrivia:
    - Add TODO entry about some SyntaxWarnings triggered by scoping.
    - Fix typo in setup-*.py.

 -- Tommi Virtanen <tv@debian.org>  Mon, 25 Aug 2003 22:22:20 +0300

ldaptor (0.0.19) unstable; urgency=low

  * Fix reference to non-existent local variable dn in webui
    change_password.py
  * Python 2.3 is now the default.

 -- Tommi Virtanen <tv@debian.org>  Sat,  9 Aug 2003 14:18:15 +0300

ldaptor (0.0.18) unstable; urgency=low

  * Bugfixes:
    - Make serviceLocationOverrides work once again in LDAPConnector.

 -- Tommi Virtanen <tv@debian.org>  Sun,  3 Aug 2003 10:17:00 +0300

ldaptor (0.0.17) unstable; urgency=low

  * API changes:
    - Add LDAPClientCreator.

 -- Tommi Virtanen <tv@debian.org>  Sun,  3 Aug 2003 10:01:19 +0300

ldaptor (0.0.16) unstable; urgency=low

  * Applications changes:
    - Make ldaptor-passwd actually follow it's usage. Defaults to
      changing password of the bind DN, if unspecified.
    - Make ldaptor-passwd Samba password changing more intelligent;
      instead of a Boolean, it's now a tristate option, with the new
      value "auto" checking for objectClass and setting the Samba
      password if and only if it sees the value sambaAccount there.
    - ldaptor-passwd now always changes all applicable passwords.
    - Hierarchical structure editing in ldaptor-webui is done, remove from
      TODO.
    - In ldaptor-webui change_password, don't make the DN a form
      field, there's no point in changing it at that time.
    - In ldaptor-webui, parse invalid base DNs and complain to user.
    - In ldaptor-webui, store DNs as DistinguishedNames, not as
      strings.
    - We fully support DNS SRV records now.
    - Add sample app bin/ldaptor-fetchschema, and notes on it's
      future direction. The current output looks ugly.

  * API changes:
    - LDAPObject.namingContext returns the naming context containing
      the LDAP object.
    - Deprecate LDAPModifyAttributes in LDAPObject, ldaptor-webui.
    - Add password changing support to LDAPObject.
    - LDAPModifyPassword is no longer used anywhere, remove it.
    - Add LDAPObject.items().
    - Add LDAPObject.fetch().
    - Support partial fetching in LDAPObject.fetch().
    - Add LDAPObject.setPassword_Samba().
    - Remove LDAPModifySambaPassword, it has no users anymore.
    - LDAPObject.setPassword() password setting now changes all
      applicable passwords automatically.
    - Remove LDAPModifyAttributes as obsolete.
    - "key in ldapobject" support, better iteration support for
      LDAPObject keys and key values.
    - Move authentication bits from ldaptor-webui main script to
      ldaptor.cred module.
    - Prevent removing attributes that are in the RDN of the object.
    - DistinguishedName now parses the actual values in DNs into
      attributetypes and values, and raises
      InvalidRelativeDistinguishedName for malformed RDNs.
    - Add preliminary support for LDAP object data content
      suggestions. Still need to implement a lot more hints and
      integrate into ldaptor-webui.
    - Add simple&stupid server-side support. Only knows bind/unbind
      and search, and all searches return no items.
    - Add LDIF parsing support.
    - Move ldaptor.protocols.ldap.ldapfilter to ldaptor.ldapfilter.
    - Split LDAP schema implementation into pure-ASCII parsing part
      and LDAP client remote schema fetching.
    - Rename the module that does LDAP schema fetching over the
      client connection to fetchschema, to better separate it from
      the ASCII schema parser.
    - Rename LDAPObject to LDAPEntry, that might be a bit more
      descriptive.

  * Refactorings to adapt to Ldaptor APIs:
    - Deleting LDAP object is now done via LDAPObject.delete().
    - Switch from ldapclient helpers to LDAPObjects in ldaptor-webui
      mass_change_password.
    - Change ldaptor-webui change_password to use
      LDAPObject.setPassword() instead of LDAPModifyPassword.
    - In ldaptor-passwd, use LDAPObject.setPassword_Samba() instead
      of LDAPModifySambaPassword.
    - Rewrite more code away from LDAPSearch.
    - Refactor ldaptor-ldap2passwd to use LDAPObjects.
    - Refactor ldaptor-webui add and delete to use LDAPObjects and
      DistinguishedNames more.
    - Modernize the ldap_parallelsearch.py example to use
      LDAPEntries.

  * Refactorings to adapt to Twisted APIs:
    - Authorizer.setApplication() has been obsoleted, apparently
      .setServiceCollection() does the same thing.
    - Use new-style maybeDeferred.
    - Switch from standard unittest to Twisted's trial. Also
      reorganized the package to match trial's expectations; that
      is, removed the lib/ dir.
    - Move from my own waitForDeferred to twisted's deferredResult,
      deferredError.
    - Rewrite the ldap_parallelsearch.py example to suit
      twisted.internet.protocol.ClientCreator and to not use global
      variables.

  * Refactorings to adapt to Python APIs:
    - Avoid using deprecated features of python.

  * Internal refactorings:
    - ldaptor-webui's Gadget() does not need or want the base DN; it
      asks it from the user.
    - Work towards running ldaptor-webui from an .rpy: add state
      serialization support, make serviceLocationOverride optional.

  * Bugfixes:
    - Use a python2.1 scope rules compatible lambda.
    - Add missing module ldapconnector to package
      ldaptor.protocols.ldap's __all__ list.
    - Make LDAPSearchRequest inherit BERSequence so that it has a
      comparison function.
    - Make sure the other dn is not just a string in
      DistinguishedName.contains().
    - Fix broken test and implementation for
      LDAPObject.setPassword() -- used to change the password for the
      bind DN.
    - Be more explicit by stringifying DNs before trying to do
      string-like operations on them.
    - Avoid requesting LDAPIdentities before the necessary LDAP
      connection has opened.

  * Cleanups:
    - Cleanup unit tests and merge similar functionality into helper
      functions.
    - Remove unintelligible comments in md4.py.
    - Avoid non-ASCII in source (but still keep it in the test).
    - Add unit tests for NT password hashing.
    - Add test for LDAPObject.keys().
    - Clean up LDAPObject journal handling. Rename journal operation
      classes, provide a superclass to inherit, and give
      LDAPAttributeSet a real API to submit changes.
    - Actually call fail.getErrorMessage, don't just print the
      function.

  * Packaging:
    - Depend on twisted >= 1.0.6
    - Change Debian section for python{,2.1,2.2}-ldaptor from
      interpreters to python.

  * Administrivia:
    - API documentation:
      - Support setting PYTHONPATH outside the script (to use CVS
        Twisted).
      - New home page URL.
      - Support uploading the API docs.
    - Ignore editor backup files.
    - Ignore Twisted tap files.
    - Fix admin/doctest-all.py that got broken in the lib/
      reorganization.

 -- Tommi Virtanen <tv@debian.org>  Sat,  2 Aug 2003 14:06:32 +0300

ldaptor (0.0.15) unstable; urgency=low

  * Typo fix.

 -- Tommi Virtanen <tv@debian.org>  Sat, 25 Jan 2003 18:11:31 +0200

ldaptor (0.0.14) unstable; urgency=low

  * Refactor ldaptor-webui add to use new-style getFreeNumber --
    missed this the first time around.
  * Python 2.1 namespace handling compatibility.

 -- Tommi Virtanen <tv@debian.org>  Sat, 25 Jan 2003 18:05:11 +0200

ldaptor (0.0.13) unstable; urgency=low

  * Bring test suite up to date.
  * Beginnings of a more Pythonic LDAP API.
  * Make ldapclient.LDAPModifyAttributes use Deferreds.
  * Pass ldapclient when creating LDAPObject, not at every use.
  * Simplify filter handling in ldaptor-search.
  * Add comparison functions for LDAPObjects.
  * LDAPObject.search now supports kwarg callback, which allows
    processing search results one by one.
  * Support creating API docs with epydoc.
  * Add bin/ldaptor-ldap2pdns
  * Docs and TODO update.
  * Allow empty base setting.
  * Support for parsing and generating string representations of
    LDAP Distinguished Names (DNs).
  * Display usage to stderr in ldaptor-namingcontexts.
  * Support for finding the domain name, and via DNS SRV, the
    server, related to an LDAP DN.
  * ldaptor-webui SRV support: options --host and --port are gone,
    finds LDAP servers for domainComponent-style DNs via DNS SRV
    records. If you don't have them, and don't want to fix that,
    use --service-location='dc=example,dc=com:ldap.example.com'.
  * Increase DNS timeout to 5 seconds.
  * Add DistinguishedName.contains()
  * Make DistinguishedName hashable.
  * Use the client for this session to fetch the attributes, don't
    open up a new connection.
  * Enable log to stderr in ldaptor-webui.
  * Runtime-changeable base DN support in ldaptor-webui: the base
    DN is now the first path segment in the URL, and you can
    navigate in the tree freely.
  * Bugfix for ldaptor-ldap2dhcpconf, used to assert when there
    were no sharedNets.
  * Fix an uninterruptible infinite loop in ldaptor-webui
    shutdown.
  * In ldaptor-webui, support search scopes.
  * In ldaptor-webui, show base object when no search has been
    done.
  * LDAP DN renaming support.
  * Various minor bugfixes.

 -- Tommi Virtanen <tv@debian.org>  Sun, 19 Jan 2003 17:32:03 +0200

ldaptor (0.0.12) unstable; urgency=low

  * Be epydoc-friendly in docstrings.
  * LDAP server closing connection due to idle timeout is now
    handled properly.
  * Added option --identity-base, setting the base dn for the
    search of identities (done with --identity-search).

 -- Tommi Virtanen <tv@debian.org>  Sat,  7 Dec 2002 13:57:19 +0200

ldaptor (0.0.11) unstable; urgency=low

  * New options-based, changeable search fields. To get the old
    behaviour, use --search-field=Name='(cn=%(input)s)'
    --search-field=UserID='(uid=%(input)s)'
    --search-field=Email='(mail=%(input)s)'.

 -- Tommi Virtanen <tv@debian.org>  Sun, 24 Nov 2002 21:16:23 +0200

ldaptor (0.0.10) unstable; urgency=low

  * ldaptor-ldap2dhcp bugfixes, cleanup, and support for
    per-subnet DNS and WINS servers.
  * Be more careful about the Debian section information.
  * In ldaptor-webui, allow editing missing optional fields of
    objects.

 -- Tommi Virtanen <tv@debian.org>  Thu, 31 Oct 2002 20:14:36 +0200

ldaptor (0.0.9) unstable; urgency=low

  * Copy over my MutableString implementation from Twisted, they
    are deprecating it. The one in UserString has very different
    behaviour. Closes: #163772.
  * Twisted Process wants the reactor.. Let's play along.
  * Handle no change -case better in ldaptor-webui mass password
    change.
  * Update TODO to reflect current situation.
  * Lots of places refer to ldaperrors.other, provide that.
  * Work on ldaptor-ldap2dhcpconf, ldaptor-ldap2maradns.
  * Bug fix in ldaptor-webui add.

 -- Tommi Virtanen <tv@debian.org>  Sun, 27 Oct 2002 12:28:14 +0200

ldaptor (0.0.8) unstable; urgency=low

  * Take out the python2.3 support, Twisted doesn't support 2.3
    yet anyway.

 -- Tommi Virtanen <tv@debian.org>  Thu, 19 Sep 2002 20:06:26 +0300

ldaptor (0.0.7) unstable; urgency=low

  * Don't leave LDAP connections open, cleanup.
  * ldaptor-webui search no longer leaks LDAP server connections
    for every search
  * Misc bug fixes.
  * Use Failures.
  * Default ldaptor-webui port is now 38980 (think "ldap and
    http").
  * New tool ldaptor-ldap2passwd
  * Added TODO notes.
  * Support changing Samba passwords.
  * Add functionality to get free uidNumbers.
  * Find free uidNumber/gidNumber in ldaptor-webui add.
  * Avoid Twisted deprecation warnings.
  * Support adding objects composed of multiple objectclasses.
  * Mark mandatory attributes with an asterisk.
  * Some pychecker cleanups.
  * Protect setup-*.py against pychecker importing them.
  * Packaging cleanups; python2.2 as default, python2.3 support,
    better descriptions.
  * Fix upstream location.

 -- Tommi Virtanen <tv@debian.org>  Thu,  8 Aug 2002 10:21:51 +0300

ldaptor (0.0.6) unstable; urgency=low

  * Twisted ClientFactory and Protocol connectionLost refactor.

 -- Tommi Virtanen <tv@debian.org>  Thu,  8 Aug 2002 10:21:07 +0300

ldaptor (0.0.5) unstable; urgency=low

  * ldaptor-passwd generated password setting failed as it tried
    to handle a list of one string as a string.
  * Depend on pwgen.
  * Add change_password.
  * Rename mass_password_change to mass_change_password, to fit
    the task-oriented naming convention.
  * Don't accept empty passwords in ldaptor-webui change_password.
  * Get rid of the rest of the implicit localhosts.
  * Moving bidirdict into ldaptor package as distutils can't
    handle it otherwise.
  * Added asText method for LDAPFilter_substrings, webui search
    should no longer fail.
  * LDAPClient.bind() now returns a Deferred.
    LDAPClient.handle_bind_success() and
    LDAPClient.handle_bind_fail() are gone.
  * LDAPClient.bind() deferred bugfixes.
  * Added ability to use shorthands for Identity names.
  * Lots of minor bugfixes.

 -- Tommi Virtanen <tv@debian.org>  Thu,  8 Aug 2002 10:16:19 +0300

ldaptor (0.0.4) unstable; urgency=low

  * Remove the obsolete ldaptor.twisted package.

 -- Tommi Virtanen <tv@debian.org>  Sat,  3 Aug 2002 16:20:21 +0300

ldaptor (0.0.3) unstable; urgency=low

  * NOTE: Requires a CVS version of twisted!
  * New upstream version.
  * tcp.Client -> reactor.clientTCP
  * Removed old code in ldaptor.twisted that got in the way of
    imports.
  * Added options --generate and --bind-auth-fd
  * Fix widget in ldaptor-webui search page.
  * Twisted Connector refactor.
  * Add hint that 'description' attributetype is always multiline.
  * Starting to use Deferreds everywhere.
  * Exception-based errors.
  * Add asText() methods to LDAPFilter*-classes, convert objects
    to textual filter representation.
  * Implement LDAPFilter_not.
  * Add mass_password_change to ldaptor-webui.
  * Added utility to generate debian/changelog automatically from
    BitKeeper.

 -- Tommi Virtanen <tv@debian.org>  Sat,  3 Aug 2002 15:55:09 +0300

ldaptor (0.0.2) unstable; urgency=low

  * NOTE: Requires a CVS version of twisted!
  * NOTE: Upgrade from 0.0.1 can fail.
  * Split package into library, ldaptor-webui and
    ldaptor-utils. Support multiple python versions in library.
  * Added new command line utilities:
    - ldaptor-namingcontexts to list naming contexts of a server.
    - ldaptor-ldap2dhcpconf is the start of a tool to export host
      entries from LDAP in a format suitable for a DHCP server.
    - ldaptor-ldap2maradns does pretty much the same for DNS, in
      (partial) maradns zone format; it was just so much easier.
    - note that the ldaptor-ldap2{dhcpconf,maradns} input format
      will change as I try to cram in a few more features
      (separate physical network location from DNS domain -- they
      are currently bound together).
    - ldaptor-search aims to be a full replacement for ldapsearch.
    - ldaptor-passwd allows changing passwords (as per RFC3062).
  * ldaptor-webui:
    - added support for "Advanced" searching with raw LDAP filter
      strings.
    - change parameter --port to --http-port, for clarity.
    - fix navi links.
  * Make all LDAP server, port and base settings explicit.
  * Add ldapfilter and ldif modules.
  * Create ldaptor.usage to store common option processing.
  * Change twisted.python.defer to twisted.internet.defer and
    twisted.protocols.protocol to twisted.internet.protocol.
  * Handle unsolicited LDAP notifications.
  * New test subsystem.
  * Rewrite LDAP protocol error number storage to be
    bi-directional; you can resolve a number to a string.

 -- Tommi Virtanen <tv@debian.org>  Sun, 28 Jul 2002 20:30:06 +0300

ldaptor (0.0.1) unstable; urgency=low

  * Initial Release.

 -- Tommi Virtanen <tv@debian.org>  Sun, 26 May 2002 18:08:30 +0300

