2013-06-19 32 views
3

我試圖通過搜索過濾器執行使用LDAPObject.search_s()在Python中使用括號LDAP的搜索

這工作完全正常,當我有沒有()個參數,但是當存在於過濾器()失敗。

例如,當我找一組

"(name=(Test Group))",一個ldap.FILTER_ERROR將提高,但是當我使用"(name=Test Group)"作爲過濾器,不會有問題。

如何搜索具有parens的組?

參考:

http://www.python-ldap.org/doc/html/ldap.html?highlight=initialize#ldap-objects

+0

名稱如何等於「(Test Group)」? – EJP

+1

它可以。 'cn =='也是一個有效的名字。 – ixe013

回答

1

Section 3 of RFC4515說,括號(括號)和其他特殊字符必須進行轉義。

該規則確保整個過濾器字符串是有效的UTF-8字符串,並規定表示ASCII字符「*」(ASCII 0x2a),「(」(ASCII 0x28),「)」的八位組(ASCII 0x29),「\」(ASCII 0x5c)和NUL(ASCII 0x00)表示爲反斜槓「\」(ASCII 0x5c),後跟兩個十六進制數字表示編碼字節的值。

Python使編碼變得簡單。只需用反斜槓(\)逃脫特殊字符。搜索名爲「測試組」組,把搜索過濾器將是:

'(cn=\(test group\))' 

+0

謝謝,修復它... – ixe013

7

您應該使用ldap.filter模塊(與Python-LDAP版本2.4.10與OpenLDAP服務器進行測試) 。它已經包含了所有需要轉義的規則。

>>> import ldap.filter 
>>> ldap.filter.filter_format('(cn=%s)', ['(Test Group)',]) 
'(cn=\\28Test Group\\29)'