From 451363eb8a4eab67ba9e23aea4e4b1af32b3e4f3 Mon Sep 17 00:00:00 2001 From: specCon18 Date: Tue, 19 Sep 2023 17:50:13 -0400 Subject: [PATCH] update for sky to patch nix issues --- Cargo.lock | 45 +++++++++++++++++++ Cargo.toml | 2 + README.md | 6 +++ dep_graph.svg | 4 ++ nix/default.nix | 11 ++--- nix/devshell.nix | 2 + src/lib/lib.rs | 110 +++++++++++++++++++++++++++++++++++++++++------ 7 files changed, 159 insertions(+), 21 deletions(-) create mode 100644 dep_graph.svg diff --git a/Cargo.lock b/Cargo.lock index 50afc1d..4324948 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -239,6 +239,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + [[package]] name = "digest" version = "0.9.0" @@ -549,6 +555,21 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + [[package]] name = "rust-lzma" version = "0.6.0" @@ -642,8 +663,10 @@ name = "sk_extract" version = "0.1.0" dependencies = [ "bzip2", + "data-encoding", "flate2", "rayon", + "ring", "rust-lzma", "sevenz-rust", "tar", @@ -651,6 +674,12 @@ dependencies = [ "zip", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "subtle" version = "2.5.0" @@ -740,6 +769,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "vcpkg" version = "0.2.15" @@ -806,6 +841,16 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "widestring" version = "1.0.2" diff --git a/Cargo.toml b/Cargo.toml index 4dd1e34..d96ce80 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,10 @@ edition = "2021" [dependencies] bzip2 = "0.4.4" +data-encoding = "2.4.0" flate2 = "1.0.27" rayon = "1.7.0" +ring = "0.16.20" rust-lzma = "0.6.0" sevenz-rust = "0.5.2" tar = "0.4.40" diff --git a/README.md b/README.md index 7db447b..1031dc9 100644 --- a/README.md +++ b/README.md @@ -182,3 +182,9 @@ thanks to all of the wonderful library devs listed below that have helped the ea - rust-lzma - sevenz-rust - tar + +### TODO: +- fix rust tests to support nix +- add permission persistance to all filetypes +- add validity and permissions tests to unit tests +- add support for the remaining filetypes \ No newline at end of file diff --git a/dep_graph.svg b/dep_graph.svg new file mode 100644 index 0000000..98c3dff --- /dev/null +++ b/dep_graph.svg @@ -0,0 +1,4 @@ + + + +
windows
windows
vcpkg
vcpkg
liblzma
liblzma
sk_extract
sk_extract
unix
unix
pkg-config
pkg-config
Nix Package Manager
Nix Package Manager
xz
xz
Text is not SVG - cannot display
\ No newline at end of file diff --git a/nix/default.nix b/nix/default.nix index 83577f8..72061d5 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,14 +1,11 @@ -{ pkgs ? import { } }: +{ pkgs ? import { }, lib }: -let - manifest = (pkgs.lib.importTOML ../Cargo.toml).package; -in pkgs.rustPlatform.buildRustPackage rec { - pname = manifest.name; - version = manifest.version; + pname = "sk_extract"; + version = "0.1.0"; cargoLock.lockFile = ../Cargo.lock; src = pkgs.lib.cleanSource ../.; buildInputs = [ pkgs.xz pkgs.unrar ]; nativeBuildInputs = [ pkgs.xz pkgs.pkg-config ]; - doCheck = false; +# doCheck = false; } \ No newline at end of file diff --git a/nix/devshell.nix b/nix/devshell.nix index 1391040..9e762b2 100644 --- a/nix/devshell.nix +++ b/nix/devshell.nix @@ -12,6 +12,8 @@ pkgs.mkShell { clippy rust-analyzer xz + zip + rar pkg-config ]; } \ No newline at end of file diff --git a/src/lib/lib.rs b/src/lib/lib.rs index d3e7ab7..d0db76e 100644 --- a/src/lib/lib.rs +++ b/src/lib/lib.rs @@ -1,3 +1,7 @@ +use data_encoding::HEXUPPER; +use ring::digest::{Context, Digest, SHA256}; +use std::{fs::{self, File},io::{BufReader, Read},os::unix::fs::PermissionsExt,path::Path}; + pub mod extractors; #[cfg(test)] @@ -31,22 +35,38 @@ use extractors::{ // extract_xar, // extract_exe }; - // Helper function to create a temporary directory for testing - fn create_temp_dir() -> PathBuf { - let mut temp_dir = std::env::temp_dir(); - temp_dir.push("test_dir"); - fs::create_dir_all(&temp_dir).expect("Failed to create temp directory"); - temp_dir - } - #[test] - fn test_extract_zip() { - let input_path = Path::new("test_data/test.zip"); - let output_directory = create_temp_dir(); +#[test] +fn test_extract_zip() { + let input_path = Path::new("test_data/test.zip"); + let output_directory = create_temp_dir(); - let result = extract_zip(input_path, &output_directory); - assert!(result.is_ok()); + let result = extract_zip(input_path, &output_directory); + assert!(result.is_ok()); + + // Calculate SHA-256 digest and get permission flags for extracted files + let extracted_files = fs::read_dir(&output_directory).expect("Failed to read extracted directory"); + for entry in extracted_files { + if let Ok(entry) = entry { + if entry.path().is_file() { + let file = File::open(entry.path()).expect("Failed to open file"); + let reader = BufReader::new(file); + let digest = sha256_digest(reader).expect("Failed to calculate SHA-256 digest"); + let metadata = entry.metadata().expect("Failed to get file metadata"); + let permissions = metadata.permissions(); + let file_mode = permissions.mode(); + let flags = mode_to_flags(file_mode); + + println!( + "File: {:?}\nSHA-256 Digest: {}\nPermission Flags: {}\n", + entry.path(), + HEXUPPER.encode(digest.as_ref()), + flags + ); + } + } } +} #[test] fn test_extract_rar() { @@ -128,4 +148,66 @@ use extractors::{ let result = extract_txz(input_path, &output_directory); assert!(result.is_ok()); } -} + // Helper function to create a temporary directory for testing + fn create_temp_dir() -> PathBuf { + let mut temp_dir = std::env::temp_dir(); + temp_dir.push("test_dir"); + fs::create_dir_all(&temp_dir).expect("Failed to create temp directory"); + temp_dir + } + + fn sha256_digest(mut reader: R) -> Result { + let mut context = Context::new(&SHA256); + let mut buffer = [0; 1024]; + + loop { + let count = reader.read(&mut buffer)?; + if count == 0 { + break; + } + context.update(&buffer[..count]); + } + + Ok(context.finish()) + } + fn mode_to_chmod(mode: u32) -> u32 { + let mut flags:u32 = 0; + + // Owner permissions + if (mode & 0o400) != 0 { flags = flags+400 } else { flags = flags+0 }; + if (mode & 0o200) != 0 { flags = flags+200 } else { flags = flags+0 }; + if (mode & 0o100) != 0 { flags = flags+100 } else { flags = flags+0 }; + + // Group permissions + if (mode & 0o40) != 0 { flags = flags+40 } else { flags = flags+0 }; + if (mode & 0o20) != 0 { flags = flags+20 } else { flags = flags+0 }; + if (mode & 0o10) != 0 { flags = flags+10 } else { flags = flags+0 }; + + // Others permissions + if (mode & 0o4) != 0 { flags = flags+4 } else { flags = flags+0 }; + if (mode & 0o2) != 0 { flags = flags+2 } else { flags = flags+0 }; + if (mode & 0o1) != 0 { flags = flags+1 } else { flags = flags+0 }; + + flags + } + fn mode_to_flags(mode: u32) -> String { + let mut flags = String::new(); + + // Owner permissions + flags.push(if (mode & 0o400) != 0 { 'r' } else { '-' }); + flags.push(if (mode & 0o200) != 0 { 'w' } else { '-' }); + flags.push(if (mode & 0o100) != 0 { 'x' } else { '-' }); + + // Group permissions + flags.push(if (mode & 0o40) != 0 { 'r' } else { '-' }); + flags.push(if (mode & 0o20) != 0 { 'w' } else { '-' }); + flags.push(if (mode & 0o10) != 0 { 'x' } else { '-' }); + + // Others permissions + flags.push(if (mode & 0o4) != 0 { 'r' } else { '-' }); + flags.push(if (mode & 0o2) != 0 { 'w' } else { '-' }); + flags.push(if (mode & 0o1) != 0 { 'x' } else { '-' }); + + flags + } +} \ No newline at end of file