LDAP服务器上的更改更改了搜索返回的属性的大小写。例如;邮件路由地址";现在是";mailRoutingAddress";。搜索本身是不区分大小写的,但处理返回的ldap对象的python代码试图引用所有小写的属性,但失败了。
有没有一种简单的方法可以指定LDAP模块应该小写所有返回的属性?或者,有没有一种简单的方法可以在返回结果后立即将其更改为小写?
我们正在努力避免大量重写以处理LDAP软件中的此更改。
此代码返回一个错误"0";未找到密钥";
timestamp_filter = ldap.filter.filter_format("a filter that works as intended")
timestamp_result = search_ldap(timestamp_filter, ['modifytimestamp'])
if not timestamp_result:
log_it('WARN', 'No timestamp returned for group "%s"' % group_cn)
return False
else:
mod = timestamp_result[0][1]['modifytimestamp'][0].decode('utf-8').split('Z')[0]
当最后一行改成这个时,它起了作用:
mod = timestamp_result[0][1]['modifyTimestamp'][0].decode('utf-8').split('Z')[0]
当ldap对象第一次被绑定时,我希望能做些什么:
def bind_to_ldap(dn=auth_dn,pwd=auth_pwd):
# create connection to ldap and pass bind object back to caller
try:
ldc = ldap.initialize(uri, bytes_mode=False)
bind = ldc.simple_bind_s(dn, pwd)
except ldap.LDAPError as lerr:
log_it('EXCEPTION',"Exception raised when attempting to bind to LDAP server %s with dn %s" % (uri, dn))
graceful_exit("%s" % lerr)
return ldc
或者,我可以迭代搜索函数返回的所有属性。
s_filter = ldap.filter.filter_format("a filter that works as intended")
s_results = search_ldap(s_filter)
groups = {}
# okay, lots of processing do here....
for group in s_results:
# etc. etc. etc.
通过dict理解,您可以很容易地将dict的键更改为小写:
>>> timestamp_result = {'modifyTimestamp': 'foo'}
>>> timestamp_result = {k.lower(): v for k, v in timestamp_result.items()}
>>> timestamp_result
{'modifytimestamp': 'foo'}
一个更健壮的解决方案是让search_ldap
函数规范化服务器输出——这将最大限度地减少服务器响应更改时需要更新的代码量。