• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 修正Qmail auth smtp中電子郵件地址任意的patch

    發表于:2007-05-25來源:作者:點擊數: 標簽:
    qmail的authsmtp有兩個patch, 分別在:http://members.elysium.pl/brush/qmail-smtpd-auth/和www.nimh.org/hacks/qmail-smtpd.c。 不過都有個問題,就是auth的用戶可以和mailfrom的用戶不一樣,這樣就 給了垃圾郵件發送者可乘之機,只要知道了某個用戶的地址

    qmail 的auth smtp有兩個patch,
    分別在:http://members.elysium.pl/brush/qmail-smtpd-auth/和www.nimh.org/hacks/qmail-smtpd.c。

    不過都有個問題,就是auth 的用戶可以和mail from的用戶不一樣,這樣就
    給了垃圾郵件發送者可乘之機,只要知道了某個用戶的地址和口令,就可以
    以自己的名義發信。同時認證用戶的過程并不記錄在郵件日志中,這給了系統管理員造成了很大不便,難以知道是哪個用戶被黑掉了。

    下面這個patch就是針對這種情況寫的。

    作用有兩個:
    1. 通過環境變量來控制是否記錄認證過程。
    2. 如果mail from和auth user name不一致,拒絕發送信件。


    這個patch是基于www.nimh.org/hacks/qmail-smtpd.c,iceblood版本中實際上也是的這個。因此,用iceblood版本的可以直接使用。如果是用
    http://members.elysium.pl/brush/qmail-smtpd-auth/版本的就需要自己
    相應的修改了。

    安裝方法,如下,將下面這些內容存到qmail-smtpd.patch。放到qmail的源碼目錄。然后
    1. patch < qmail-smtpd.patch
    2. make qmail-smtpd
    3. 替換qmail-smtpd
       或者復制到新的執行文件例如qmail-smtpd.auth,這樣你的舊版本就能保留
      了,只需要在smtpd的啟動腳本中,修改為對應的執行文件就可以。

    如果你需要記錄smtp認證的信息,在smtpd的啟動腳本中定義環境變量,如下:
    LOG_AUTH=1
    export LOG_AUTH

    缺省情況下,認證信息不記入log

    [quote:d38fd091a9]
    --- qmail-smtpd.c       2003-04-05 17:55:20.000000000 -0500
    +++ qmail-smtpd.c.new   2003-04-05 17:50:58.000000000 -0500
    @@ -304,7 +304,11 @@
       if (!stralloc_copys(&rcptto,"")) die_nomem();
       if (!stralloc_copys(&mailfrom,addr.s)) die_nomem();
       if (!stralloc_0(&mailfrom)) die_nomem();
    +  if (smtp_auth_validfrom(mailfrom.s)) {
       out("250 ok\r\n");
    +  } else {
    +    out("must use username as From authenticated! (#5.7.1)\r\n");
    +  }
     }
     void smtp_rcpt(arg) char *arg; {
       if (!seenmail) { err_wantmail(); return; }
    @@ -527,6 +531,82 @@
     static stralloc smtpauth = {0};
     static char smtpauthlogin[65];
     static char smtpauthpass[65];
    +static int authd = 0;
    +
    +/* Author: gadfly@163.com.
    + * 1. Check consistent between auth user and 'From' user.
    + * 2. Read the LOG_AUTH enviroment variable to determine whether logging the auth info.
    + * LOG_AUTH=1, write the auth smtp info into syslog.
    + */
    +#include <syslog.h>
    +
    +#define SMTP_AUTH_SUCCESS     0
    +#define SMTP_AUTH_FAILED      1
    +
    +int smtp_auth_validfrom(from) char * from;
    +{
    +  stralloc tmplogin={0},mydefaultdomain={0};
    +  char authusername[256];
    +  int k, userlen;
    +
    +  if (!authd) return 1;
    +
    +  authusername[255] = '\0';
    +  userlen = k = str_len(smtpauthlogin);
    +  k = byte_rchr(smtpauthlogin, k, '@');
    +
    +  if (k == userlen)
    +  {
    +    k = byte_rchr(smtpauthlogin, userlen, '%');
    +
    +    if (k == userlen)
    +    {
    +      if (control_readfile(&mydefaultdomain,"/var/qmail/control/me",1) != 1)
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_copys(&tmplogin, smtpauthlogin) )
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_cats(&tmplogin, "@") )
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_cat(&tmplogin, &mydefaultdomain))
    +      {
    +        die_nomem();
    +      }
    +      strncpy(authusername, tmplogin.s, sizeof(authusername));
    +      }
    +      else
    +      {
    +        strcpy(authusername, smtpauthlogin);
    +      authusername[k]='@';
    +      }
    +  }
    +  else {
    +    strcpy(authusername, smtpauthlogin);
    +  }
    +  return !strcasecmp(from, authusername);
    +}
    +
    +
    +void auth_smtplog(authlogin, authresult)
    +char * authlogin;
    +int authresult;
    +{
    +  char * x = env_get("LOG_AUTH");
    +
    +  if (!x || (*x != '1')) return;
    +
    +  if (authresult == SMTP_AUTH_SUCCESS) {
    +    syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, suclearcase/" target="_blank" >ccess!", authlogin);
    +  } else {
    +    syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, failed!", authlogin);
    +  }
    +}
    +
     static int smtpauth_getl(void) {
       int i;
       if (!stralloc_copys(&smtpauth, "")) return -1;
    @@ -611,11 +691,14 @@
       wait_pid(&st, pid);
       if (wait_exitcode(st) == 0) {
         out("235 go ahead\r\n");
    +    authd = 1;
    +    auth_smtplog(smtpauthlogin, SMTP_AUTH_SUCCESS);
         flush();
         relayclient="";
         return;
       }
       sleep(2);
    +  auth_smtplog(smtpauthlogin, SMTP_AUTH_FAILED);
       out("535 auth failure\r\n"); flush(); _exit(0);
       /* done */
     }
    [/quote:d38fd091a9]

    呵呵,正式用之前,各位多測試測試。

    幾種情況需要測測看:
    1. 其它服務器發到本域,smtp過程是否正常,本域能否收到
    2. from和auth user 不一樣會出現什么情況, 一樣的話,能否發信。
    3. LOG_AUTH是否起作用。

    呵呵,qmail的對齊用空格,實在不習慣,沒辦法,為保持一致,我也用了。     

    [b:d38fd091a9]更新版本[/b:d38fd091a9]
    應一些朋友的要求,加了本地發信人發給本地,也需要auth的功能。 

    另外而且還加了一些注釋,版本號。方法和前面一樣。 

    代碼如下:
    [code:1:d38fd091a9]
    --- qmail-smtpd.c 2003-06-02 18:34:51.000000000 -0400
    +++ qmail-smtpd.c.new 2003-06-02 18:42:31.000000000 -0400
    @@ -268,6 +268,7 @@
       int r;
       r = rcpthosts(addr.s,str_len(addr.s));
       if (r == -1) die_control();
    +  if (!localauthd()) return 0;
       return r;
     }
     
    @@ -304,7 +305,11 @@
       if (!stralloc_copys(&rcptto,"")) die_nomem();
       if (!stralloc_copys(&mailfrom,addr.s)) die_nomem();
       if (!stralloc_0(&mailfrom)) die_nomem();
    -  out("250 ok\r\n");
    +  if (smtp_auth_validfrom(mailfrom.s)) {
    +    out("250 ok\r\n");
    +  } else {
    +    out("must use username as From authenticated! (#5.7.1)\r\n");
    +  }
     }
     void smtp_rcpt(arg) char *arg; {
       if (!seenmail) { err_wantmail(); return; }
    @@ -527,6 +532,89 @@
     static stralloc smtpauth = {0};
     static char smtpauthlogin[65];
     static char smtpauthpass[65];
    +static int authd = 0;
    +
    +/* Author: gadfly@163.com. Version: 1.2.
    + * 1. Check consistent between auth user and 'From' user.
    + * 2. Read the LOG_AUTH enviroment variable to determine whether logging the auth info.
    + * LOG_AUTH=1, write the auth smtp info into syslog.
    + * 3. If mail from local, rcpt to local domain, user must auth before send data.
    + */
    +#include <syslog.h>
    +
    +#define SMTP_AUTH_SUCCESS     0
    +#define SMTP_AUTH_FAILED      1
    +
    +int localauthd() {
    +
    +  if (rcpthosts(mailfrom.s, strlen(mailfrom.s)) && !authd) return 0;
    +  return 1;
    +}
    +
    +int smtp_auth_validfrom(from) char * from;
    +{
    +  stralloc tmplogin={0},mydefaultdomain={0};
    +  char authusername[256];
    +  int k, userlen;
    +
    +  if (!authd) return 1;
    +
    +  authusername[255] = '\0';
    +  userlen = k = str_len(smtpauthlogin);
    +  k = byte_rchr(smtpauthlogin, k, '@');
    +
    +  if (k == userlen)
    +  {
    +    k = byte_rchr(smtpauthlogin, userlen, '%');
    +
    +    if (k == userlen)
    +    {
    +      if (control_readfile(&mydefaultdomain,"/var/qmail/control/me",1) != 1)
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_copys(&tmplogin, smtpauthlogin) )
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_cats(&tmplogin, "@") )
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_cat(&tmplogin, &mydefaultdomain))
    +      {
    +        die_nomem();
    +      }
    +      strncpy(authusername, tmplogin.s, sizeof(authusername));
    +      }
    +      else
    +      {
    +        strcpy(authusername, smtpauthlogin);
    +      authusername[k]='@';
    +      }
    +  }
    +  else {
    +    strcpy(authusername, smtpauthlogin);
    +  }
    +  return !strcasecmp(from, authusername);
    +}
    +
    +
    +void auth_smtplog(authlogin, authresult)
    +char * authlogin;
    +int authresult;
    +{
    +  char * x = env_get("LOG_AUTH");
    +
    +  if (!x || (*x != '1')) return;
    +
    +  if (authresult == SMTP_AUTH_SUCCESS) {
    +    syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, success!", authlogin);
    +  } else {
    +    syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, failed!", authlogin);
    +  }
    +}
    +
     static int smtpauth_getl(void) {
       int i;
       if (!stralloc_copys(&smtpauth, "")) return -1;
    @@ -611,11 +699,14 @@
       wait_pid(&st, pid);
       if (wait_exitcode(st) == 0) {
         out("235 go ahead\r\n");
    +    authd = 1;
    +    auth_smtplog(smtpauthlogin, SMTP_AUTH_SUCCESS);
         flush();
         relayclient="";
         return;
       }
       sleep(2);
    +  auth_smtplog(smtpauthlogin, SMTP_AUTH_FAILED);
       out("535 auth failure\r\n"); flush(); _exit(0);
       /* done */
     }
    [/code:1:d38fd091a9]

    另外,感謝erehw提供的空間可以下載這個patch。
    http://gadfly.shanji.com/qmail-smtpd/

    [b:d38fd091a9]
    由于網頁上的代碼貼上去,格式有問題。
    我就不再更新了。
    請各位到以上的url下載。
    或給我發信索要
    [/b:d38fd091a9]

     Fun-FreeBSD 回復于:2003-04-05 18:32:03
    好啊,可惜我沒在公司,周一到公司試一下~

     peng 回復于:2003-04-06 21:22:10
    gadfly真強??!
    看來做研發的就是厲害啊。
    好文章。

     gadfly 回復于:2003-04-07 00:40:49
    暈,這上面的patch中,每行前面的空格都不顯示出來,復制下來肯定沒法用.

    本站的ftp服務也關了. 

    如果手工復制下來,需要在每行沒有@或+開頭的代碼行前面加個空格,
    就可以使用了.

    如果覺得麻煩,可以給我發信,我把patch發給你們. gadfly@163.com

    最好能有個上載的地方 :-(

     gadfly 回復于:2003-04-07 00:42:59
    peng老大過獎了,都在技術的苦海中苦苦掙扎. 兄弟們得攜手共進才是.

    說不定還有不少問題呢

     gadfly 回復于:2003-04-07 11:43:57
    由于,有網友給我發信提了一些問題,我想還是到這里說比較方便。

    其實下面的問題,在我上面都說明了。沒辦法,我還是重點說一下

    FAQ: 

    1. patch是基于哪一個auth的?
    auth smtp有兩個patch, 
    分別在:http://members.elysium.pl/brush/qmail-smtpd-auth/
    和www.nimh.org/hacks/qmail-smtpd.c。 
    基于的是后者。
    如果你們auth smtp用的是前者,我提供的patch就不能直接使用。
    等我有時間,在寫一個基于前者的patch吧。

    2. patch執行后的結果是什么?
    暈,剛發現,www.nimh.org/hacks/qmail-smtpd.c又更新了,做的糟糕,沒有版本信息,我還不知道我針對的哪一個版本。下次我也要加上版本信息了。
    現在只好說: iceblood版本: 正常執行成功的話,沒有任何輸出。
              最新版本(nimh.org主頁上的):輸出入下:
    [quote:de306b6c4e]
    Hunk #1 succeeded at 252 (offset -52 lines).
    Hunk #2 succeeded at 498 (offset -33 lines).
    Hunk #3 succeeded at 633 (offset -58 lines).
    [/quote:de306b6c4e]
    但是還好,編譯出來的可以正常使用。

    3.編譯出來的大小沒有區別?
    這個和系統環境相關,不是絕對的。只要前兩個沒問題,你就看測試結果吧。

    4.網頁上的patch不好用?
    是的,因為格式的原因,手工復制下來,需要在每行沒有@或+開頭的代碼行前面加個空格, 就可以使用了. 

    如果覺得麻煩,可以給我發信,我把patch發給你們. gadfly@163.com 

    最好能有個上載的地方

     netloafer 回復于:2003-04-07 12:13:31
    gadfly真是強呀~~
    有關資料可以上傳到linux版的FTP服務器上~~~~

     gadfly 回復于:2003-04-07 12:23:03
    [quote:cf2cc80f45="netloafer"]

    gadfly真是強呀~~ 
    有關資料可以上傳到linux版的FTP服務器上~~~~


    [/quote:cf2cc80f45]

    呵呵,過獎了。

    ftpserver我昨天試過了,還是沒有開。

    聽說因為受攻擊,還影響了電信的其他業務,現在已經關閉了。只有另尋他途。

     夜未眠 回復于:2003-04-28 19:41:16
    針對http://members.elysium.pl/brush/qmail-smtpd-auth/認證補丁再加上樓主所說的功能.

    [ 非patch ]

    首先你要打補丁,然后照下面的方法修改qmail-smtpd.c源代碼.

    1.增加全局變量:
            stralloc authusername={0};   //全局變量用于記錄認證的email地址

    2.在認證成功后將mailfrom存入上面的authusername中,也就是在函數
    int authenticate(void)最后return 0;語句前插入下面的語句
             /*將用戶名存入全局變量 authusername*/
             if(!stralloc_copy(&authusername,&user)) return 1;

    3.在void smtp_rcpt(arg)函數的if (relayclient) {語句后插入下面的語句.
                 if(case_diffs(authusername.s,mailfrom.s)) { 
                        err_noauth(); //認證用戶名與mailfrom中的地址不符
                        /*在這兒加入log代碼*/
                        return; //出錯返回
                 }

    ===========================================================
    一個問題:也不知道我想的對不對,在此提出與各位討論.

        但是我覺得你的patch和我上面的方法好象都有一個問題.就是如果遠程連接到服務器25號端口,不通過認證。一樣可以向control/rcpthosts中列出的地址發郵件(就象是別的MTA與你對話一樣,別人的MTA不可能知道你的用戶名和密碼)因為不通過認證那么relayclient將會是null,那么就會進行rcpthosts的比較,如果rcpt 指定的email地址在rcpthosts中列出,qmail會接收并轉發該郵件,如果一個快速請求對一個慢速服務器,那是什么情況?
         有人想把用戶名與mailfrom地址比較的操作放在if(relayclient)這前,前面我說了,別人的MTA不會知道你的用戶名及密碼。如果你這樣作了,你將收不到郵件。
        我想就一臺服務器再打補丁也是白打??梢杂脙膳_服務器比較安全,分別打不同的補丁<也就是在前面提到的if(relayclient)處>,一臺專收,一臺專發。兩臺之間進行通信。這樣可能才能比較安全.

        不知道各位大蝦有什么看法。不仿在此討論討論..

     tutux 回復于:2003-04-28 21:04:37
    [quote:3284d68729="夜未眠"] ]

    首先你要打補丁,然后照下面的方法修改qmail-smtpd.c源代碼.

    1.增加全局變量:
            stralloc authusername={0};   //全局變量用于記錄認證的email地址

    2.在認證成功后將mailfrom存入上面的authusern..........[/quote:3284d68729]

    [quote:3284d68729]就是如果遠程連接到服務器25號端口,不通過認證。一樣可以向control/rcpthosts中列出的地址發郵件(就象是別的MTA與你對話一樣,別人的MTA不可能知道你的用戶名和密碼)因為不通過認證那么relayclient將會是null,那么就會進行rcpthosts的比較,如果rcpt 指定的email地址在rcpthosts中列出,qmail會接收并轉發該郵件,如果一個快速請求對一個慢速服務器,那是什么情況? 
    [/quote:3284d68729]

    這個情況,是暫時沒辦法的啦。

     iceblood 回復于:2003-04-29 08:50:32
    謝謝,希望加精。
    能否mail給我一份?
    我盡快把qmail-smtpd.c替換掉。

     gadfly 回復于:2003-04-29 12:22:51
    to 夜未眠:

    大概明白你的意思.
    1.smtp的這種機制下,安全就是相對的,我知道你服務器的域和用戶,我就可以向你發信。
    2.其實你說的分開,也就是將mail relay(本域用戶向外發信)和mail receive(用于MTA)之間,我記得和peng以前討論過,確實可以這么做.而且不同的patch確實能使效率提高,同時又起到了分流的作用.不過大部分的情況下,效率的問題并不大, 這兩者還是合一的.不過我想用不同的patch,效率上的提高還是有限的。即使有效率問題,完全可以通過多服務器負載均衡來避免.
    3.你說白打,我的理解你是針對發往本域的,我同意。不過這些patch基本上都是針對relay的,從這個角度來說,patch是很有作用的.

    to iceblood:
    看不到你的mail address。不知如何給你

     iceblood 回復于:2003-04-29 14:32:09
    暈到~一時忽疏~居然忘記留下地址,現在補上~
    iceblood@163.com

     夜未眠 回復于:2003-04-29 18:20:36
    to gadfly
    我都不是很清楚自已在說什么,誰叫我表達能力太差呢。大哥居然能夠理解我的意圖,佩服佩服。

     haohaoo 回復于:2003-04-30 12:54:06
    [quote:6770b16ed1]這個patch是基于www.nimh.org/hacks/qmail-smtpd.c,iceblood版本中實際上也是的這個。因此,用iceblood版本的可以直接使用。[/quote:6770b16ed1]
    那要怎么用?你還沒有說呢?下載qmail-smtpd.c后要怎么辦?我用iceblood版本已經安裝好了,要怎么打?

     gadfly 回復于:2003-04-30 13:31:52
    不仔細看?
    [quote:7de698ebbe]
    安裝方法,如下,將下面這些內容存到qmail-smtpd.patch。放到qmail的源碼目錄。然后 
    1. patch < qmail-smtpd.patch 
    2. make qmail-smtpd 
    3. 替換qmail-smtpd 
    [/quote:7de698ebbe]

     haohaoo 回復于:2003-04-30 17:45:54
    [quote:f25e681436="gadfly"][/quote:f25e681436]
    有看啊,不過我說iceblood版本已經安裝好了的???
    是不是把包解開,然后把qmail-smtpd.c改名,然后編譯好后,把qmail-smtpd拿到已安裝的機器上去替換就行了?

     gadfly 回復于:2003-04-30 21:01:19
    ??
    不用改名,解包后按我說的步驟作就好了

     haohaoo 回復于:2003-05-02 12:55:18
    我替換掉qmail-smtpd后還是出問題啊,smtp不用驗證就可以發信啊

     ryanxyz 回復于:2003-05-02 20:43:25
    我一開始就用了gadfly兄的patch
    完全沒有問題
    一次搞定 如果是從網頁上複製下來的 
    需要注意空白的問題

     microcao 回復于:2003-05-04 20:45:08
    我來補充一下

    首先

    http://nimh.org/ 的補丁地址改變了不在本來的地方了新地地方是

    http://nimh.org/dl/

    其次推薦所有使用 http://nimh.org/ 發布的 qmail-smtpd.c  的朋友
    換成另外一個補丁

    http://www.cuni.cz/~vhor/qmail/smtpauth-en.html

    這個補丁是在 http://nimh.org/ 基礎上改進來的, 他解決了樓主說的問題
    增加了系統認證的日志應該是比較完善的!

     gadfly 回復于:2003-05-05 20:12:23
    [quote:a5ea51c1db="microcao"]
    http://www.cuni.cz/~vhor/qmail/smtpauth-en.html 

    這個補丁是在 http://nimh.org/ 基礎上改進來的, 他解決了樓主說的問題 
    增加了系統認證的日志應該是比較完善的!
    [/quote:a5ea51c1db]
    呵呵,看了你寫的鏈接上的說明以及代碼,我都沒看到檢查mail from和auth login name的一致性。另外syslog也就兩個地方用到了,不覺的它的更完善。而且是直接寫日志,而不是通過環境變量來判斷是否寫日志。

    所以結論是那個鏈接上的patch沒有解決本文涉及的問題.

     IPphone 回復于:2003-05-12 16:04:00
    哈,原來這有這么多高手在的呢??求教一個問題:我用的是http://members.elysium.pl/brush/qmail-smtpd-auth/ 
    上的補丁,完成后可以認證發郵件,可問題是我在OUTLOOK上去掉認證時一樣還是可以發送郵件。我曾經懷疑那個relayclient的問題,就是它還是在我每次收郵件時會記錄我的客戶端IP讓它可以忘外發郵件;于是我去掉roaming-users重新編譯vpopmail,但是那樣就不能給外面發郵件了。各位大大能不能告訴我哪里出問題了??


    gadfly,可不可以給我一份你的補丁程序??地址是:xzj35@msn.com

     gadfly 回復于:2003-05-12 16:33:15
    你說的這個問題,不少的網友都遇到過。iceblood的
    包中帶的qmail-smtpd-auth*.tar.gz就是這個patch。

    我沒有仔細研究,反正其它問題排除,我幫他們改用了qmail-smtpd.c,也就是http://nimh.org/ 上的,這個問題就不存在了。

    patch 給你發過去了。

     IPphone 回復于:2003-05-12 16:51:20
    [quote:529282cb58="gadfly"]你說的這個問題,不少的網友都遇到過。iceblood的
    包中帶的qmail-smtpd-auth*.tar.gz就是這個patch。

    我沒有仔細研究,反正其它問題排除,我幫他們改用了qmail-smtpd.c,也就是http://nimh.org/ 上的,這個問題?.........[/quote:529282cb58]


    謝了??!我再玩玩看。

     gadfly 回復于:2003-05-18 12:45:25
    由于網友xmubeta用這個patch遇到了問題,

    我仔細察看了一下代碼。

    確實如xmubeta 所說,代碼有點問題。

    問題出在,以前我給的patch,smtp_auth_validfrom的調用和定義的參數都不一致。

    編譯居然也不報錯,也是DJK風格的一個缺點:所有的內部函數都不預定義,即使預定義也不定義參數,所以編譯不報錯。

    好了,我把我的patch改過來了。

    改動的地方只有一個,原來是
      if (smtp_auth_validfrom(mailfrom)) {
    現在是
      if (smtp_auth_validfrom(mailfrom.s)) {

    謝謝xmubeta的指正。

    至于為什么原來的patch在linux不出錯,在solaris上出錯。
    我理解是linux上將結構傳入參數,轉化成char *的時候,實際上是將第一個結構成員轉化了,而這個正好是mailfrom.s。所以沒有問題。

    而solaris上就有所不同了,所以造成錯誤。

    iceblood, patch我給你重發了。

     gadfly 回復于:2003-06-02 18:51:47
    應一些朋友的要求,加了本地發信人發給本地,也需要auth的功能。

    另外而且還加了一些注釋,版本號。方法和前面一樣。

    我稍微測試了一下。各位測惻看吧。

    [code:1:e9fa54356d]
    --- qmail-smtpd.c       2003-06-02 18:34:51.000000000 -0400
    +++ qmail-smtpd.c.new   2003-06-02 18:42:31.000000000 -0400
    @@ -268,6 +268,7 @@
       int r;
       r = rcpthosts(addr.s,str_len(addr.s));
       if (r == -1) die_control();
    +  if (!localauthd()) return 0;
       return r;
     }

    @@ -304,7 +305,11 @@
       if (!stralloc_copys(&rcptto,"")) die_nomem();
       if (!stralloc_copys(&mailfrom,addr.s)) die_nomem();
       if (!stralloc_0(&mailfrom)) die_nomem();
    -  out("250 ok\r\n");
    +  if (smtp_auth_validfrom(mailfrom.s)) {
    +    out("250 ok\r\n");
    +  } else {
    +    out("must use username as From authenticated! (#5.7.1)\r\n");
    +  }
     }
     void smtp_rcpt(arg) char *arg; {
       if (!seenmail) { err_wantmail(); return; }
    @@ -527,6 +532,89 @@
     static stralloc smtpauth = {0};
     static char smtpauthlogin[65];
     static char smtpauthpass[65];
    +static int authd = 0;
    +
    +/* Author: gadfly@163.com. Version: 1.2.
    + * 1. Check consistent between auth user and 'From' user.
    + * 2. Read the LOG_AUTH enviroment variable to determine whether logging the auth info.
    + * LOG_AUTH=1, write the auth smtp info into syslog.
    + * 3. If mail from local, rcpt to local domain, user must auth before send data.
    + */
    +#include <syslog.h>
    +
    +#define SMTP_AUTH_SUCCESS     0
    +#define SMTP_AUTH_FAILED      1
    +
    +int localauthd() {
    +
    +  if (rcpthosts(mailfrom.s, strlen(mailfrom.s)) && !authd) return 0;
    +  return 1;
    +}
    +
    +int smtp_auth_validfrom(from) char * from;
    +{
    +  stralloc tmplogin={0},mydefaultdomain={0};
    +  char authusername[256];
    +  int k, userlen;
    +
    +  if (!authd) return 1;
    +
    +  authusername[255] = '\0';
    +  userlen = k = str_len(smtpauthlogin);
    +  k = byte_rchr(smtpauthlogin, k, '@');
    +
    +  if (k == userlen)
    +  {
    +    k = byte_rchr(smtpauthlogin, userlen, '%');
    +
    +    if (k == userlen)
    +    {
    +      if (control_readfile(&mydefaultdomain,"/var/qmail/control/me",1) != 1)
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_copys(&tmplogin, smtpauthlogin) )
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_cats(&tmplogin, "@") )
    +      {
    +        die_nomem();
    +      }
    +      if (!stralloc_cat(&tmplogin, &mydefaultdomain))
    +      {
    +        die_nomem();
    +      }
    +      strncpy(authusername, tmplogin.s, sizeof(authusername));
    +      }
    +      else
    +      {
    +        strcpy(authusername, smtpauthlogin);
    +      authusername[k]='@';
    +      }
    +  }
    +  else {
    +    strcpy(authusername, smtpauthlogin);
    +  }
    +  return !strcasecmp(from, authusername);
    +}
    +
    +
    +void auth_smtplog(authlogin, authresult)
    +char * authlogin;
    +int authresult;
    +{
    +  char * x = env_get("LOG_AUTH");
    +
    +  if (!x || (*x != '1')) return;
    +
    +  if (authresult == SMTP_AUTH_SUCCESS) {
    +    syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, success!", authlogin);
    +  } else {
    +    syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, failed!", authlogin);
    +  }
    +}
    +
     static int smtpauth_getl(void) {
       int i;
       if (!stralloc_copys(&smtpauth, "")) return -1;
    @@ -611,11 +699,14 @@
       wait_pid(&st, pid);
       if (wait_exitcode(st) == 0) {
         out("235 go ahead\r\n");
    +    authd = 1;
    +    auth_smtplog(smtpauthlogin, SMTP_AUTH_SUCCESS);
         flush();
         relayclient="";
         return;
       }
       sleep(2);
    +  auth_smtplog(smtpauthlogin, SMTP_AUTH_FAILED);
       out("535 auth failure\r\n"); flush(); _exit(0);
       /* done */
     }
    [/code:1:e9fa54356d]

     IPphone 回復于:2003-06-02 19:18:09
    這個怎么用呢,是不是作為一個 patch 來打?????


    另外我有個問題請問 gadfly ,我用呢前面的那個補丁打入最新的那個 qmail-smtpd.c (就是有三行輸出的那個)。用編譯后的 qmail-smtpd 來跑,認證沒有問題,但是客戶端的地址設置還是可以隨便改啊,可不可以幫我分析一下原因??


    我的 runsmtp 啟動腳本是:
    #/bin/sh
    LOG_AUTH=1
    export LOG_AUTH

    tcpserver -H -R -l 0 0 smtp /var/qmail/bin/qmail-smtpd-auth /bin/checkpassword /bin/true &

     IPphone 回復于:2003-06-02 20:07:14
    老兄啊,你那第十行的 “}” 又問題吧??我 patch 打不上啊。     



    另外加了你的那個日志記錄后會記錄一些什么內容???仍然是在 Linux 的 /var/log/maillog 中嗎??


    我的 runsmtp 腳本改為:     

    #/bin/sh 
    LOG_AUTH=1 
    export LOG_AUTH 

    tcpserver -H -R -l 0 -u qmailduid -g qmaildgid 0 smtp /var/qmail/bin/qmail-smtpd-auth /bin/checkpassword /bin/true | /var/qmail/bin/splogger &

     gadfly 回復于:2003-06-02 20:30:03
    ??不會呀,具體的錯誤信息。

    另外看我最前面的說明。

    特別要說明的是粘貼上來后,有些沒有空格了。得自己補上

     IPphone 回復于:2003-06-02 20:59:23
    看來確實是空格問題。后來用 gadfly 發過來的補丁就可以了。

    后來在 gadfly 的熱心幫助下解決了遇到的一些我在運行腳本和 qmail 配置文件上的問題;描述如下,供大家參考。

    runsmtpd-auth腳本:
    #!/bin/sh

    LOG_AUTH=1
    export LOG_AUTH

    tcpserver -H -R -v -p -l 0 -u 0 -g 0 0 smtp /var/qmail/bin/qmail-smtpd-auth-gadfly /bin/checkpassword /bin/true 2>&1 | /var/qmail/bin/splogger &

    /var/qmail/control/me 里面的內容改成了域的名稱(原來是服務器的完整域名)




    這里我的服務器是只需要給本域用戶發送email 的。(呵呵,是不是有點大材小用阿?)現在不會出現亂發郵件的問題了。

    謝謝 gadfly ?。。。?!

     jeff183 回復于:2003-08-08 21:59:46
    可以直接把文件給我嗎?
    謝謝!

    jeff183@sina.com

     erehw 回復于:2003-09-03 15:54:25
    gadfly :
    你好,這個修改過的c文件,能否提供一個地方下載?或者麻煩發一個到我的郵箱.erehw@163.com。
    謝謝。

     carelezz 回復于:2003-09-05 20:39:50
    gadfly:
         您好,我也想要您修正過的qmail-smtpd.c文件或者patch
         我的郵箱:carelezz74@hotmail.com
         再次感謝


    carelezz

     gadfly 回復于:2003-09-07 22:33:48
    呵呵,以上各位朋友,不好意思,由于帖子瀏覽的這個配置
    [quote:b400c9f086]
    默認方式只列出: 3月內的帖子
    注意:回復這個時間段以外的普通帖子不能被按默認方式瀏覽的朋友看到![/quote:b400c9f086]
    導致我沒有及時的看到各位的回復。

    不過還好,非常感謝erehw,提供空間下載patch。

    樓頂的帖子我更新了。包括最新的patch和下載地址。

     xiaoxiaoke 回復于:2004-02-06 22:13:55
    前提是你已經成功安裝了smtp-auth的補?。?!

    刪除/var/qmail/control/rcphosts中的本機域名
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~

     yjc2688 回復于:2004-12-20 22:30:49
    這樣會不會影響資源??

     毛天吹 回復于:2004-12-22 01:15:47
    謝謝各們樓主的無私的提供了。。我現在就趕快去更更新我的MAIL 了
     .
    樓上可以發給我一份不: yixiang.wang@126.com

     platinum 回復于:2005-02-12 00:16:35
    哪位能提供一下打好補丁的qmail-smtp.c文件呢?
    補丁太多,打亂了~~

     hongfengyue 回復于:2005-03-16 16:02:45
    是呀,誰有打好的補丁的c文件?
    mail:  hongfengwbw@yahoo.com.cn
    謝謝??!

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>