<div dir="ltr">Hello everybody, <div>thanks for all suggestions you sent me, I've posted an alpha version of python3-ldap on PyPi. It covers all the basic operations defined in rfc4511 and should work on Linux and Windows OS with Python3 (I'm working on backward compatability with Python2 too). If you're interested you can send me feedback at <a href="mailto:python3ldap@gmail.com">python3ldap@gmail.com</a>. </div>
<div><br></div><div>I'd like to thanks Michael and I ask him for forgiveness for the intrusion in this mailing-list. I won't send any more message here.</div><div><br></div><div>Have fun,</div><div>gc</div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">2013/6/5 GG CC <span dir="ltr"><<a href="mailto:python3ldap@gmail.com" target="_blank">python3ldap@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div>Hi,</div><div>I'm developing a pure python ldap client library to be used in version 3 of Python.</div><div><br></div><div>My mandatory requirement are:</div><div>1. strictly follow the latest RFC for LDAP 3 ( from rfc4510 to rfc4519)</div>

<div>2. platform independent (at least for linux and Windows) architecture</div><div>3. do not have any external dependence (no openldap client library)</div><div>4. to be compatible with python3 and (possibly) python2</div>

<div>5. have a list of connection strategies (no thread, single thread, multithread, event...) to choose from, either synchronous or asynchronous</div><div>6. have a semplified query construction language</div><div>7. have a compatibility mode for application using python-ldap</div>

<div><br></div><div>The project will be open source. I have a basic client working (at a pre-alpha stage) and I'm about to create a site for hosting it. I've made a package submission on pypi for python3-ldap (I'm not sure if this will be the name), but there is no code available yet.</div>

<div><br></div><div>A bit more info about the previous requirements:<br></div><div><br></div><div>1. Latest RFC for ldap v3 (dated 2006) obsoletes the previous RFC specified in rfc3377 (2251-2256, 2829, 2830, 3371) for ldap v3 and amend and clarify the ldap protocol. I've already rewritten all the asn1 definitions from the rfc4511 because those in the pyasn1_modules package are not current with the RFC.</div>

<div><br></div><div>2. The library should run on Windows and Linux with no differences.</div><div><br></div><div>3. I usually work on Linux and Windows boxes and each time have to install the current python-ldap library from different sources. My library should be directly installed from pypi using pip or a similar package manager on both platforms. With python-ldap on Windows I can't use pip to update the library from the CheeseShop so I do not want to have any dependencies, installation should be the same on both platforms. Socket and thread programming should be appropriate for the platform used, with no changes needed in the configuration. My library should depend on the standard library and (for now) on the pyasn1 package only.</div>

<div><br></div><div>4. I'm writing and testing the library in Python 3, but it should (hopefully) be compatible with Python 2. Unicode strings are appropriately converted.</div><div><br></div><div>5. I'm not sure about which connection strategy is the best to use on ldap messages communication, so I'm writing a connection object with a "pluggable" socket connection strategy. For now I have "sync-nothread" and "async-blocking-threaded" strategies, maybe I'll add a "async-multiprocess-blocking" strategy and an "event-nonblocking-strategy".</div>

<div><br></div><div>6. I've already developed (for another project) an "abstraction layer" for ldap query. For example I can define "application fields" that maps to ldap attributes with a validate, prequery-transformation, postquery-transformation and a simplified query language. I think it could be helpful to extend the abstration to add/modify/delete and include this abstraction layer in the library to (optionally) simplify ldap usage. The following is an excerpt from my other project:</div>

<div><br></div><div><br></div><div># This is the definition of an abstract "Role" class mapped to an ldap object of class "CustomRole". </div><div># Fields maps to attributes (roleName to LocalizedName, roleLevel to RoleLevel, roleOwner to owner')</div>

<div># attr is the name of the attribute in ldap</div><div># multivalue fields are returned as a list of values</div><div># validation is a function to be executed with the value of the field. It it's non True the field is not added to the query</div>

<div># preQuery is a function to be executed to transform the value of the field before the query is executed</div><div># postQuery is a function to be executed to transform the response values of the query</div>
<div># default is a value to be returned if the query for that attribute is empty</div><div><br></div><div>class Role(_ldapBase):</div><div>    LDAPClass = 'CustomRole'</div><div>    baseLDAP = 'ou=roles,o=company')</div>

<div>    attrDefs = {</div><div>                'roleName': {</div><div>                    'attr': 'CustomRoleName',</div><div>                    'multivalue': False,</div><div>                    'validation': None,</div>

<div>                    'preQuery': lambda attrName, attrValue: Role._filterName('nrfLocalizedNames', AttrName, AttrValue),</div><div>                    'postQuery': lambda a: Role._getCustomName(a),</div>

<div>                    'default': 'no-role'</div><div>                },</div><div>                'roleLevel': {</div><div>                    'attr': 'RoleLevel',</div><div>                    'multivalue': False,</div>

<div>                    'validation': lambda value: True if value in ['1', '2', '3'] else False,</div><div>                    'preQuery': None,</div><div>                    'postQuery': None,</div>

<div>                    'default': ''</div><div>                },</div><div>                'roleOwner': {</div><div>                    'attr': 'owner',</div><div>                    'multivalue': True,</div>

<div>                    'validation': None,</div><div>                    'preQuery': None,</div><div>                    'postQuery': None,</div><div>                    'default': []</div>

<div>                },</div><div>    }</div><div><br></div><div>when I execute a query on this class I can use something like:</div><div>    roleName:admin,user roleLevel:3</div><div>and get the result for the following search filter:</div>

<div>    (&(|(CustomRoleName=admin_role)(CustomRoleName=admin_role))(RoleLevel = 3)).</div><div><br></div><div><br></div><div>7. I have developed different projects that use the python-ldap library. I'd like to convert them to python3 without changing what I've already done for the ldap part. So it should be (ideally) enough just to change the import from python-ldap to python3-ldap (or whatever the name of the library will be).</div>

<div><br></div><div><div>I'm writing in this list to know if anybody is interested in this kind of project and have suggestions or hints on how to go on. </div><div><br></div></div><div>Thanks,<br></div><div>gc</div>
<div>
<br></div><div>ps. I admit the reading RFCs is not one of the most interesting things to do in your spare time...</div><div><br></div></div>
</blockquote></div><br></div>