The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Патч к 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, lithium, 15:35, 15/01/2007 [ответить] [смотреть все]
  • +/
    можно попробовать использовать qmail-spp (http://qmail-spp.sourceforge.net/), там используется система плагинов -- не нужно патчить qmail. Этот патч можно было бы реализовать за несколько строк.
     
     
  • 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 - больше работы, зато экономия на техсуппорте)


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

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


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

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

     

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



    ПОДПИШИСЬ НА ЖУРНАЛ Linux Format 2012!

    Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

    Каждый, кто оформит подписку, получает бонусы и подарки- объёмные наклейки на системный блок, диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

    Оформить подписку на год


      Закладки на сайте
      Проследить за страницей
    Created 1996-2012 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    RUNNet TopList