CHANGELOG

# 2.9.1 - 2021.07.17
  • new feature: added support for using Kerberos authentication on windows clients using the native winkerberos library

  • new feature: added support for using Channel Bind tokens with Kerberos authentication on windows clients

  • fixed a bug related to using start_tls with a RESTARTABLE strategy that caused errors to be raised erroneously.

  • fixed a bug around the type checking of Reverse DNS Settings with Kerberos authentication

  • fixed an issue related to decoding unicode strings in LDAP referrals and attributes in python 2

  • minor documentation updates and corrections

# 2.9 - 2021.01.24
  • new feature: SafeRestartable strategy (SAFE_RESTARTABLE) for using a restartable Connection object in a multi-threading program

  • tested against Python 3.9

  • added requirements-dev.txt

  • fixed logging unicode exceptions in python2.7

  • added more granular control over use of reverse dns with Kerberos (thanks Azaria)

  • support MS Active Directory persistent search (thanks eLeX)

  • added support for LDAP signing when using DIGEST-MD5 authentication (thanks Augustin-FL)

  • check only for searchResEntries in LDIF conversion (thanks Jay)

  • modify-increment now works properly in mock strategies (thanks Saint-Marcel)

  • objectGUID are now converted properly (thanks Janne)

  • default timeout in asynchronous strategies raised to 20 seconds

# 2.8.1 - 2020.09.07
  • fixed regression in 2.8 for members returned in AD auto-range search (thanks Felix)

  • fixed regression in 2.8 for attribute error in restartable class (thanks Christian)

  • try to use Crypto library if present for hashing NTLM password on python interpreter missing the MD4 OpenSSL algorithm (thanks Doron)

# 2.8 - 2020.08.08
  • new feature: SafeSync strategy (SAFE_SYNC) for using a synchronous Connection object in a multi-threading program

  • new feature: LDIF_LINE_LENGTH for specifying line length wrapping in ldif-content output (default to 78 as per RFC 2849)

  • fixed requirements for pyasn1

  • fixed regression for ldapi connections

  • fixed issue with lazy connection requesting server info on every operation

  • fixed searching by objectGUID in hex format (thanks Matt)

  • added iso_format parameter to utils.format_json to return dates in ISO format (thanks Hugh)

  • fixed issue with Referral attributes not returned by the referral server (thanks Nazarii)

  • fixed lost error message in auto_bind (thanks cfelder)

  • fixed delete_old_dn in mock connections (thanks kpinc)

  • fixed a ResourceWarning with lazy connections

  • fixed entry_to_json() that in python2 modified the original entry value (thanks Dirk-Jan)

  • tests doesnt’ raise Exception if real server is not present (thanks Matej)

# 2.7 - 2020.03.01
  • tested against Python 3.8.1 and pyasn1 0.4.8

  • re-enabled ssl exception raising on bad certificate when only 1 server is present in the server pool

  • removed Python 2.6 from Travis configuration (thanks gliptak)

  • added support for source specifications in LDAP connections (thanks Azaria)

  • added support for allowing special AD security identifier (SID) in DN (thanks John)

  • fixed pickling of entry and attribute (thanks cfelder)

  • close connection when auto_bind fails (thank Hrishikesh)

  • operational attributes can be used in Abstraction Layer (thanks Sohalt)

  • additional SSL options can be used in Tls object (thanks Nazarii)

  • threading.Event replaces loop checking in async strategy. ASYNC strategy should be much faster now (thanks Yang)

  • adding a key that is already an alias that contains other aliases in CaseInsensitiveWithAliasDict() now works properly (thanks Mark)

  • when searching for GUID, UUID and SID the backslash character (0x5C) is properly managed (thanks Nocturem)

  • LDIF output properly formatted when controls are missing (thanks Tom)

  • operational attributes are not returned in MOCK strategies when not requested (thanks kpinc)

  • undecodable values are returned as raw bytes when using the pyasn1 decoder

# 2.6.1 - 2019.09.06
  • tested against pyasn1 0.4.7

  • added eDirectory 9.1.4 (EDIR_9_1_4) to offline schemas

  • added json converter for timedelta (thanks dirkjanm)

  • strip parameter defaults to False in utils.dn.parse_dn()

  • escaped space is allowed as trailing character in attribute_value in utils.dn.parse_dn() (thanks phi1010)

  • connection.extend.standard.paged_search doesn’t raise exceptions when raise_exceptions is False

  • the Search operation returns the entries fetched by the server when size or time limits are reached even if raise_exceptions is set to True

  • Handle the minimum value that can be stored in an Int64 in format_ad_timedelta (thanks mprahl)

  • EntryState: entry_raw_attributes is populated instead of raw_attributes (thanks Christian)

  • Removed restriction to perform rename and move simultaneously in modify_dn (thanks Fabian)

  • fixed checking for hexdigits in parse_dn (thanks Michael)

  • fixed escaping when multiple backslashes are present in parse_dn (thanks Phillip)

  • fixed multiple NoneType exceptions in entry_to_json() (thanks David and cfelder)

  • allowing Microsoft specific syntax (<WKGUID=xxx>) for WellKnownObjects in DN (thanks David)

  • connection.extend.standard.paged_search() now follows referrals when auto_referrals=True (thanks kprativa)

  • fixed a bug in decoding replica list in connection.extend.novell.list_replicas()

  • fixed a bug when adding duplicate alias in CaseInsensitiveWithAliasDict()

  • added ignore_duplicates=False in set_aliases in CaseInsensitiveWithAliasDict() to ignore a duplicate alias (either in aliases or in keys)

  • Schema info now uses CaseInsensitiveWithAlias dict as default so object and attributes can also be referentiated with OID (thanks ahoffm11)

  • added block mode and timeout parameters to next() method of persistent_search

  • when using the pyasn1 decoder raw_dn is not returned as a pyasn1 object anymore but as bytes

  • Return offset timezone aware datetime for max AD timestamp (thanks Jussi)

# 2.6 - 2019.03.24
  • fixed empty digestMd5.py file in 2.5.2 package

  • explicitly declare digest module md5 in util.ntlm (thanks adawalli)

  • change object passed to modify() was unexpectedly mutated (thanks John)

  • added LDAPInfoError exception

  • added Server.has_control(control) method to check if a server has a specific control

  • added Server.has_extension(extension) method to check if a server has a specific extension

  • added Server.has_feature(feature) method to check if a server has a specific feature

  • fixed checking of \ in safe_dn (thanks Maxim)

  • fixed uuid checking with 5c byte value

  • added single=True parameter to the ServerPool object definition. Servers state is shared between connections using the same pool

  • updated copyright notice

# 2.5.2 - 2018.12.28
  • when starting tls before binding the connection is automatically open

  • fixed changelog date (thanks Adam)

  • support for AD timedeltas (thanks mprahl)

  • fixed WhoAmI in mock strategies (thanks mprahl)

  • prevent unnecessary exception in extend/standard/ModifyPassword (thanks Johnny)

  • added support for external gssapi credentials to be passed to the sasl connection (thanks Firstyear)

  • added support for gssapi store in sasl connection (thanks clhendrick)

  • fixed LdifProducer (thanks antoinell)

  • fixed NTLM bind (thanks ribx)

  • server state in ServerPool is now a namedtuple “ServerState” (thanks Krisztian)

  • fixed error when adding member to AD group with unsafe DN (thanks Maxim)

  • properly restore lazy status in reusable strategy (thanks Krisztian)

  • ServerState namedtuple converted to class in core/pooling (thanks Krisztian)

  • empty schema doesn’t raise exception in Abstraction Layer (thanks ghost)

