qmail の POP3/SMTP over SSL 対応を行ったが、パスワードチェック用プログラムが、POP before SMTP 対応の checkpassword から、非対応の checkpw に変わったため、SSL 接続では /etc/tcp.smtp* ファイルが更新されず、外部からの利用ができなかった。(POP before SMTP が利用できなくなってしまった!!)
そのため、手動で checkpassword へのパッチ内容を checkpw に当ててコンパイルしてみたところ通った。
で、実際に接続して試してみたら、POP/SMTP over SSL 接続でもちゃんと /etc/tcp.smtp.filter.newer が更新されていた。
ということで、今後同じ案件があった場合の対応方法は以下のとおり。
=============================================
パッチを当てて、checkpw をリコンパイル。
www# pwd
/usr/local/src/checkpw-1.01
www# ls -la checkpw*
-rwxr-xr-x 1 root 100 9016 Mar 29 12:51 checkpw
-rw-r--r-- 1 500 100 2488 Jan 7 2002 checkpw.c
-rw-r--r-- 1 root 100 3740 Mar 29 12:51 checkpw.o
-rw-r--r-- 1 500 100 58 Jun 4 2001 checkpw=x
-rw-r--r-- 1 root 100 878 Apr 2 12:55 checkpw_opensmtp.20040402.patch
www# patch < checkpw_opensmtp.20040402.patch
Hmm... Looks like a new-style context diff to me...
The text leading up to this was:
--------------------------
|*** checkpw.c_org Fri Apr 2 11:39:55 2004
|--- checkpw.c Fri Apr 2 12:11:10 2004
--------------------------
Patching file checkpw.c using Plan A...
Hunk #1 succeeded at 10.
Hunk #2 succeeded at 99.
done
www# ls -la checkpw*
-rwxr-xr-x 1 root 100 9016 Mar 29 12:51 checkpw
-rw-r--r-- 1 root wheel 2841 Apr 2 12:56 checkpw.c
-rw-r--r-- 1 500 100 2488 Jan 7 2002 checkpw.c.orig
-rw-r--r-- 1 root 100 3740 Mar 29 12:51 checkpw.o
-rw-r--r-- 1 500 100 58 Jun 4 2001 checkpw=x
-rw-r--r-- 1 root 100 878 Apr 2 12:55 checkpw_opensmtp.20040402.patch
www# make
./compile checkpw.c
./load checkpw auto_maildir.o auto_password.o auto_patrn.o unix.a byte.a
これで、新しい checkpw が作られるので、任意のディレクトリにコピーしておく。
オリジナルの checkpw が置いてある場所に、checkpw_opensmtp のような名前で作っておくのがよいだろう。
www# cp -p /usr/local/src/checkpw-1.01/checkpw /bin/checkpw_opensmtp
www# ls -la /bin/checkpw*
-rwx------ 1 root wheel 9016 Mar 29 12:52 /bin/checkpw
-rwxr-xr-x 1 root 100 9336 Apr 2 12:57 /bin/checkpw_opensmtp
www# chmod 700 /bin/checkpw_opensmtp
tcpserver 経由での qmail-pop3d 起動スクリプトを直す。
(例:/usr/local/etc/rc.d/qmail-ssl.sh)
/usr/local/bin/tcpserver_ssl -Rs \
-n /var/qmail/cert.pem 0 995 /var/qmail/bin/qmail-popup mx.fureai-ichiba.com \
/bin/checkpw_opensmtp /var/qmail/bin/qmail-pop3d Maildir &
↑このように、パスワードチェックプログラムを checkpw_opensmtp にする。
で、tcpserver を起動しなおしてOK!
<おまけ>
checkpw_opensmtp.20040402.patch の中身。(TAB コードなどはスペースに変換されているので、実際に使用する時は、パッチファイルをダウンロードすること)
*** checkpw.c_org Fri Apr 2 11:39:55 2004
--- checkpw.c Fri Apr 2 12:11:10 2004
***************
*** 10,15 ****
--- 10,18 ----
#include "auto_password.h"
#include "auto_patrn.h"
+ #include <sys/types.h>
+ #include <sys/wait.h>
+
#include <pwd.h>
static struct passwd *pw;
***************
*** 96,101 ****
--- 99,118 ----
stored.s[str_chr(stored.s,'\n')] = 0;
if (!*stored.s || strcmp(password,stored.s)) die(1);
+
+ if (1) {
+ int child;
+ int wstat;
+ char *opensmtp = "/usr/local/bin/pop3-record";
+
+ switch(child = fork())
+ {
+ case -1: _exit(111); break;
+ case 0: execl(opensmtp, opensmtp, 0); _exit(111); break;
+ }
+ waitpid(child, &wstat, 0);
+ if (!WIFEXITED(wstat)) _exit(111);
+ }
if (prot_gid((int) pw->pw_gid) == -1) die(1);
if (prot_uid((int) pw->pw_uid) == -1) die(1);
|
|