Python3-LDAP没有返回预期的结果

时间:2013-12-24 22:07:13

标签: python database curl python-3.x ldap

我正在使用Python 3 LDAP库here。我不理解它对'< ='运算符的行为。

我需要测试一系列uidNumber个特定值。我正在将范围分解成块,以便我可以并行化每个部分。因此,查询中的过滤器如下所示:

(&(uid=MY_UID)(&(uidNumber>=chunk_start)(uidNumber<=chunk_end)))

与我正在搜索的uidNumber相关联的uid位于chunk_startchunk_end之间。然而。在ldap3.Connection对象上运行上面的查询不会返回任何结果。具体来说,我回来了:

[{'description': 'success',
  'dn': '',
  'message': '',
  'referrals': None,
  'result': 0,
  'type': 'searchResDone'}]

通过curl运行相同的查询会产生正确的结果,因此我在ldap3中进行了更多搜索。我发现使用>=运算符的查询按预期工作,但<=运算符的任何内容都没有产生任何结果。搜索uidNumberuid会产生以下结果:

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正在回归正确的结果只是侥幸吗?

2 个答案:

答案 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行的末尾也缺少,