ブログ

Ruby on Rails界隈を震撼させた「mimemagic問題」とその解決方法

Ruby on Railsが依存していた「mimemagic」というGemがあります。2021年3月、ライセンス規約の変更により、Ruby on Railsからmimemagicのバージョン0.3.5以下のものが削除されてしまうというハプニングが発生しました。弊社でも古のプロジェクトを開発環境にgit cloneし、起動しようとしたときに地雷が爆発しました。

mimemagic問題とは

mimemagicはMIMEタイプを識別するライブラリです。Gemで公開されていることから推測できる通り、MITライセンス(無償公開)です。しかし、mimemagicにGPLライセンス(公開に制限のある)のファイルが意図せず組み込まれていたことが発覚しました。

MITライセンスとGPLライセンスがかち合った場合、公開に制限が掛けられることのほうが優先されます。公開が規約違反であることが発覚したmimemagicは全削除されてしまったのです。その後、MITライセンスとして公開できるように修正された新バージョンがリリースされ、この事件は2021年になんとか収束しました。

mimemagicは、有名かつ各所で使われており「mimemagic問題」で検索するといくらでも検索結果がヒットします。それほど、界隈に激震の走った事件でした。本来であれば「Gemを無根拠に信じて使用していると、痛い目を見ることがあるから気をつけようね」で話は終わります。しかしそうは問屋が卸してはもらえませんでした。個人的な恨み節も込めて本記事を残しておこうと思います。

不具合の横展開、きちんと推進しようね

このmimemagic問題、弊社もあおりを受けました。古いAsanaタスク(弊社内で採用されている作業管理サービス)の中に問題発生の起票と対応結果が残っていました。古いmimemagicをインストールしようとするとエラーが発生することは明らかです。しかし、Gemfileの修正を横展開しよう! というタスクだけが残されていて、横展開はされていませんでした。社長に泣きつけば「あー、mimemagic問題ねー」という反応が返ってくるようなわかりやすいトラブルのため、つど属人的に解決できてしまっており、根本解決がされないままになっていました。

mimemagic問題の解決手順

mimemagic問題のいちばんの解決方法はRuby on Railsのバージョンアップです。問題の発覚以降にリリースされたバージョン5.2.5、バージョン6.0.3.6、バージョン6.1.3.1ではmimemagicの利用は取りやめられ、別のライブラリ(Apache Tika)に置き換えられました。

しかし現実問題として、かならずしもRuby on Railsのバージョンアップができるとは限りません。今回は古いプロジェクトの動作確認のために開発環境を再構築しようとしていたので、当時のバージョンのRuby on Railsで起動させる必要がありました。

Ruby on Railsのバージョンアップができない場合、mimemagicをバージョンアップすることで対応することができます。ただし、この場合はライセンスの問題が再燃するため、もしお手持ちのプログラムがMITライセンスを維持しなければならない場合はご注意ください。

mimemagicのバージョンアップで対応する場合

  1. Gemfile に下記の一文を追加し、明示的にmimemagic をインストールする
    • gem ‘mimemagic’, ‘< 0.4.3’
  2. 以下のコマンドによりmimemagic のバージョンを更新する
    • bundle update mimemagic
  3. Gemfile.lock が更新されるため、Gemfile 共々コミットし、無影響確認を実施する

弊社の開発環境ではたまたま必要がありませんでしたが、mimemagicの最新バージョンを動作させるためには、環境のOSによってshared-mime-infoというライブラリのインストールが必要です。shared-mime-infoライブラリはGPLライセンスになりますので、お気をつけください。

shared-mime-infoというライブラリのインストール手順は以下の記事が詳しいです。

『mimemagicの最新動向 >都合によりRailsをアップデートできない・したくない場合』

https://hackmd.io/@mametter/mimemagic-info-ja#%E9%83%BD%E5%90%88%E3%81%AB%E3%82%88%E3%82%8ARails%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%83%BB%E3%81%97%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88

mimemagicって結局なにをしてくれるGemなの?

mimemagicはMIMEタイプを識別するライブラリです。MIMEとは「Multipurpose Internet Mail Extensions」の略です。日本語に訳すと「メディア種別」になります。乱暴な理解としては、ファイル拡張子の親戚のようなものと思ってもらえれば、当たらずも遠からずかと。次のサイトにもう少し詳しいところが書かれているので、興味があればご覧ください。

『MIME タイプ』
https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types

小難しいことはさておき、mimemagicはファイルだったりバイト列だったりといった要素の識別ができるライブラリです。

前述のRuby on Railsのバージョン以外でも、mimemagicが使えなくなったことによるトラブルがありました。たとえば、ファイルをアップロードする場面です。

VALUE KITにはマスタ画像をアップロードする管理画面があります。しかし画像ではないファイル、たとえば.docxや.txtといった文章ファイルをアップロードされても困るため、画像ファイル以外は弾かれるしくみになっています。このファイルのアップロード機能は、CarrierWaveというGemが担っていて、CarrierWaveではファイルの内容判定にmimemagicの力を借りていました。

このCarrierWave君にも過去に苦しめられたことがあるため、次回はその失敗談をご紹介できたらなと思いつつ今回はこの辺で。

【参考文献】

おすすめ記事