at posts/single.html

Proc を使って AppEngine の JRuby でセーフレベルを変更する

tDiary を Google App Engine で動かしてみたの続き。 前回までのまとめ。

  • tDiary のセキュアモードはプラグインを $SAFE = 4 で実行する (参考: [tDiary-devel] Re: Pluginをどこまで信用すべきなのか)
  • セーフレベルの変更には Thread を使っている
  • AppEngine はスレッドに対応していないので、とりあえずセーフレベルを変更しないようにして逃げた

なかださんから、SAFEレベルの変更はprocでもできませんかというツッコミをいただいたので、。 Thread の代わりに Proc を使うように修正した。

既存コードのテストを書く

といっても、いきなりコードを修正するのではなく、まずは Thread を使った版のテストコードを書く。

まずは tdiary.rb から Safe モジュールのコードを切り出して safe.rb として保存する。

つぎに、 safe.rb に対するテストコード safe_spec.rb を書く。 セーフレベル1だと環境変数を変更できるが、セーフレベル4だと SecurityError 例外が発生することを確認している。

spec コマンドでテストを実行し、正常に終了することを確認する。

$ spec safe_spec.rb
..

Finished in 0.003902 seconds

2 examples, 0 failures

コードを修正 (Thread から Procに)

Thread の代わりに Proc を使うように safe.rb を修正する。

修正したコードでもう一度 spec コマンドを実行する。

$ spec safe_spec.rb
..

Finished in 0.003902 seconds

2 examples, 0 failures

これで Thread でなく Proc でも同じように動くことが確認できた。

GitHub に反映

この修正コードを testable ブランチに反映し、 appengine ブランチにマージしておしまい。

関連する日記