The OpenNET Project / Index page

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

Патч к qmail для привязки авторизованных пользователей к значению From (patch qmail smtp mail)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: patch, qmail, smtp, mail,  (найти похожие документы)
From: Максим Биринцев <birintsev@mail.ru.> Newsgroups: email Date: Mon, 15 Jan 2007 14:31:37 +0000 (UTC) Subject: Патч к qmail для привязки авторизованных пользователей к значению From Пользователи связки Qmail+Vpopmail, после SMTP авторизации получают в своё распоряжение SMTP-сервер и могут отсылать email с призвольного адреса (from) и в неограниченном количестве. Ограничить возможность авторизованным пользователям установки from только в свой адрес (он же логин) позволяет следуюший ниже патч. Патч осуществляет проверку установленной после авторизации переменной TCPREMOTEINFO и envelope адреса. Управляется проверка дополнительным файлом dropwrongenvelopesender в ~/qmail/controls (для проверки нужно в файле указать 1). Возвращаемая ошибка: 553 sorry, your envelope sender is wrong, need: <email-авторизованного-пользователя> (#5.7.1) Патч необходимо применять к стандартному qmail-1.03 после применения AUTH патча.
# # Max Birintsev <birintsev@mail.ru.> # --- qmail-smtpd.c.orig Tue Dec 26 21:38:17 2006 +++ qmail-smtpd.c Tue Dec 26 22:33:11 2006 @@ -53,6 +53,13 @@ void straynewline() { out("451 See http://pobox.com/~djb/docs/smtplf.html.\r\n"); flush(); _exit(1); } void err_bmf() { out("553 sorry, your envelope sender is in my badmailfrom list (#5.7.1)\r\n"); } +void err_wmf(arg) char *arg; +{ + out("553 sorry, your envelope sender is wrong, need: "); + out(arg); + out(" (#5.7.1)\r\n"); +} + void err_nogateway() { out("553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)\r\n"); } void err_unimpl() { out("502 unimplemented (#5.5.1)\r\n"); } void err_syntax() { out("555 syntax error (#5.5.4)\r\n"); } @@ -106,6 +113,7 @@ int liphostok = 0; stralloc liphost = {0}; int bmfok = 0; +int wmfok = 0; stralloc bmf = {0}; struct constmap mapbmf; @@ -128,6 +136,9 @@ if (bmfok == -1) die_control(); if (bmfok) if (!constmap_init(&mapbmf,bmf.s,bmf.len,0)) die_nomem(); + + if (control_readint(&wmfok,"control/dropwrongenvelopesender") == -1) die_control(); + if (wmfok < 0) wmfok = 1; if (control_readint(&databytes,"control/databytes") == -1) die_control(); x = env_get("DATABYTES"); @@ -231,6 +242,7 @@ int seenmail = 0; int flagbarf; /* defined if seenmail */ +int flagwarf; /* defined if seenmail */ stralloc mailfrom = {0}; stralloc rcptto = {0}; @@ -261,6 +273,7 @@ { if (!addrparse(arg)) { err_syntax(); return; } flagbarf = bmfcheck(); + flagwarf = wmfcheck(); seenmail = 1; if (!stralloc_copys(&rcptto,"")) die_nomem(); if (!stralloc_copys(&mailfrom,addr.s)) die_nomem(); @@ -271,6 +284,7 @@ if (!seenmail) { err_wantmail(); return; } if (!addrparse(arg)) { err_syntax(); return; } if (flagbarf) { err_bmf(); return; } + if (flagwarf) { err_wmf(remoteinfo); return; } if (relayclient) { --addr.len; if (!stralloc_cats(&addr,relayclient)) die_nomem(); @@ -426,6 +440,28 @@ substdio ssup; char upbuf[128]; int authd = 0; + + +int wmfcheck() +{ + if (!wmfok) return 0; + + /* if autenticated, + compare envelope sender (MAIL FROM) + with authenticated user (email for Vpopmail auth) + */ + if (authd) + { + if (!strcmp(addr.s,remoteinfo)) + { + return 0; + } + else return 1; + } + else return 0; +} + + int authgetl(void) { int i;

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1.1, lithium (??), 15:35, 15/01/2007 [ответить]  
  • +/
    можно попробовать использовать qmail-spp (http://qmail-spp.sourceforge.net/), там используется система плагинов -- не нужно патчить qmail. Этот патч можно было бы реализовать за несколько строк.
     
     
  • 2.2, q (??), 22:12, 15/01/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Патч, конечно, весьма полезный. Только зачем же стиль Бернштайна коверкать?
    Вот строку
    if (!strcmp(addr.s,remoteinfo))
    заменить бы на
    if (!str_diffs(addr.s,remoteinfo))
    или лучше на
    if (!case_diffs(addr.s,remoteinfo))
    (во втором случае надо будет взять отдельно патч, содержащий case.a и добавить его в мэйкфайл и в списке #include в qmail-smtpd.c - больше работы, зато экономия на техсуппорте)


     
     
  • 3.4, lithium (??), 11:34, 16/01/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >Патч, конечно, весьма полезный. Только зачем же стиль Бернштайна коверкать?

    напишите им, это не мой патч.


     
  • 2.3, Emotion (??), 11:31, 16/01/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Не знал, спасибо, посмотрю. Я здесь на форуме спрашивал - никто не ответил )
     
     
  • 3.5, q (??), 14:20, 16/01/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Кстати, как насчет поддержки реалмов в патче?
    Ведь может быть и так:
    addr.s="user@domain"
    а в то же время
    TCPREMOTEINFO="user"
    TCPREMOTEINFO="user%domain"

    Потом где-то сверху есть присвоение
    remoteinfo="unknown" на тот случай, если переменная TCPREMOTEINFO отсутствует (по разным не зависящим от Вас причинам)- можно выключать эту проверку на этот случай.
    Было бы неплохо и это учитывать.

     

  • 1.6, anonim (?), 13:33, 17/04/2013 [ответить]  
  • +/
    Подскажите, на какой AUTH patср надо ставить этот патч from??
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

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