Impedir que anônimos baixem arquivos incompatíveis com CDN

Tenho um site onde os arquivos mp4 estão retornando 404.

Eles têm authorized_extensions definido como *. O upload do arquivo funciona perfeitamente. Eu o vejo no sistema de arquivos. As permissões estão corretas. file diz que é um arquivo MP4. O registro no rails parece OK:

[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>

mas acessá-lo retorna um 404. Houve alguns novos recursos e correções de bugs para mp4 recentemente, mas acabei de fazer um upgrade e ainda não está funcionando. Não sei mais onde procurar.

O problema é que a configuração do nginx está permitindo apenas certos tipos de arquivo. Movendo isto para bug.

Em discourse.conf está esta seção:

      # isso nos permite contornar o rails
      location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico|webp)$ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }

Eu adicionei mp3 e mp4 aos tipos de arquivo (depois de webp e os mp4 agora funcionam) ao discourse.conf dentro do container. Eu vejo “contornar o rails” em discourse_docker config/nginx.sample.conf. Eu não vejo como isso entra no template dentro do docker, então eu não sei como descobrir quando isso aconteceu.

Eles têm * para os tipos de arquivo permitidos. Eu não sei se há alguma mágica que permitiria que os mp3/mp4 funcionassem se eles fossem enumerados nas configurações do site, mas eu não vejo como isso poderia ser.

Mas o download deve funcionar se ele também não contornar o Rails.

Existe uma rota para isso

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 }

e o método show deve apenas enviar o arquivo. A configuração do nginx apenas o tornaria mais eficiente contornando o rails, mas isso não é um requisito.

Ah… as authorized_extensions são apenas para autorização de upload, não para downloads (ou seja, uma extensão não estar nessa lista não deve impedir que um arquivo seja baixado).

Não consigo reproduzir isso nos testes mais recentes que passaram, então talvez você queira movê-lo de volta para Support :wink:

EDIT: Pesquisei o site e parece que você tem outros problemas.

Agora, quando simplesmente faço wget do arquivo, funciona.

(EDIT 2: Isso pode ser porque você adicionou a extensão mp4 à configuração do nginx? Ainda assim, para mim, funciona sem problemas)

1 curtida

Obrigado! Vou dar uma olhada nisso primeiro. Acho que deveria ter tentado o modo de segurança!

Estou bastante confuso com esse service worker.

Não é um bug.

Ainda não entendi essa mensagem do Service Worker, mas desativei \t\nprevent_anons_from_downloading_files e agora está funcionando. Parece que a configuração “prevent_anons” é incompatível com CDN?

Mas os uploads não estão sendo recuperados do CDN nesse site? Ele apenas se refere a um local em www

1 curtida

Então, estou ainda mais confuso. Suponho que essa postagem não foi reprocessada após a definição do CDN.

Mas https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/7909 está sendo carregado do CDN, e mudar a configuração corrigiu isso.

Também vejo um monte de 404s no console, mas é um site padrão de dois contêineres com apenas estes plugins:

          - 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

E acho que você está olhando para https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/8017, que está puxando do CDN quando eu olho, mas logado e não logado.