mirror of
https://github.com/TheFunny/TelegramTwitterMediaBot.git
synced 2026-10-03 00:52:10 +00:00
fix: reject oversized local media before upload
This commit is contained in:
@@ -229,13 +229,25 @@ pub(super) async fn prepare_upload_item(
|
|||||||
message: "file id reached the upload fallback".into(),
|
message: "file id reached the upload fallback".into(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
let media_url = item_url(&item);
|
||||||
// Locally produced files (ugoira / bsky remux MP4): nothing to download
|
// Locally produced files (ugoira / bsky remux MP4): nothing to download
|
||||||
// or shrink — upload the file directly. The send is a multipart upload,
|
// or shrink — upload the file directly. The send is a multipart upload,
|
||||||
// so the only remaining failure is an upload-cap error, which is
|
// so the only remaining failure is an upload-cap error, which is
|
||||||
// permanent (a video cannot be re-encoded here).
|
// permanent (a video cannot be re-encoded here).
|
||||||
let media_url = item_url(&item);
|
|
||||||
if !media_url.starts_with("http://") && !media_url.starts_with("https://") {
|
if !media_url.starts_with("http://") && !media_url.starts_with("https://") {
|
||||||
let media = media_from_file(&item, std::path::PathBuf::from(media_url), caption)
|
let path = std::path::Path::new(media_url);
|
||||||
|
let size = tokio::fs::metadata(path)
|
||||||
|
.await
|
||||||
|
.map_err(|e| FallbackError::Permanent {
|
||||||
|
message: format!("local media unavailable: {e}"),
|
||||||
|
})?
|
||||||
|
.len();
|
||||||
|
if size > MAX_MEDIA_UPLOAD_BYTES {
|
||||||
|
return Err(FallbackError::Permanent {
|
||||||
|
message: "local media exceeds Telegram upload limit".into(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let media = media_from_file(&item, path.to_path_buf(), caption)
|
||||||
.map_err(|message| FallbackError::Permanent { message })?;
|
.map_err(|message| FallbackError::Permanent { message })?;
|
||||||
return Ok(PreparedItem {
|
return Ok(PreparedItem {
|
||||||
index,
|
index,
|
||||||
@@ -454,4 +466,23 @@ mod download_class_tests {
|
|||||||
Ok(_) => panic!("a file id must be refused, not prepared"),
|
Ok(_) => panic!("a file id must be refused, not prepared"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn oversized_local_media_is_refused_before_upload() {
|
||||||
|
let dir = tempfile::tempdir().unwrap();
|
||||||
|
let file = dir.path().join("video.mp4");
|
||||||
|
let handle = std::fs::File::create(&file).unwrap();
|
||||||
|
handle.set_len(MAX_MEDIA_UPLOAD_BYTES + 1).unwrap();
|
||||||
|
drop(handle);
|
||||||
|
let item = MediaItemPayload::Video {
|
||||||
|
media: MediaRef::Source(file.to_string_lossy().into_owned()),
|
||||||
|
has_spoiler: false,
|
||||||
|
thumbnail: None,
|
||||||
|
fallback_url: None,
|
||||||
|
};
|
||||||
|
assert!(matches!(
|
||||||
|
prepare_upload_item(item, 0, None).await,
|
||||||
|
Err(FallbackError::Permanent { .. })
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user