/pyldap

Python 3 compatible ldap library

Primary LanguagePythonOtherNOASSERTION

pyldap

Continuous integration status

pyldap is a fork of the excellent python-ldap Python project.

The goals of this fork are the following:

  • Bring Python 3 support to python-ldap while keeping a PY2-compatible codebase
  • Improve tooling and code quality
  • Keep backwards compatibility whenever possible

Backwards compatibility

Users should be able to replace python-ldap with pyldap with minimal impact on their code. According to this, releases of pyldap will stick to the numbering of the upstream python-ldap releases they are based on.

However, some compatibility toggles will be added to bring cleaner APIs for PY3 code.

Please note the pyldap installs under the same ldap module as python-ldap; it CANNOT be installed alongside.

Upgrading from python-ldap

pyldap brings some improvements on top of python-ldap.

Bytes/text management

The LDAP protocol states that some fields (distinguised names, relative distinguished names, attribute names, queries) be encoded in UTF-8; some other (mostly attribute values) MAY contain any type of data, and thus be treated as bytes.

However, python-ldap used bytes for all fields, including those guaranteed to be text. In order to support Python 3, pyldap needs to make this distinction explicit; this is done through the bytes_mode flag to ldap.initialize().

When porting from python-ldap, users are advised to update their code to set bytes_mode=False on calls to these methods. Under Python 2, pyldap checks aggressively the type of provided arguments, and will raise a TypeError for any invalid parameter; however, if the bytes_mode kwarg isn't provided, pyldap will only raise warnings.

The typical usage is as follow; note that only the result's values are of the bytes type:

>>> import ldap
>>> con = ldap.initialize('ldap://localhost:389', bytes_mode=False)
>>> con.simple_bind_s('login', 'secret_password')
>>> results = con.search_s('ou=people,dc=example,dc=org', ldap.SCOPE_SUBTREE, "(cn=Raphaël)")
>>> results
[
    ("cn=Raphaël,ou=people,dc=example,dc=org", {
        'cn': [b'Rapha\xc3\xabl'],
        'sn': [b'Barrois'],
    }),
]

python-ldap: LDAP client API for Python

What is python-ldap?

python-ldap provides an object-oriented API to access LDAP directory servers from Python programs. Mainly it wraps the OpenLDAP client libs for that purpose.

Additionally the package contains modules for other LDAP-related stuff (e.g. processing LDIF, LDAPURLs, LDAPv3 sub-schema, etc.).

Not included: Direct BER support

See INSTALL for version compability

See TODO for planned features. Contributors welcome.

For module documentation, see:

http://www.python-ldap.org/

Quick usage example:

import ldap
l = ldap.initialize("ldap://my_ldap_server.my_domain")
l.simple_bind_s("","")
l.search_s("o=My Organisation, c=AU", ldap.SCOPE_SUBTREE, "objectclass=*")

See directory Demo/ of source distribution package for more example code.

Author(s) contact and documentation:

http://www.python-ldap.org/

If you are looking for help, please try the mailing list archives first, then send a question to the mailing list. Be warned that questions will be ignored if they can be trivially answered by referring to the documentation.

If you are interested in helping, please contact the mailing list. If you want new features or upgrades, please check the mailing list archives and then enquire about any progress.

Acknowledgements:

Thanks to Konstantin Chuguev <Konstantin.Chuguev at dante.org.uk> and Steffen Ries <steffen.ries at sympatico.ca> for working on support for OpenLDAP 2.0.x features.

Thanks to Michael Stroeder <michael at stroeder.com> for the modules ldif, ldapurl, ldap/schema/*.py, ldap/*.py and ldap/controls/*.py.

Thanks to Hans Aschauer <Hans.Aschauer at Physik.uni-muenchen.de> for the C wrapper schema and SASL support.

Thanks to Mauro Cicognini <mcicogni at siosistemi.it> for the WIN32/MSVC6 bits, and the pre-built WIN32 ldap.pyd.

Thanks to Waldemar Osuch <waldemar.osuch at gmail.com> for contributing the new-style docs based on reStructuredText.

Thanks to Torsten Kurbad <torsten at tk-webart.de> for the easy_install support.

Thanks to James Andrewartha <jamesa at daa.com.au> for significant contribution to Doc/*.tex.

Thanks to Rich Megginson <rmeggins at redhat.com> for extending support for LDAPv3 controls and adding support for LDAPv3 extended operations.

Thanks to Peter Gietz, DAASI for funding some control modules.

Thanks to Chris Mikkelson for various fixes and ldap.syncrepl.

These very kind people have supplied patches or suggested changes:

  • Federico Di Gregorio <fog at mixadlive.com>
  • John Benninghoff <johnb at netscape.com>
  • Donn Cave <donn at u.washington.edu>
  • Jason Gunthorpe <jgg at debian.org>
  • gurney_j <gurney_j at 4j.lane.edu>
  • Eric S. Johansson <esj at harvee.billerica.ma.us>
  • David Margrave <davidma at premier1.net>
  • Uche Ogbuji <uche.ogbuji at fourthought.com>
  • Neale Pickett <neale at lanl.gov>
  • Blake Weston <weston at platinum1.cambridge.scr.slb.com>
  • Wido Depping <wido.depping at gmail.com>
  • Deepak Giridharagopal <deepak at arlut.utexas.edu>
  • Ingo Steuwer <steuwer at univention.de>
  • Andreas Hasenack <ahasenack at terra.com.br>
  • Matej Vela <vela at debian.org>

Thanks to all the guys on the python-ldap mailing list for their contributions and input into this package.

Thanks! We may have missed someone: please mail us if we have omitted your name.