Патч к qmail для привязки авторизованных пользователей к значению From (patch qmail smtp mail)
Ключевые слова: 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;
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??