1Released 3.4.0 2021-11-26
2
3This release requires Python 3.6 or above,
4and is tested with Python 3.6 to 3.10.
5Python 2 is no longer supported.
6
7New code in the python-ldap project is available under the MIT licence
8(available in ``LICENCE.MIT`` in the source). Several contributors have agreed
9to apply this licence their previous contributions as well.
10See the ``README`` for details.
11
12The following undocumented functions are deprecated and scheduled for removal:
13- ``ldap.cidict.strlist_intersection``
14- ``ldap.cidict.strlist_minus``
15- ``ldap.cidict.strlist_union``
16
17Security fixes:
18* Fix inefficient regular expression which allows denial-of-service attacks
19  when parsing specially-crafted LDAP schema.
20  (GHSL-2021-117)
21
22Changes:
23* On MacOS, remove option to make LDAP connections from a file descriptor
24  when built with the system libldap (which lacks the underlying function,
25  ``ldap_init_fd``)
26* Attribute values of the post read control are now ``bytes``
27  instead of ISO8859-1 decoded ``str``
28* ``LDAPUrl`` now treats urlscheme as case-insensitive
29* Several OpenLDAP options are now supported:
30  * ``OPT_X_TLS_REQUIRE_SAN``
31  * ``OPT_X_SASL_SSF_EXTERNAL``
32  * ``OPT_X_TLS_PEERCERT``
33
34Fixes:
35* The ``copy()`` method of ``cidict`` was added back. It was unintentionally
36  removed in 3.3.0
37* Fixed getting/setting ``SASL`` options on big endian platforms
38* Unknown LDAP result code are now converted to ``LDAPexception``,
39  rather than raising a ``SystemError``.
40
41slapdtest:
42* Show stderr of slapd -Ttest
43* ``SlapdObject`` uses directory-based configuration of ``slapd``
44* ``SlapdObject`` startup is now faster
45
46Infrastructure:
47* CI now runs on GitHub Actions rather than Travis CI.
48
49
50----------------------------------------------------------------
51Released 3.3.0 2020-06-18
52
53Highlights:
54* ``LDAPError`` now contains additional fields, such as ctrls, result, msgid
55* ``passwd_s`` can now extract the newly generated password
56* LDAP connections can now be made from a file descriptor
57
58This release is tested on Python 3.8, and the beta of Python 3.9.
59
60The following undocumented functions are deprecated and scheduled for removal:
61- ``ldap.cidict.strlist_intersection``
62- ``ldap.cidict.strlist_minus``
63- ``ldap.cidict.strlist_union``
64
65Modules/
66* Ensure ReconnectLDAPObject is not left in an inconsistent state after
67  a reconnection timeout
68* Syncrepl now correctly parses SyncInfoMessage when the message is a syncIdSet
69* Release GIL around global get/set option call
70* Do not leak serverctrls in result functions
71* Don't overallocate memory in attrs_from_List()
72* Fix thread support check for Python 3
73* With OpenLDAP 2.4.48, use the new header openldap.h
74
75Lib/
76* Fix some edge cases regarding quoting in the schema tokenizer
77* Fix escaping a single space in ldap.escape_dn_chars
78* Fix string formatting in ldap.compare_ext_s
79* Prefer iterating dict instead of calling dict.keys()
80
81Doc/
82* Clarify the relationship between initialize() and LDAPObject()
83* Improve documentation of TLS options
84* Update FAQ to include Samba AD-DC error message
85  "Operation unavailable without authentication"
86* Fix several incorrect examples and demos
87  (but note that these are not yet tested)
88* Update Debian installation instructions for Debian Buster
89* Typo fixes in docs and docstrings
90
91Test/
92* Test and document error cases in ldap.compare_s
93* Test if reconnection is done after connection loss
94* Make test certificates valid for the far future
95* Use slapd -Tt instead of slaptest
96
97Infrastructure:
98* Mark the LICENCE file as a license for setuptools
99* Use "unittest discover" rather than "setup.py test" to run tests
100
101
102----------------------------------------------------------------
103Released 3.2.0 2019-03-13
104
105Lib/
106* Add support for X-ORIGIN in ldap.schema's ObjectClass
107* Make initialize() pass extra keyword arguments to LDAPObject
108* ldap.controls.sss: use str instead of basestring on Python 3
109* Provide ldap._trace_* atributes in non-debug mode
110
111Doc/
112* Fix ReST syntax for links to set_option and get_option
113
114Tests/
115* Use intersphinx to link to Python documentation
116* Correct type of some attribute values to bytes
117* Use system-specific ENOTCONN value
118
119Infrastructure:
120* Add testing and document support for Python 3.7
121* Add Python 3.8-dev to Tox and CI configuration
122* Add Doc/requirements.txt for building on Read the Docs
123
124
125----------------------------------------------------------------
126Released 3.1.0 2018-05-25
127
128This release brings two minor API changes:
129- Long-deprecated functions `ldap.open()` and `ldap.init()` are removed
130- `LDAPObject.compare_s()` and `compare_ext_s` return bool instead of 0 or 1
131
132All changes since 3.0.0:
133
134Lib/
135* Remove long deprecated functions ldap.open() and ldap.init()
136* LDAPObject.compare_s() and LDAPObject.compare_ext_s() now return a bool
137  instead of 1 or 0.
138* Make iteration over cidict yield same values as keys()
139* Fail if pyasn1 is not installed
140* Fix parsing of PPolicyControl ASN.1 structure
141* Use items() when appropriate in dict iteration
142* Add support for tracing LDAP calls. Tracing can now be enabled with
143  the env var PYTHON_LDAP_TRACE_LEVEL and redirected to a file with
144  PYTHON_LDAP_TRACE_FILE.
145  (This is mainly intended for debugging and internal testing; the
146  configuration or output may change in future versions.)
147
148Modules/
149* Fix ref counting bug in LDAPmessage_to_python
150
151Doc/
152* Remove warning about unreleased version
153* Doc: Replace Mac OS X -> macOS
154
155Tests/
156* Add tests and coverage for tracing
157* Disable warnings-as-errors for Python 3.4
158* Fix assertTrue to assertEqual
159* Mark several test values as bytes
160
161Lib/slapdtest/
162* Fix error message for missing commands
163* Make SlapdObject a context manager
164* Disable SASL external when missing SASL support
165* Make SlapdObject.root_dn a property
166* In SlapdObject, build include directives dynamically
167* Move import statements to top level
168
169Code style:
170* Add Makefile rules for automatic formatting of C and Python code
171* Reformat and indent all C files
172* Trim white space throughout the project
173
174Infrastructure:
175* Add py3-trace tox environment to Travis CI config
176* Add new Pytest cache directory to gitignore
177
178General:
179* Update all pypi.python.org URLs to pypi.org
180
181
182----------------------------------------------------------------
183Released 3.0.0 2018-03-12
184
185Notable changes since 2.4.45 (please see detailed logs below):
186* Python 3 support and bytes_mode
187  see: https://python-ldap.readthedocs.io/en/latest/bytes_mode.html
188* The module `ldap.async` is renamed to `ldap.asyncsearch`
189* New dependencies: pyasn1, pyasn1_modules
190* Dropped support for Python 2.6 and 3.3
191
192
193Changes since 3.0.0b4:
194
195Lib/
196* Add bytes_strictness to allow configuring behavior on bytes/text mismatch
197
198Modules/
199* Add argument name to bytes mode TypeError
200* Use correct integer types for BER encode/decode (fix for big endian machines)
201
202Test/
203* Set $LDAPNOINIT in all tests
204* Add test for secure TLS default
205* Ignore SASL methods in DSE test (fix for restricted environments)
206* Remove filterstr workaround from syncrepl test
207* Explicitly set TLS_REQUIRE_CERT option to TLS_HARD in test_tls_ext_noca
208
209Doc/
210* Link to bytes mode from text-string arguments in the ldap module
211
212Infrastructure:
213* Include lber in list of libraries in setup.cfg
214
215----------------------------------------------------------------
216Released 3.0.0b4 2018-01-10
217
218Changes since 3.0.0b3:
219
220Removed support for Python 3.3, which reached its end-of-life 2017-09-29.
221
222Lib/
223* Make default argument values work under bytes_mode
224* Update use of map() to use list/set comprehensions instead
225
226Test/
227* Refactor syncrepl tests to run with bytes_mode
228
229Doc/
230* Document all_records attribute of LDIFRecordList
231
232
233----------------------------------------------------------------
234Released 3.0.0b3 2017-12-20
235
236Changes since 3.0.0b2:
237
238The functions `ldap.open()`, `ldap.init()`, `ldif.CreateLDIF()`
239and `ldif.ParseLDIF()`, which were deprecated for over a decade,
240are scheduled for removal in python-ldap 3.1.
241
242Infrastructure:
243* Require setuptools to build
244* Start running automatic tests on PyPy
245
246Lib/
247* When raising LDAPBytesWarning, give helpful code locations
248* Use modern Python idioms in several places
249* Avoid reimplementing UserDict.get() in cidict and models.Entry
250
251Doc/
252* Use https links
253
254Test/
255* Add reproducer for openldap's NSS shutdown/restart issue
256* Make testing on non-Linux platforms easier
257
258
259----------------------------------------------------------------
260Released 3.0.0b2 2017-12-11
261
262Changes since 3.0.0b1:
263
264The module `ldap.async` is renamed to `ldap.asyncsearch`, due to
265`async` becoming a keyword in Python 3.7.
266The old module name is deprecated, but will be available as long
267as Python 3.6 is supported.
268
269Lib/
270* Use custom ldap.LDAPBytesWarning class
271* Rename ldap.async to ldap.asyncsearch
272
273Modules/
274* Support None for set_option(OPT_TIMEOUT) and OPT_NETWORK_TIMEOUT
275* Fix error reporting of LDAPObject.set_option()
276* Change memory handling in attrs_from_List()
277
278Test/
279* Remove workaround for OpenLDAP NSS issue
280
281Demo/
282* Use uniform shebang in all demos
283
284Doc/
285* Provide build deps for Alpine and CentOS
286* Move sample workflow out of the main Contributing guide
287
288Infrastructure:
289* Add valgrind target to check for memory leaks
290* Minimal configuration for pytest
291
292
293----------------------------------------------------------------
294Released 3.0.0b1 2017-12-04
295
296Changes since 2.4.45:
297(this list includes changes from 2.5.x)
298
299New dependencies (automatically installed when using pip):
300* pyasn1 0.3.7+
301* pyasn1_modules 0.1.5+
302
303Python 3 support and bytes_mode:
304* merged from the pyldap fork (https://github.com/pyldap)
305* please see documentation on bytes_mode and text/bytes handling:
306    https://python-ldap.readthedocs.io/en/latest/bytes_mode.html
307
308Removed support for Python 2.6.
309
310Infrastructure:
311* Move to Git
312* Don't define search path for includes and libs in the default setup.cfg
313* Include sasl/sasl.h from the standard path
314* Re-format README to ReStructured Text
315* Setup for automatic testing using Travis CI
316* Add coverage reporting for Python and C
317* Add install requires into setup.py
318* Remove distclean.sh in favor of make clean
319* Use `package`, `depends`, `install_requires` in setup.py
320* Add make target for scan-build (static analysis using clang)
321* Add make target and suppression file for Valgrind (memory checker)
322
323Modules/
324* Remove unused LDAPberval helper functions
325* Fix type conversion in page control
326* Fix multiple ref leaks in error-handling code
327* Fix reference leak in result4
328* Fix several compiler warnings
329* Fix memory leak in whoami
330* Fix internal error handling of LDAPControl_to_List()
331* Fix two memory leaks and release GIL in encode_assertion_control
332* Allow set_option() to set timeouts to infinity
333and, thanks to Michael Ströder:
334* removed unused code schema.c
335* moved code from version.c to ldapmodule.c
336* removed obsolete back-ward compability constants from common.h
337* build checks whether LDAP_API_VERSION is OpenLDAP 2.4.x
338* _ldap.__author__ and _ldap.__license__ also set from ldap.pkginfo
339* assume C extension API for Python 2.7+
340
341Lib/
342* Avoid eval() for getting module-level variables to fix running under pytest
343* Compability changes for pyasn1 0.3 or newer
344and, thanks to Michael Ströder:
345* ldap.__version__, ldap.__author__ and ldap.__license__ now
346  imported from new sub-module ldap.pkginfo also to setup.py
347* Added safety assertion when importing _ldap:
348  ldap.pkginfo.__version__ must match _ldap.__version__
349* removed stand-alone module dsml
350* slapdtest.SlapdObject.restart() just restarts slapd
351  without cleaning any data
352* The methods SSSResponseControl.decodeControlValue() and
353  VLVResponseControl.decodeControlValue() now follow the coding
354  convention to use camel-cased ASN.1 name as class attribute name.
355  The old class names are still set for back-ward compability
356  but should not be used in new code because they might be removed
357  in a later release.
358* removed SSSRequestControl from ldap.controls.KNOWN_RESPONSE_CONTROLS
359* removed all dependencies on modules string and types
360* removed use of .has_key()
361* removed class ldap.ldapobject.NonblockingLDAPObject
362* new global constant ldap.LIBLDAP_API_INFO
363* right after importing _ldap there is a call into libldap to initialize it
364* method .decodeControlValue() of SSSResponseControl and VLVResponseControl
365  does not set class attribute result_code anymore
366* always use bytes() for UUID() constructor in ldap.syncrepl
367* module ldif now uses functions b64encode() and b64decode()
368* fixed pickling and restoring of ReconnectLDAPObject
369
370Lib/slapdtest
371* Automatically try some common locations for SCHEMADIR
372* Ensure server is stopped when the process exits
373* Check for LDAP schema and slapd binaries
374* slapdtest is now a package and includes testing certificates
375
376Tests/
377* Expand cidict membership test
378* Add test suite for binds
379* Add test suite for edits
380* Add a smoke-check for listall() and attribute_types()
381* Add test case for SASL EXTERNAL auth
382* Add tests for start_tls
383* In CI, treat compiler warnings as fatal errors
384* Added tests for ldap.syncrepl
385and, thanks to Michael Ströder:
386* added explicit reconnect tests for ReconnectLDAPObject
387* scripts do not directly call SlapdTestCase.setUpClass() anymore
388* added LDIF test with folded, base64-encoded attribute
389* added more tests for sub-module ldap.dn
390
391Doc/
392* Build documentation without the compiled C extension
393* Merge contents from python-ldap.org
394* Move reference documentation in its own section
395* Document return value of {modify,add,delete}_ext_s() as a tuple
396* Add tests for documentation (build & spelling)
397* Link to documentation of old versions
398* Add a contributing guide
399
400----------------------------------------------------------------
401Released 2.4.45 2017-10-09
402
403Changes since 2.4.44:
404
405Lib/
406* Fixed reraising of wrong exception in SimpleLDAPObject._ldap_call()
407  (thanks to Aigars Grins)
408
409Tests/
410* removed work-around in t_cext.py
411
412----------------------------------------------------------------
413Released 2.4.44 2017-09-08
414
415Changes since 2.4.43:
416
417Modules/
418* more fine-grained GIL releasing in function l_ldap_result4()
419
420----------------------------------------------------------------
421Released 2.4.43 2017-09-06
422
423Changes since 2.4.42:
424
425Lib/
426* fixed passing all arguments from LDAPObject.sasl_non_interactive_bind_s()
427  to LDAPObject.sasl_interactive_bind_s()
428
429Tests/
430* added test for LDAPObject.sasl_external_bind_s()
431
432Doc/
433* added docs for SASL bind methods
434* more references
435* better sorting of LDAPObject methods
436
437----------------------------------------------------------------
438Released 2.4.42 2017-09-04
439
440Changes since 2.4.41:
441
442Lib/
443* added new SlapdObject methods _ln_schema_files() and
444  _create_sub_dirs()
445* SlapdObject methods setup_rundir() and gen_config()
446  are now "public" methods
447* removed pseudo test script from module ldap.cidict
448
449Tests/
450* added sub-module for testing class ldap.cidict.cidict
451* avoid deprecated method alias unittest.TestCase.assertEquals
452
453----------------------------------------------------------------
454Released 2.4.41 2017-07-12
455
456Changes since 2.4.40:
457
458Lib/
459* Added support for increment: lines in LDIF changes records
460
461----------------------------------------------------------------
462Released 2.4.40 2017-06-27
463
464Changes since 2.4.39:
465
466Modules/
467* fixed memory leaks when using extended controls
468  (thanks to Erik Cumps)
469
470----------------------------------------------------------------
471Released 2.4.39 2017-05-31
472
473Changes since 2.4.38:
474
475Lib/
476* fixed errno-related ldap.TIMEOUT regression
477
478Lib/slapdtest.py
479* Removed obsolete assert statements
480
481----------------------------------------------------------------
482Released 2.4.38 2017-04-28
483
484Changes since 2.4.37:
485
486Lib/slapdtest.py
487* SlapdObject now evaluates env var SLAPD for optionally pointing
488  to OpenLDAP's slapd executable (e.g. with OpenLDAP LTB builds)
489* added LDAPI support in slaptest.SlapdObject which is internally used
490  in methods ldapadd() and ldapwhoami()
491* added method slaptest.SlapdObject.ldapmodify()
492* fixed enabling logger in slaptest
493* directory name now contains port to be able to run several SlapdObject
494  instances side-by-side (e.g. with replication)
495* added authz-regexp mapping to rootdn for user running the test
496* internally use SASL/EXTERNAL via LDAPI to bind
497* SlapdObject.server_id used as serverID in slapd.conf for MMR
498* Removed method SlapdObject.started() because SlapdTestCase.setUpClass()
499  will be used to add initial entries
500
501Tests/
502* ReconnectLDAPObject is also tested by sub-classing test class
503
504----------------------------------------------------------------
505Released 2.4.37 2017-04-27
506
507Changes since 2.4.36:
508
509Lib/
510* fixed errno-related regression introduced in 2.4.35
511
512Tests/
513* added more checks to t_cext.py
514* renamed t_search.py to t_ldapobject.py and code-cleaning
515* added test for errno-related regression to t_ldapobject.py
516
517----------------------------------------------------------------
518Released 2.4.36 2017-04-26
519
520Changes since 2.4.35:
521
522Lib/
523* gracefully handle KeyError in LDAPObject._ldap_call() when
524  using errno
525* added new stand-alone module slapdtest (formerly Tests/slapd.py)
526  for general use (still experimental)
527
528Tests/
529* re-factored t_cext.py and t_search.py
530* set env var LDAPNOINIT=1 in t_cext.py and t_search.py to avoid
531  interference with locally installed .ldaprc or ldap.conf
532* by default back-mdb is now used for slapd-based tests
533  which requires fairly recent OpenLDAP builds but implements
534  full feature set
535* env vars can be set for slapd.py to tweak path names
536  of executables, temporary and schema data to be used
537* new class SlapdTestCase
538
539----------------------------------------------------------------
540Released 2.4.35 2017-04-25
541
542Changes since 2.4.33:
543(2.4.34 is missing because of foolish pypi version madness)
544
545Modules/
546* use errno in a safer way
547* set errno as LDAPError class item
548* do not use strerror() which is not thread-safe and platform-specific
549
550Lib/
551* LDAPObject._ldap_call() sets LDAPError info to value returned
552  by platform-neutral os.stderror()
553
554----------------------------------------------------------------
555Released 2.4.33 2017-04-25
556
557Changes since 2.4.32:
558
559Lib/
560* faster implementation of ldap.schema.tokenizer.split_tokens()
561  (thanks to Christian Heimes)
562* removed unused 2nd argument of ldap.schema.tokenizer.split_tokens()
563* fixed method calls in ReconnectLDAPObject (thanks to Philipp Hahn)
564
565Modules/
566* an empty info message is replaced with strerror(errno) if errno is non-zero
567  which gives more information e.g. in case of ldap.SERVER_DOWN
568  (thanks to Markus Klein)
569* removed superfluous ldap_memfree(error) from LDAPerror()
570  (thanks to Markus Klein)
571
572Tests/
573* re-factored t_ldap_schema_tokenizer.py
574
575----------------------------------------------------------------
576Released 2.4.32 2017-02-14
577
578Changes since 2.4.31:
579
580Running tests made easier:
581- python setup.py test
582- added tox.ini
583
584----------------------------------------------------------------
585Released 2.4.31 2017-02-14
586
587Changes since 2.4.30:
588
589Tests/
590* new test scripts t_ldap_schema_tokenizer.py and t_ldap_modlist.py
591  on former raw scripts (thanks to Petr Viktorin)
592* new test-cases in t_ldapurl.py based on former raw scripts
593  (thanks to Petr Viktorin)
594* new test-cases in t_ldap_dn.py
595* moved a script to Demo/
596
597----------------------------------------------------------------
598Released 2.4.30 2017-02-08
599
600Changes since 2.4.29:
601
602Lib/
603* compability fix in ldap.controls.deref to be compatible to
604  recent pyasn1 0.2.x (thanks to Ilya Etingof)
605
606----------------------------------------------------------------
607Released 2.4.29 2017-01-25
608
609Changes since 2.4.28:
610
611Modules/
612* Fixed checking for empty server error message
613  (thanks to Bradley Baetz)
614* Fixed releasing GIL when calling ldap_start_tls_s()
615  (thanks to Lars Munch)
616
617----------------------------------------------------------------
618Released 2.4.28 2016-11-17
619
620Changes since 2.4.27:
621
622Lib/
623* LDAPObject.unbind_ext_s() invokes LDAPObject._trace_file.flush()
624  only if LDAPObject._trace_level is non-zero and Python is running
625  in debug mode
626* LDAPObject.unbind_ext_s() now ignores AttributeError
627  in case LDAPObject._trace_file has no flush() method
628* added dummy method ldap.logger.logging_file_class.flush() because
629  LDAPObject.unbind_ext_s() invokes it
630
631----------------------------------------------------------------
632Released 2.4.27 2016-08-01
633
634Changes since 2.4.26:
635
636Lib/
637* added 'strf_secs' and 'strp_secs' to ldap.functions.__all__
638* fixed regression introduced with 2.4.26:
639  ldif.LDIFParser did not fully parse LDIF records without trailing empty
640  separator line
641
642----------------------------------------------------------------
643Released 2.4.26 2016-07-24
644
645Changes since 2.4.25:
646
647Installation:
648* added ldap.controls.sss to py_modules in setup.py
649
650Lib/
651* LDAPObject.unbind_ext() now removes class attribute
652  LDAPObject._l to completely invalidate C wrapper object
653* LDAPObject.unbind_ext() now flushes trace file
654* ldap.ldapobject.SimpleLDAPObject:
655  added convenience methods read_rootdse_s() and get_naming_contexts()
656* added functions ldap.strf_secs() and ldap.strp_secs()
657* added function ldap.filter.time_span_filter()
658* Refactored ldif.LDIFParser
659  * ldif.LDIFParser.version ís now Integer
660  * ignore multiple empty lines between records
661* Fixed ldap.dn.is_dn()
662
663Modules/
664* Fixed #69 Segmentation fault on whoami_s after unbind
665  (thanks to Christian Heimes and Petr Viktorin)
666
667Tests/
668* Fixed result3() being used instead of correct result4()
669  (see #66, thanks to David D. Riddle)
670* Tests/slapd.py honors env var $TMP instead of just using
671  hard-coded /var/tmp
672* Tests/slapd.py now expects schema to be in /etc/openldap/
673* Tests/t_ldapurl.py now independent of module ldap
674* Tests/t_ldif.py now has more test-cases including change records
675* added some more test scripts for sub-modules ldap.dn, ldap.filter and
676  ldap.functions (not complete yet)
677
678----------------------------------------------------------------
679Released 2.4.25 2016-01-18
680
681Changes since 2.4.23:
682(2.4.24 is missing because of foolish pypi version madness)
683
684Lib/
685* Fix for attrlist=None regression introduced in 2.4.23
686  by ref count patch
687
688----------------------------------------------------------------
689Released 2.4.23 2016-01-17
690
691Changes since 2.4.22:
692
693Modules/
694* Ref count issue in attrs_from_List() was fixed
695  (thanks to Elmir Jagudin)
696
697----------------------------------------------------------------
698Released 2.4.22 2015-10-25
699
700Changes since 2.4.21:
701
702Lib/
703* LDIFParser now also accepts value-spec without a space
704  after the colon.
705* Added key-word argument authz_id to LDAPObject methods
706  sasl_non_interactive_bind_s(), sasl_external_bind_s() and
707  sasl_gssapi_bind_s()
708* Hmmpf! Added missing self to LDAPObject.fileno().
709* ReconnectLDAPObject.sasl_bind_s() now correctly uses
710  generic wrapper arguments *args,**kwargs
711* Correct method name LDIFParser.handle_modify()
712* Corrected __all__ in modules ldap.controls.pwdpolicy and
713  ldap.controls.openldap
714
715Doc/
716* Started missing docs for sub-module ldap.sasl.
717
718----------------------------------------------------------------
719Released 2.4.21 2015-09-25
720
721Changes since 2.4.20:
722
723Lib/
724* LDAPObject.read_s() now returns None instead of raising
725  ldap.NO_SUCH_OBJECT in case the search operation returned emtpy result.
726* ldap.resiter.ResultProcessor.allresults() now takes new key-word
727  argument add_ctrls which is internally passed to LDAPObject.result4()
728  and lets the method also return response control along with the search
729  results.
730* Added ldap.controls.deref implementing support for dereference control
731
732Tests/
733* Unit tests for module ldif (thanks to Petr Viktorin)
734
735----------------------------------------------------------------
736Released 2.4.20 2015-07-07
737
738Changes since 2.4.19:
739
740* New wrapping of OpenLDAP's function ldap_sasl_bind_s() allows
741  to intercept the SASL handshake (thanks to René Kijewski)
742
743Modules/
744* Added exceptions ldap.VLV_ERROR, ldap.X_PROXY_AUTHZ_FAILURE and
745  ldap.AUTH_METHOD_NOT_SUPPORTED
746
747Lib/
748* Abandoned old syntax when raising ValueError in modules ldif and
749  ldapurl, more information in some exceptions.
750* ldap.ldapobject.LDAPObject:
751  New convenience methods for SASL GSSAPI or EXTERNAL binds
752* Refactored parts in ldif.LDIFParser:
753  - New class attributes line_counter and byte_counter contain
754    amount of LDIF data read so far
755  - Renamed some internally used methods
756  - Added support for parsing change records currently limited to
757    changetype: modify
758  - New separate methods parse_entry_records() (also called by parse())
759    and parse_change_records()
760  - Stricter order checking of dn:, changetype:, etc.
761  - Removed non-existent 'AttrTypeandValueLDIF' from ldif.__all__
762* New mix-in class ldap.controls.openldap.SearchNoOpMixIn
763  adds convience method noop_search_st() to LDAPObject class
764* Added new modules which implement the control classes
765  for Virtual List View (see draft-ietf-ldapext-ldapv3-vlv) and
766  Server-side Sorting (see RFC 2891) (thanks to Benjamin Dauvergne)
767  Note: This is still experimental! Even the API can change later.
768
769----------------------------------------------------------------
770Released 2.4.19 2015-01-10
771
772Changes since 2.4.18:
773
774Lib/
775* Fixed missing ReconnectLDAPObject._reconnect_lock when pickling
776  (see SF#64, thanks to Dan O'Reilly)
777* Added ldap.controls.pagedresults which is pure Python implementation of
778  Simple Paged Results Control (see RFC 2696) and delivers the correct
779  result size
780
781----------------------------------------------------------------
782Released 2.4.18 2014-10-09
783
784Changes since 2.4.17:
785
786Lib/
787* Fixed raising exception in LDAPObject.read_s() when reading
788  an entry returns empty search result
789
790----------------------------------------------------------------
791Released 2.4.17 2014-09-27
792
793Changes since 2.4.16:
794
795Lib/
796* New hook syncrepl_refreshdone() in ldap.syncrepl.SyncReplConsumer
797  (thanks to Petr Spacek and Chris Mikkelson)
798
799Modules/
800* Added support for getting file descriptor of connection
801  with ldap.OPT_DESC
802
803----------------------------------------------------------------
804Released 2.4.16 2014-09-10
805
806Changes since 2.4.15:
807
808Lib/
809* New convenience function ldap.dn.is_dn()
810* New convenience function ldap.escape_str()
811* New convenience methods LDAPObject.read_s() and
812  LDAPObject.find_unique_entry()
813* Fixed invoking start_tls_s() in ReconnectLDAPObject.reconnect()
814  (thanks to Philipp Hahn)
815
816----------------------------------------------------------------
817Released 2.4.15 2014-03-24
818
819Changes since 2.4.14:
820
821Lib/
822* Added missing modules ldap.controls.openldap and
823  ldap.controls.pwdpolicy to setup.py
824* Added missing imports to ldap.controls.pwdpolicy
825* Fixed ldap.controls.pwdpolicy.decodeControlValue() to decode
826  string of digits
827* Support for X-SUBST in schema element class LDAPSyntax
828* Support for X-ORDERED and X-ORIGIN in schema element class AttributeType
829* ldapurl: New scope 'subordinates' defined in
830  draft-sermersheim-ldap-subordinate-scope
831
832Modules/
833* New constant ldap.SCOPE_SUBORDINATE derived from ldap.h for
834  draft-sermersheim-ldap-subordinate-scope
835* Fixed constant ldap.sasl.CB_GETREALM (thanks to Martin Pfeifer)
836
837----------------------------------------------------------------
838Released 2.4.14 2014-01-31
839
840Changes since 2.4.13:
841
842Lib/
843* Added ldap.controls.openldap.SearchNoOpControl
844* New method ldap.async.AsyncSearchHandler.afterFirstResult()
845  for doing something right after successfully receiving but before
846  processing first result
847* Better log data written when invoking ldap.LDAPLock.acquire() and
848  ldap.LDAPLock.release()
849* LDAPObject and friends now pass `desc' to ldap.LDAPLock() which
850  results in better logging
851* ldapobject.ReconnectLDAPObject now uses internal class-wide
852  lock for serializing reconnects
853* Method signature of ReconnectLDAPObject.reconnect() changed to be able
854  to call it with separate retry_max and retry_delay values
855
856Modules/
857* Added support for retrieving negotiated TLS version/cipher
858  with LDAPObject.get_option() with the help of upcoming OpenLDAP libs
859
860----------------------------------------------------------------
861Released 2.4.13 2013-06-27
862
863Changes since 2.4.12:
864
865Lib/
866* ldapobject.ReconnectLDAPObject._apply_last_bind() now sends
867  anonymous simple bind request even if the calling application
868  did not to provoke ldap.SERVER_DOWN in method reconnect()
869* ldapobject.ReconnectLDAPObject.reconnect() now also catches
870  ldap.TIMEOUT exception after reconnection attempt
871* Several other fixes for ldapobject.ReconnectLDAPObject
872  (thanks to Jonathan Giannuzzi)
873
874----------------------------------------------------------------
875Released 2.4.12 2013-06-01
876
877Changes since 2.4.11:
878
879Lib/
880* Truly optional import of PyAsn1Error exception which should
881  not fail anymore if pyasn1 is not installed
882
883----------------------------------------------------------------
884Released 2.4.11 2013-05-27
885
886Changes since 2.4.10:
887
888Lib/
889* ldap.controls.DecodeControlTuples() now simply ignores
890  PyAsn1Error exception raised during decoding malformed
891  response control values in case of non-critical controls.
892* ldif.LDIFWriter.unparse() does not simply skip empty
893  records anymore.
894
895----------------------------------------------------------------
896Released 2.4.10 2012-06-07
897
898Changes since 2.4.9:
899
900Lib/
901* ldapobject.ReconnectLDAPObject.reconnect() now preserves
902  order of options set with LDAPObject.set_option before.
903  This is needed e.g. for setting connection-specific TLS options.
904
905Demo/
906* Better version of Demo/pyasn1/syncrepl.py
907  (thanks to Ben Cooksley)
908
909----------------------------------------------------------------
910Released 2.4.9 2012-03-14
911
912Changes since 2.4.8:
913
914Lib/
915* ldapobject.ReconnectLDAPObject.reconnect() now does kind of
916  an internal locking to pause other threads while reconnecting
917  is pending.
918* Changes to bind- and startTLS-related operation methods of
919  class ReconnectLDAPObject for more robustness
920* New constant ldap.OPT_NAMES_DICT contains mapping from
921  integer to variable name for all option-related constants.
922
923----------------------------------------------------------------
924Released 2.4.8 2012-02-21
925
926Changes since 2.4.7:
927
928Lib/
929* Fixed overzealous check for non-unique NAMEs in
930  ldap.schema.subentry.SubSchema.__init__()
931* Fixed typos in control decoding method
932  ldap.controls.simple.OctetStringInteger.decodeControlValue()
933* Added experimental support for draft-vchu-ldap-pwd-policy
934
935----------------------------------------------------------------
936Released 2.4.7 2012-12-19
937
938Changes since 2.4.6:
939
940Lib/
941* Separate classes for request/response controls for RFC 3829
942* Fixed ldap.schema.subentry.SubSchema.attribute_types() to
943  also eliminate double attribute types in MAY clause of
944  DIT content rule
945
946Modules/
947* Fixed memory leak (thanks to David Malcolm)
948
949----------------------------------------------------------------
950Released 2.4.6 2011-11-27
951
952Changes since 2.4.5:
953
954Lib/
955* ldap.controls.ppolicy:
956  Another fix for decoding the password policy response control
957
958----------------------------------------------------------------
959Released 2.4.5 2011-11-25
960
961Changes since 2.4.4:
962
963Installation:
964* defines for SASL and SSL in setup.cfg to be more friendly to
965  Python setup tools (easy_install)
966
967Lib/
968* Fixed typo in ldap.functions._ldap_function_call() which
969  always released ldap._ldap_module_lock instead of local lock
970* ldap.controls.ppolicy:
971  Fixed decoding the password policy response control
972
973Demo/
974* Demo script for ldap.controls.ppolicy
975
976----------------------------------------------------------------
977Released 2.4.4 2011-10-26
978
979Changes since 2.4.3:
980
981Modules/
982* Format intermediate messages as 3-tuples instead of
983  4-tuples to match the format of other response messages.
984  (thanks to Chris Mikkelson)
985* Fixes for memory leaks (thanks to Chris Mikkelson)
986
987Lib/
988* New experimental(!) sub-module ldap.syncrepl implementing syncrepl
989  consumer (see RFC 4533, thanks to Chris Mikkelson)
990
991Doc/
992* Cleaned up rst files
993* Added missing classes
994
995----------------------------------------------------------------
996Released 2.4.3 2011-07-23
997
998Changes since 2.4.2:
999
1000Lib/
1001* Mostly corrected/updated __doc__ strings
1002
1003Doc/
1004* Corrected rst files
1005* Added missing modules, functions, classes, methods, parameters etc.
1006  at least as auto-generated doc
1007
1008----------------------------------------------------------------
1009Released 2.4.2 2011-07-21
1010
1011Changes since 2.4.1:
1012
1013Lib/
1014
1015Logging:
1016* pprint.pformat() is now used when writing method/function
1017  arguments to the trace log
1018
1019ldap.schema.subentry:
1020* SubSchema.__init__() now has new key-word argument check_uniqueness
1021  which enables checking whether OIDs are unique in the subschema subentry
1022* Code-cleaning: consequent use of method SubSchema.getoid() instead of
1023  accessing SubSchema.name2oid directly.
1024* SubSchema.getoid() and SubSchema.getoid() now have key-word argument
1025  raise_keyerror=0 and raise KeyError with appropriate description.
1026
1027----------------------------------------------------------------
1028Released 2.4.1 2011-07-05
1029
1030Changes since 2.4.0:
1031
1032Modules:
1033* New LDAP option OPT_X_TLS_PACKAGE available in OpenLDAP 2.4.26+
1034  to determine the name of the SSL/TLS package OpenLDAP was
1035  built with
1036
1037Lib/
1038* ldap.modlist.modifyModlist(): New key-word argument
1039  case_ignore_attr_types used to define attribute types for which
1040  comparison of old and new values should be case-insensitive
1041* Minor changes to which data is sent to debug output for various
1042  trace levels
1043* Now tag [1] is used in ldap.extop.dds.RefreshResponse in
1044  compliance with RFC 2589 (fix available for OpenLDAP ITS#6886)
1045* New sub-module ldap.controls.sessiontrack implements request control
1046  as described in draft-wahl-ldap-session (needs pyasn1_modules)
1047
1048----------------------------------------------------------------
1049Released 2.4.0 2011-06-02
1050
1051Changes since 2.3.13:
1052
1053* OpenLDAP 2.4.11+ required to build
1054* Support for extracting LDAPv3 extended controls in
1055  LDAP_RES_SEARCH_ENTRY responses
1056  (see SF#2829057, thanks to Rich)
1057* Generic support for LDAPv3 extended operations (thanks to Rich)
1058
1059Lib/
1060* new class API in ldap.controls, not backwards-compatible!
1061* new sub-modules for ldap.controls, some require pyasn1 and pyasn1_modules
1062* New methods LDAPObject.result4() and LDAPObject.extop_result()
1063* New (optional) class ldap.controls.AssertionControl
1064* New helper module ldap.logger contains file-like object which
1065  sends trace messages to logging.log()
1066* Removed non-functional method LDAPObject.set_cache_options()
1067* Removed unused dictionary ldap.controls.knownLDAPControls
1068
1069Modules/
1070* ldapcontrol.c: Fixed encode_assertion_control() and function is no longer
1071  hidden behind ifdef-statement
1072
1073----------------------------------------------------------------
1074Released 2.3.13 2011-02-19
1075
1076Changes since 2.3.12:
1077
1078Modules/
1079* Correct #ifdef-statement for LDAP_OPT_X_TLS_CRLFILE in
1080  constants.c fixes build with older OpenLDAP libs
1081* Support for LDAP_OPT_DEFBASE (see SF#3072016, thanks to Johannes)
1082
1083----------------------------------------------------------------
1084Released 2.3.12 2010-08-05
1085
1086Changes since 2.3.11:
1087
1088Lib/
1089* Removed tabs from various modules to make things work with python -tt.
1090* Quick fix to ldif.is_dn() to let multi-valued RDNs pass as valid.
1091  Is too liberal in some corner-cases though...
1092* Fix to ldif.is_dn() to allow dashes in attribute type (see SF#3020292)
1093* ldap.open() now outputs a deprecation warning
1094* module-wide locking is now limited to calling _ldap.initialize().
1095  Still ldap.functions._ldap_function_call() is used to wrap all
1096  calls for writing debug log.
1097
1098Modules/
1099* New LDAP options available in OpenLDAP 2.4.18+ supported in
1100  LDAPObject.get/set_option():
1101  ldap.OPT_X_KEEPALIVE_IDLE, ldap.OPT_X_KEEPALIVE_PROBES,
1102  ldap.OPT_X_KEEPALIVE_INTERVAL,
1103  ldap.OPT_X_TLS_CRLCHECK, ldap.OPT_X_TLS_CRLFILE
1104
1105Doc/
1106* Various small updates/improvements
1107
1108----------------------------------------------------------------
1109Released 2.3.11 2010-02-26
1110
1111Changes since 2.3.10:
1112
1113Lib/
1114* Fixed LDAP URL parsing with four ? but no real extensions
1115* ldap.ldapobject.LDAPObject.rename_s() now also accepts arguments
1116  serverctrls and clientctrls
1117* Removed untested and undocumented class ldap.ldapobject.SmartLDAPObject
1118* Removed broken method ldap.ldapobject.LDAPObject.manage_dsa_it()
1119
1120Modules/
1121* Make use of LDAP_OPT_X_TLS_NEWCTX only if available in
1122  OpenLDAP libs used for the build
1123* Fixed #ifdef-statements for OPT_X_TLS_PROTOCOL_MIN
1124
1125Doc/
1126* Some updates and corrections regarding description of use of
1127  LDAPv3 controls
1128* Some more descriptions for constants
1129* Removed comments related to old LaTeX-based documentation system
1130
1131----------------------------------------------------------------
1132Released 2.3.10 2009-10-30
1133
1134Changes since 2.3.9:
1135
1136Lib/
1137* The diagnosticMessage returned by a server is written to the trace
1138  output also for successful operations.
1139* Fixed handling of LDAP URL extensions with implicit value None which are
1140  mapped to class attributes of LDAPUrl.
1141* Fixed handling of LDAP URLs with ? being part of extensions.
1142* Fixed exceptions raised by get_option/set_option (SF#1964993)
1143* ldap.functions: Fixed import trace-related variables from base-module ldap
1144* Fixed ldap.resiter missing in RPMs built with python setup.py bdist_rpm
1145* Fix in class ldap.schema.models.SchemaElement:
1146  repr() was liberally used in methods key_attr() and key_list() to enclose
1147  values in quotes.
1148
1149Modules/
1150* Changed internal API List_to_LDAPControls() to LDAPControls_from_object()
1151* Supported was added for retrieving the SASL username during SASL bind with
1152  ldap_get_option(LDAP_OPT_X_SASL_USERNAME) if available in libldap.
1153* New LDAP option constant ldap.OPT_X_TLS_NEWCTX supported
1154  in LDAPObject.set_option()
1155* New LDAP option constants supported in LDAPObject.get/set_option():
1156  ldap.OPT_X_TLS_PROTOCOL_MIN, ldap.OPT_CONNECT_ASYNC, ldap.OPT_X_TLS_DHFILE
1157* Fixed setting _ldap.OPT_ON and _ldap.OPT_OFF
1158* l_ldap_result3(): controls are now parsed for all response types (SF#2829057)
1159
1160Doc/
1161* Added example for ldap.resiter
1162
1163----------------------------------------------------------------
1164Released 2.3.9 2009-07-26
1165
1166Changes since 2.3.8:
1167
1168Lib/
1169* All modules (ldap, ldif, dsml and ldapurl) have common version number now
1170* Non-exported function ldif.needs_base64() was abandoned and is now
1171  implemented as method LDIFWriter._needs_base64_encoding().
1172  This allows sub-classes of LDIFWriter to implement determining whether
1173  attribute values have to be base64-encoded in a different manner and is
1174  the same approach like in class dsml.DSMLWriter.
1175* LDAPUrlExtension._parse() now gracefully handles LDAP URL extensions
1176  without explicit exvalue as being set with implicit value None.
1177
1178Modules/
1179* New LDAP option constant ldap.OPT_X_SASL_NOCANON supported
1180  in LDAPObject.get/set_option()
1181
1182----------------------------------------------------------------
1183Released 2.3.8 2009-04-30
1184
1185Changes since 2.3.7:
1186
1187Lib/
1188* ldap.schema.models: More fault-tolerant parsing of SYNTAX in
1189  AttributeTypeDescription
1190* ldap.schema.tokenizer.split_tokens():
1191  More tolerant parsing of items separated only with a DOLLAR without
1192  surrounding white-spaces (because WSP is declared as zero or more spaces
1193  in RFC 4512)
1194
1195----------------------------------------------------------------
1196Released 2.3.7 2009-04-09
1197
1198Changes since 2.3.6:
1199
1200Lib/
1201* urllib.quote() is now used in LDAPUrlExtension.unparse() to quote
1202  all special URL characters in extension values
1203
1204Modules/
1205* Fixed ldapcontrol.c not to raise ldap.ENCODING_ERROR in
1206  function encode_rfc2696() on 64-bit systems
1207* Fixed seg fault if error code in a LDAP response was outside
1208  the known error codes and could not be mapped to a specific
1209  exception class (thanks to Sean)
1210* errors.c: LDAP_ERROR_MAX set to LDAP_PROXIED_AUTHORIZATION_DENIED
1211  if available in OpenLDAP header
1212* new exception class ldap.PROXIED_AUTHORIZATION_DENIED
1213  if available in OpenLDAP header
1214* Fixed functions.c not to raise ldap.ENCODING_ERROR in
1215  function l_ldap_str2dn() on 64-bit systems (see SF#2725356)
1216
1217----------------------------------------------------------------
1218Released 2.3.6 2009-02-22
1219
1220Changes since 2.3.5:
1221
1222Lib/
1223* Importing ldap.str2dn() which directly imported _ldap.str2dn()
1224  is prohibited now (see SF#2181141)
1225
1226Modules/
1227* get_option(): Added support for reading more SASL options.
1228  (OPT_X_SASL_MECH, OPT_X_SASL_REALM, OPT_X_SASL_AUTHCID and
1229  OPT_X_SASL_AUTHZID)
1230* Added some explicit type casts to fix issues while building
1231  with SunStudio
1232* Fixed compiling issue with GCC 4.4
1233  (see SF#2555793, thanks to Matej and Martin)
1234
1235Doc/
1236* Clarified not to use ldap_get_dn() directly
1237* Fixed description of ldap.SASL_AVAIL and ldap.TLS_AVAIL
1238  (see SF#2555804, thanks to Matej and Martin)
1239
1240----------------------------------------------------------------
1241Released 2.3.5 2008-07-06
1242
1243Changes since 2.3.4:
1244
1245Lib/
1246* Fixed methods ldap.cidict.__contains__() and
1247  ldap.schema.models.Entry.__contains__()
1248* FWIW method LDAPObject.cancel_s() returns a result now
1249* Fixed ldap.schema.models.NameForm: Class attribute oc is now
1250  of type string, not tuple to be compliant with RFC 4512
1251----------------------------------------------------------------
1252Released 2.3.4 2008-03-29
1253
1254Changes since 2.3.3:
1255
1256Modules/
1257* Fixed seg fault when calling LDAPObject.get_option()
1258  (see SF#1926507, thanks to Matej)
1259
1260----------------------------------------------------------------
1261Released 2.3.3 2008-03-26
1262
1263Changes since 2.3.2:
1264
1265Fixed backward-compability when building with OpenLDAP 2.3.x libs.
1266
1267----------------------------------------------------------------
1268Released 2.3.2 2008-03-26
1269
1270Changes since 2.3.1:
1271
1272Lib/
1273* ldap.dn.escape_dn_chars() now really adheres to
1274  RFC 4514 section 2.4 by escaping null characters and a
1275  space occurring at the beginning of the string
1276* New method ldap.cidict.cidict.__contains__()
1277* ldap.dn.explode_dn() and ldap.dn.explode_rdn()
1278  have a new optional key-word argument flags which is
1279  passed to ldap.dn.str2dn().
1280
1281Modules/
1282* Removed unused OPT_PRIVATE_EXTENSION_BASE from constants.c
1283
1284Doc/
1285* Various additions, updates, polishing (thanks to James).
1286
1287----------------------------------------------------------------
1288Released 2.3.1 2007-07-25
1289
1290Changes since 2.3.0:
1291
1292* Support for setuptools (building .egg, thanks to Torsten)
1293* Support for matched values control (RFC 3876, thanks to Andreas)
1294
1295Lib/
1296* Fixed ldif (see SF#1709111, thanks to Dmitry)
1297* ldap.schema.models:
1298  SUP now separated by $ (method __str__() of classes
1299  AttributeType, ObjectClass and DITStructureRule, thanks to Stefan)
1300
1301Modules/
1302* Added constant MOD_INCREMENT to support
1303  modify+increment extension (see RFC 4525, thanks to Andreas)
1304----------------------------------------------------------------
1305Released 2.3.0 2007-03-27
1306
1307Changes since 2.2.1:
1308
1309* OpenLDAP 2.3+ required now to build.
1310* Added support for Cancel operation ext. op. if supported
1311in OpenLDAP API of the libs used for the build.
1312
1313Modules/
1314* Removed deprecated code for setting options by name
1315* Added l_ldap_cancel()
1316* Some modifications related to PEP 353 for
1317  Python 2.5 on 64-bit platforms (see SF#1467529, thanks to Matej)
1318* Added new function l_ldap_str2dn(), removed functions
1319  l_ldap_explode_dn() and l_ldap_explode_rdn()
1320  (see SF#1657848, thanks to David)
1321
1322Lib/
1323* Added method ldapobject.LDAPObject.cancel()
1324* ldap.schema.subentry.urlfetch() now can do non-anonymous
1325  simple bind if the LDAP URL provided contains extensions
1326  'bindname' and 'X-BINDPW'. (see SF#1589206)
1327* ldap.filter.escape_filter_chars() has new a key-word argument
1328  escape_mode now which defines which chars to be escaped
1329  (see SF#1193271).
1330* Various important fixes to ldapobject.ReconnectLDAPObject
1331* Moved all DN-related functions to sub-module ldap.dn,
1332  import them in ldap.functions for backward compability
1333* ldap.dn.explode_dn() and ldap.dn.explode_rdn() use the new
1334  wrapper function ldap.dn.str2dn() (related to SF#1657848)
1335* changetype issue partially fixed (see SF#1683746)
1336
1337----------------------------------------------------------------
1338Released 2.2.1 2006-11-15
1339
1340Changes since 2.2.0:
1341
1342Modules/
1343* Fix for Python 2.5 free(): invalid pointer (see SF#1575329)
1344* passwd() accepts None for arguments user, oldpw, newpw
1345  (see SF#1440151)
1346
1347Lib/
1348* ldif.LDIFWriter.unparse() now accepts instances of
1349  derived dict and list classes (see SF#1489898)
1350
1351----------------------------------------------------------------
1352Released 2.2.0 2006-04-10
1353
1354Changes since 2.0.11:
1355
1356* OpenLDAP 2.2+ required now to build.
1357
1358Modules/
1359* Dropped all occurences of '#ifdef #LDAP_VENDOR_VERSION'.
1360* Fixed wrong tuple size in l_ldap_result3() (see SF#1368108)
1361* Fixed get_option(ldap.OPT_API_INFO) (see SF#1440165)
1362* Fixed memory leak in l_ldap_result3() when all=0
1363  (see SF#1457325)
1364* Fixed memory leak in l_ldap_result3() in error cases
1365  (see SF#1464085)
1366
1367Lib/
1368* Fixed ldap.schema.models.DITStructureRule.__str__() to
1369  separate SUP rule-ids with a single space instead of ' $ '
1370* Fixed ldap.async.Dict
1371* Added ldap.async.IndexedDict
1372* ldap.schema.subentry.SubSchema.attribute_types() has new
1373  key-word argument ignore_dit_content_rule
1374----------------------------------------------------------------
1375Released 2.0.11 2005-11-07
1376
1377Changes since 2.0.10:
1378
1379Lib/
1380* Class ldap.ldapobject.LDAPObject:
1381  Each method returns a result now
1382* Class ldap.ldapobject.ReconnectLDAPObject:
1383  Some methods called the wrong methods of LDAPObject. Fixed.
1384* Added new class ldap.async.Dict
1385* Slightly cleaned up ldap.schema.subentry.attribute_types()
1386* New sub-module ldap.resiter which simply provides a mix-in
1387  class for ldap.ldapobject.LDAPObject with a generator method
1388  allresults().
1389  Obviously this only works with Python 2.3+. And
1390  it's still experimental.
1391
1392----------------------------------------------------------------
1393Released 2.0.10 2005-09-23
1394
1395Changes since 2.0.9:
1396
1397Lib/
1398* Switched back to old implementation of
1399  ldap.schema.tokenizer.split_tokens() since the new one
1400  had a bug which deletes the spaces from DESC
1401* ldap.INSUFFICIENT_ACCESS is now ignored in
1402  ldap.ldapobject.LDAPObject.search_subschemasubentry_s()
1403
1404----------------------------------------------------------------
1405Released 2.0.9 2005-07-28
1406
1407Changes since 2.0.8:
1408
1409Modules/
1410* Removed __doc__ strings from ldapcontrol.c to "fix"
1411  build problems with Python versions 2.2 and earlier.
1412
1413----------------------------------------------------------------
1414Released 2.0.8 2005-06-22 at Linuxtag 2005, Karlsruhe, Germany
1415
1416Changes since 2.0.7:
1417
1418* Preliminary support for receiving LDAP controls added.
1419  Contributor:
1420  - Andreas Ames
1421
1422Lib/
1423- Added classes in module ldif to ldif.__all__ to fix
1424  from ldif import *
1425- Removed BitString syntax from
1426  ldap.schema.models.NOT_HUMAN_READABLE_LDAP_SYNTAXES
1427  since the LDAP encoding is in fact human-readable
1428- ldapurl.LDAPUrlExtension.unparse() outputs empty string
1429  if LDAPUrlExtension.exvalue is None
1430- Added ldap.controls.SimplePagedResultsControl
1431
1432----------------------------------------------------------------
1433Released 2.0.7 2005-04-29
1434
1435Changes since 2.0.6:
1436
1437* Added preliminary support for sending LDAP controls
1438  with a request.
1439  Contributors:
1440  - Deepak Giridharagopal
1441  - Ingo Steuwer
1442  (Receiving controls in LDAP results still not supported.)
1443
1444Modules:
1445* LDAPObject.c: removed l_ldap_manage_dsa_it()
1446* LDAPObject.c: Added missing #ifdef around l_ldap_passwd()
1447  for compability with older OpenLDAP libs.
1448
1449Lib/
1450* New algorithm in ldap.schema.tokenizer.split_tokens()
1451  contributed by Wido Depping which is more robust
1452  when parsing very broken schema elements
1453  (e.g. Oracle's OID).
1454* Fixed argument list (position of timeout) when calling
1455  LDAPObject.search_ext_s() from search_st() and search_s().
1456* LDAPObject.search_ext_s() correctly calls search_ext_s() now.
1457* Re-implemented LDAPObject.manage_dsa_it() without calling _ldap.
1458
1459----------------------------------------------------------------
1460Released 2.0.6 2004-12-03
1461
1462Changes since 2.0.5:
1463
1464Lib/
1465* Added sub-module ldap.dn
1466* Added function ldap.dn.escape_dn_chars()
1467* Special check when implicitly setting SUP 'top' to
1468  structural object classes without SUP defined to avoid
1469  a loop in the super class chain.
1470
1471----------------------------------------------------------------
1472Released 2.0.5 2004-11-11
1473
1474Changes since 2.0.4:
1475
1476Some small improvements for SASL:
1477The noisy output during SASL bind is avoided now. Interaction
1478with output on stderr can be enabled by the calling application
1479by explicitly defining SASL flags.
1480
1481Removed obsolete directory Win32/.
1482
1483Lib/
1484* Make sure that ldap.sasl.sasl.cb_value_dict is a dictionary
1485  even when the caller passes in None to argument cb_value_dict
1486* Added new key-word arg sasl_flags to method
1487  LDAPObject.sasl_interactive_bind_s()
1488
1489Modules/
1490* l_ldap_sasl_interactive_bind_s():
1491  New key-word arg sasl_flags passed to
1492  ldap_sasl_interactive_bind_s()
1493
1494----------------------------------------------------------------
1495Released 2.0.4 2004-10-27
1496
1497Changes since 2.0.3:
1498
1499Modules/
1500* Applied some fixes for 64-bit platforms to LDAPObject.c
1501* Constants ldap.TLS_AVAIL and ldap.SASL_AVAIL will indicate
1502  whether python-ldap was built with support for SSL/TLS
1503  and/or SASL
1504
1505setup.py and Modules/
1506* Applied some fixes for building under Win32
1507
1508----------------------------------------------------------------
1509Released 2.0.3 2004-10-06
1510
1511Changes since 2.0.2:
1512
1513* Added support for LDAP Password Modify Extended Operation
1514  (see RFC 3062)
1515
1516Demo/:
1517* Added passwd_ext_op.py
1518
1519Modules/
1520* Added l_ldap_passwd() in LDAPObject.c
1521
1522Lib/
1523* Added methods passwd() and passwd_s() to
1524  ldap.ldapobject.LDAPObject
1525
1526----------------------------------------------------------------
1527Released 2.0.2 2004-07-29
1528
1529Changes since 2.0.1:
1530
1531Modules/
1532* Fixed detecting appropriate OpenLDAP libs version for
1533  determining whether ldap_whoami_s() is available or not.
1534  This fixes build problems with OpenLDAP libs 2.1.0 up
1535  to 2.1.12.
1536
1537----------------------------------------------------------------
1538Released 2.0.1 2004-06-29
1539
1540Changes since 2.0.0:
1541
1542dsml:
1543* Fixed wrong exception message format string
1544
1545ldap.schema.models:
1546* Fixed Entry.__delitem__() to delete really everything
1547  when deleting an attribute dictionary item.
1548
1549----------------------------------------------------------------
1550Released 2.0.0 2004-05-18
1551
1552Changes since 2.0.0pre21:
1553
1554ldif:
1555* Empty records are simply ignored in ldif.LDIFWriter.unparse()
1556
1557Modules/
1558* New method result2() returns 3-tuple containing the msgid
1559  of the outstanding operation.
1560
1561ldap.ldapobject:
1562* New _ldap wrapper method LDAPObject.result2() (see above)
1563  which is now used by LDAPObject.result().
1564
1565----------------------------------------------------------------
1566Released 2.0.0pre21 2004-03-29
1567
1568Changes since 2.0.0pre20:
1569
1570setup.py:
1571* runtime_library_dirs is set
1572
1573Modules/
1574* (Hopefully) fixed building with OpenLDAP 2.2 libs in errors.c
1575* Removed meaningless repr() function from LDAPObject.c
1576* Removed setting LDAP_OPT_PROTOCOL_VERSION in l_ldap_sasl_bind_s()
1577* Modified string handling via berval instead of *char
1578  in l_ldap_compare_ext() makes it possible to compare attribute
1579  values with null chars.
1580* Wrapped ldap_sasl_bind() for simple binds instead of ldap_bind()
1581  since 1. the latter is marked deprecated and 2. ldap_sasl_bind()
1582  allows password credentials with null chars.
1583* Removed unused sources linkedlist.c and linkedlist.h
1584* Function l_ldap_whoami_s() only added if built against
1585  OpenLDAP 2.1.x+ libs (should preserve compability with 2.0 libs)
1586
1587ldap.ldapobject:
1588* LDAPObject.bind() only allows simple binds since Kerberos V4
1589  binds of LDAPv2 are not supported anymore. An assert statement
1590  was added to make the coder aware of that.
1591* Renamed former LDAPObject.sasl_bind_s() to
1592  LDAPObject.sasl_interactive_bind_s() since it wraps OpenLDAP's
1593  ldap_sasl_interactive_bind_s()
1594
1595----------------------------------------------------------------
1596Released 2.0.0pre20 2004-03-19
1597
1598Changes since 2.0.0pre19:
1599
1600Modules/
1601* Removed doc strings from functions.c
1602* Removed probably unused wrapper function l_ldap_dn2ufn() since
1603  ldap_dn2ufn() is deprecated in OpenLDAP 2.1+
1604* Removed wrapper function l_ldap_is_ldap_url().
1605* Removed macro add_int_r() from constants.c since it caused
1606  incompability issues with OpenLDAP 2.2 libs
1607  (Warning: all result types are Integers now! Use the constants!)
1608* New wrapper function l_ldap_whoami_s()
1609
1610ldap.ldapobject:
1611* New wrapper method LDAPObject.whoami_s()
1612
1613ldap.functions:
1614* Removed is_ldap_url(). The more general function
1615  ldapurl.isLDAPUrl() should be used instead.
1616
1617ldap.sasl:
1618* Added class cram_md5 (for SASL mech CRAM-MD5)
1619
1620ldap.async:
1621* Use constants for search result types (see note about
1622  add_int_r() above).
1623
1624----------------------------------------------------------------
1625Released 2.0.0pre19 2004-01-22
1626
1627Changes since 2.0.0pre18:
1628
1629Modules/
1630* LDAPObject.c:
1631  Most deprecated functions of OpenLDAP C API are not used anymore.
1632* functions.c:
1633  Removed unused default_ldap_port().
1634* constants.c:
1635  Removed unused or silly constants
1636  AUTH_KRBV4, AUTH_KRBV41, AUTH_KRBV42, URL_ERR_BADSCOPE, URL_ERR_MEM
1637* errors.c:
1638  Fixed building with OpenLDAP 2.2.x
1639  (errors caused by negative error constants in ldap.h)
1640
1641ldap.ldapobject.LDAPObject:
1642* Removed unused wrapper methods uncache_entry(), uncache_request(),
1643  url_search(), url_search_st() and url_search_s()
1644* New wrapper methods for all the _ext() methods in _ldap.LDAPObject.
1645
1646ldap.modlist:
1647* Some performance optimizations and simplifications
1648  in function modifyModlist()
1649
1650----------------------------------------------------------------
1651Released 2.0.0pre18 2003-12-09
1652
1653Changes since 2.0.0pre17:
1654
1655ldap.ldapobject:
1656* Fixed missing ldap._ldap_function_call() in
1657  ReconnectLDAPObject.reconnect()
1658
1659----------------------------------------------------------------
1660Released 2.0.0pre17 2003-12-03
1661
1662Changes since 2.0.0pre16:
1663
1664ldap.functions:
1665* Fixed ImportError when running python -O
1666
1667----------------------------------------------------------------
1668Released 2.0.0pre16 2003-12-02
1669
1670Changes since 2.0.0pre15:
1671
1672Modules/
1673* Removed definition of unused constant RES_EXTENDED_PARTIAL since
1674  the corresponding symbol LDAP_RES_EXTENDED_PARTIAL seems to not
1675  be available in OpenLDAP-HEAD (pre 2.2) anymore.
1676
1677All in Lib/
1678* Fixed some subtle bugs/oddities mentioned by pychecker.
1679
1680dsml:
1681* Renamed DSMLWriter._f to DSMLWriter._output_file
1682* Added wrapper method DSMLWriter.unparse() which simply
1683  calls DSMLWriter.writeRecord()
1684
1685ldap.ldapobject:
1686* Simplified LDAPObject.search_subschemasubentry_s()
1687
1688ldap.functions:
1689* Moved ldap._ldap_function_call() into ldap.functions.
1690* apply() is not used anymore since it seems deprecated
1691
1692ldap.async:
1693* Added class DSMLWriter
1694
1695ldap.schema:
1696* Removed unused key-word argument strict from
1697  ldap.schema.subentry.SubSchema.attribute_types()
1698* Fixed backward compability issue (for Python prior to 2.2) in
1699  ldap.schema.subentry.SubSchema.listall()
1700----------------------------------------------------------------
1701Released 2.0.0pre15 2003-11-11
1702
1703Changes since 2.0.0pre14:
1704
1705Modules/
1706Follow rule "Always include Python.h first"
1707
1708ldap.schema.subentry:
1709* Added new method SubSchema.get_structural_oc()
1710* Added new method SubSchema.get_applicable_aux_classes()
1711* Methods SubSchema.listall() and SubSchema.tree() have
1712  new key-word argument schema_element_filters
1713* Support for DIT content rules in SubSchema.attribute_types()
1714
1715----------------------------------------------------------------
1716Released 2.0.0pre14 2003-10-03
1717
1718Changes since 2.0.0pre13:
1719
1720setup.py:
1721* Some modifications to ease building for Win32
1722* Added directory Build/ mainly intended for platform-specific
1723  examples of setup.cfg
1724* Fixed installing ldap.filter
1725
1726ldap.ldapobject:
1727* Added class attribute LDAPObject.network_timeout mapped to
1728  set_option(ldap.OPT_NETWORK_TIMEOUT,..)
1729* LDAPObject.search_ext(): Pass arguments serverctrls,clientctrls
1730  to _ldap.search_ext()
1731
1732ldap.sasl:
1733* Added class ldap.sasl.external for handling
1734  the SASL mechanism EXTERNAL
1735* Dictionary ldap.sasl.saslmech_handler_class built during import
1736  for all the known SASL mechanisms derived from class definitions
1737
1738ldap.schema:
1739* More graceful handling of KeyError in SubSchema.attribute_types()
1740* New method SubSchema.get_inheritedattr() for retrieving inherited
1741  class attributes
1742* New method SubSchema.get_inheritedobj() for retrieving a
1743  schema element instance including all inherited class attributes
1744
1745----------------------------------------------------------------
1746Released 2.0.0pre13 2003-06-02
1747
1748Changes since 2.0.0pre12:
1749
1750ldap.async:
1751* Checking type of argument writer_obj relaxed in
1752  LDIFWriter.__init__() since file-like objects are
1753  not necessarily an instance of file.
1754
1755ldap.schema:
1756* ldap.schema.subentry.SubSchema.attribute_types() now correctly
1757  handles attribute types without NAME set
1758* If SUP is not defined for a structural object class 'top' is
1759  assumed to be the only super-class by default
1760* '_' is now the abstract top node in SubSchema.tree() for all
1761  schema element classes since ABSTRACT and AUXILIARY object
1762  classes are not derived from 'top' by default
1763
1764----------------------------------------------------------------
1765Released 2.0.0pre12 2003-05-27
1766
1767Changes since 2.0.0pre11:
1768
1769New sub-module ldap.filter:
1770* Added functions escape_filter_chars() and filter_format()
1771
1772ldap.ldapobject:
1773* Trace log writes LDAP URI of connection instead of module name
1774* search_s() passes self.timeout as argument timeout when
1775  calling search_ext_s()
1776* Key-word arguments for simple_bind() and simple_bind_s()
1777  with defaults for anonymous bind.
1778* LDAPObject.protocol_version is set to LDAPv3 as default
1779  (this might make code changes necessary in a real LDAPv2
1780   environment)
1781* Default for key-word argument trace_stack_limit passed to
1782  __init__() is 5
1783* Updated __doc__ strings
1784* Aligned and tested ReconnectLDAPObject and SmartLDAPObject
1785
1786ldap.async:
1787* LDIFWriter uses ldif.LDIFWriter instead of calling
1788  function ldif.CreateLDIF
1789* LDIFWriter accepts either file-like object or ldif.LDIFWriter
1790  instance as argument for specifying the output
1791
1792ldif:
1793* Abandoned argument all_records of LDIFRecordList.__init__()
1794
1795ldapurl:
1796* urllib.unquote() used instead of urllib.unquote_plus()
1797
1798----------------------------------------------------------------
1799Released 2.0.0pre11 2003-05-02
1800
1801Changes since 2.0.0pre10:
1802
1803ldap.ldapobject:
1804* Cosmetic change: Named argument list for LDAPObject.compare()
1805  instead of *args,**kwargs.
1806* Fixed bug in ReconnectLDAPObject._apply_method_s() affecting
1807  compability with Python 2.0. The bug was introduced with
1808  2.0.0pre09 by dropping use of apply().
1809
1810ldap.modlist:
1811* modifyModlist(): Only None is filtered from attribute value lists,
1812  '' is preserved as valid attribute value. But filtering applies
1813  to old_value and new_value now.
1814
1815ldap.schema:
1816* Zero-length attribute values for schema elements are ignored
1817  (needed on e.g. Active Directory)
1818
1819dsml:
1820Added support for parsing and generating DSMLv1.
1821Still experimental though.
1822
1823
1824----------------------------------------------------------------
1825Released 2.0.0pre10 2003-04-19
1826
1827Changes since 2.0.0pre09:
1828
1829ldap.schema:
1830* Emulate BooleanType for compability with Python2.3 in assert
1831  statements
1832
1833----------------------------------------------------------------
1834Released 2.0.0pre09 2003-04-19
1835
1836Changes since 2.0.0pre08:
1837
1838Modified setup.py to support Cyrus-SASL 2.x.
1839
1840ldap.ldapobject:
1841* apply() is not used anymore since it seems deprecated
1842* Fixed __setstate__() and __getstate__() of ReconnectLDAPObject
1843
1844ldap.schema:
1845* Completed classes for nameForms, dITStructureRules and
1846  dITContentRules
1847
1848----------------------------------------------------------------
1849Released 2.0.0pre08 2003-04-11
1850
1851Changes since 2.0.0pre07:
1852
1853ldap.schema:
1854* For backward compability with Python versions prior to 2.2
1855  Lib/ldap/schema/tokenizer.py and Lib/ldap/schema/models.py use
1856  (()) instead of tuple() for creating empty tuples.
1857
1858----------------------------------------------------------------
1859Released 2.0.0pre07 2003-04-03
1860
1861Changes since 2.0.0pre06:
1862
1863LDAPObject.c:
1864  * Wrapped OpenLDAP's ldap_search_ext()
1865  * Removed empty __doc__ strings
1866  * Removed fileno
1867  * Removed all stuff related to caching in OpenLDAP libs
1868
1869ldap.ldapobject:
1870  * Fixed SASL rebind in ldap.ldapobject.ReconnectLDAPObject
1871  * use search_ext() instead ldap_search()
1872  * new class attribute timeout for setting a global time-out
1873    value for all synchronous operations
1874
1875ldap.schema:
1876* Fixed two typos in ldap.schema.models
1877* Some attempts to improve performance of parser/tokenizer
1878* Completely reworked to have separate OID dictionaries for
1879  the different schema element classes
1880* Fixed the Demo/schema*.py to reflect changes to ldap.schema
1881
1882Documentation updates and various __doc__ string modifications.
1883
1884ldapurl:
1885  * Removed all Unicode stuff from module ldapurl
1886  * Consistent URL encoding in module ldapurl
1887
1888ldif:
1889  * Removed ldif.FileWriter
1890  * Proper handling of FILL (see RFC 2849)
1891
1892----------------------------------------------------------------
1893Released 2.0.0pre06 2002-09-23
1894
1895Changes since 2.0.0pre05:
1896- Fine-grained locking when linking against libldap_r
1897- New wrapper class ldap.ReconnectLDAPObject
1898- Security fix to module ldapurl
1899- Other fixes and improvements to whole package
1900- LDAPv3 schema support
1901  (still somewhat premature and undocumented)
1902
1903----------------------------------------------------------------
1904Released 2.0.0pre05 2002-07-20
1905
1906----------------------------------------------------------------
1907Released 2.0.0pre04 2002-02-09
1908
1909----------------------------------------------------------------
1910Released 2.0.0pre02 2002-02-01
1911
1912----------------------------------------------------------------
1913Released 1.10alpha3 2000-09-19
1914