Ссылки и доступ

Временные ссылки

Для каждого файла можно создать одну или несколько ссылок на скачивание. Каждая ссылка содержит криптографически случайный токен; в базе данных хранится только его SHA-256 хеш — сам исходный токен нигде не сохраняется и не логируется.

Срок действия (expiration)

При создании ссылки можно указать срок жизни в часах. По истечении этого времени ссылка автоматически перестаёт работать. Фоновый воркер также ежечасно деактивирует просроченные ссылки в базе данных.

Пароль на ссылку

Ссылку можно защитить паролем. Пароль хешируется алгоритмом argon2 и никогда не хранится в открытом виде. Получателю нужно ввести пароль на странице скачивания — после успешной проверки выдаётся кратковременный токен доступа (10 минут), позволяющий браузеру докачать файл, если скачивание было прервано.

Лимит скачиваний

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

Одноразовые ссылки

Одноразовая ссылка отключается в той же транзакции, что и учёт скачивания — ещё до того, как начнётся передача файла. Это предотвращает состояние гонки (race condition), при котором два одновременных запроса могли бы оба получить файл.

Важное следствие: одноразовые ссылки не поддерживают докачку через HTTP Range-запросы несколькими соединениями, так как повторное обращение к файлу означало бы более одного скачивания. Обычные ссылки (не одноразовые) поддерживают докачку прерванных загрузок.

Докачка (Range requests)

Сервер поддерживает HTTP Range-запросы для больших файлов, что позволяет браузеру возобновить прерванную загрузку без повторного скачивания всего файла с начала.