fix(storage): handle cross-device rename and MKCOL on existing folders

- dedup_service: fall back to copy+delete when rename() fails with
  EXDEV (os error 18), which occurs when temp and blob dirs are on
  different filesystems
- NC webdav_handler: return 405 instead of 500 when MKCOL targets an
  existing folder (RFC 4918 §9.3.1)
This commit is contained in:
Jared Wolff
2026-03-05 17:28:50 -05:00
parent 633c1bbe97
commit cea7665a43
2 changed files with 42 additions and 14 deletions
+17 -9
View File
@@ -572,15 +572,23 @@ async fn handle_mkcol(
parent_id: Some(parent_folder.id.clone()),
};
folder_service
.create_folder(dto)
.await
.map_err(|e| AppError::internal_error(format!("Failed to create folder: {}", e)))?;
Ok(Response::builder()
.status(StatusCode::CREATED)
.body(Body::empty())
.unwrap())
match folder_service.create_folder(dto).await {
Ok(_) => Ok(Response::builder()
.status(StatusCode::CREATED)
.body(Body::empty())
.unwrap()),
Err(e) if e.message.contains("already exists") || e.message.contains("Already Exists") => {
// RFC 4918 §9.3.1: MKCOL on existing resource → 405
Ok(Response::builder()
.status(StatusCode::METHOD_NOT_ALLOWED)
.body(Body::empty())
.unwrap())
}
Err(e) => Err(AppError::internal_error(format!(
"Failed to create folder: {}",
e
))),
}
}
// ──────────────────── DELETE ────────────────────