なるようになるブログ

読書感想文かrailsについてかrubyについてか

rails commit log流し読み(2018/11/28)

2018/11/28分のコミットです。

CHANGELOGにのったコミットは以下の通りです。

activestorage/CHANGELOG.md


Merge pull request #34538 from bogdan/reuse-find-target

Active Recordの修正です。

CollectionAssociationSingularAssociationそれぞれで定義していたfind_targetメソッドを親クラスのAssociationに定義し、処理を共通化するよう修正しています。

が、修正内容に誤りがあり(同一でない処理を同一として扱っている)、直後にrevertされています。


Revert "Merge pull request #34538 from bogdan/reuse-find-target"

直前のfind_targetメソッドに関する修正をrevertしています。


Ensure that singular association should execute limited query

activerecord/test/cases/associations/belongs_to_associations_test.rbactiverecord/test/cases/associations/has_one_associations_test.rbの修正です。

singular associationを呼び出す際に、limited queryが実行される事を確認するテストを追加しています。

先のfind_targetメソッドのリファクタに関するリグレッションテストです。


More exercise singular association query

ACtive Recordのテストの修正です。

先のテスト追加のフォローアップとして、has_one throughを使用している場合にもlimited queryが実行される事を確認するテストを追加、繰り返し使用する値を変数に格納してキャシュするよう修正、等を行っています。


Do not deserialize GlobalID objects that were not generated by Active Job

activejob/lib/active_job/arguments.rbの修正です。

jobのargumentsをdeserializeする際に、argumentsがStringだった場合に無条件でGlobalIDのlocate処理を実行していたのを、実行しないよう修正しています。

ここでGlobalIDのlocate処理を実行すると、jobの引数にユーザが入力した値をそのまま使用している、かつ、その入力にGlobal IDが指定された場合に、本来アクセス出来ない筈のユーザのデータにアクセス出来てしまうという問題がある為。

例。

class MyJob < ApplicationJob
  queue_as :default

  def perform(*args)
    # ...
  end
end
user_input = "gid://master/User/1"
MyJob.perform_later(user_input)

上記のような処理が行われた場合に、performのargsusersテーブルのidが1のデータが渡されてしまっていました。本修正により、上記のような場合はString("gid://master/User/1")がそのまま渡されるようになっています。

参考:[CVE-2018-16476] Broken Access Control vulnerability in Active Job


Prevent content type and disposition bypass in storage service URLs

Active Storageの修正です。

Active Storageが生成するファイルダウンロードURLで、content-dispositionとcontent-typeを改変出来てしまう、というバグがあったのを修正しています。この問題は、serviceにGoogle Cloud StorageかDiskを使用している場合のみ発生します。

これにより、本来inlineで実行すべきではないファイルもinlineで実行出来てしまう、かつ、+ Cookie Bomb等のテクニックを組み合わせる事で、特定のstorage pathのsigned URLsを取得出来る(本来アクセス出来ないファイルにアクセス出来てしまう)という問題が発生していました。

合わせて、inlineで表示するファイルのtypeを制限する対応も入っており、特定のcontent type以外はそもそもinlineで表示出来ないようになっています。

参考:[CVE-2018-16477] Bypass vulnerability in Active Storage


Fix minor Active Storage docs typo [ci skip]

activestorage/app/models/active_storage/blob.rbのdocの修正です。

ActiveStorage::Blob.find_signedメソッドのdocのグラマーの修正を行っています。


Merge pull request #33835 from schneems/schneems/faster_cache_version

activerecord/lib/active_record/integration.rbの修正です。

ActiveRecord::Integration#cache_versionメソッドでcache keyを生成する際に、updated_atの値をTimeクラスに変換してから使用していたのを、Stringのupdated_atの値がそのまま使用出来るケースでは、Timeクラスに変換せず文字列のまま扱うよう修正しています。Timeクラスへの変換処理が重い為。

updated_atの値が、Stringである、default timezoneが:utcである、等幾つかの条件を満たした場合のみTimeクラスに変換しないようになっています。それ以外の場合は、既存のままの処理を行います。


Merge pull request #34546 from y-yagi/fix_ast_build

Active Storageのテストの修正です。

先のcontent-dispositionとcontent-typeに関する修正の影響で、Active Storageのテストが複数箇所で失敗するようになっていたのを修正しています。


Fix "warning: ambiguous first argument; put parentheses or a space even after `/' operator"

activestorage/test/service/gcs_service_test.rbの修正です。

"warning: ambiguous first argument; put parentheses or a space even after `/' operator"のwarningが出ている箇所があったのを修正しています。


Pass the test reporter by reference

activesupport/lib/active_support/testing/parallelization.rbの修正です。

parallel testで実行するテストをworker processに渡す際に、repoterについては明示的に参照を渡すよう修正しています。

reporterはMarshal.dump出来ない(Thread等々Marshal出来ないオブジェクトを使用している)ので、どちらにしても参照として渡されるのですが、そのまま渡してしまうとreporterを含むArrayそのものが参照として扱われてしまい、結果worker / server間で不要な遣り取りが発生してしまうんで、事前に明示的に参照として渡すようにしています。


Use Testing::Parallelization in Action Packs's test

actionpack/test/abstract_unit.rbの修正です。

Action Packのテスト実行時にTesting::Parallelizationを使用するよう修正しています。

元々独自のparallel testの仕組みを持っていたのですが、その内容がTesting::Parallelizationと同じ(fork + DRb)な為、Testing::Parallelizationを使用するようにしています。


Fix ArgumentError when uploading to amazon s3

activestorage/lib/active_storage/service/s3_service.rbの修正です。

先のcontent-dispositionとcontent-typeに関する修正内容に漏れりがあり、AWS S3にファイルアップロードするとArgumentErrorが発生してしまうバグがあったのを修正しています。