RailsのGPL混入問題についてまとめ（mimemagic）

- <font color="red">**！！New！！**</font>[Rails 5.2.5, 6.0.3.6, 6.1.3.1はmimemagicに依存しなくなった（3/27追記）](#rails-525-6036-6131はmimemagicに依存しなくなった327追記)
- [mimemagicがMITに戻った（3/26追記）](#mimemagicがmitに戻った326追記)

## 概要
RailsのGPL混入問題についてまとめました。間違いがあればご指摘ください。（2021/3/25現在）
https://github.com/rails/rails/issues/41750

ここには３つの問題がある。

- **Railsが依存しているmimemagicのライセンスがMITからGPL2.0になった**
    - もともとGPLのものが混入していたのにMITになってしまっていた
- **これにより、Railsのbuildができなくなった**
    - Railsが依存しているmimemagic0.3.5が削除されたことが原因
- **Railsの依存モジュールにGPLのものが混入することとなった**
    - mimemagicを0.3.6以降にすればbuildはできるが、GPL問題は解決しない

## mimemagicのライセンスがMITからGPL2.0になった
mimemagicはMITからGPLに変わった。
[mimemagicのissues #97](https://github.com/minad/mimemagic/issues/97)によると、

shared-mime-infoはGPL。
mimemagicの以下のファイルがshared-mime-info依存している。
https://github.com/minad/mimemagic/blob/master/script/freedesktop.org.xml

これまでmimemagicはMITだったが、shared-mime-infoがGPLなので、mimemagicもGPLにすべきであり修正された。
変更内容：https://github.com/minad/mimemagic/commit/c0f7b6b21a192629839db87612794d08f9ff7e88

## Railsがbuildできない問題
前述のGPL問題修正により、Railsのbuildができない問題が起きた。
https://github.com/minad/mimemagic/issues/98

`bundle install`すると以下のエラーが発生する。

```
Installing dependencies using bundler 2.2.1
Running: bundle install --jobs=4 --retry=4

Your bundle is locked to mimemagic (0.3.5), but that version could not be found
in any of the sources listed in your Gemfile. If you haven't changed sources,
that means the author of mimemagic (0.3.5) has removed it. You'll need to update
your bundle to a version other than mimemagic (0.3.5) that hasn't been removed
in order to install.
```

Railsが依存しているmiemagicは0.3.5。これが`but that version could not be found`と言われる。削除されたみたい。

## Railsの依存モジュールにGPL混入
0.3.6以上にすればbuildはできるようになるみたいだが、0.3.6も0.4.0もGPLなのでライセンス問題は解決されない。


## GPLのソフトウェアをサーバサイドで使う場合の著作権表示について
[GPLのソフトウェアをサーバサイドで使う場合の著作権表示について](https://blog.zelkova.cc/2018/03/gpl-copyright-in-serverside.html)
> GPLのライブラリをサーバサイドで使う場合、ソースコード公開義務はないという解釈が一般的です。

> 「サーバサイドで使えばプログラムの頒布じゃないからソースコード公開しなくていいじゃん！」という解釈のもと、ウェブサービスではGPLものが結構使われています。

> どういうことかというと、ウェブサービスはプログラムの出力結果の頒布であって、プログラムの頒布ではないのでソースコードの公開義務はないという解釈です。
GCCでコンパイルされたバイナリを頒布してもソース公開義務がないのと同じ解釈です。

という解釈があるようだが、どうなんだろうか。


## リンク
- https://github.com/rails/rails/issues/41750

## mimemagicがMITに戻った（3/26追記）
mimemagicの修正PR：[Externalise source data #3](https://github.com/jellybob/mimemagic/pull/3)

> this PR removes it from the gem, and instead requires the user to provide one themselves.
> Otherwise an environment variable will need to be set to point it in the right direction.

mimemagicに含まれるshared-mime-infoがGPL2.0だっため、これを取り除いたことによって、MITになった。
しかし、それを自分でインストールしないといけなくなった。

https://github.com/jellybob/mimemagic/pull/3/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5R27
> Place the file `freedesktop.org.xml` in an appropriate location, and then set the environment variable `FREEDESKTOP_MIME_TYPES_PATH` to that path.


## How to fix
### shared-mime-infoのインストール
shared-mime-info => MIME typesのデータベース。これがGPL2.0。
http://ftp.riken.jp/Linux/cern/centos/7/updates/x86_64/repoview/shared-mime-info.html

#### Linux
Linuxならshared-mime-infoはインストールされてるみたい。CentOS7ではインストールされていた。

```
$ yum list installed | grep shared-mime-info
shared-mime-info.x86_64         1.8-5.el7                 @centos-base
```

#### macOS
shared-mime-infoをインストールする。

```
$ brew install shared-mime-info
$ bundle update mimemagic
```

もしmimemagicのupgradeだけで動かない人は、nokogiriとmarcelもupgradeするといいかも。
参照：https://github.com/rails/rails/issues/41757#issuecomment-806938727

```
$ bundle update nokogiri marcel mimemagic
```

### mimemagicを0.3.9にupgrade

```
$ bundle update mimemagic
```

```diff
$ git diff
diff --git a/Gemfile.lock b/Gemfile.lock
index cef0127..4a0ef93 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -133,7 +133,9 @@ GEM
     marcel (0.3.3)
       mimemagic (~> 0.3.2)
     method_source (1.0.0)
-    mimemagic (0.3.5)
+    mimemagic (0.3.9)
+      nokogiri (~> 1)
+      rake
     mini_mime (1.0.2)
     mini_portile2 (2.4.0)
     minitest (5.14.3)
```

### shared-mime-infoのPATHを環境変数にセット
PATHは以下のあたりにある。参考：[possible_paths](https://github.com/jellybob/mimemagic/pull/3/files#diff-306f61b369750a26a66f2e575187d1b7f0e7b907e7dd8cdc956b0d337c065d33R5)


- /usr/local/share/mime/packages/freedesktop.org.xml
- /opt/homebrew/share/mime/packages/freedesktop.org.xml
- /usr/share/mime/packages/freedesktop.org.xml

CentOS7では以下にあった。

```
$ ls -l /usr/share/mime/packages/freedesktop.org.xml
-rw-r--r-- 1 root root 2196823 Apr  1  2020 /usr/share/mime/packages/freedesktop.org.xml
```

Rails起動時にこれを環境変数 `FREEDESKTOP_MIME_TYPES_PATH` としてセットする。

```
$ FREEDESKTOP_MIME_TYPES_PATH=/usr/share/mime/packages/freedesktop.org.xml \
    bundle exec pumactl start
```

一応これで起動したし、問題はなさそうに見える。

これでよいのかrailsのIssueで聞いてみてる。(3/26 12:00現在)
https://github.com/rails/rails/issues/41757#issuecomment-807898051

## Rails 5.2.5, 6.0.3.6, 6.1.3.1はmimemagicに依存しなくなった（3/27追記）
Rails 5.2.5, 6.0.3.6 and 6.1.3.1がリリースされ、これらはmimemagicに依存しなくなったのでアップグレードすればOK。

- [Rails 5.2.5, 6.0.3.6 and 6.1.3.1 have been released](https://weblog.rubyonrails.org/2021/3/26/marcel-upgrade-releases/)
- [mimemagic is not a dependency of Rails anymore since the last releases. Please upgrade.](https://github.com/rails/rails/issues/41757#issuecomment-808445077)

これらのRailsのversionは、[Marcel 1.0.0](https://github.com/rails/marcel)に依存するようになった。
1.0.0以前は間接的にGPLに依存していたが、Apache License 2.0である[Apache Tika](https://tika.apache.org/)のMIME type dataを使うように改造されたので、GPL依存でなくなった。