我正在尝试移植一个从Perl查询LDAP服务器的程序,使用Go版本,我收到了过滤器格式错误的响应:
00000057: LdapErr: DSID-0C0C0968,注释:服务器无法解码搜索请求筛选器,数据0,v1db1\x00
我已经使用tcpdump来捕获使用我的程序的Perl和Go版本传输到服务器的数据,并且发现它们发送的过滤包略有不同。这个问题不是关于Go程序中的任何可能的but,而是关于理解LDAP过滤包的内容。
编码滤波器是:
(objectClass=*)而Perl生成的数据包(服务器喜欢的)如下所示:
ASCII . . o b j e c t C l a s s
Hex 87 0b 6f 62 6a 65 63 74 43 6c 61 73 73
Byte# 0 1 2 3 4 5 6 7 8 9 10 11 12Go生成的数据包(服务器不喜欢)如下所示:
ASCII . . . . o b j e c t C l a s s
Hex a7 0d 04 0b 6f 62 6a 65 63 74 43 6c 61 73 73
Byte# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14这是我自己的邮包分类:
Perl版本为11个字节,Go版本为13个字节
对于这两个包,这只是ASCII文本objectClass
我对RFC 4511节4.5.1的解读表明Go版本“更正确”,然而Perl版本是与服务器一起工作的版本。怎么回事?
Wireshark能够解析两个数据包,并平等地解释它们。
发布于 2014-11-19 17:32:58
Perl版本是正确的,Go版本是不正确的。
正如您所指出的,RFC 4511节4.5.1指定了过滤器元素的编码,如下所示:
Filter ::= CHOICE {
and [0] SET SIZE (1..MAX) OF filter Filter,
or [1] SET SIZE (1..MAX) OF filter Filter,
not [2] Filter,
equalityMatch [3] AttributeValueAssertion,
substrings [4] SubstringFilter,
greaterOrEqual [5] AttributeValueAssertion,
lessOrEqual [6] AttributeValueAssertion,
present [7] AttributeDescription,
approxMatch [8] AttributeValueAssertion,
extensibleMatch [9] MatchingRuleAssertion,
... }在这种情况下,有关的部分是:
present [7] AttributeDescription,AttributeDescription元素在同一规范的4.1.4节中定义:
AttributeDescription ::= LDAPString
-- Constrained to <attributedescription>
-- [RFC4512]第4.1.2节:
LDAPString ::= OCTET STRING -- UTF-8 encoded,
-- [ISO10646] characters这意味着当前的过滤器组件是一个八进制字符串,它是一个基本元素。Go不正确地将其转换为构造的元素,并且目录服务器正确地拒绝了该格式错误的请求。
https://stackoverflow.com/questions/27022146
复制相似问题