sheepman 方式ツッコミ spam 対策を採用やめた

一度載っけたんだけどうまく動かなくてすぐに削除していたエントリ。原因は初期化ミスと断定してよさそうなので再公開。

【警告】以下を適用すると TrackBack を受け付けられなくなります。tDiary は TrackBack もツッコミの一種として扱っていて、なおかつこれを書いた時点(2005-02-03)で TrackBack とツッコミをフィルタプログラムから判別する方法が分からなかったためです。ハハハハさんの コメントキーフィルタ&プラグイン では回避できていますのでそちらをどうぞ。これ書いた私はもう使ってません。

羊堂本舗の コメントスパム 方式を tDiary 2 の filter 形式で実装することにした。とりあえず動いているみたいだけどなんだか分かっていないので tDiary ハカーの方々に直してもらいたいです。

プラグイン(misc/plugin/comment_key.rb)

require 'digest/md5'
alias :orig_comment_name_label :comment_name_label

def comment_name_label
  @conf.options['comment_key'] ||= ""
  v = Digest::MD5.hexdigest( @conf.options['comment_key'] + @date.strftime( '%Y%m%d' ))
  %Q!<input type="hidden" name="key" value="#{v}">\n! + orig_comment_name_label()
end

置くと設定画面でプラグインを有効にしようが無効にしようが問答無用で効きます。

フィルタ(tdiary/filter/sheepman.rb)

require 'digest/md5'
module TDiary
  module Filter
    class SheepmanFilter < Filter
      def comment_filter( diary, comment )
        @conf.options['comment_key'] ||= ''
        v = Digest::MD5.hexdigest( @conf.options['comment_key'] + @cgi.params['date'][0])
        v == @cgi.params['key'][0]
      end
    end
  end
end

で、tdiary.conf に

@options['comment_key'] = '秘密の文字列'

を追加。たぶん真面目に form から spam を送りつけてくるプログラムが現れたら無力化してしまうんだけど、かっこよさげという言葉を信じて採用。

以下、たったこれだけを作るのにめっちゃ苦労した感想。

  • 渡ってくる comment でどうにかなるものと思い込んで tdiary.rb も読まずに悪戦苦闘
  • もともと tDiary の中身が全然分かっていないんだけど、@options で値が取れると思い込んで悪戦苦闘(plugin では取れるけど filter では取れない)
  • tDiary に RDoc コメント埋め込みまくってくれるスーパーマンが現れたらいいなー
  • tDiary 関係のものをいじるときはまず expand -2 してからだ

tDiary はトランザクションの処理が入ってるみたいで、一度失敗するとその原因を取り除くだけでなくトランザクションをなかったことにする必要があるみたい。いやーハマったハマった。

つーかほんとは

spam なツッコミをスマートに削除したうえで makerss.rb にうまくそれが伝わるような方法がほしかったり。

More