Ok, así que encontré el lugar donde se genera el Markdown para los archivos adjuntos y, por lo que entiendo de la API de plugins, uno no puede (fácilmente) anularlo (incluso creo que no debería hacerlo).
Así que mi idea inicial de agregar un parámetro ?dl=1 a esas URL parece ser la forma incorrecta de hacerlo.
Con respecto a no forzar descargas para URL cortas resueltas: si entiendo el argumento en contra de las ACL públicas en los buckets de S3 correctamente, uno debería:
- servir archivos desde S3 a través de una CDN (no factible para archivos adjuntos como señaló @martin, ya que es posible que no podamos configurar correctamente el nombre del archivo para la descarga en este caso)
- crear una URL pre-firmada para el objeto S3
Pero el comportamiento actual no hace ninguna de las dos cosas y espera que el bucket S3 tenga una ACL pública. Este también parece ser el caso de los proveedores S3 compatibles (incluido Amazon), así que me gustaría preguntar por qué no hacer que la opción force_download en Discourse.store.url_for sea verdadera por defecto al resolver URL cortas para tiendas S3.