大江戸Ruby会議01に参加したことによる家事業を消化するのに一回休み。
tDiary は mod_ruby でも動くように $SAFE = 1 で動作するのだけど、この場合、LOAD_PATH に含まれる全てのパスが untaint な状態になってないと、外部ライブラリを読み込んだ時に SecurityError となってしまう。
んで、1.9 で rubygems に含まれるライブラリを require した時にそのライブラリの lib パスが taint な状態で LOAD_PATH に追加されてしまってさあ大変*1。
>> $:.each{|path| p path if path.tainted? };nil => nil >> require 'fcgi' => true >> $:.each{|path| p path if path.tainted? };nil "/Users/hsbt/.rvm/gems/ruby-1.9.2-p180/gems/ruby-fcgi-0.8.9/lib" => nil
この挙動が rubygems のものなのか ruby 本体のものなのかはわからないけど、こうなってしまうとプラガブルなアプリケーションで$SAFE=1で動かすのは格段に難しくなってしまう(とあるプラグインで gem を require していると知らず知らずのうちに $: が汚染されてしまう)。
今回はひとまず tDiary では公式に使用している gem は標準添付を除くと fcgi だけなので、fcgi に限定して untaint にするようにしてお茶濁し。この辺を使いたければ vendor 配下に配置して untaint したものを使うようにするしかないかなあ。どうするのが落としどころかなあ。
*1 1.8だとこの現象は発生しない