From b376373af53844f99dfc51a29894d2fe2c572e5d Mon Sep 17 00:00:00 2001 From: npeter83 Date: Tue, 20 Oct 2026 00:45:22 +0200 Subject: [PATCH] fix(files): a folder's kind is answered before its new name, as before A blank name on a source folder answered 400 name_required; it answers 409 not_own again. --- backend/app/downloads/folders.py | 7 ++++++- backend/app/routes/files.py | 3 +++ backend/tests/test_files_api.py | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/backend/app/downloads/folders.py b/backend/app/downloads/folders.py index f829375b..f38eb8ce 100644 --- a/backend/app/downloads/folders.py +++ b/backend/app/downloads/folders.py @@ -328,9 +328,14 @@ def create_own(db: Session, user_id: int, name: str) -> FileFolder: return folder +def renamable(folder: FileFolder) -> bool: + """Only a folder of the user's own making takes a name: a source folder's is its origin's.""" + return folder.kind == FolderKind.OWN + + def rename(db: Session, folder: FileFolder, name: str) -> None: """Rename one of the user's own folders (a source folder's name is its origin's).""" - if folder.kind != FolderKind.OWN: + if not renamable(folder): raise FolderError("file_folder_not_own") folder.name = name try: diff --git a/backend/app/routes/files.py b/backend/app/routes/files.py index dd16f0ea..27645322 100644 --- a/backend/app/routes/files.py +++ b/backend/app/routes/files.py @@ -375,6 +375,9 @@ def update_folder( folder = own_folder(db, user, folder_id) sent = body.model_fields_set if "name" in sent: + # Which folder may be renamed is answered before what the name is, as it always was. + if not folders.renamable(folder): + raise refused(409, "file_folder_not_own") try: folders.rename(db, folder, _folder_name(body.name or "")) except folders.FolderError as e: diff --git a/backend/tests/test_files_api.py b/backend/tests/test_files_api.py index 543b8eb3..1f3992e1 100644 --- a/backend/tests/test_files_api.py +++ b/backend/tests/test_files_api.py @@ -124,6 +124,9 @@ def test_only_an_own_folder_is_renamed_and_only_by_its_user(db, make_user, as_us assert clash.json()["detail"]["reason"] == "file_folder_name_taken" no = c.patch(f"/api/files/folders/{src.id}", json={"name": "YouTube 2"}) assert no.status_code == 409 and no.json()["detail"]["reason"] == "file_folder_not_own" + # Which folder is answered before what the name is: a blank one is still "not yours to name". + blank = c.patch(f"/api/files/folders/{src.id}", json={"name": " "}) + assert blank.status_code == 409 and blank.json()["detail"]["reason"] == "file_folder_not_own" stranger = as_user(make_user()).patch(f"/api/files/folders/{own.id}", json={"name": "X"}) assert stranger.status_code == 404 db.refresh(own)