Проблемы с загрузкой файлов со сложными именами в Safari

Похоже, в Safari возникла проблема с загружаемыми файлами, если в именах файлов содержатся кавычки (особенно опасны) или символы вне диапазона ASCII. Речь идёт о следующих файлах:

Create New "Open File" Macro and Copy Macro URL 1.1.kmmacros
Create New "Open File" Macro and Copy Macro URL 1.1.kmmacros

В первом файле используются обычные двойные кавычки, и он ведёт себя крайне некорректно; во втором — фигурные кавычки, которые искажаются.

См. тему на форуме:

В Chrome на Mac оба файла скачиваются нормально, при этом имена выглядят так:

Create New _Open File_ Macro and Copy Macro URL 1.1.kmmacros
Create New "Open File" Macro and Copy Macro URL 1.1.kmmacros

Двойные кавычки в первом файле заменяются на подчёркивания, что допустимо; вероятно, это осознанное решение где-то в системе.

Однако в Safari файлы скачиваются следующим образом:

Create New .dms
Create New “Open File” Macro and Copy Macro URL 1.1.kmmacros

Первый случай особенно тревожен, поскольку имя файла полностью искажено, включая расширение. Это может иметь потенциальные последствия для безопасности, так как непонятно, как именно обрабатываются кавычки.

Во втором случае, похоже, проблема связана с конвертацией UTF.

Подозреваю, что это регрессия либо в Discourse (на моём сервере версия 2.3.2), либо в Safari, поскольку, думаю, мы бы уже сталкивались с этим ранее. Однако я не нашёл конкретных старых случаев, где макросы явно содержали бы кавычки в именах, чтобы проверить. Определённо есть старые файлы с символами вне диапазона ASCII (например, здесь), и раньше я никогда не замечал, что они не работают.

Особенно странно, что в Chrome это работает, а в Safari — нет, следовательно, проблема, скорее всего, связана с каким-то клиентским кодом.

3 лайка

Я могу воспроизвести это локально на последней версии, загружая и скачивая файл через Firefox. Safari также обрезает имя загрузки в кавычках. Chrome, должно быть, обрабатывает кавычки в именах файлов иначе, заменяя их на нижние подчёркивания.

3 лайка

@gerhard, можешь посмотреть?

2 лайка

send_file в Rails на данный момент не использует параметр filename* в заголовке Content-Disposition. Вот почему имена файлов в большинстве браузеров искажаются.

В Rails 6 это будет исправлено: Encode Content-Disposition filenames on send_data and send_file · rails/rails@890485c · GitHub

Стоит ли мне пока применить monkey patch? И, похоже, S3 store тоже должен устанавливать filename*.

2 лайка

Наверное, но не уверен, когда мы доберёмся до Rails 6?

Да, пожалуйста. Похоже, этот код уже год не менялся, так что он должен быть достаточно стабильным (но всё же проверьте, нет ли исправлений ошибок).

3 лайка

Я только что внес исправление. Вы можете попробовать его, обновившись или переключившись на ветку tests-passed.

3 лайка