update for sky to patch nix issues
This commit is contained in:
parent
f196e5366e
commit
451363eb8a
7 changed files with 159 additions and 21 deletions
45
Cargo.lock
generated
45
Cargo.lock
generated
|
|
@ -239,6 +239,12 @@ dependencies = [
|
||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "data-encoding"
|
||||||
|
version = "2.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "digest"
|
name = "digest"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
|
|
@ -549,6 +555,21 @@ version = "0.7.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
|
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]]
|
[[package]]
|
||||||
name = "rust-lzma"
|
name = "rust-lzma"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
|
@ -642,8 +663,10 @@ name = "sk_extract"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bzip2",
|
"bzip2",
|
||||||
|
"data-encoding",
|
||||||
"flate2",
|
"flate2",
|
||||||
"rayon",
|
"rayon",
|
||||||
|
"ring",
|
||||||
"rust-lzma",
|
"rust-lzma",
|
||||||
"sevenz-rust",
|
"sevenz-rust",
|
||||||
"tar",
|
"tar",
|
||||||
|
|
@ -651,6 +674,12 @@ dependencies = [
|
||||||
"zip",
|
"zip",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spin"
|
||||||
|
version = "0.5.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subtle"
|
name = "subtle"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
|
|
@ -740,6 +769,12 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "untrusted"
|
||||||
|
version = "0.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vcpkg"
|
name = "vcpkg"
|
||||||
version = "0.2.15"
|
version = "0.2.15"
|
||||||
|
|
@ -806,6 +841,16 @@ version = "0.2.87"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
|
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]]
|
[[package]]
|
||||||
name = "widestring"
|
name = "widestring"
|
||||||
version = "1.0.2"
|
version = "1.0.2"
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,10 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bzip2 = "0.4.4"
|
bzip2 = "0.4.4"
|
||||||
|
data-encoding = "2.4.0"
|
||||||
flate2 = "1.0.27"
|
flate2 = "1.0.27"
|
||||||
rayon = "1.7.0"
|
rayon = "1.7.0"
|
||||||
|
ring = "0.16.20"
|
||||||
rust-lzma = "0.6.0"
|
rust-lzma = "0.6.0"
|
||||||
sevenz-rust = "0.5.2"
|
sevenz-rust = "0.5.2"
|
||||||
tar = "0.4.40"
|
tar = "0.4.40"
|
||||||
|
|
|
||||||
|
|
@ -182,3 +182,9 @@ thanks to all of the wonderful library devs listed below that have helped the ea
|
||||||
- rust-lzma
|
- rust-lzma
|
||||||
- sevenz-rust
|
- sevenz-rust
|
||||||
- tar
|
- 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
|
||||||
4
dep_graph.svg
Normal file
4
dep_graph.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 12 KiB |
|
|
@ -1,14 +1,11 @@
|
||||||
{ pkgs ? import <nixpkgs> { } }:
|
{ pkgs ? import <nixpkgs> { }, lib }:
|
||||||
|
|
||||||
let
|
|
||||||
manifest = (pkgs.lib.importTOML ../Cargo.toml).package;
|
|
||||||
in
|
|
||||||
pkgs.rustPlatform.buildRustPackage rec {
|
pkgs.rustPlatform.buildRustPackage rec {
|
||||||
pname = manifest.name;
|
pname = "sk_extract";
|
||||||
version = manifest.version;
|
version = "0.1.0";
|
||||||
cargoLock.lockFile = ../Cargo.lock;
|
cargoLock.lockFile = ../Cargo.lock;
|
||||||
src = pkgs.lib.cleanSource ../.;
|
src = pkgs.lib.cleanSource ../.;
|
||||||
buildInputs = [ pkgs.xz pkgs.unrar ];
|
buildInputs = [ pkgs.xz pkgs.unrar ];
|
||||||
nativeBuildInputs = [ pkgs.xz pkgs.pkg-config ];
|
nativeBuildInputs = [ pkgs.xz pkgs.pkg-config ];
|
||||||
doCheck = false;
|
# doCheck = false;
|
||||||
}
|
}
|
||||||
|
|
@ -12,6 +12,8 @@ pkgs.mkShell {
|
||||||
clippy
|
clippy
|
||||||
rust-analyzer
|
rust-analyzer
|
||||||
xz
|
xz
|
||||||
|
zip
|
||||||
|
rar
|
||||||
pkg-config
|
pkg-config
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
100
src/lib/lib.rs
100
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;
|
pub mod extractors;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
@ -31,22 +35,38 @@ use extractors::{
|
||||||
// extract_xar,
|
// extract_xar,
|
||||||
// extract_exe
|
// 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]
|
#[test]
|
||||||
fn test_extract_zip() {
|
fn test_extract_zip() {
|
||||||
let input_path = Path::new("test_data/test.zip");
|
let input_path = Path::new("test_data/test.zip");
|
||||||
let output_directory = create_temp_dir();
|
let output_directory = create_temp_dir();
|
||||||
|
|
||||||
let result = extract_zip(input_path, &output_directory);
|
let result = extract_zip(input_path, &output_directory);
|
||||||
assert!(result.is_ok());
|
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]
|
#[test]
|
||||||
fn test_extract_rar() {
|
fn test_extract_rar() {
|
||||||
|
|
@ -128,4 +148,66 @@ use extractors::{
|
||||||
let result = extract_txz(input_path, &output_directory);
|
let result = extract_txz(input_path, &output_directory);
|
||||||
assert!(result.is_ok());
|
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<R: Read>(mut reader: R) -> Result<Digest, std::io::Error> {
|
||||||
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue