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 @@
+
+
+
+
\ 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