俺だけのために Ore! Tips!

checkpw コマンドを POP before SMTP 対応にする

2004年04月02日 作業

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);

前ページに戻る


Copyright (C) 2004 S.Maaasamasa.