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... большой текст свёрнут, показать | |
|
|
|
|
|
|
|