- 论坛徽章:
- 0
|
前阵子论坛上因为这个问题引发了一场很激烈的争吵或者说是吵架,
我一时好奇, 就架设了一个环境折腾了一下, 发表本贴不代表
偶支持或反对前阵子争论中的任何一方的非技术观点.
1) 架设环境:
完全模拟问题提出者的环境:
mysql-standard-4.0.20-pc-linux-i686.tar.gz
autorespond-2.0.2
qmail-1.03
ezmlm-0.53
qmailadmin-1.2.2
ucspi-tcp-0.88
ezmlm-idx-0.40
vpopmail-5.4.4
相关configure如下:
a. vpopmail(严格参考源代码目录下的README.mysql)
./configure --enable-auth-module=mysql --disable-passwd --enable-clear-passwd --disable-many-domain --enable-auth-logging --enable-mysql-logging --enable-valias --disable-mysql-limits --enable-incdir=/usr/local/mysql/include --enable-libdir=/usr/local/mysql/lib --enable-passwd=n --enable-domainquotas=y --enable-tcprules-prog=/usr/local/bin/tcprules --enable-tcpserver-file=/home/vpopmail/etc/tcp.smtp --enable-vpopuser=vpopmail --enable-vpopgroup=vchkpw --enable-ip-alias-domains=n --enable-auth-module=mysql
b.
./configure --enable-cgibindir=/usr/local/httpd/cgi-bin --enable-htmldir=/usr/local/httpd/htdocs --enable-ezmlmdir=/var/qmail/bin/ezmlm --enable-autoresponder-bin=/var/qmail/bin/autorespond --enable-modify-quota=y --enable-help --enable-domain-autofill
2) 测试:
建立虚拟域qmailcn.org.
建立用户ylei和test, 限额分别为1M, 2M, 域qmailcn.org的限额为1M
1) ylei给test发送超过1M的附件, 日志显示: domain is over quota
2) 反弹回邮件给ylei, 日志显示: user is over quota(不再做domain quota check)
3) 再次bouce给postmaster(无限额), 日志显示:domain is over quota
发现问题:
限制(用户quota和域quota)功能OK, 设置/修改用户quota时未考虑当前用户的总quota超过域quota限制.
3) 解决:
a) 新版本vpopmail和qmailadmin
vpopmail NOT 5.4.6 5.5.0 NO
qmailadmin 1.2.2最新版本 NO
b) 搜索patch NO
b) 自己patch
diff vpopmail.h vpopmail.h.mod
diff vpopmail.c vpopmail.c.mod
对vpopmail.h的修改:
109c109
< int vadduser( char *, char *, char *, char *, int);
---
>; int vadduser( char *, char *, char *, char *, int, char*);
对vpopmail.c的修改:
437c437
< int apop )
---
>; int apop , char* userquota)
445a446,449
>; char* newquota = NULL;
>; struct vqpasswd* mypw = NULL;
>; int curquota = 0, totalquota = 0;
>; int first = 1, len = 0;
481a486,521
>; // 如果该域指定了domain disk quota, 才对增加用户时的用户quota做限制.
>; if (limits.diskquota != 0)
>; {
>; if (userquota != NULL)
>; { // 即使是postmaster也不能NOQUOTA
>; if (strcmp(userquota, "NOQUOTA" == 0)
>; {
>; printf("can't set NOQUOTA, domain disk quota: %dM\n", limits.diskquota);
>; return(VA_NULL_POINTER);
>; } else {
>; curquota = atoi(userquota);
>; }
>; }
>; // 获取域的当前所有用户的quota之和(以字节计数)
>; while ((mypw = vauth_getall(domain, first, 1)) != NULL)
>; {
>; first = 0;
>; len = strlen(mypw->;pw_shell);
>; newquota = (char *)malloc(len+1);
>; if (!newquota)
>; return(VA_NULL_POINTER);
>; memcpy(newquota, mypw->;pw_shell, len);
>; newquota[len-1] = '\0';
>; totalquota += atoi(newquota);
>; free(newquota);
>; }
>;
>; // 配置文件中domain disk quota以Mbytes计数
>; if ((totalquota + curquota)/1024/1024 >; limits.diskquota)
>; {
>; printf("over domain disk quota: %dM\n", limits.diskquota);
>; return(VA_NULL_POINTER);
>; }
>; }
>;
>;
1562a1603
>; printf("quota: %s; formattedquota: %s\n", quota, formattedquota);
注意:
对vpopmail和qmailadmin代码不怎么熟悉, 临时研究了一下, 主要只是想
能让vadduser添加用户时限制用户总quota不能超过domain disk quota.
所以很多其他调用vadduser()的地方没考虑. 所以要应用本patch, 得先
完全编译好vpopmail代码生成相应的二进制程序后, 再应用本patch, 才
能使得vadduser具有相应功能, 否则, 无法编译通过vpopmail.
跟该问题相关的地方:
qmailadmin 添加/修改用户
vpopmail 添加/修改用户
vpopmail 添加域(生成postmaster用户)
...其他...
不考虑修改domain disk quota时检查当前所有用户的quota总和.
如果domain disk quota设置, 该domain内所有用户都得限制quota, 包括postmaster.
再次申明:
vpopmail/qmailadmin玩得不多, 与quota相关的很多功能都不熟悉, 所以考虑quota
时很可能顾此失彼, 欢迎指正.
写这个东西也只是玩一玩, 了解一下vpopmail/qmailadmin, 共同探讨交流, 不是为了让
大家获取一个成熟可用的东西, 所以, 一切风险自负. |
|