From f505ff03e47d248bde9d36d8a595badf2833ecc6 Mon Sep 17 00:00:00 2001 From: Floris Bruynooghe Date: Thu, 21 Nov 2019 21:17:59 +0100 Subject: [PATCH] Do not break double file extensions Double extensions are sometimes used to identify files correctly, e.g. .tar.gz or .html.zip. Breaking those extensions is not very nice. This fixes #865. --- src/blob.rs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/blob.rs b/src/blob.rs index 53777fc9d..ceae79180 100644 --- a/src/blob.rs +++ b/src/blob.rs @@ -283,13 +283,13 @@ impl<'a> BlobObject<'a> { }; let clean = sanitize_filename::sanitize_with_options(name, opts); - let mut iter = clean.rsplitn(2, '.'); - let mut ext = iter.next().unwrap_or_default().to_string(); + let mut iter = clean.splitn(2, '.'); let mut stem = iter.next().unwrap_or_default().to_string(); - ext.truncate(32); + let mut ext = iter.next().unwrap_or_default().to_string(); stem.truncate(64); - match stem.len() { - 0 => (ext, "".to_string()), + ext.truncate(32); + match ext.len() { + 0 => (stem, "".to_string()), _ => (stem, format!(".{}", ext).to_lowercase()), } } @@ -610,6 +610,26 @@ mod tests { } } + #[test] + fn test_double_ext_preserved() { + let t = dummy_context(); + BlobObject::create(&t.ctx, "foo.tar.gz", b"hello").unwrap(); + let foo = t.ctx.get_blobdir().join("foo.tar.gz"); + assert!(foo.exists()); + BlobObject::create(&t.ctx, "foo.tar.gz", b"world").unwrap(); + for dirent in fs::read_dir(t.ctx.get_blobdir()).unwrap() { + let fname = dirent.unwrap().file_name(); + if fname == foo.file_name().unwrap() { + assert_eq!(fs::read(&foo).unwrap(), b"hello"); + } else { + let name = fname.to_str().unwrap(); + println!("{}", name); + assert!(name.starts_with("foo")); + assert!(name.ends_with(".tar.gz")); + } + } + } + #[test] fn test_create_long_names() { let t = dummy_context();