fix: hopefully fix up mimetype checking bug by using tokio
format, check and test / cargo fmt (push) Has been cancelled Details
format, check and test / cargo test (push) Has been cancelled Details

main
Volkor 2023-09-26 19:12:12 +10:00
parent f235b47cde
commit 98c411cf2f
Signed by: Volkor
SSH Key Fingerprint: SHA256:taX3XcC6grYv7+eTzBsIUNCVFgMzh7gkVgxliSh69ek
2 changed files with 58 additions and 10 deletions

View File

@ -118,6 +118,53 @@ mod tests {
assert!(result.is_ok());
assert_eq!(result.unwrap(), "application/x-empty");
// Test case 3: small png file
// This should test for a bug that lets really small files not count as the correct
// filetype
let small_png_data: &[u8] = &[
// a random screenshot lol
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x20,
0x08, 0x06, 0x00, 0x00, 0x00, 0x82, 0x71, 0x21, 0x79, 0x00, 0x00, 0x00,
0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc,
0x61, 0x05, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
0x0e, 0xc3, 0x00, 0x00, 0x0e, 0xc3, 0x01, 0xc7, 0x6f, 0xa8, 0x64, 0x00,
0x00, 0x01, 0x23, 0x49, 0x44, 0x41, 0x54, 0x58, 0x47, 0xed, 0x97, 0xb1,
0xad, 0x84, 0x30, 0x0c, 0x86, 0x33, 0x00, 0x4b, 0xb0, 0x03, 0x2b, 0xb0,
0x01, 0x0b, 0xd0, 0x43, 0x4f, 0x4f, 0x49, 0x4b, 0x4b, 0x47, 0x4d, 0x4b,
0x4f, 0xcd, 0x4e, 0x39, 0x7d, 0x91, 0x8c, 0xa2, 0x28, 0xb9, 0x3b, 0xbd,
0xc6, 0xef, 0x24, 0x17, 0x9f, 0x50, 0xfc, 0xc7, 0xce, 0x1f, 0xc7, 0x0d,
0xae, 0xaa, 0x2a, 0xff, 0xab, 0x98, 0x79, 0x2d, 0xcc, 0xbc, 0x16, 0x6e,
0x18, 0x06, 0xff, 0xab, 0x98, 0x79, 0x2d, 0xcc, 0xbc, 0x16, 0x66, 0x5e,
0x0b, 0x33, 0xaf, 0x85, 0x99, 0xd7, 0xc2, 0xcc, 0x6b, 0x61, 0xe6, 0xb5,
0x30, 0xf3, 0x5a, 0xd8, 0x6f, 0xa0, 0x16, 0x6a, 0xe6, 0xf7, 0x7d, 0xf7,
0xf7, 0x7d, 0x87, 0x6f, 0xdb, 0xb6, 0xd9, 0x3d, 0x9f, 0x50, 0x33, 0x8f,
0xe1, 0xbe, 0xef, 0xfd, 0x71, 0x1c, 0xfe, 0xba, 0xae, 0x3f, 0x5d, 0x40,
0x7d, 0x6c, 0xea, 0xba, 0xf6, 0xe7, 0x79, 0x86, 0x17, 0xc8, 0xe9, 0xef,
0xf8, 0x17, 0x33, 0x3f, 0x4d, 0x53, 0x18, 0x21, 0x2e, 0x92, 0xd3, 0x4b,
0x38, 0x92, 0x62, 0x44, 0xa0, 0xd0, 0xba, 0xae, 0x4f, 0x3c, 0x9d, 0x4d,
0xd6, 0xcb, 0xb2, 0x3c, 0xb3, 0x4b, 0xf7, 0xba, 0xae, 0xfb, 0x3a, 0x3f,
0x86, 0x38, 0x7b, 0xe2, 0x7c, 0x81, 0x3c, 0x6a, 0xa7, 0x71, 0x70, 0x24,
0x30, 0x7b, 0x24, 0x6f, 0xdb, 0xf6, 0x08, 0x1c, 0xcc, 0x2c, 0x8e, 0xe3,
0x18, 0x74, 0x0a, 0x30, 0x9f, 0xa2, 0x53, 0x54, 0x74, 0x6a, 0xa0, 0xc5,
0x87, 0x88, 0x4e, 0x6e, 0x4e, 0x4f, 0xe1, 0x7c, 0x6a, 0xa5, 0xf1, 0xb7,
0xe6, 0xe9, 0x10, 0x85, 0x21, 0x7e, 0x36, 0x8a, 0xd1, 0x59, 0x59, 0x53,
0x98, 0x98, 0x74, 0x8f, 0xa2, 0x5c, 0x50, 0xf4, 0x79, 0x9e, 0x83, 0x2e,
0xeb, 0xd4, 0x8c, 0x74, 0xb7, 0xd4, 0x7d, 0x34, 0xc6, 0x27, 0xa7, 0x95,
0x70, 0x39, 0xe3, 0x40, 0x31, 0x0c, 0xc9, 0x9a, 0xee, 0x11, 0x93, 0xa7,
0xc5, 0x7c, 0xac, 0xc7, 0xe6, 0x65, 0x6f, 0x0e, 0xc9, 0x8f, 0x69, 0x9a,
0xa6, 0xa8, 0x95, 0xa9, 0xfc, 0x0b, 0x8b, 0x4a, 0xde, 0xf6, 0xdf, 0xf9,
0xf2, 0xac, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
];
let result = detect_mime_type(small_png_data);
println!("Test case 3: small_png: {:?}", result);
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
"image/pngf"
);
// Test case 4: putty.exe
let file_data: &[u8] = &[
// Putty.exe trimmed at 2048

View File

@ -1,11 +1,10 @@
use chrono::{TimeZone, Utc};
use salvo::{handler, hyper::header::HOST, prelude::StatusCode, writer::Text, Request, Response};
use std::{
fs::{self, File},
io::Read,
path::{Path, PathBuf},
time::SystemTime,
};
use tokio::{fs::{self, File}, io::AsyncReadExt};
use tracing::{debug, error, info, trace};
use super::guess_ip;
@ -52,14 +51,16 @@ pub async fn upload(req: &mut Request, res: &mut Response) {
engine::generate_filename(length, file.name().unwrap_or("file").to_string()).await;
// Get the temporary file
let mime_file = File::open(file.path()).expect("Error opening file");
let mut buffer = Vec::with_capacity(2048);
trace!("opening file for mimetype check: {:?}", file.path());
let mime_file = File::open(file.path()).await.expect("Failed to open file");
let mut buffer = Vec::with_capacity(512);
// Load up 2048 bytes (There wasn't a decent answer on how much or little I should read)
mime_file
.take(2048)
.read_to_end(&mut buffer)
.expect("couldn't read mimetype buffer");
// Load up 512 bytes (This breaks with a few filetypes, but meh. https://en.wikipedia.org/wiki/List_of_file_signatures)
let n = mime_file.take(512).read_to_end(&mut buffer).await.expect("Error reading file");
// mime_file
// .take(512)
// .read_to_end(&mut buffer);
trace!("read bytes for mime parsing: {:x?}", buffer);
@ -130,7 +131,7 @@ pub async fn upload(req: &mut Request, res: &mut Response) {
// file.path is the path to the temp file.
// file.size seems to be always 'None', so we'll ask the filesystem.
let path = Path::new(file.path());
let filesize = fs::metadata(path).unwrap().len() as i32;
let filesize = fs::metadata(path).await.unwrap().len() as i32;
debug!("upload(filesize): {:?}", filesize);
let expiry =
engine::calculate_expiry(sqlconn, &filename.to_str().unwrap(), filesize).await;