diff options
| author | 2026-01-13 16:14:49 +0800 | |
|---|---|---|
| committer | 2026-01-13 16:14:49 +0800 | |
| commit | 746a94952de6d506dee5f45c77c72ccb597bb516 (patch) | |
| tree | ab3693dba733736a7670ed901aa4b9bf44d99d7b /src-tauri/src/utils | |
| parent | d247a02cd9656b7ca15128e517c8e995af66903a (diff) | |
| download | DropOut-746a94952de6d506dee5f45c77c72ccb597bb516.tar.gz DropOut-746a94952de6d506dee5f45c77c72ccb597bb516.zip | |
Implement library rules validation and zip extraction utility
- Added `is_library_allowed` function to evaluate library permissions based on defined rules.
- Introduced `rule_matches` helper function to check OS compatibility for rules.
- Created `extract_zip` function to handle zip file extraction, including directory creation and skipping of META-INF entries.
Diffstat (limited to 'src-tauri/src/utils')
| -rw-r--r-- | src-tauri/src/utils/mod.rs | 3 | ||||
| -rw-r--r-- | src-tauri/src/utils/zip.rs | 34 |
2 files changed, 35 insertions, 2 deletions
diff --git a/src-tauri/src/utils/mod.rs b/src-tauri/src/utils/mod.rs index 088da95..265beda 100644 --- a/src-tauri/src/utils/mod.rs +++ b/src-tauri/src/utils/mod.rs @@ -1,6 +1,5 @@ // utils/mod.rs -pub mod file_utils; -pub mod config_parser; +pub mod zip; // 文件操作相关的实用工具函数 pub mod file_utils { diff --git a/src-tauri/src/utils/zip.rs b/src-tauri/src/utils/zip.rs new file mode 100644 index 0000000..3ddf0f2 --- /dev/null +++ b/src-tauri/src/utils/zip.rs @@ -0,0 +1,34 @@ +use std::path::Path; +use std::fs; + +pub fn extract_zip(zip_path: &Path, extract_to: &Path) -> Result<(), String> { + let file = fs::File::open(zip_path).map_err(|e| format!("Failed to open zip {}: {}", zip_path.display(), e))?; + let mut archive = zip::ZipArchive::new(file).map_err(|e| format!("Failed to read zip: {}", e))?; + + for i in 0..archive.len() { + let mut file = archive.by_index(i).map_err(|e| format!("Failed to read zip entry: {}", e))?; + let outpath = match file.enclosed_name() { + Some(path) => extract_to.join(path), + None => continue, + }; + + // Skip META-INF + if outpath.to_string_lossy().contains("META-INF") { + continue; + } + + if file.name().ends_with('/') { + fs::create_dir_all(&outpath).map_err(|e| format!("Failed to create dir: {}", e))?; + } else { + if let Some(p) = outpath.parent() { + if !p.exists() { + fs::create_dir_all(&p).map_err(|e| format!("Failed to create dir: {}", e))?; + } + } + let mut outfile = fs::File::create(&outpath).map_err(|e| format!("Failed to create file: {}", e))?; + std::io::copy(&mut file, &mut outfile).map_err(|e| format!("Failed to copy file: {}", e))?; + } + } + + Ok(()) +} |