diff --git a/handlers.py b/handlers.py index 9fc53a1..39426a0 100644 --- a/handlers.py +++ b/handlers.py @@ -3,7 +3,7 @@ import os import sqlite3 from datetime import datetime from http.server import BaseHTTPRequestHandler -from urllib.parse import parse_qs, urlparse +from urllib.parse import parse_qs, unquote, urlparse import database from config import get_storage_root, load_config @@ -289,14 +289,19 @@ class FileServerHandler(BaseHTTPRequestHandler): self.send_redirect("/files") def handle_file_download(self, username, filename): + # Decode URL-encoded filename + # For example when we have not default symbols: %D1%80%D0%B8%D0%BD%D0%B3%D1%82%D0%BE%D0%BD.mp3 + decoded_filename = unquote(filename) + user_dir = os.path.join(get_storage_root(), username) - filepath = os.path.join(user_dir, filename) + filepath = os.path.join(user_dir, decoded_filename) + print(filepath) if not os.path.exists(filepath) or not os.path.isfile(filepath): self.send_html("

File not found

", 404) return - mime_type, _ = mimetypes.guess_type(filename) + mime_type, _ = mimetypes.guess_type(decoded_filename) if not mime_type: mime_type = "application/octet-stream" @@ -306,9 +311,9 @@ class FileServerHandler(BaseHTTPRequestHandler): if mime_type.startswith(("image/", "video/", "audio/")): disposition = "inline" else: - disposition = f'attachment; filename="{filename}"' + disposition = f"attachment; filename*=UTF-8''{quote(decoded_filename)}" else: - disposition = f'attachment; filename="{filename}"' + disposition = f"attachment; filename*=UTF-8''{quote(decoded_filename)}" self.send_response(200) self.send_header("Content-Type", mime_type)