Update Active Storage for ImageProcessing 2.0
Active Storage が ImageProcessing 2.0 に対応し、ruby-vips と mini_magick の明示的依存を追加しました。これにより、画像変換の安全性と依存関係の可視化が向上します。
背景
ImageProcessing 2.0 のリリースに伴い、画像処理ライブラリの依存が明示的に必要となり、既存の image_processing (~> 1.2) 記述では対応できなくなりました。さらに、libvips 8.13 以降では未検証フォーマット(BPM、PSD、ICO など)をデフォルトでブロックするようになり、Active Storage が受け入れていた "variable" コンテンツタイプとの齟齬が生じました。
この齟齬を解消しつつ、開発者が必要なライブラリを明示的に追加できるようにすることが、本PRの主目的です。
技術的な変更
Gemfile と Gemfile.lock が更新され、image_processing のバージョン指定が ~> 2.0 に上げられ、ruby-vips (~> 2.3) と mini_magick (~> 5.0) が新たに追加されました。Gemfile の差分は次のとおりです。
@@ -118,7 +118,9 @@ group :storage do
gem "aws-sdk-s3", require: false
gem "google-cloud-storage", "~> 1.11", require: false
- gem "image_processing", "~> 1.2"
+ gem "image_processing", "~> 2.0"
+ gem "ruby-vips", "~> 2.3"
+ gem "mini_magick", "~> 5.0"
end
Engine の警告ロジックが拡張され、image_processing が見つからないケースに加えて、ruby-vips と mini_magick が欠如している場合にも個別の警告が出力されます。これにより、開発者は不足している依存を即座に把握できます。
@@
- when /image_processing/
- ActiveStorage.logger.warn <<~WARNING.squish
- Generating image variants require the image_processing gem.
- Please add `gem "image_processing", "~> 1.2"` to your Gemfile
- or set `config.active_storage.variant_processor = :disabled`.
- WARNING
+ when /image_processing/
+ ActiveStorage.logger.warn <<~WARNING.squish
+ Generating image variants require the image_processing gem.
+ Please add `gem "image_processing", "~> 2.0"` to your Gemfile
+ or set `config.active_storage.variant_processor = :disabled`.
+ WARNING
+ when /ruby-vips/
+ ActiveStorage.logger.warn <<~WARNING.squish
+ Generating image variants with libvips requires the ruby-vips gem.
+ Please add `gem "ruby-vips", "~> 2.3"` to your Gemfile.
+ WARNING
+ when /mini_magick/
+ ActiveStorage.logger.warn <<~WARNING.squish
+ Generating image variants with ImageMagick requires the mini_magick gem.
+ Please add `gem "mini_magick", "~> 5.0"` to your Gemfile.
+ WARNING
エラーメッセージを投げる transformers のコードも同様にバージョン番号を更新し、image_processing が不足している場合の例外文言が新バージョンに合わせて変更されました。
@@
- Please add `gem "image_processing", "~> 1.2"` to your Gemfile.
+ Please add `gem "image_processing", "~> 2.0"` to your Gemfile.
Vips transformer に Vips.block_untrusted(false) の呼び出しが追加され、環境変数 VIPS_BLOCK_UNTRUSTED が未設定の場合はデフォルトでブロック機能を無効化します。これにより、既存アプリが突如変換失敗するリスクを回避しつつ、必要に応じて安全側に切り替えられます。
@@
+Vips.block_untrusted(false) if Vips.respond_to?(:block_untrusted) && !ENV["VIPS_BLOCK_UNTRUSTED"]
ドキュメント (guides/source/active_storage_overview.md) も更新され、VIPS_BLOCK_UNTRUSTED 環境変数や Vips.block_untrusted(true) を使用したブロック設定の方法が記載されました。コメントの追記により、variant.rb でも gem の追加が必要である旨が明示されています。
設計判断
後方互換性 を最優先し、既存のデフォルトプロセッサ :vips はそのまま維持しつつ、依存が欠如した場合に警告を出すだけに留めました。コードパスの追加は最小限に抑えられ、従来のアプリは変更なしで動作します。
依存の明示化 を選択した理由は、Bundler が提供する依存管理の透明性を活かすためです。自動的にライブラリをロードする代わりに、Gemfile に明示的に記載させることで、バージョン衝突やプラットフォーム固有のビルド問題を事前に検知できます。
セキュリティ設定 に関しては、libvips の未検証フォーマットブロック機能をデフォルトで無効化し、環境変数や initializer で有効化できるようにした点が特徴です。これにより、既存アプリの互換性を損なわずに、必要な場合のみセキュリティを強化できる設計になっています。
まとめ
この PR は Active Storage を ImageProcessing 2.0 に合わせ、ruby-vips と mini_magick の明示的依存と安全なフォーマットブロック設定を導入した変更です。依存関係の可視化と警告メッセージの更新により、開発者は必要な gem を容易に把握でき、環境変数で libvips のセキュリティ挙動を柔軟に制御できます。