免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gadfly
打印 上一主题 下一主题

[Mail] 修正Qmail auth smtp中电子邮件地址任意的patch [复制链接]

论坛徽章:
0
21 [报告]
发表于 2003-05-04 20:45 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

我来补充一下

首先

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/ 基础上改进来的, 他解决了楼主说的问题
增加了系统认证的日志应该是比较完善的!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
22 [报告]
发表于 2003-05-05 20:12 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

原帖由 "microcao" 发表:

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

这个补丁是在 http://nimh.org/ 基础上改进来的, 他解决了楼主说的问题
增加了系统认证的日志应该是比较完善的!

呵呵,看了你写的链接上的说明以及代码,我都没看到检查mail from和auth login name的一致性。另外syslog也就两个地方用到了,不觉的它的更完善。而且是直接写日志,而不是通过环境变量来判断是否写日志。

所以结论是那个链接上的patch没有解决本文涉及的问题.

论坛徽章:
0
23 [报告]
发表于 2003-05-12 16:04 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

哈,原来这有这么多高手在的呢??求教一个问题:我用的是http://members.elysium.pl/brush/qmail-smtpd-auth/
上的补丁,完成后可以认证发邮件,可问题是我在OUTLOOK上去掉认证时一样还是可以发送邮件。我曾经怀疑那个relayclient的问题,就是它还是在我每次收邮件时会记录我的客户端IP让它可以忘外发邮件;于是我去掉roaming-users重新编译vpopmail,但是那样就不能给外面发邮件了。各位大大能不能告诉我哪里出问题了??


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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
24 [报告]
发表于 2003-05-12 16:33 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

你说的这个问题,不少的网友都遇到过。iceblood的
包中带的qmail-smtpd-auth*.tar.gz就是这个patch。

我没有仔细研究,反正其它问题排除,我帮他们改用了qmail-smtpd.c,也就是http://nimh.org/ 上的,这个问题就不存在了。

patch 给你发过去了。

论坛徽章:
0
25 [报告]
发表于 2003-05-12 16:51 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

原帖由 "gadfly" 发表:
你说的这个问题,不少的网友都遇到过。iceblood的
包中带的qmail-smtpd-auth*.tar.gz就是这个patch。

我没有仔细研究,反正其它问题排除,我帮他们改用了qmail-smtpd.c,也就是http://nimh.org/ 上的,这个问题?.........



谢了!!我再玩玩看。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
26 [报告]
发表于 2003-05-18 12:45 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

由于网友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我给你重发了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
27 [报告]
发表于 2003-06-02 18:51 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

应一些朋友的要求,加了本地发信人发给本地,也需要auth的功能。

另外而且还加了一些注释,版本号。方法和前面一样。

我稍微测试了一下。各位测恻看吧。


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

  10. @@ -304,7 +305,11 @@
  11.    if (!stralloc_copys(&rcptto,"")) die_nomem();
  12.    if (!stralloc_copys(&mailfrom,addr.s)) die_nomem();
  13.    if (!stralloc_0(&mailfrom)) die_nomem();
  14. -  out("250 ok\r\n");
  15. +  if (smtp_auth_validfrom(mailfrom.s)) {
  16. +    out("250 ok\r\n");
  17. +  } else {
  18. +    out("must use username as From authenticated! (#5.7.1)\r\n");
  19. +  }
  20. }
  21. void smtp_rcpt(arg) char *arg; {
  22.    if (!seenmail) { err_wantmail(); return; }
  23. @@ -527,6 +532,89 @@
  24. static stralloc smtpauth = {0};
  25. static char smtpauthlogin[65];
  26. static char smtpauthpass[65];
  27. +static int authd = 0;
  28. +
  29. +/* Author: gadfly@163.com. Version: 1.2.
  30. + * 1. Check consistent between auth user and 'From' user.
  31. + * 2. Read the LOG_AUTH enviroment variable to determine whether logging the auth info.
  32. + * LOG_AUTH=1, write the auth smtp info into syslog.
  33. + * 3. If mail from local, rcpt to local domain, user must auth before send data.
  34. + */
  35. +#include <syslog.h>;
  36. +
  37. +#define SMTP_AUTH_SUCCESS     0
  38. +#define SMTP_AUTH_FAILED      1
  39. +
  40. +int localauthd() {
  41. +
  42. +  if (rcpthosts(mailfrom.s, strlen(mailfrom.s)) && !authd) return 0;
  43. +  return 1;
  44. +}
  45. +
  46. +int smtp_auth_validfrom(from) char * from;
  47. +{
  48. +  stralloc tmplogin={0},mydefaultdomain={0};
  49. +  char authusername[256];
  50. +  int k, userlen;
  51. +
  52. +  if (!authd) return 1;
  53. +
  54. +  authusername[255] = '\0';
  55. +  userlen = k = str_len(smtpauthlogin);
  56. +  k = byte_rchr(smtpauthlogin, k, '@');
  57. +
  58. +  if (k == userlen)
  59. +  {
  60. +    k = byte_rchr(smtpauthlogin, userlen, '%');
  61. +
  62. +    if (k == userlen)
  63. +    {
  64. +      if (control_readfile(&mydefaultdomain,"/var/qmail/control/me",1) != 1)
  65. +      {
  66. +        die_nomem();
  67. +      }
  68. +      if (!stralloc_copys(&tmplogin, smtpauthlogin) )
  69. +      {
  70. +        die_nomem();
  71. +      }
  72. +      if (!stralloc_cats(&tmplogin, "@") )
  73. +      {
  74. +        die_nomem();
  75. +      }
  76. +      if (!stralloc_cat(&tmplogin, &mydefaultdomain))
  77. +      {
  78. +        die_nomem();
  79. +      }
  80. +      strncpy(authusername, tmplogin.s, sizeof(authusername));
  81. +      }
  82. +      else
  83. +      {
  84. +        strcpy(authusername, smtpauthlogin);
  85. +      authusername[k]='@';
  86. +      }
  87. +  }
  88. +  else {
  89. +    strcpy(authusername, smtpauthlogin);
  90. +  }
  91. +  return !strcasecmp(from, authusername);
  92. +}
  93. +
  94. +
  95. +void auth_smtplog(authlogin, authresult)
  96. +char * authlogin;
  97. +int authresult;
  98. +{
  99. +  char * x = env_get("LOG_AUTH");
  100. +
  101. +  if (!x || (*x != '1')) return;
  102. +
  103. +  if (authresult == SMTP_AUTH_SUCCESS) {
  104. +    syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, success!", authlogin);
  105. +  } else {
  106. +    syslog(LOG_MAIL | LOG_INFO, "smtp auth: user name is %s, failed!", authlogin);
  107. +  }
  108. +}
  109. +
  110. static int smtpauth_getl(void) {
  111.    int i;
  112.    if (!stralloc_copys(&smtpauth, "")) return -1;
  113. @@ -611,11 +699,14 @@
  114.    wait_pid(&st, pid);
  115.    if (wait_exitcode(st) == 0) {
  116.      out("235 go ahead\r\n");
  117. +    authd = 1;
  118. +    auth_smtplog(smtpauthlogin, SMTP_AUTH_SUCCESS);
  119.      flush();
  120.      relayclient="";
  121.      return;
  122.    }
  123.    sleep(2);
  124. +  auth_smtplog(smtpauthlogin, SMTP_AUTH_FAILED);
  125.    out("535 auth failure\r\n"); flush(); _exit(0);
  126.    /* done */
  127. }
复制代码

论坛徽章:
0
28 [报告]
发表于 2003-06-02 19:18 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

这个怎么用呢,是不是作为一个 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 &

论坛徽章:
0
29 [报告]
发表于 2003-06-02 20:07 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

老兄啊,你那第十行的 “}” 又问题吧??我 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 &

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
30 [报告]
发表于 2003-06-02 20:30 |只看该作者

修正Qmail auth smtp中电子邮件地址任意的patch

??不会呀,具体的错误信息。

另外看我最前面的说明。

特别要说明的是粘贴上来后,有些没有空格了。得自己补上
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP