Skip to main content

exarch_core/
lib.rs

1//! Memory-safe archive extraction library with security validation.
2//!
3//! `exarch-core` provides a safe API for extracting archive files (tar, zip)
4//! with built-in protection against common security vulnerabilities like
5//! path traversal, zip bombs, symlink attacks, and hardlink attacks.
6//!
7//! # Examples
8//!
9//! ```no_run
10//! use exarch_core::SecurityConfig;
11//! use exarch_core::extract_archive;
12//!
13//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
14//! let config = SecurityConfig::default();
15//! let report = extract_archive("archive.tar.gz", "/output/dir", &config)?;
16//! println!("Extracted {} files", report.files_extracted);
17//! # Ok(())
18//! # }
19//! ```
20
21#![deny(unsafe_code)]
22#![warn(missing_docs)]
23
24pub mod api;
25pub mod archive;
26pub mod config;
27pub(crate) mod copy;
28pub mod creation;
29pub mod error;
30pub mod formats;
31pub mod inspection;
32pub mod report;
33pub mod security;
34pub(crate) mod test_utils;
35pub mod types;
36
37// Re-export main API types
38pub use api::create_archive;
39pub use api::create_archive_with_progress;
40pub use api::extract_archive;
41pub use api::extract_archive_with_options;
42pub use api::extract_archive_with_options_and_progress;
43pub use api::extract_archive_with_progress;
44pub use api::list_archive;
45pub use api::verify_archive;
46pub use archive::Archive;
47pub use archive::ArchiveBuilder;
48pub use config::ExtractionOptions;
49pub use config::SecurityConfig;
50pub use config::Unvalidated;
51pub use config::Validated;
52pub use error::ArchiveError;
53pub use error::FfiErrorMessage;
54pub use error::IoContext;
55pub use error::QuotaResource;
56pub use error::Result;
57/// Formats an archive-relative, attacker-authored path for an FFI error
58/// message without redaction. Shared by `exarch-python` and `exarch-node`.
59pub use error::redaction::format_entry_path_for_error;
60/// Sanitizes a `std::io::Error` message for an FFI error message. Shared by
61/// `exarch-python` and `exarch-node`.
62pub use error::redaction::sanitize_io_error_for_error;
63/// Redacts a host-derived filesystem path for an FFI error message in
64/// release builds. Shared by `exarch-python` and `exarch-node`.
65pub use error::redaction::sanitize_path_for_error;
66pub use report::ExtractionReport;
67pub use report::NoopProgress;
68pub use report::ProgressCallback;
69
70// Re-export creation types
71pub use creation::ArchiveCreator;
72pub use creation::CreationConfig;
73pub use creation::CreationReport;
74pub use formats::traits::FormatCreator;
75
76// Re-export inspection types
77pub use inspection::ArchiveEntry;
78pub use inspection::ArchiveManifest;
79pub use inspection::CheckStatus;
80pub use inspection::IssueCategory;
81pub use inspection::IssueSeverity;
82pub use inspection::ManifestEntryType;
83pub use inspection::VerificationIssue;
84pub use inspection::VerificationReport;
85pub use inspection::VerificationStatus;
86
87// Re-export security types
88/// Summary statistics produced by the validation pipeline; see
89/// [`security::ValidationReport`].
90pub use security::ValidationReport;
91/// Maximum length, in bytes, of a single `SecurityConfig` entry — an
92/// allowed extension or a banned path component. Shared by `exarch-python`
93/// and `exarch-node`.
94pub use security::boundary::MAX_CONFIG_ENTRY_LENGTH;
95/// Maximum length, in bytes, of a raw path string accepted at the FFI
96/// boundary. Shared by `exarch-python` and `exarch-node`.
97pub use security::boundary::MAX_PATH_LENGTH;
98/// Validates a single caller-supplied `SecurityConfig` entry string.
99/// Shared by `exarch-python` and `exarch-node`.
100pub use security::boundary::validate_config_entry;
101/// Validates a raw, caller-supplied path string before it enters the
102/// archive pipeline. Shared by `exarch-python` and `exarch-node`.
103pub use security::boundary::validate_raw_path_str;
104
105// Re-export types module for easier access
106pub use types::DestDir;
107pub use types::EntryType;
108pub use types::SafePath;
109pub use types::SafeSymlink;