# 2.5.1 - 2018.08.01
  • connection.result is populated when exception raised with raise_exceptions=True

  • fixed objectSid in mocking strategies

  • fixed circular reference in exception history

  • added objectSid validator

  • byte values are properly searched in MOCK strategies (thanks dyj216)

  • exception history refactored (thanks Tamas)

  • connections in context manager don’t bind anymore when auto_bind is set to AUTO_BIND_NONE (Thanks Tim)

  • Cython compatible build (thanks Pedro)

  • more detailed exception message in Mock strategy (thanks Janne)

  • exceptions flow refactored in reusable strategy (thanks kxt)

  • pwdlastset accept any positive integer (thanks abenbecker)

  • fixed an exception while logging packet with pyasn1 decoder

  • fixed importing abc from collections for Python 3.8

# 2.5 - 2018.04.15
  • abstract layer now handles auxiliary classes

  • pwdLastSet in AD is valid for 0 and -1 (thanks Taylor)

  • fixed extend.novell.get_universal_password (thanks Fernando)

  • entryUUID is properly validated in search filters (thanks FriedrichI)

  • custom attribute formatters are properly applied when parsing the search filter

  • REUSABLE strategy now honours credentials when changed in the original connection (thanks Prof Hase)

  • add operation doesn’t change passed attribute dict anymore (thanks Daniele)

  • missing entry’s attribute return False when searching instead of raising an exception (thanks Maxsond)

  • fixed ad_timestamp evaluation for integers (thanks Flynn)

  • wrong exception raised when user name is empty in simple binding (thanks Ivan)

  • exception is raised if size limit is exceed when searching in mocking strategies with raise_exceptions=True (thanks David)

  • fixed validator for novell guid

  • fixed validator for openldap EntryUUID

  • fixed validator for AD objectGUID, now follows MS-DTYP

  • fixed formatter for AD objectGUID

  • fixed exception when adding binary values (thanks guidow)

  • added escape_rdn_chars() to ldap3.utils.dn for safe checking untrusted input while building DNs (thanks Alex)

  • fixed search for binary values in mock strategies

  • fixed exception with unicode chars in subfilters for python 2 (thanks Friedrich)

  • connection.extend.paged_search() doesn’t miss the last entries anymore when size limit is exceeded on the server (thanks Friedrich)

  • validators are not applied when loading data from json dump in Mock strategies (thanks Derek)

  • additional validator to check for erroneous bytes to string conversion in Python 3 (thanks Brian)

  • additional formatter and validator to check for generalizedTime with 0 year (thanks Brian)

  • added ADDITIONAL_CLIENT_ENCODINGS parameter

  • fixed AD dir_sync extended operation (thanks Lucas)

  • ad_unlock_account works properly (thanks Francowxu)

  • added Microsoft security descriptor control (thanks Dirk-jan)

  • fixed search in mock strategies when raise_exceptions=True (thanks Derek)

  • formatters never raise exceptions but return the raw_value when unable to format

  • fixed controls duplication in paged search (thanks Dirk-jan)

# 2.4.1 - 2018.01.21
  • tested against pyasn1 from version 0.1.8 up to version 0.4.2, Python 2.6.6, Python 2.7.14, Python 3.6.4

  • auto_encode parameter is honored when binding (thanks jkolo)

  • fixed organizationalName definition in oid (thanks mingulov)

  • automatic byte to int conversion working again (thanks Brian)

  • mock connection searchs correctly escape filters (thanks kiddick)

  • fixed bind with not unicode characters in Python 2 (thanks jkolo)

  • extended filter attributes should work again with pyasn1 0.4.1 (thanks Dirk-jan)

  • fixed error when reading incomplete server info

  • NOT keyword properly handled in dit_content_rules (thanks Michael)

  • operational attributes are prorerly returned in Cursor whit get_operational_attributes = True (thanks a23s4a)

  • start_tls() is properly executed with AD when raise_exceptions=True (thanks Andrew)

  • reopening a Connection honours auto_bind setting (thanks calken)

  • an attribute returned with no value from a flaky server doesn’t raise exception anymore (thanks Terrence)

  • pwdLastSet in AD is valid only for -1 (thanks Thane)

  • fixed docs for ldifProducer (thanks lhoekenga)

  • fixed monkeypatching of pyasn1 for Boolean Value in BER encoding (thanks tmarlok88)

  • check_names was not honoured while validating attribute values (thanks ymcymc)

  • locks refactored in Connection and in Async strategy

  • socket properly closed when checking availability of an invalid server

# 2.4 - 2017.11.14
  • security fix in the rebind() method of the Connection object (thanks Daniel)

  • fix for Sasl credentials in Python 3 (thanks Busuwe)

  • fixed bug when checking for equality in MockBase

  • added validator parameter to Server object for custom validators

  • attribute values are now validated in add/compare/modify operations in the Connection object

  • Python types can now be used in add/compare/modify operations

  • compatible with the pyasn1 library from version 0.1.8 up to latest (0.3.3 for now) version

  • fixed compatibility with Twisted on Windows on Python 2.7 (thanks Pmisik)

  • fixed paged_search behaviour in Reader object

  • fixed regression in MockBase (thanks Markus)

  • fixed invalid filter sequence in MockBase (thanks SignedBit)

  • added compatibility with Cython (thanks Pedro)

  • fixed auto_encode check in validate_attribute_value for unknown attrs (thanks CFelder)

  • don’t encode response_value as extended_response_to_dict expects a decoded value (thanks Matthias)

  • compatible with the pyasn1 library from version 0.1.8 up to latest (0.3.7 for now) version

  • added LDAPObjectDereferenceError exception

  • LDAPObjectDereferenceError is raised when an object tries to dereference itself in the Abstraction Layer (thanks Daniele)

  • async module renamed to asynchronous for compatibility with Python 3.7 (thank Barry)

  • long integer are properly checked in mocking strategies (thanks gregn610)

  • NUMERIC_TYPES includes long for Python 2

# 2.3 - 2017.08.02
  • compatible with the pyasn1 library from version 0.1.8 up to latest (0.3.1 for now) version

  • MockAsync strategy is available

  • added __ne__ method to Attribute in abstraction layer (thank Rodrigo)

  • added LDAPUserNameIsMandatoryError exception in simple bind when user name is empty

  • search referrals are properly decoded with fast decoder

  • paged search works in mock strategies

  • paged_search in extend.standard namespace raises an exception of class LDAPOperationResult if the search returns an error

  • search_paged() method of Cursor object now return the whole list of entries if generator=False

  • updated docs for defaults parameters (thanks Guarnacciaa)

  • fixed mockBase for integer matching (thanks Jijo)

  • boolean values are now uppercase in LDIF (thanks Linus)

  • fixed timeout in ssl connection on Linux and Mac (thanks Allan)

  • changed some internal functions to private in ldap3.utils.dn

  • operational attribute entryDN is properly managed in Mock strategies (thanks Mark)

  • new rdn in renamed entry is properly set in Mock strategies (thanks Mark)

  • metrics are now updated for Mock strategies, except that for received bytes (thanks joehy)

  • better managing of missing schema from the server (thanks Deborah)

  • fixed error while schema is not in string format (thanks Alexandre)

  • SNI support added when the underlying python library allows it (thanks Edmund)

  • added pool_keepalive parameter to Connection object for REUSABLE strategy

  • connection.extend.microsoft.modify_password returns False when change is not successful (thanks Ashley)

  • added validators for uuid and uuid_le

  • fixed error while searching for bytes

  • fixed pickling and unpickling of datetime values (thanks David)

  • fixed error that resulted in valid generalizedTime strings not being parsed (thanks Busuwe)

  • fixed error with modify operation on referrals (thanks Busuwe)

  • fixed error in mockBase add_entry() with raw rdn (thanks Chad)

  • fixed error when stdin has not encoding in config.py (thanks cronicryo)

  • fixed error when optional field are not present in pyasn1 requests (thanks Ilya)

  • added DEFAULT_SERVER_ENCODING config parameter, should always be utf-8

  • DEFAULT_ENCODING config parameter renamed to DEFAULT_CLIENT_ENCODING

  • ADDITIONAL_ENCODINGS config parameter renamed to ADDITIONAL_SERVER_ENCONDINGS

  • additional encodings are applied to all data received from the server

  • additional encodings are not applied to client data

  • added from_server=False parameter to to_unicode() to not try client encoding while decoding data from server

# 2.2.4 - 2017.05.07
  • leading and trailing spaces in server name don’t raise exception anymore

  • DitContentRule is properly read from the schema

  • added validator for Active Directory timestamp

  • Mock strategies raise an exception if a non-bytes value is added to the schema when no offline schema is provided (str and int are automatically converted)

  • added custom_validators property to Mock strategies

  • modifying objectClass with bytes values doesn’t raise an exception anymore (but it may fail anyway because of server constraints)

  • ensure that config sequence parameters are properly set

  • allow case insensitive attribute and class names in config parameters

  • added server.schema.is_valid() to check if the schema is available

  • empty schema properties are set to empty dict() instead of None

  • schema definitions with trailing and leading spaces are now properly parsed and don’t raise an LDAPSchemaError exception anymore

  • fixed error when flaky servers (OpenLDAP) don’t return the correct response with StartTls

# 2.2.3 - 2017.04.30
  • abstraction layer query converts int values to string (thanks dgadmin)

  • CaseInsensitiveDictWithAlias doesn’t raise an exception anymore if alias is set multiple times to the same key

  • friendly names in AttrDef are properly managed when performing commits in Writer cursors

  • no more errors when server returns an empty schema (thanks Glen)

  • range attributes in entries are properly recognized when auto_range is False

  • fixed random errors in auto_range searches (thanks James)

  • fixed checking of malformed schema

  • added configuration parameter IGNORE_MALFORMED_SCHEMA to not raise exception for servers that don’t follow the LDAP RFCs (defaults to False)

  • test config moved to test/config.py

  • testcase_id generated randomly for each test

  • added ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF parmeter to exclude some attribute from automatic populate of ObjectDef in Abstract Layer (helpful for AD)

  • added IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF parmeter to exclude some attribute from mandatory attribute list in ObjectDef in Abstract Layer (helpful for AD)

  • fixed error when using implicit assigning in WritableEntry

  • added LDAPInvalidValueError Exception

  • in Python 3 byte filter are converted to unicode before parsing

  • RESPONSE_DN_ENCODING parameter renamed to ADDITIONAL_ENCODINGS

  • to_unicode(value, encoding=None, additional_encodings=False) now checks for additional encoodings in ADDITIONAL_ENCODINGS list if additional_encoding is set to True

  • Reusable strategy uses not lazy Restartable connections

  • Reusable strategy doesn’t keep requesting the schema

  • connection pool size in Reusable strategy defaults to 5

  • optimized usage of configuration parameters

# 2.2.2 - 2017.03.17
  • PLAIN mechanism added to SASL authentication (thanks Janusz)

  • added RESULT_RESERVED return code (thanks Rak)

  • added RESPONSE_DN_ENCODING in config for flaky servers that return non utf-8 encoded DN. Set it to a list of encoding to sequentially try for decodign DNs.

  • removed StopIteration in generators (deprecated by PEP 479)

  • fixed a bug when converting AD datetimes on Windows systems

  • added compatibility with pyasn1 0.2.3

  • fixed NTLM authentication with pyasn1 0.2.3

  • fixed an error when installing via executable on Windows (thanks TrumSteven)

  • added ‘raw_dn’ key in search response dictionary. It contains the DN byte value returned for DN by the server

  • attributes with “;binary” tag can now be retrieved in abstraction layer with the usual entry.atttribute syntax

  • updated tests for OpenLDAP

  • fixed error when in add/remove extend operation for case mismatch in user or group dn

  • integer validator now automatically convert valid string numbers to int

  • invalid timezone are checked when validating Generalized Time Format

  • added test cases for validators

  • updated tests for OpenLDAP

# 2.2.1 - 2017.02.12
  • tested against pyasn1 0.2.2 (thanks Ilya)

  • get_response() has an optional new parameter “get_request” to return the request too, helpful in asynchronous strategies

  • connection.request, connection.response and connection result are now properly blanked in async strategies

  • ldap3.utils.dn.safe_dn() now checks for AD names only if no equal sign is present in the dn

  • abstraction layer properly works with asynchronous strategies

  • added a named tuple “Operation” used to store the request, result and response of an LDAP operation in Cursor history

  • cursors in the Abstraction Layer keep history of executed LDAP operations for the last Cursor operation in the cursor.operation property

  • Cursors in the Abstraction Layer keep history of errors for the last Cursor operation in the cursor.errors property

  • if any error has occurred in the last operation of a Cursor the cursor.failed property is set to True

  • added a named tuple “Operation” for storing request, result and response of an LDAP operation in Cursor history

  • Cursor honours raise_exception parameter of the Connection.

  • Cursor commit() return True if operations are successful and False if not. All pending commits are executed even if some fail

  • new entries that have no additional mandatory attributes other those defined in dn are properly managed in Writers (thanks Matt)

  • CaseInsensitiveDict now properly strips blanks from keys

  • updated hashing alghoritm SHA to SHA1 (thanks Satoh)

  • added match_dn(dn) to Cursor for matching entries with specified text in DN

  • added match(attributes, value) for matching entries with specified value in one or more attribute values. It checks values and raw_values

  • Cursors have simple match capability. When key is a string Cursor tries to match it against the DN of entries found.

# 2.2.0 - 2017.01.16
  • tested againsts Python 3.6.0, Python 2.7.13 and Python 2.6.6

  • updated docs regarding search response attributes (thanks James)

  • fixed LDIF representation for operation_to_ldif (thanks m7four)

  • fixed rebind for pooled connections

  • fixed custom sort order in LDIF representation of entry

  • added Active Directory GUID syntax for safe_dn() (thanks dinhngtu)

  • added pre-post read control (thanks Elizabeth)

  • added add_members_to_groups in microsoft.extend namespace for Active Directory

  • added remove_members_to_groups in microsoft.extend namespace for Active Directory

  • refactored internal extend.microsoft and extend.novell structures

  • fixed auto_escape for extended characters (thanks asand3r)

  • validators now transform the Python value to a valid LDAP value when appropriate (thanks Sjd-Risca)

  • added validator for boolean types

  • added validator for date types

  • fixed representation of binary data in Abstraction Layer for Python 2

  • added auto_encode parameter to Connection object (defaults to True)

  • limited auto_escape feature only to filter values

  • escape_filter_chars doens’t try anymore to guess if the value is already escaped.

  • added ldap3.conv.is_filter_safe() (thanks Robert)

  • added auto_escape parameter to connection.search() to override connection auto_escape behaviour (defaults to None)

  • auto_escape is not applied to filter value if already escaped

  • automatically encode output to stdout encoding for repr() and str() (for printing and logging attributes values).

  • binary data are converted to a hex values string in repr() and str() (for printing and logging attributes values).

  • auto_encoding is performed only for well known attribute types that use Unicode format in LDAP

  • CLASSES_EXCLUDED_FROM_CHECK and ATTRIBUTES_EXCLUDED_FROM_CHECK moved to ldap3.utils.config and made available via get_config_parameter()

  • added UTF8_ENCODED_SYNTAXES in ldap3.config.utils and made available via get_config_parameter()

  • added UTF8_ENCODED_TYPES in ldap3.config.utils and made available via get_config_parameter()

  • config parameters made available only via get_config_parameters()

  • removed to_bytes() and check_escape() from ldap3.utils.conv (ambiguous functions)

  • added connection.request to MockSync (thanks Fabian)

  • tags are properly managed in add, compare and modify requests (thanks guidow)

  • in Mock strategies single-valued attributes are properly managed

  • in Mock strategies attributes type names are properly managed

  • implemented extended operation machinery in MockBase

  • implemented WhoAmI [RFC4532] in Mock strategies

  • implemented GetBindDn [NOVELL] in Mock strategies

  • implemented operational attributes machinery in MockBase

  • implemented entryDN [RFC5020] operational attribute in MockBase

  • Sphinx updated to 1.5.1

# 2.1.1 - 2016.11.18
  • Mock strategy uses case insensitive matching when appropriate

  • fixed error when adding a virtual attribute in the abstract Entry object

  • fixed error messages in Entry moving and renaming

  • Reverted default connection strategy to SYNC (thanks Mauro)

  • Fixed tutorials (thanks Mauro)

  • Fixed checking of schema in ObjectDef (thanks Pierre)

  • Fixed checking of stdin in config (thanks Oleg)

  • fixed commit of entry with async strategies

  • fixed reading of entries in async strategies

  • added cipher argument to Tls (thanks Nicolas)

  • fixed bug when using the abstraction layer with lazy connections

  • fixed case matching while adding new entry in Writer cursor (thanks t0neg)

  • disabled auto_escape for byte values

  • fixed auto_escape for python 2

  • fixed tutorials (thanks Ivano)

# 2.1.0 - 2016.11.03
  • changed default Connection strategy from SYNC to RESTARTABLE

  • enable automatic escaping of assertion values

  • fixed decoding error with check_name=False

  • added auto_escape parameter in connection, for trying automatic filter and attribute values escape

  • fixed checking of schema in MockBase

  • SASLBindInProgress doesn’t raise an exception anymore with raise_exceptions=True

  • standard formatters are applied in mocking strategies when serching for exact match

# 2.0.9 - 2016.10.28
  • removed sanitization of DN in bind operation because some servers accept non standard DN for Simple Bind

# 2.0.8 - 2016.10.28
  • included referral caching (thanks TWAC)

