Не удается обработать экзоп сервера LdapJS - PullRequest
1 голос
/ 26 сентября 2019

Я использую функциональность сервера LDAP модуля Node.js ldapjs версия 1.0.2.Я хочу обработать расширенную операцию LDAP 1.3.6.1.4.1.4203.1.11.1 (см. 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) работает, метод обработчика вызывается правильно.

Данные из команды 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?

1 Ответ

0 голосов
/ 28 сентября 2019

Проблема может быть решена путем установки версии 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 ( ad451edc ) в файле lib / messages / ext_request.js строка 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 для получениябайты данных исходного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...