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 ブランチにマージしておしまい。