# 2.0.7 - 2016.10.27
  • FIRST RELEASE OF LDAP3 V2

  • changed signature of ldap3.abstract.Reader object

  • removed search_size_limit(), search_time_limit() and search_types_only in the Reader cursor

  • fixed SASL in progress error (thanks Styleex)

  • fixed ALL_ATTRIBUTES in MOCK_SYNC strategy (thanks Belgarion)

  • ncorrect attribute type error message now includes the name of the attribute (Thanks Andrej)

  • relaxed dn checking for Active Directory UserPrincipalName

  • relaxed dn checking for Active Directory SamAccountName

  • added checking of attribute name in add, compare and search operations

  • added checking of class name in add operation

  • renamed exception LDAPTypeError to LDAPAttributeError

  • in sync strategies LDAP operations populate the last_error attribute of the connection in case of not RESULT_SUCCESS

  • connection.return_empty_attributes defaults to True

  • escaped filter by default

  • fixed escaping of filter

  • add move and rename to abstraction layer entry

  • ldap3 namespace decluttered

  • RESULT_CODES moved to ldap3.core.results

  • compatibility constants removed

  • exceptions removed from ldap3 namespace, defined in ldap3.core.exceptions only

  • ADDRESS_INFO_REFRESH_TIME is now configurable via set_config_parameter

  • Operational attribute prefix set to ‘OA_

  • Allows cert and key file in the same file (thanks Jan-Philip)

  • Removed logging info when logging is disabled (thanks Dan)

  • Updated copyright notice

  • Refactored abstraction layer with full support for CRUD (Create, Read, Update, Delete) abstract operations

  • Added WritableEntry and WritableAttribute to abstraction layer

  • Added standard validators for attribute types and syntaxes defined in the standard LDAP schema

  • Added custom validators for attribute values

  • Added update capability to abstraction layer

  • Fixed typo in docs (thanks Gerardwx)

  • Fixed Object and Attribute representation in schema (superior class not shown)

  • ObjectDef automatically populates attributes from schema, following object_class hierarchy

  • Added attributes parameter to search* methods of Cursor, so that only needed attributes are read even if attr_defs defines more

  • Fixed connect_timeout not honored while wrapping socket in tls (thanks Kyle)

  • Added ‘set’ to SEQUENCE_TYPES (thanks Christian)

  • Entries returned by search are now writable via the abstraction layer

  • LDAPReaderError exception renamed to LDAPCursorError

  • auto_range parameter in Connection defaults to True (thanks Ashley)

  • get_info defaults to SCHEMA while defining Server object

  • Included ordereddict 1.1 (# Copyright (c) 2009 Raymond Hettinger) in ldap3.utils.ordDict for backporting OrderedDict in Python 2.6

  • Added config parameter RESET_AVAILABILITY_TIMEOUT to reinsert invalid address in candidate_addresses while checking connection, defaults to 5 seconds

  • Fixed inability to connect to a server if the connection starts when the server is unavailable and then it becomes available again

  • All DNs are sanitized if connection.check_names is True

  • LDAPControlsError exception renamed to LDAPControlError

  • LDAPChangesError exception renamed to LDAPChangeError

  • The following older constants in ldap3 have been removed, please use the suggested ones:

  • AUTH_ANONYMOUS = ANONYMOUS

  • AUTH_SIMPLE = SIMPLE

  • AUTH_SASL = SASL

  • SEARCH_SCOPE_BASE_OBJECT = BASE

  • SEARCH_SCOPE_SINGLE_LEVEL = LEVEL

  • SEARCH_SCOPE_WHOLE_SUBTREE = SUBTREE

  • SEARCH_NEVER_DEREFERENCE_ALIASES = DEREF_NEVER

  • SEARCH_DEREFERENCE_IN_SEARCHING = DEREF_SEARCH

  • SEARCH_DEREFERENCE_FINDING_BASE_OBJECT = DEREF_BASE

  • SEARCH_DEREFERENCE_ALWAYS = DEREF_ALWAYS

  • STRATEGY_SYNC = SYNC

  • STRATEGY_ASYNC_THREADED = ASYNC

  • STRATEGY_LDIF_PRODUCER = LDIF

  • STRATEGY_SYNC_RESTARTABLE = RESTARTABLE

  • STRATEGY_REUSABLE_THREADED = REUSABLE

  • STRATEGY_MOCK_SYNC = MOCK_SYNC

  • STRATEGY_MOCK_ASYNC = MOCK_ASYNC

  • POOLING_STRATEGY_FIRST = FIRST

  • POOLING_STRATEGY_ROUND_ROBIN = ROUND_ROBIN

  • POOLING_STRATEGY_RANDOM = RANDOM

  • GET_NO_INFO = NONE

  • GET_DSA_INFO = DSA

  • GET_SCHEMA_INFO = SCHEMA

  • GET_ALL_INFO = ALL

# 1.4.0 - 2016.07.18
  • Multiple Mock strategies now share entries when using the same Server object

  • Added AsyncStreamStrategy

  • Added Connection.extend.standard.persistent_search() (Thanks martinrm77)

  • Added escaping of character > 0x7F in filter validation (thanks cfelder)

  • Added better descriptions of Exception in abstraction layer (thanks cfelder)

  • Added queue in Persistent Search

  • Added callback in Persistent Search

  • MockStrategy now honors raise_exception parameter (thanks Simon)

# 1.3.3 - 2016.07.03
  • Change paameter name from ‘check’ to ‘fix’ in connection.extend.novell.add_members_to_groups() and connection.extend.novell.remove_members_from_groups

  • Added connection.extend.novell.check_groups_memberships() that check if members are in groups and fixes the user-group relation if incorrect

  • Updated docs link to ldap3.readthedocs.io

  • Fixed error in utils.conv.check_escape (thanks Anjuta)

  • Fixed typo in server.py when IP_V4_PREFERRED is used (thanks eva8668)

  • Host name certificate matching exception and logging is much more informative (thanks eddie-dunn)

  • Fixed typo in docs for use_ssl (thanks Brooks Kindle)

  • Tested against Python 2.6., Python 2.7.12, Python 3.5.2 and PyPy 5.3.1

# 1.3.2 - 2016.07.01
  • unreleased on pypi

# 1.3.1 - 2016.05.11
  • Added support for mocking the ldap3 library

  • Added support for MockSync strategy (thanks Roxana)

  • Added checked_attributes=True parameter to connection.response_to_json()

  • Added checked_attributes=True parameter to entry.entry_to_json()

  • MockSyncBase strategy supports bind(), unbind(), delete(), compare(), modify(), modify_dn(), abandon(), add()

  • MockSyncBase strategy accepts directory entries in json file

  • Fixed schema representation (thanks Conrado)

  • Allow connection.abandon(0), useful to “ping” the server

  • Added connection.abandon() test suite

  • Reusable strategy checks bind credential at bind() time, only on one worker connection

  • Reusable strategy ignores abandon() operation because of multiple connection workers

  • Reusable strategy honours return_empty_attributes connection parameter

  • Added lazy information to connection representation

  • Added support for hash (LM:NTLM) Windows NTLM authentication (thanks Dirk)

  • Fixed representation of empty attributes in connection.entries

  • Comparison of entry attributes value is easier

  • Added new extended operation connection.extend.novell.start_transaction()

  • Added new extended operation connection.extend.novell.end_transaction()

  • Added new extended operation connection.extend.novell.add_members_to_groups(members, groups, check, transaction)

  • Added new extended operation connection.extend.novell.remove_members_from_groups(members, groups, check, transaction)

  • Added new exception LDAPTransactionError

  • Added logic to handle Novell Transaction Error Unsolicited Notice

  • Ignore cheching of ssl context when cadata, cafile and capath are not provided (thanks DelboyJan)

# 1.2.2 - 2016.03.23
  • repr encoding set to ‘ascii’ when sys.stdout.encoding is None (thanks Jeff)

# 1.2.1 - 2016.03.19
  • try to use the requested ssl protocol in SSLContext for Python>=3.4 (thanks Patrick)

  • added return_empty_attributes to Connection object to return an empty list when the attribute requested is missing in the retrieved object

# 1.1.2 - 2016.03.10
  • Added rebind() method to Connection object to rebind with a different user (thanks Lorenzo)

  • Added Tests for rebind operation

  • Start_tls honored in referrals

  • Default ldaps port honored in referrals

  • Additional connection parameters honored in referrals and in the restartable strategy

  • Server connection timeout is honored while connecting, connection receive timeout while receiving

  • Extended operations followed on referrals (thanks Pavel)

  • Added receive_timeout parameter in Connection object to set socket in non-blocking mode with a specified timeout (thanks Antho)

  • Fixed abstract entry __getattr__() throwing KeyError instead of AttributeError (thanks Kilroy)

  • Fixed start_tls() Reusable strategy

# 1.0.4 - 2016.01.25
  • Controls can be added to extended operation in the extend package (thanks Hinel)

# 1.0.3 - 2015.12.1
  • Fixed set_config_parameter (thanks Sigmunau)

  • Disabled unauthenticated authentication, see RFC 4513 section 5.1.2 (thanks Petros)

  • Fixed falsey value in abstract Entry object __contains__() (thanks Vampouille)

# 1.0.2 - 2015.12.07
  • Allowed_referral_hosts in Server objects defaults to [(‘*’, True)] to accept any referral server with authentication

  • Referral uri is now properly percent-undecoded (thanks TWAC)

  • Referral Server object now use the same configuration of the original Server object

  • Fixed __contains__() in Entry object (thanks Vampouille)

# 1.0.1 - 2015.12.06
  • Removed the compat package

  • Refactored docs for extend operations

# 1.0.0 - 2015.12.06
  • Private RC for production

  • Status moved to 5 - Production/Stable

# 0.9.9.4 - 2015.12.02
  • Added items() to CaseInsensitiveDict class (thanks Jan-Hendrik)

  • Added set_config_parameter() in ldap3 namespace to modify the values of the configurable parameters of ldap3

  • Added microsoft.extend.modify_password() extended operation to change AD password

  • Fixed find_active_random_server() in pooling (thanks Sargul)

  • Fixed referral decoding in fast ber decoder (thanks TWAC)

# 0.9.9.3 - 2015.11.15
  • Added LDAPI (LDAP over IPC) support for unix socket communication

  • Added mandatory_in and optional_in in server schema for attribute types. Now you can see in which classes attributes are used

  • Added last_transmitted_time and last_received_time to Usage object to track time of the last sent and received operation

  • Exception SessionTerminatedByServer renamed to SessionTerminatedByServerError and added to ldap3 namespace

  • Added get_config_parameter() in ldap3 namespace to read the current value of ldap3 configurable parameters

  • Added SASL mechanism name as constants in the ldap3 namespace

  • Added escape_filter_chars in utils.conv (thanks Peter)

  • Reverted ALL_ATTRIBUTES behaviour in search to 0.9.9.1 (thanks Petros)

# 0.9.9.2 - 2015.10.19
  • Fixed hasattr() behaviour for Entry object in Python 3

  • Allows empty sasl_credentials in SASL bind

  • Added POOLING_LOOP_TIMEOUT constant to specify how many seconds the server pooling strategy has to wait before retrying if it did not find an active server (defaults to 10)

  • Pooling strategy now allows to specify the number of cycles to try when finding a server (with active=N)

  • Pooling strategy now allows to specify how many seconds a server must be considered offline before retrying to check for availabiliry (with exhaust=N)

  • Connection.entries defaults to empty list

  • ALL_ATTRIBUTES don’t send any attribute in the attribute list (was sending ‘*’) while searching

  • Added DirSync extended function for Microsoft Active Directory

  • Added LDAP_SERVER_DIRSYNC_OID control for Microsoft Active Directory

  • Added LDAP_SERVER_EXTENDED_DN_OID control for Microsoft Active Directory

  • Added LDAP_SERVER_SHOW_DELETED_OID control for Microsoft Active Directory

  • Fixed AD tests for single valued attributes

  • Added ACL attribute in the ATTRIBUTES_EXCLUDED_FROM_CHECK list

# 0.9.9.1 - 2015.09.21
  • Allows empty member values in groups while adding - this should not be as per rfc4511 4.1.7, but some servers expects it (thanks John)

  • Faster case insensitive dict while getting and setting key (thanks Pierre)

  • Updated setuptools to 18.3.2

  • Updated wheel to 0.26

  • Tested against Python 2.6 - Python 2.7 - Python 3.3 - Python 3.4 - Python 3.5 - pypy - pypy3

# 0.9.9 - 2015.09.09
  • Fixed boolean value for True value in ASN.1 encoding for certain ldap servers. (thanks Will)

  • Fixed follow auto referrals. (thanks WIll)

  • Now protocol defined integer values can be used for scope and derefAliases arguments when searching. (thanks Will)

  • Added description field in the AttrDef object. (thanks Hogne)

  • Added a custom ber decoder. Decoding of received packets is now 10x faster.

  • Added new boolean argument fast_decoder in connection object. Defaults to True.

  • Highest date correctly managed by the format_ad_timestamp() formatter. (thanks Will)

  • Fix for latest gssapi kerberos authentication module (thanks Alex)

  • Added freeIPA OID descriptors

  • Removed unneeded OidInfo class

# 0.9.8.8 - 2015.08.14
  • Coerce objectClass to a list in Add operation. (thanks Yutaka)

  • ObjectClass attribute values mantain their order in the Add operation. (thanks Yutaka)

  • Fixed search filter composition when the value part of the assertion contains = character. (thanks Eero)

  • Fixed modify_password extended operation when no hash method is specified. (thanks midnightlynx)

  • Added credentials to kerberos authentication. (thanks Alex)

  • Target name can be specified in sasl_credentials for Kerberos authentication. (thanks Alex)

  • Target name can be read from DNS in sasl_credential for Kerberos authentication. (thanks Alex)

  • Fixed connection.entries error when referrals are in the search response. (thanks WIll)

# 0.9.8.7 - 2015.07.19
  • Backported ssl.match_hostname from Python 3.4.3 standard library to be used in Python < 2.7.10

  • Use backports.ssl_match_hostname if present instead of static backported functions for matching server names in ssl certificate (thanks Michal)

  • Attributes values are properly printed when not strings in abstract.attribute (thanks hogneh)

  • Checking unicode __repr__() in python2

  • Added hashing capability to Modify Password extended operation (thanks Gawain)

# 0.9.8.6 - 2015.06.30
  • Modify operation now accept multiple changes for same attribute (Thanks Lorenzo)

  • Fixed entries property in connection when objects from multiple object classes are returned

  • Hide sensitive data in logging. use the utils.log.set_library_hide_sensitive_data(False) to show sensitive data and utils.log.get_library_hide_sensitive_data() to get the current value

  • Limited number of characters in a single log line. use the utils.log.set_library_log_max_line_length(length) to set and utils.log.get_library_log_max_line_length(length) to get the current value

  • Added CHANGES.txt with full changelog, latest changes only in README.txt

# 0.9.8.5.post2 - 2015.06.24
  • Updated pyasn1 to 0.1.8

  • Fixed error in not filter with pyasn1 0.1.8

# 0.9.8.5 - 2015.06.23
  • Updated docs with ldap operations pages

  • Fixed a bug where an Exception was raised on OpenBSD for missing IPV4_MAPPED flag

  • Fixed missing add operation usage metrics

  • Abstract Attribute doesn’t permit “falsy” values or None as default (thanks Lucas)

# 0.9.8.4 - 2015.05.19
  • Added EXTENDED log detail level with prettyPrint description of ldap messages

  • Fixed logging of IPv6 address description

  • Fixed checking of open address when dns returns more than one ip for the same host

  • Fixed selection of proper address when failing back from IPv6 to IPv4 and vice-versa

  • When sending controls controlValue is now optional (as stated in RFC 4511), specify None to not send it

  • Moved badges to shields.io

# 0.9.8.3 - 2015.05.11
  • Added support for logging

  • Added LDAPInvalidTlsSpecificationError exception

  • Added support for kerberos sasl - needs the gssapi package (thanks sigmaris and pefoley2)

  • Added support for using generator objects in ldap operations (thanks Matt)

  • Fixed bug in collect_usage (thanks Philippe)

  • Changed default server mode from IP_SYSTEM_DEFAULT to IP_V6_PREFERRED

# 0.9.8.2 - 2015.04.08
  • SaslCred returned as raw bytes (thanks Peter)

  • Search_paged now properly works in abstract.reader (thanks wazboy)

# 0.9.8.1 - 2015.04.04
  • Added NTLMv2 authentication method

  • extend.standard.who_am_i() now try to decode the authzid as unicode

  • Tests for AD (Active Directory) now use tls_before_bind when opening a connection

  • 0.9.8 not working for pypi problems

# 0.9.7.12 - 2015.03.18
  • Fixed missing optional authzid in digestMD5 sasl mechanism (thanks Damiano)

  • Changed unneeded classmethods to staticmethods

# 0.9.7.11 - 2015.03.12
  • Fixed address_info resolution on systems without the IPV4MAPPED flag (thanks Andryi)

# 0.9.7.10 - 2015.02.28
  • Fixed bug in PagedSearch when server has a hard limit on the number of entries returned (thanks Reimar)

  • 0.9.7.9 not working for pypi problems

  • 0.9.7.8 not working for pypi problems

  • 0.9.7.7 not working for pypi problems

  • 0.9.7.6 not working for pypi problems

# 0.9.7.5 - 2015.02.20
  • Fixed exception raised when opening a connection to a server. If there is only one candidate address and there is an error it returns the specific Exception, not a generic LDAPException error

  • Address_info filters out any impossible address to reach

  • Address_info include an IPV4MAPPED address for IPV6 host that try to reach an IPV4 only server

  • Added SyncMock strategy (needs the sldap3 package)

  • Fixed bug when using the aproximation operation in ldap search operations (thanks Laurent)

  • Removed response from exception raised with raise_exceptions=True to avoid very long exceptions message

# 0.9.7.4 - 2015.02.02
  • Added connection.entries property for storing response from search operations as and abstract.Entry collection.

# 0.9.7.3 - 2015.01.25
  • Modify operation type can also be passed as integer

# 0.9.7.2 - 2015.01.16
  • Fixed a bug when resolving IP address with getaddrinfo(). On OSX returned an UDP connection (thanks Hiroshi).

# 0.9.7.1 - 2015.01.05
  • Moved to Github

  • Moved to Travis-CI for continuous integration

  • Moved to ReadTheDocs for documentation

  • Moved testing servers in the cloud, to allow testing from Travis-CI

  • Project renamed from python3-ldap to ldap3 to avoid name clashing with the existing python-ldap library

  • Constant values in ldap3 are now strings. This is helpful in testing and debugging

  • Test suite fully refactored to be used in cloud lab and local development lab

  • Test suite includes options for testing against eDirectory, Active Directory and OpenLDAP

# 0.9.7 - 2014.12.17
  • Fixed bug for auto_range used in paged search

  • Added dual IP stack mode parameter in Server object, values are: IP_SYSTEM_DEFAULT, IP_V4_ONLY, IP_V4_PREFERRED, IP_V6_ONLY, IP_V6_PREFERRED

  • Added read_server_info parameter to bind() and start_tls() to avoid multiple schema and info read operations with auto_bind

  • Redesigned Reusable (pooled) strategy

  • Added LDAPResponseTimeoutError exception raised when get_response() doesn’t receive any response in the allowed timeout period

  • Added shortened authentication parameters in ldap3 namespace: ANONYMOUS, SIMPLE, SASL

  • Added shortened scope parameters in ldap3 namespace: BASE, LEVEL, SUBTREE

  • Added shortened get_info parameters in ldap3 namespace: NONE, DSA, SCHEMA, ALL

  • Added shortened alias dereferencing parameters in ldap3 namespace: DEREF_NONE, DEREF_SEARCH, DEREF_BASE, DEREF_ALWAYS

  • Added shortened connection strategy parameters in ldap3 namespace: SYNC, ASYNC, LDIF, RESTARTABLE, REUSABLE

  • Added shortened pooling strategy parameters in ldap3 namespace: FIRST, ROUND_ROBIN, RANDOM

  • Added reentrant lock to avoid race conditions in the Connection object

  • When runs in Python 2.7.9 uses SSLContext

  • Tested against Python 2.7.9, PyPy 2.4.0 and PyPy3 2.4.0

  • setuptools updated to 8.2.1

# 0.9.6.2 - 2014.11.17
  • Changed SESSION_TERMINATED_BY_SERVER from 0 to -2

  • Removed unneeded FORMAT_xxx variables in ldap3 namespace

  • Fixed bug in auto_range when search operation returns search continuations

  • Added infrastructure for Mock DSA (not functional yet)

# 0.9.6.1 - 2014.11.11
  • Added boolean parameter “auto_range” to catch the “range” ldap tag in searches. When true all needed search operation are made to fully obtain the whole range of result values

  • Fixed bug in sdist

  • Added offline schema for Fedora 389 Directory Server 1.3.3

  • Fixed bug while reading DSA info

# 0.9.6 - 2014.11.01
  • New feature ‘offline schema’ to let the client have knowledge of schema and DSA info even if not returned by the server

  • Offline schema for Novell eDirectory 8.8.8

  • Offline schema for Microsoft Active Directory 2012 R2

  • Offline schema for slapd 2.4 (Openldap)

  • Added server.info.to_json() and server.info.to_file to JSON serialize schema and info from Server object

  • Added Server.from_json() and Server.from_file() to create a Server object from a JSON definition

  • Added response_to_json() and response_to_file() to Connection object to serialize search response entries in JSON as a string or as a file

  • New exception hierarchy LDAPConfigurationError includes library configuration exceptions

  • New exception LDAPInvalidConfigurationDefinitionError

  • Dsa info and schema are not read twice when binding (thanks phobie)

  • LDAPStartTLSError exception is merged with exception raised from ssl packaged

  • Digest-MD5 SASL authentication accepts directives with list attributes (thanks John)

  • Fixed caseInsensitiveDictionary for keys() and values() methods

  • Fixed matching of certificate name in ssl with Python2

  • Attributes names and formatters are checked even if schema is not read by the server

  • Fixed fractional time when parsing generalized time

  • Specific decoder for Active Directory ObjectGuid and ObjectSid

  • Added additional checking for unicode in Python 2

  • Tested against Python 3.4.2, 2.7.8, 2.6.6

  • Updated setuptools to 7.0

# 0.9.5.4 - 2014.09.22
  • Fixed security issue in lazy connections (thanks Moritz)

  • Added ldap3.utils.dn with parse_dn(dn) to verify dn compliance with RFC4514

  • Added safe_dn(dn) to properly escape dn (if possible)

  • Added ldap3.utils.uri with parse_uri(uri) to verify uri compliance with RFC4516

  • Check for trailing slashes in hostname (thanks Dylan)

  • Timeout for socket connect operation. Server.connect_timeout = seconds_to_wait_for_establishing_connection (thanks Florian)

  • Closing socket error doesn’t raise exception anymore

  • ServerPool can be implicity defined with a list of server names (even when defining a connection)

# 0.9.5.3 - 2014.08.24
  • elements returned in schema and dsa info are in a case insensitive dictionary (can be changed in ldap3.CASE_INSENSITIVE_SCHEMA_NAMES = True|False)

  • attributes name returned in searches are now case insensitive (can be changed in ldap3.CASE_INSENSITIVE_ATTRIBUTE_NAMES = True|False)

  • change parameter name from separe_rdn to separate_rdn in ldap3.utils.conv.to_dn()

  • sync dev from Bitbucket to GitHub

  • schema attributes are explicitly read (useful for Active directory and 389 Directory Server)

  • new extended operation: list_replicas (Novell)

  • new extended operation: get_replica_info (Novell)

  • new extended operation: partition_entry_count (Novell)

  • renamed convert_to_ldif() to _convert_to_ldif()

# 0.9.5.2 - 2014.08.05
  • fixed LDAPOperationResult.__str__ (thanks David)

  • added to_dn() in utils.conv to convert a dn string to a list of components (strings or tuples)

  • added __version__ in ldap3

  • don’t raise exception if the schema cannot be read in unauthenticated state

  • server.address_info is now a property

# 0.9.5.1 - 2014.08.02
  • getaddrinfo called only once

  • real_server machinery removed - messageId is now global and monotonic for the whole library

  • attributes are returned formatted if schema is read and check_names = True, removed checked_attributes

  • bind result is populated again when successful (was removed in 0.9.2.1)

  • exception is now raised if you receive multiple extended response to a single extended request. This is not allowed by RFC 4511

# 0.9.5 - 2014.07.22
  • added support for IPv6 (thanks Robert)

  • auto_bind can be used even for establishing tls, possible values (defined in ldap3) are: AUTO_BIND_NONE, AUTO_BIND_NO_TLS, AUTO_BIND_TLS_AFTER_BIND, AUTO_BIND_TLS_BEFORE_BIND

  • refactored extend package to use classes

  • new extended operation: get_universal_password (Novell)

  • new extended operation: set_universal_password (Novell)

  • added parsing of hostname in scheme://hostname:hostport format. This has the precedence on the parameters (thanks Sorin)

  • added extra checks when the schema is read (with the get_info parameter) but nothing is returned by the server

  • updated setuptools to version 5.4.1

  • when check_name is True and schema is read attributes are checked and formatted in “checked_attributes” as specified by RFCs following the server schema

  • added formatter for generalizedTime syntax as specified in RFC4517 (ASN.1)

  • custom formatter can be added in Server definition

# 0.9.4.2 - 2014.07.03
  • Moved to Bitbucket + Mercurial

  • Fixed import in core.tls package

  • Removed unneeded imports

# 0.9.4.1 - 2014.07.02
  • included missing extend package (thanks to debnet)

# 0.9.4 - 2014.07.02
  • when running in python 3.4 or newer now Tls class uses SSLContext object with default secure setting

  • added parameters ca_certs_path, ca_certs_data, local_private_key_password to Tls object creation, valid when using SSLContext

  • in python 3.4 or newer the system CA certificates configuration can be used (just leave ca_cert_file, ca_certs_path and ca_certs_data set to None)

  • removed TLSv1 as default for Tls connection

  • upgraded backported ssl function from python 3.4.1 when using with python 2

  • when creating a connection the server parameter can be a string: the name of the server to connect in cleartext on default port 389

  • fixed bug in ldap3.util.conv.escape_bytes()

  • attributes parameter in search can be a tuple

  • check_names parameter in connection now defaults to True (so when schema info is available attribute and class name will be checked when performing LDAP operations)

  • remove the connection.close() method - use connection.unbind()

  • new exception LDAPExtensionError for signalling when the requestValue of extended operation is of an unknown ASN1 type

  • exiting connection manager doesn’t raise an exception if unbind is not successful (needed in long operations)

  • new extended operation: modify_password (RFC3062)

  • new extended operation: who_am_i (RFC4532)

  • new extended operation: get_bind_dn (Novell)

  • updated setuptools to version 5.3

# 0.9.3.5 - 2014.06.22
  • Exception history in restartable strategy is printed when reached the maximum number of retries

  • Fixed conditions on terminated_by_server unsolicited message

  • Added python2.6 egg installation package

# 0.9.3.4 - 2014.06.16
  • Exception can now be imported from ldap3 package

  • Escape_bytes return ‘’ for empty string instead of None (thanks Brian)

  • Added exception history to restartable connection (not for infinite retries)

  • Fixed start_tls retrying in restartable connection (thanks Brian)

  • New exception LDAPMaximumRetriesError for signalling when the SyncRestartable Strategy has reached the maximum number of retries while performing an operation

  • Inverted deleteoldrdn value in LDIF output (thanks Joseph)

# 0.9.3.3 - 2014.06.01
  • Fixed a bug in LDIFProducer when using context manager for connection

  • LDIF header in stream is added only whene there are actual data in the stream

  • Now LDIF stream can be added to an existing file - version header will not be written if stream is not empty

# 0.9.3.2 - 2014.05.30
  • Fixed a bug while reading schema

  • Add an implicit open() when trying binding on a closed connection

# 0.9.3.1 - 2014.05.28
  • Added stream capability to LDIFProducer strategy

  • Customizable line separator for LDIF output

  • Customizable sorting order for LDIF output

  • object_class parameter is now optional in connection.add()

  • Fixed objectClass attribute case sensitive dependency in add operation

  • Added stream capability to response_to_ldif() while searching

# 0.9.3 - 2014.05.20
  • Now the key in server.schema.attribute_type is the attribute name (was the oid)

  • Now the key in server.schema.object_classes is the class name (was the oid)

  • Added check_names to Connection definition to have name of attributes and of object class checked against the schema

  • Updated setuptools to 3.6

  • Added wheel installation format

  • Added raise_exceptions mode for connection

  • Exception hierarchy reworked

  • Added locking to Server object (for multithreading)

# 0.9.2.2 - 2014.04.30
  • fixed a bug from 0.9.1 that broke start_tls() (thanks Mark)

# 0.9.2.1 - 2014.04.28
  • fixed a bug in 0.9.2 that allowed only string attributes in add, modify and compare operations (thank Mladen)

# 0.9.2 - 2014.04.26
  • changed return value in get_response from response to (response, result) - helpful for multi-threaded connections

  • added ReusableStrategy for pooling connections

  • refined docstrings (thanks Will)

  • result and response attributes don’t overlap anymore. Operation result is only in result attribute.

  • fixed search for binary values (thanks Marcin)

  • added convenience function to convert bytes to LDAP binary value string format for search filter

# 0.9.1 - 2014.03.30
  • added laziness flag to test suite

  • changed ServerPool signature to accept active and exhaust parameters

  • removed unneeded start_listen parameter

  • added ‘lazy’ parameter to open, to bind and to unbind a connection only when an effective operation is performed

  • fixed start_tls in SyncWaitRestartable strategy

  • fixed certificate name checking while opening an ssl connection

  • fixed syntax error during installation

  • socket operations now raises proper exception, not generic LDAPException (thanks Joseph)

  • tested against Python 3.4, 3.3, 2.7, 2.6

  • updated setuptools to 3.3

# 0.9.0 - 2014.03.20
  • PEP8 compliance

  • added ldap3.compat package with older (non PEP8 compliant) signatures

  • renamed ldap3.abstraction to ldap3.abstract

  • moved connection.py, server.py and tls.py files to ldap3.core

  • fixed SyncWaitRestartableStrategy (thanks Christoph)

# 0.8.3 - 2014.03.08
  • added SyncWaitRestartable strategy

  • removed useless forceBind parameter

  • usage statistics updated with restartable success/failure counters and open/closed/wrapped socket counters

# 0.8.2 - 2014.03.04
  • Added refresh() method to Entry object to read again the attributes from the Reader in the abstraction layer

  • Fixed Python 2.6 issues

  • Fixed test suite for Python 2.6

# 0.8.1 - 2014.02.12
  • Changed exceptions returned by the library to LDAPException, a subclass of Exception.

  • Fixed documentation typos

# 0.8.0 - 2014.02.08
  • Added abstraction layer (for searching, read only)

  • Added context manager to Connection class

  • Added readOnly parameter to Connection class

  • Fixed a bug in search with ‘less than’ parameter

  • Remove validation of available SSL protocols because different Python interpreters can use different ssl packages

# 0.7.3 - 2014.01.05
  • Added SASL DIGEST-MD5 support

  • Moved to intrapackage (relative) imports

# 0.7.2 - 2013.12.30
  • Fixed a bug when parentheses are used in search filter as ASCII escaped sequences

# 0.7.1 - 2013.12.21
  • Completed support for LDIF as per RFC2849

  • Added new LDIF_PRODUCER strategy to generate LDIF-CHANGE stream

  • Fixed a bug in the autoReferral feature when controls where used in operation

# 0.7.0 - 2013.12.12
  • Added support for LDIF as per RFC2849

  • Added LDIF-CONTENT compliant search responses

  • Added exception when using autoBind if connection is not successful

# 0.6.7 - 2013.12.03
  • Fixed exception when DSA is not willing to return rootDSE and schema info

# 0.6.6 - 2013.11.13
  • Added parameters to test suite

# 0.6.5 - 2013.11.05
  • Modified rawAttributes decoding, now null (empty) values are returned

# 0.6.4 - 2013.10.16
  • Added simple paged search as per RFC2696

  • Controls return values are decoded and stored in result attribute of connection

# 0.6.3 - 2013.10.07
  • Added Extesible Filter syntax to search filter

  • Fixed exception while closing connection in AsyncThreaded strategy

# 0.6.2 - 2013.10.01
  • Fix for referrals in searchRefResult

  • Disabled schema reading on Active Directory

# 0.6.1 - 2013.09.22
  • Experimental support for Python 2 - no unicode

  • Added backport of ssl.match_name for Python 2

  • Minor fixes for using the client in Python 2

  • Fix for getting schema info with AsyncThreaded strategy

# 0.6.0 - 2013.09.16
  • Moved to beta!

  • Added support site hosted on www.assembla.com

  • Added public svn repository on www.assembla.com

  • Added getInfo to server object, parameter can be: GET_NO_INFO, GET_DSA_INFO, GET_SCHEMA_INFO, GET_ALL_INFO

  • Added method to read the schema from the server. Schema is decoded and returned in different dictionaries of the server.schema object

  • Updated connection usage info (elapsed time is now computed when connection is closed)

  • Updated OID dictionary with extensions and controls from Active Directory specifications.

# 0.5.3 - 2013.09.03
  • Added getOperationalAttributes boolean to Search operation to fetch the operational attributes during search

  • Added increment operation to modify operation as per RFC4525

  • Added dictionary of OID descriptions (for DSE and schema decoding)

  • Added method to get Info from DSE (returned in server.info object)

  • Modified exceptions for sending controls in LDAP request

  • Added connection usage (in connection.usage if collectUsage=True in connection definition)

  • Fixed StartTls in asynchronous client strategy

# 0.5.2 - 2013.08.27
  • Added SASLprep profile for validating password

  • Fixed RFC4511 asn1 definitions

# 0.5.1 - 2013.08.17
  • Refactored package structure

  • Project description reformatted with reStructuredText

  • Added Windows graphical installation

# 0.5.0 - 2013.08.15
  • Added reference to LGPL v3 license

  • Added Tls object to hold ssl/tls configuration

  • Added StartTLS feature

  • Added SASL feature

  • Added SASL EXTERNAL mechanism

  • Fixed Unbind

  • connection.close is now an alias for connection.unbind

# 0.4.4 - 2013.08.01
  • Added ‘Controls’ to all LDAP Requests

  • Added Extended Request feature

  • Added Intermediate Response feature

  • Added namespace ‘ldap3’

# 0.4.3 - 2013.07.31
  • Test suite refactored

  • Fixed single object search response error

  • Changed attributes returned in search from tuple to dict

  • Added ‘raw_attributes’ key in search response to hold undecoded (binary) attribute values read from ldap

  • Added __repr__ for Server and Connection objects to re-create the object instance

# 0.4.2 - 2013.07.29
  • Added autoReferral feature as per RFC4511 (4.1.10)

  • Added allowedReferralHosts to conform to Security considerations of RFC4516

# 0.4.1 - 2013.07.20
  • Add validation to Abandon operation

  • Added connection.request to hold a dictionary of infos about last request

  • Added info about outstanding operation in connection.strategy._oustanding

  • Implemented RFC4515 for search filter coding and decoding

  • Added a parser to build filter string from LdapMessage

# 0.4.0 - 2013.07.15
  • Refactoring of the connection and strategy classes

  • Added the ldap3.strategy namespace to contain client connection strategies

  • Added ssl authentication

  • Moved authentication parameters from Server object to Connection object

  • Added ssl parameters to Server Object

# 0.3.0 - 2013.07.14
  • Fixed AsyncThreaded strategy with _outstanding and _responses attributes to hold the pending requests and the not-yet-read responses

  • Added Extended Operation

  • Added “Unsolicited Notification” discover logic

  • Added managing of “Notice of Disconnection” from server to properly close connection

# 0.2.0 - 2013.07.13
  • Update setup with setuptools 0.7

  • Docstrings added to class

  • Removed ez_setup dependency

  • Removed distribute dependency

# 0.1.0 - 2013.07.12
  • Initial upload on pypi

  • PyASN1 RFC4511 module completed and tested

  • Synchronous client working properly

  • Asynchronous client working but not fully tested

  • Basic authentication working