我正在使用Python 3 LDAP库here。我不理解它对'< ='运算符的行为。
我需要测试一系列uidNumber
个特定值。我正在将范围分解成块,以便我可以并行化每个部分。因此,查询中的过滤器如下所示:
(&(uid=MY_UID)(&(uidNumber>=chunk_start)(uidNumber<=chunk_end)))
与我正在搜索的uidNumber
相关联的uid
位于chunk_start
和chunk_end
之间。然而。在ldap3.Connection
对象上运行上面的查询不会返回任何结果。具体来说,我回来了:
[{'description': 'success',
'dn': '',
'message': '',
'referrals': None,
'result': 0,
'type': 'searchResDone'}]
通过curl
运行相同的查询会产生正确的结果,因此我在ldap3
中进行了更多搜索。我发现使用>=
运算符的查询按预期工作,但<=
运算符的任何内容都没有产生任何结果。搜索uidNumber
和uid
会产生以下结果:
In [175]: res = c.search('######'
'(&(uid=######)(uidNumber<=#######))',
ldap3.SEARCH_SCOPE_WHOLE_SUBTREE,
attributes=['objectClass', 'displayName'])
In [176]: c.getResponse(res)
Out[176]:
[{'description': 'success',
'dn': '',
'message': '',
'referrals': None,
'result': 0,
'type': 'searchResDone'}]
切换<=
>=
并将uidNumber
保留在查询中会产生正确的结果。
我还注意到,如果我删除uid
参数,getResult
会返回None
,而不是没有结果的列表。
这里出了什么问题?
编辑:
在架构中点击'uidNumber`会产生以下结果:
attributeTypes: ( 1.3.6.1.1.1.1.0 NAME 'uidNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )
objectClasses: ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) X-ORIGIN 'RFC 2307' )
反过来,查看RFC 2307说:
( nisSchema.1.0 NAME 'uidNumber'
DESC 'An integer uniquely identifying a user in an
administrative domain'
EQUALITY integerMatch SYNTAX 'INTEGER' SINGLE-VALUE )
EQUALITY integerMatch
行是否意味着它不支持排序? curl
正在回归正确的结果只是侥幸吗?
答案 0 :(得分:3)
我是python3-ldap库的作者。你是对的,在处理&lt; =运算符时,库中有一个错误。
我已经在即将推出的0.8.0版本的python3-ldap中修复了它。
再见 乔瓦尼
答案 1 :(得分:1)
订购在LDAP架构中定义。检查你的uidNumber是否具有integerOrderingMatch排序规则 - 如果没有,可能会发生任何奇怪的事情。
此外,您的粘贴代码
(&(uid=MY_UID)(&(uidNumber>=chunk_start)(uidNumber<=chunk_end))
最后缺少)
,这是一个复制/粘贴错误还是真实代码中的错误?我的python非常生疏,但在错误消息中,我假设在第175行的末尾也缺少,
。