LdapJS 服务器 exop 处理失败
LdapJS server exop handling fails
我正在使用 Node.js 模块的 LDAP 服务器功能 ldapjs version 1.0.2. I want to handle an LDAP 1.3.6.1.4.1.4203.1.11.1 extended operation (see RFC 3062 = LDAP 密码修改)。
我的服务器已配置...
const server = ldapjs.createServer( ... );
...
server.exop('1.3.6.1.4.1.4203.1.11.1', (req: any, res: any, next: any) => {
const requestValue = req.requestValue;
});
调用命令 ldappasswd
(来自 debian 软件包 ldap-utils)有效,以正确的方式调用处理程序方法。
使用 "old" 作为旧密码和 "new" 使用新密码的 ldappasswd ... uid=user -A -S
命令的数据产生以下十六进制值:
30 14 80 08 75 69 64 3d 73 75 72 66 81 03 6f 6c 64 82 03 6e 65 77
0 u i d = u s e r o l d n e w
0x80为属性开始,0x81为旧密码开始,0x82为新密码开始。此字节后的值为长度,后跟信息本身。
问题:
在处理程序方法中,requestValue 是一个包含无效分隔符的字符串。
0uid=user�old�new
将字符串转换为缓冲区 (Buffer.from(req.reuqestValue
) 结果:
<Buffer 30 14 ef bf bd 08 75 69 64 3d 75 73 65 72 ef bf bd 03 6f 6c 64 ef bf bd 03 6e 65 77>
分隔符字节 0x80、0x81 和 0x82 被转换为 ef bf bd
,因此解析信息失败,因为类型丢失。
知道如何从 requestValue
属性中获取信息值吗?
问题可以通过安装版本next
并使用req.requestValueBuffer
代替req.requestValue
来解决:
npm install --save ldapjs@next
const server = ldapjs.createServer( ... );
...
server.exop('1.3.6.1.4.1.4203.1.11.1', (req: any, res: any, next: any) => {
const requestValue = req.requestValueBuffer;
})
该问题是由于当前ldapjs master分支的bug导致的(ad451edc) in file lib/messages/ext_request.js line 61:
this.requestName = ber.readString(0x80);
if (ber.peek() === 0x81)
try {
this.requestValue = ber.readString(0x81);
} catch (e) {
this.requestValue = ber.readBuffer(0x81);
}
在 ldappasswd
数据的情况下,调用 readString()
函数(未抛出异常),并且此函数始终使用 UTF-8 解码将缓冲区转换为字符串。那是错误的。此代码片段中的另一个错误是 readBuffer(...)
的调用,它在对象 ber
.
上不存在
在 ldapjs 存储库的下一个分支中,此错误已由 commit b87e4bb 中的错误修复解决。
修正 lib/messages/ext_request.js 第 82 行:
this.requestName = ber.readString(0x80)
if (ber.peek() === 0x81) {
this.requestValueBuffer = ber.readString(0x81, true)
this.requestValue = this.requestValueBuffer.toString('utf8')
}
处理程序方法现在可以使用 req.requestValueBuffer
获取原始请求数据字节。
我正在使用 Node.js 模块的 LDAP 服务器功能 ldapjs version 1.0.2. I want to handle an LDAP 1.3.6.1.4.1.4203.1.11.1 extended operation (see RFC 3062 = LDAP 密码修改)。
我的服务器已配置...
const server = ldapjs.createServer( ... );
...
server.exop('1.3.6.1.4.1.4203.1.11.1', (req: any, res: any, next: any) => {
const requestValue = req.requestValue;
});
调用命令 ldappasswd
(来自 debian 软件包 ldap-utils)有效,以正确的方式调用处理程序方法。
使用 "old" 作为旧密码和 "new" 使用新密码的 ldappasswd ... uid=user -A -S
命令的数据产生以下十六进制值:
30 14 80 08 75 69 64 3d 73 75 72 66 81 03 6f 6c 64 82 03 6e 65 77
0 u i d = u s e r o l d n e w
0x80为属性开始,0x81为旧密码开始,0x82为新密码开始。此字节后的值为长度,后跟信息本身。
问题:
在处理程序方法中,requestValue 是一个包含无效分隔符的字符串。
0uid=user�old�new
将字符串转换为缓冲区 (Buffer.from(req.reuqestValue
) 结果:
<Buffer 30 14 ef bf bd 08 75 69 64 3d 75 73 65 72 ef bf bd 03 6f 6c 64 ef bf bd 03 6e 65 77>
分隔符字节 0x80、0x81 和 0x82 被转换为 ef bf bd
,因此解析信息失败,因为类型丢失。
知道如何从 requestValue
属性中获取信息值吗?
问题可以通过安装版本next
并使用req.requestValueBuffer
代替req.requestValue
来解决:
npm install --save ldapjs@next
const server = ldapjs.createServer( ... );
...
server.exop('1.3.6.1.4.1.4203.1.11.1', (req: any, res: any, next: any) => {
const requestValue = req.requestValueBuffer;
})
该问题是由于当前ldapjs master分支的bug导致的(ad451edc) in file lib/messages/ext_request.js line 61:
this.requestName = ber.readString(0x80);
if (ber.peek() === 0x81)
try {
this.requestValue = ber.readString(0x81);
} catch (e) {
this.requestValue = ber.readBuffer(0x81);
}
在 ldappasswd
数据的情况下,调用 readString()
函数(未抛出异常),并且此函数始终使用 UTF-8 解码将缓冲区转换为字符串。那是错误的。此代码片段中的另一个错误是 readBuffer(...)
的调用,它在对象 ber
.
在 ldapjs 存储库的下一个分支中,此错误已由 commit b87e4bb 中的错误修复解决。
修正 lib/messages/ext_request.js 第 82 行:
this.requestName = ber.readString(0x80)
if (ber.peek() === 0x81) {
this.requestValueBuffer = ber.readString(0x81, true)
this.requestValue = this.requestValueBuffer.toString('utf8')
}
处理程序方法现在可以使用 req.requestValueBuffer
获取原始请求数据字节。