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 获取原始请求数据字节。