Hatena::ブログ(Diary)

あどけない話

2009-07-27

デーモン版 Receiver Policy Framework のリリース

デーモン版の Receiver Policy Framework (RPF)をリリースしました。

RPF の背景は、この辺りを読んで下さい。

RPF は、ENMA のポリシー記述言語として採用されることを目指していましたが、採用されませんでしたので、一からデーモンを書きました。

ほとんどすべて、Haskell で書いています。リンクしている C のライブラリーGnu adns だけです。(ENMA のライブラリーは使っていません。)

libmilter に相当する部分も Haskell で書いています。本当は libmilter のようにスレッドベースにしたかったのですが、GHC にはいくつか問題があるので、プロセスベースになりました。

汚れたインターネット環境で試していますが、ISP レベルの環境では試していません。メールの受信には影響を与えない、Logonly モードがあるので、試して頂けると嬉しいです。

Milter プロトコルについて教えて頂いた須藤さんと小林さんに深謝します。ネットワーク周りのコードをレビューして頂いた nwn さん、Haskell についてたくさん教えて頂いた shelarcy さんに感謝します。

2009-06-29

Mailman の備忘録

以下、Mailman を /usr/local/mailmanインストールしているという前提での話です。

ソースコードをいじったら

.py を .pyc に直すには、以下のようにします。

% sudo python -c 'from compileall import *; compile_dir("/usr/local/mailman/Mailman")'

MLアーカイブを作り直す

% cd /usr/local/mailman/archives/private/
% sudo rm -rf ML
% sudo /usr/local/mailman/bin/arch ML

ML.mbox は消してはいけません!

ML の通し番号を変更する

以下 100 に変更する例です。

% sudo /usr/local/mailman/bin/withlist ML
Loading list LIST-NAME (unlocked)
The variable `m' is the LIST-NAME MailList instance
>>> m.Lock()
>>> m.post_id
6.0
>>> m.post_id = 100
>>> m.Save()
>>> ^D
Unlocking (but not saving) list: LIST-NAME
Finalizing

listinfo に ML が一覧表示しなくなったら

メールサーバーを入れ替えて、/usr/local/mailman/archives/private/ML.mbox と /usr/local/mailman/lists/ML を新しいサーバに持って行くと、listinfo に ML が一覧表示されなくなります。そんなときは、以下のコマンドを使います。

% sudo /usr/local/mailman/bin/withlist -l -r fix_url ML

2009-04-30

RPF v0.3 のリリース

何人かの人と議論して、Receiver Policy Framework の仕様を変えました。というわけで、 RPF v0.3 をリリースします。

v0.3 では、Milter ありきの設計になっています。こんなことが書けるようになりました。

$ip_white_list = 10.0.0.1;
$ip_forwarding_list = 192.168.20.1, 192.168.30.1;
$spammer_domain = "spammer.example.jp", "spammer.example.net";
$spammer_domain2 = "spammer.example.com";
$spf_fail = 'softfail', 'hardfail';

// #ip
connect {
	accept: #ip == $ip_white_list;
	reject: #ip == 192.168.10.0/24, 2001:db8:100::/48;
	continue;
}

// #spf, #mail_from
mail_from {
	reject: #spf == 'pass' && #mail_from == $spammer_domain;
	accept: #spf == 'pass';
	accept: #spf == $spf_fail && #ip == $ip_forwarding_list;
	hold:   #spf == 'softfail';
	continue;
}

// #from, #pra, #sender_id, #dkim_from, #sig_dkim, #sig_domainkeys
header {
	reject: #sender_id == 'pass' && #mail_from == $spammer_domain2;
	accept: #sender_id == 'pass';
	reject: #mail_from == "dkim.example.jp" && #sig_dkim == No;
	continue;
}

// #dkim, #adsp
body {
	accept: #dkim == 'pass';
	reject: #dkim == 'fail' && #adsp == 'discard';
	reject: #dkim != 'pass' && #from == "dkim.example.jp";
	discard;
}