The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

postfix + pam патч

23.04.2003 12:36

Патч реализующий поддержку проверки наличия пользователя, на начальном этапе почтовой сессии (local_recipient_maps), через PAM для postfix.

  1. Главная ссылка к новости (http://d.scn.ru/proj/postfix/...)
Автор новости: Roman Y. Bogdanov
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/2373-map
Ключевые слова: map, patch, postfix, pam
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (7) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Michael Tokarev (?), 21:56, 23/04/2003 [ответить]  
  • +/
    Эмм, хорошие...  Во-первых, это всё-таки не auth'торизация, а проверка наличия аккаунта.  Для этого в общем-то уже есть нормальный local_recipient_maps, с возможностью использовать свои map'ы (ну не radius, понятное дело).  Есть nss "поддерживаемый" out of the box.  Кстати, если local_recipient_maps вернёт, что user exists, но его реально нет, то local(8) всё равно не сможет его доставить, так что nss всё равно нужен, и посему от dict_pam толку никакого не будет.

    Вот если действительно хочется модуль уметь подключать, тогда нужно просто доделать dict_tcp и повесить свой демоночек для ответов на запросы, и уже туда пихать всё что захочется (только не PAM, я вас умоляю...;)

     
     
  • 2.2, Andrew Baznikin (?), 05:25, 24/04/2003 [^] [^^] [^^^] [ответить]  
  • +/
    Ответ Michael Tokarev.
    Была задача сделать проверку наличия пользователя через RADIUS, что было сделано с минимальными трудозатратами. Использовать для этих целей dict_tcp - это значит 1) написать сетевой уровень - сокеты там всякие 2) написать работу с RADIUS-сервером (не спорю, по времени это заняло бы даже меньше времени - ведь написал бы я его на любимом Perl, используя старые наработки, но это было бы менее универсально..). Была сначала сделать dict_radius, но была отвергнута. Есть готовый pam_radius, зачем делать лишнюю работу? К тому же это будет более универсально - используется вся мощь PAM, с его chain'ами, и пр. и пр.

    "Во-первых, это всё-таки не auth'торизация, а проверка наличия аккаунта" - совершенно верно. dict_pam передает в PAM только имя пользователя (читай - email) и название сервиса.

    "для этого в общем-то уже есть нормальный local_recipient_maps, с возможностью использовать свои map'ы" - я и сделал "свой map".

    "...то local(8) всё равно не сможет его доставить" - в качестве maildrop используется cyrus-imapd, который так же смотрит в RADIUS - есть ли такой пользователь. Если есть, а у него нет ящика, он его создаст (патч пишу сейчас).

    "Есть nss "поддерживаемый" out of the box." - это что за зверь?
    grep -Ri nss ./src/* - no result.

     
     
  • 3.3, poige (?), 10:44, 24/04/2003 [^] [^^] [^^^] [ответить]  
  • +/
    В твоем патче есть строка такая с

      strdup(...) // FIXME

    (если не ошибаюсь).

    причем, речь идет о memory leak, который "просит" чтобы его пофиксили.
    Если код хотя бы раз вызывается при каждой проверке, то работающий у ISP почтовик, "откусит" немало мозгов, по идее.

    /poige
    --
    http://www.morning.ru/~poige/

     
     
  • 4.4, Andrew Baznikin (?), 11:01, 24/04/2003 [^] [^^] [^^^] [ответить]  
  • +/
    >В твоем патче есть строка такая с
    >
    >  strdup(...) // FIXME
    >
    >причем, речь идет о memory leak, который "просит" чтобы его пофиксили.

    Спасибо за комментарий .)
    int converse(int n, const struct pam_message **msg,
                struct pam_response **resp, void *data) {
    /* ... */
        resp[i]->resp = strdup(msg[i]->msg); /* FIXME */
    /* ... */
    }

    Утечки здесь нет, т.к. буфер, в который производится копирование (resp) инициализируется PAM, им же он и освобождается. Т.е. это - проблемы негров .)

     
     
  • 5.5, poige (?), 18:36, 24/04/2003 [^] [^^] [^^^] [ответить]  
  • +/
    >>причем, речь идет о memory leak, который "просит" чтобы его пофиксили.
    >
    >Спасибо за комментарий .)
    >int converse(int n, const struct pam_message **msg,

    >    resp[i]->resp = strdup(msg[i]->msg); /* FIXME */

    >Утечки здесь нет, т.к. буфер, в который производится копирование (resp) инициализируется PAM,
    >им же он и освобождается. Т.е. это - проблемы негров .)

    Я не уверен на все 100 что называется, так как, в текстах PAM-модулей часто встречается такая работа с данными (strdup()), а детального описания интерфейса (API), в котором было бы написано кто, что и как выделяет/освобождает, я не нашел. Однако, там же (в текстах) встречается и проверка на то, что память действительно выделена, причем, если этого не произошло, то выполняется "откат", освобождая все, что успели получить до этого. В твоем патче такого нет:

    +    for (i = 0; i < n; ++i) {
    +        resp[i]->resp_retcode = 0;
    +        resp[i]->resp = strdup(msg[i]->msg); // FIXME
    +    }
    +
    +    return (PAM_SUCCESS);

    Если ты брал готовый (чужой) кусок кода, то следовало обратить внимание на его готовность к "реальной жизни", ибо он там *специально* отмечен комментарием.

    /poige
    --
    http://www.morning.ru/~poige/

     
     
  • 6.6, Andrew Baznikin (?), 05:57, 25/04/2003 [^] [^^] [^^^] [ответить]  
  • +/
    >Я не уверен на все 100 что называется, так как, в
    >текстах PAM-модулей часто встречается такая работа с данными (strdup()), а детального
    >описания интерфейса (API), в котором было бы написано кто, что и
    >как выделяет/освобождает, я не нашел. Однако, там же (в текстах) встречается
    >и проверка на то, что память действительно выделена, причем, если этого
    >не произошло, то выполняется "откат", освобождая все, что успели получить до
    >этого. В твоем патче такого нет:
    >
    >+    for (i = 0; i < n; ++i)
    >{
    >+        resp[i]->resp_retcode = 0;
    >+        resp[i]->resp = strdup(msg[i]->msg); // FIXME
    >+    }
    >+
    >+    return (PAM_SUCCESS);
    >
    >Если ты брал готовый (чужой) кусок кода, то следовало обратить внимание на
    >его готовность к "реальной жизни", ибо он там *специально* отмечен комментарием.

    Пример converse я взял из доки к pam (/usr/share/doc/en/articles/pam/pam-sample-conv.html). Вот кусок из оригинала:
        resp[i]->resp = strdup(buf);
        if (resp[i]->resp == NULL)
          goto fail;
    Далее по коду примера, resp нигде не освобождается.
    А что касается коментария - его я поставил для себя, так я отмечаю места к которым нужно вернуться для возможного улучшения. В этом патче converse служит исключительно заглушкой.

     
     
  • 7.7, poige (?), 11:55, 25/04/2003 [^] [^^] [^^^] [ответить]  
  • +/
    Гм Так в примере-то есть проверка значения strdup , а у тебя она лишь в FI... большой текст свёрнут, показать
     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру