CDNと互換性のないファイルのダウンロードを匿名ユーザーに防止する

MP4 ファイルへのアクセス時に 404 エラーが発生しています。

authorized_extensions* に設定されています。ファイルは正常にアップロードされ、ファイルシステム上にも存在し、パーミッションも正しいです。file コマンドは MP4 ファイルであることを示しています。Rails のレコードも問題ないように見えます。

[1] pry(main)> u=Upload.find(196082)
=> #<Upload:0x00005601a1b56348
 id: 196082,
 user_id: 1,
 original_filename: "PXL_20220617_184736219.mp4",
 filesize: 9328093,
 width: nil,
 height: nil,
 url: "/uploads/default/original/3X/5/6/5679d94dfce852f780afa5fcb7f1a29d810cc8fc.mp4",
 created_at: Fri, 17 Jun 2022 18:53:41.130790000 UTC +00:00,
 updated_at: Fri, 17 Jun 2022 18:53:41.176664000 UTC +00:00,
 sha1: "5679d94dfce852f780afa5fcb7f1a29d810cc8fc",
 origin: nil,
 retain_hours: nil,
 extension: "mp4",
 thumbnail_width: nil,
 thumbnail_height: nil,
 etag: nil,
 secure: false,
 access_control_post_id: nil,
 original_sha1: nil,
 verification_status: 1,
 animated: nil,
 security_last_changed_at: nil,
 security_last_changed_reason: nil>

しかし、アクセスすると 404 が返されます。最近 MP4 に関するいくつかの新機能とバグ修正がありましたが、アップグレードを実行しても問題は解決しません。他にどこを確認すればよいか分かりません。

問題は、nginx の設定で特定のファイルタイプのみが許可されていることです。これをバグに移動します。

discourse.conf にはこのスタンザがあります。

      # this allows us to bypass rails
      location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico|webp)$ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }

ファイルタイプに mp3mp4 を追加しました(webp と mp4 は現在機能しています)。これはコンテナ内の discourse.conf に追加しました。discourse_dockerconfig/nginx.sample.conf に「bypass rails」と表示されています。それが Docker 内のテンプレートにどのように入るのかわかりません。そのため、これがいつ発生したのかを特定する方法がわかりません。

許可されているファイルタイプには * があります。サイト設定で列挙されていれば mp3/mp4 が機能するようになる何らかのマジックがあるのかどうかはわかりませんが、それがどのように機能するのかはわかりません。

しかし、Railsをバイパスしないのであれば、ダウンロードは機能するはずです。

それ用のルートがあります。

get "uploads/:site/original/:tree:sha(.:extension)" => "uploads#show", constraints: { site: /\w+/, tree: /([a-z0-9]+\/)+/i, sha: /\h{40}/, extension: /[a-z0-9\._]+/i }

そして、showメソッドはファイルを送信するだけです。nginxの設定は、Railsをバイパスすることでより効率的になるだけですが、これは必須ではありません。

ああ.. authorized_extensionsはアップロードの承認のためだけで、ダウンロードのためではありません(つまり、そのリストにない拡張子でもファイルのダウンロードを妨げるべきではありません)。

最新のテスト通過済みで再現できないため、Support に戻した方が良いかもしれません :wink:

編集:サイトをグーグルで検索したところ、他の問題があるようです。

今、ファイルをwgetで取得すると、うまくいきます。

(編集2:これは、mp4拡張子をnginxの設定に追加したためかもしれません?それでも、私にとってはそのまま機能します)

「いいね!」 1

ありがとうございます。まずそれに目を通します。セーフモードを試すべきでしたね!

あのサービスワーカーにはかなり困惑しています。

バグではありません。

Service Worker のメッセージはまだ理解できませんが、prevent_anons_from_downloading_files をオフにしたところ、動作するようになりました。「prevent_anons」設定は CDN と互換性がないのでしょうか?

しかし、そのサイトではCDNからアップロードが取得されていませんか?単にwww上の場所を参照しているだけです。

「いいね!」 1

それなら、さらに混乱します。CDNが定義された後に、その投稿はリベイクされなかったのでしょう。

しかし、https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/7909 はCDNからロードされており、設定を変更したら修正されました。

コンソールで多くの404も確認できますが、これは標準的な2コンテナサイトで、以下のプラグインしかありません。

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-akismet.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-cakeday.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-checklist.git
          - git clone https://github.com/discourse/discourse-canned-replies.git
          - git clone https://github.com/discourse/discourse-chat

そして、あなたが確認しているのは https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/8017 だと思いますが、これは私が確認した限りでは、ログイン時もログアウト時もCDNからロードされています。