fix: properly disallow duplicate filenames in upload (#7387)

This commit is contained in:
aecsocket
2026-08-31 17:55:01 +00:00
committed by GitHub
parent 3fdcf73d11
commit d378b64f92
2 changed files with 43 additions and 1 deletions
@@ -923,7 +923,7 @@ pub async fn upload_file(
) -> Result<(), CreateError> {
let (file_name, file_extension) = get_name_ext(content_disposition)?;
if other_file_names.contains(&format!("{file_name}.{file_extension}")) {
if other_file_names.iter().any(|name| name == file_name) {
return Err(CreateError::InvalidInput(
"Duplicate files are not allowed to be uploaded to Modrinth!"
.to_string(),
+42
View File
@@ -91,6 +91,48 @@ async fn test_get_version() {
.await;
}
#[actix_rt::test]
async fn rejects_duplicate_filename_when_uploading_file_to_version() {
with_test_environment(
None,
|test_env: common::environment::TestEnvironment<ApiV3>| async move {
let api = &test_env.api;
let version_id = &test_env.dummy.project_alpha.version_id;
let version_before = api
.get_version_deserialized_common(version_id, USER_USER_PAT)
.await;
assert_eq!(version_before.files.len(), 1);
let primary_before = version_before.files[0].clone();
let conflicting_file = TestFile::BasicModRandom {
filename: primary_before.filename.clone(),
bytes: TestFile::build_random_jar().bytes(),
};
let response = api
.upload_file_to_version(
version_id,
&conflicting_file,
USER_USER_PAT,
)
.await;
assert_status!(&response, StatusCode::BAD_REQUEST);
let version_after = api
.get_version_deserialized_common(version_id, USER_USER_PAT)
.await;
assert_eq!(version_after.files.len(), 1);
let primary_after = &version_after.files[0];
assert_eq!(primary_after.id, primary_before.id);
assert_eq!(primary_after.hashes, primary_before.hashes);
assert_eq!(primary_after.url, primary_before.url);
assert_eq!(primary_after.filename, primary_before.filename);
assert_eq!(primary_after.primary, primary_before.primary);
assert_eq!(primary_after.size, primary_before.size);
},
)
.await;
}
#[actix_rt::test]
async fn version_updates() {
// Test setup and dummy data