注意: tcl 7.4 が必要です。7.5 では動作しないとの噂があります。
README.tcl_hook の日本語訳は kondou@uxd.fc.nec.co.jp によって行われまし
た。
---------------------------------------------------------------------------
Subject: TCL-based Filtering for INN 1.5
Date: Mon, 07 Feb 94 12:36:47 -0800
From: Bob Heiney <heiney@pa.dec.com>


過去数ヵ月何度か一つあるいは二つのサイトから Message-ID を変えて同じ記事
が何度もポストされることがありました。通常は、これはソフトの不具合が原因
です(例えば、mail <-> news のゲートウェイで、これには多数ありますが、正し
く動作しているものはほとんどありません)。しかしこの場合、この再ポストは意
図的なものでした。最近の例では、"Global Alert: Jesus Is Coming" というメッ
セージで、2200 以上のニュースグループにポストされてました(それぞれ
Message-ID が違います)。

インターネットが引続き爆発的な成長を遂げるにつれて、このようなことがもっ
と頻繁に起きるのではないかと私は思っています。私のサイト(decwrl)は通常、
このような問題を切り抜けるのに十分余るほど許容力がありますが、多くのサイ
トではそうでないでしょう。数ヵ月前の comp.sys.sgi.misc での、原因となっ
たサイトで修正されるまでに spew された 40MB の記事の重複の問題では、多く
のサイトのスプールを溢れさせました。多くのリソースを持つようなサイトでさ
えも、間違ってあるいは悪意のある重複された記事を配送する必要は無いはずで
す。

私はこのような状況から自分のサイトを守るための、非常に特化した、かつフレ
キシブルで高速な方式を必要としていました。

同じ記事を調べてみると、 Message-ID は違うけれども、他の記事と別物に見せ
るために使用した記事のヘッダを基準にしたいくつかのルールをニュース管理者
が見つけるのは比較的は容易でした(例えば、John.Doe@foo.com が 'foobar' と
いう Subject で comp.sys.sgi.misc にポストしている等)。私は、innd を変更
して、"このような記事を拒否する"ことがこの問題を解決するという結論に達し
ました。

また、後の作業で、(ヘッダでは無く、本文のチェックサムを使用して)過度の重
複した記事の発見と排除を自動的に行えるように設計段階において十分な柔軟性
も持たせたいとも思っていました。

私は、これらすべてを行うための非常に強力な言語を必要としていましたが、世
の中ではこのような特殊な言語をまだ必要としていなかったため、私の解決策と
して INN で TCL がサポートできるようにすることでした。私は、"ARTpost" を
変更して、記事を受け取るか拒否するかを行える TCL ルーチンを呼ぶようにし
ました。TCL のコードでは "Headers" と呼ばれる記事のすべてのヘッダを含む
記事に関連する配列にアクセスできます。TCL のコードからは 32 bit の記事の
本文のチェックサム処理も呼ぶこともできます(これは将来、重複した記事を自
動的に見つけるためのものです)。

以下に TCL フィルタの処理ルーチンがどのようなものかの例を示します。

proc filter_news {} {
  global o Headers
  set sum [checksum_article]
  puts $o "$Headers(Message-ID) $sum"
  set newsgroups [split $Headers(Newsgroups) ,]
  foreach i $newsgroups {
    if {$i=="alt.test" && [string match "*heiney@pa.dec.com*" $Headers(From)]} {
      return "dont like alt.test from heiney"
    }
  }
  return "accept"
}

上記 TCL のコードではいくつかのことを行っています。まず、32 bit の記事
チェックサムを計算し、ファイルにその結果と Message-ID を書いています。そ
して、私からの alt.test への記事は拒否します。

私が行った作業は完全に INN の構築と実行環境に導入されています。例えば、
フィルタをオフにするためには、次のように入力するだけです。

	ctlinnd filter n

フィルタを行う TCL のコードを reload するには、次のように入力するだけで
す。

	ctlinnd reload filter.tcl 'your comment here'

(フィルタでの処理によっては、reload の直前や直後実行される TCL ルーチン
も指定することもできます。) 詳細は ctlinnd の man ページを参照してくださ
い。

フィルタの機能は多くの目的、例えばあるときは(過度の重複記事の発見や統計情
報のような)穏やかにかつ有効に、またあるときは悪用に対して等に使用すること
ができます。ニュース管理者が行うフィルタについてどのように真剣に考えている
かきいてみたいところです。

/Bob


