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