added text extension set, more test coverage, cargo update
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
0f2f408c09
commit
d54cc8d6da
5 changed files with 61 additions and 7 deletions
|
@ -7,6 +7,8 @@ Dates are given in YYYY-MM-DD format.
|
||||||
- Better documentation for command line arguments
|
- Better documentation for command line arguments
|
||||||
- Added more stuff to test.py
|
- Added more stuff to test.py
|
||||||
- PKGBUILD for Arch-based distros
|
- PKGBUILD for Arch-based distros
|
||||||
|
- Added Text extension set
|
||||||
|
- More test coverage
|
||||||
|
|
||||||
### v0.2.11 (2021-04-04)
|
### v0.2.11 (2021-04-04)
|
||||||
#### Features
|
#### Features
|
||||||
|
|
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -284,9 +284,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.92"
|
version = "0.2.93"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "56d855069fafbb9b344c0f962150cd2c1187975cb1c22c1522c240d8c4986714"
|
checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
|
@ -549,9 +549,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.68"
|
version = "1.0.69"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3ce15dd3ed8aa2f8eeac4716d6ef5ab58b6b9256db41d7e1a0224c2788e8fd87"
|
checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
|
@ -67,6 +67,9 @@ fastrand = "1.4.0"
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = "thin"
|
lto = "thin"
|
||||||
|
|
||||||
|
[profile.test]
|
||||||
|
opt-level = 0
|
||||||
|
|
||||||
# optimise dependencies, even when producing debug builds
|
# optimise dependencies, even when producing debug builds
|
||||||
[profile.dev.package."*"]
|
[profile.dev.package."*"]
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
|
|
@ -14,6 +14,8 @@ pub enum ExtensionSet {
|
||||||
Media,
|
Media,
|
||||||
/// Extensions used for document file formats, such as `pdf`, `odt`, `docx`, etc.
|
/// Extensions used for document file formats, such as `pdf`, `odt`, `docx`, etc.
|
||||||
Documents,
|
Documents,
|
||||||
|
/// Extensions used for text file formats, such as `txt`, `toml`, `html`, etc.
|
||||||
|
Text,
|
||||||
/// Extensions used for archive file formats, such as `zip`, `zst`, `gz`, etc.
|
/// Extensions used for archive file formats, such as `zip`, `zst`, `gz`, etc.
|
||||||
Archives,
|
Archives,
|
||||||
}
|
}
|
||||||
|
@ -34,9 +36,10 @@ impl ExtensionSet {
|
||||||
Self::Documents => vec![
|
Self::Documents => vec![
|
||||||
"pdf", "doc", "docx", "ppt", "pptx", "xls", "xlsx", "csv", "tsv", "odt", "ods", "odp", "oda", "rtf", "ps",
|
"pdf", "doc", "docx", "ppt", "pptx", "xls", "xlsx", "csv", "tsv", "odt", "ods", "odp", "oda", "rtf", "ps",
|
||||||
],
|
],
|
||||||
|
Self::Text => mime_guess::get_mime_extensions_str("text/*").unwrap().to_vec(),
|
||||||
// many compressed file types follow the name scheme "application/x.+compressed.*" - maybe this can be used
|
// many compressed file types follow the name scheme "application/x.+compressed.*" - maybe this can be used
|
||||||
// somehow to extract extensions for compressed files from mime_guess?
|
// somehow to extract extensions for compressed files from mime_guess?
|
||||||
Self::Archives => vec!["zip", "tar", "gz", "zst", "xz", "rar", "7z", "bz", "bz2"],
|
Self::Archives => vec!["zip", "tar", "gz", "zst", "xz", "rar", "7z", "bz", "bz2", "tgz"],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,9 +8,12 @@ use cfg_if::cfg_if;
|
||||||
use mime_guess::mime::{APPLICATION_OCTET_STREAM, APPLICATION_PDF, IMAGE_JPEG, IMAGE_PNG};
|
use mime_guess::mime::{APPLICATION_OCTET_STREAM, APPLICATION_PDF, IMAGE_JPEG, IMAGE_PNG};
|
||||||
use mime_guess::Mime;
|
use mime_guess::Mime;
|
||||||
|
|
||||||
|
use crate::findings::Findings;
|
||||||
|
use crate::formats::{Format, Script};
|
||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
|
use std::io::Read;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
const JPEG_BYTES: &[u8] = b"\xFF\xD8\xFF";
|
const JPEG_BYTES: &[u8] = b"\xFF\xD8\xFF";
|
||||||
|
@ -149,7 +152,10 @@ fn simple_directory() {
|
||||||
"pdf" => APPLICATION_PDF,
|
"pdf" => APPLICATION_PDF,
|
||||||
"zip" => application_zip(),
|
"zip" => application_zip(),
|
||||||
_ => APPLICATION_OCTET_STREAM, // general "fallback" type
|
_ => APPLICATION_OCTET_STREAM, // general "fallback" type
|
||||||
}
|
},
|
||||||
|
"Incorrect MIME type detected - got {:?} for a {:?} file",
|
||||||
|
result.mime,
|
||||||
|
ext.unwrap()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -180,7 +186,8 @@ fn argument_parsing() {
|
||||||
hidden: false,
|
hidden: false,
|
||||||
extensionless: false,
|
extensionless: false,
|
||||||
follow_symlinks: true
|
follow_symlinks: true
|
||||||
}
|
},
|
||||||
|
"ScanOpts are incorrect"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,3 +231,42 @@ fn identify_random_bytes() {
|
||||||
}
|
}
|
||||||
println!("No type found:\t{} counts", 500 - results.values().sum::<i32>())
|
println!("No type found:\t{} counts", 500 - results.values().sum::<i32>())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn outputs_move_commands() {
|
||||||
|
// create an example finding stating that "misnamed_file.png" has been identified as a jpeg file
|
||||||
|
let entries = vec![Ok(Findings {
|
||||||
|
file: Path::new("misnamed_file.png"),
|
||||||
|
valid: false,
|
||||||
|
mime: IMAGE_JPEG,
|
||||||
|
})];
|
||||||
|
|
||||||
|
let mut cursor = std::io::Cursor::new(Vec::new());
|
||||||
|
let mut contents = std::string::String::new();
|
||||||
|
|
||||||
|
Script::new()
|
||||||
|
.write_all(&entries, &mut cursor)
|
||||||
|
.expect("Failed to write to cursor");
|
||||||
|
cursor.set_position(0);
|
||||||
|
cursor
|
||||||
|
.read_to_string(&mut contents)
|
||||||
|
.expect("Failed to read from cursor to string");
|
||||||
|
|
||||||
|
// the output should contain a command like "mv -i misnamed_file.png misnamed_file.jpg"
|
||||||
|
assert!(
|
||||||
|
contents.contains("misnamed_file.jpg"),
|
||||||
|
"Output doesn't contain move command!"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn media_contains_audio_video_images() {
|
||||||
|
use crate::extension_set::ExtensionSet::{Audio, Images, Media, Videos};
|
||||||
|
let media_exts = Media.extensions();
|
||||||
|
|
||||||
|
// assert every extension in the audio/video/image sets is contained in the media set
|
||||||
|
[Audio.extensions(), Videos.extensions(), Images.extensions()]
|
||||||
|
.concat()
|
||||||
|
.into_iter()
|
||||||
|
.for_each(|ext| assert!(media_exts.contains(&ext)));
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue