use std::path::Path;
use crate::Result;
use crate::SecurityConfig;
use crate::types::DestDir;
use crate::types::SafePath;
pub fn validate_path(path: &Path, dest: &DestDir, config: &SecurityConfig) -> Result<SafePath> {
SafePath::validate(path, dest, config)
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
use std::path::PathBuf;
use tempfile::TempDir;
fn create_test_dest() -> (TempDir, DestDir) {
let temp = TempDir::new().expect("failed to create temp dir");
let dest = DestDir::new(temp.path().to_path_buf()).expect("failed to create dest");
(temp, dest)
}
#[test]
fn test_validate_path_valid() {
let (_temp, dest) = create_test_dest();
let config = SecurityConfig::default();
let path = PathBuf::from("foo/bar.txt");
assert!(validate_path(&path, &dest, &config).is_ok());
}
#[test]
fn test_validate_path_traversal() {
let (_temp, dest) = create_test_dest();
let config = SecurityConfig::default();
let path = PathBuf::from("../etc/passwd");
assert!(validate_path(&path, &dest, &config).is_err());
}
#[test]
fn test_validate_path_absolute() {
let (_temp, dest) = create_test_dest();
let config = SecurityConfig::default();
let path = PathBuf::from("/etc/passwd");
assert!(validate_path(&path, &dest, &config).is_err());
}
#[test]
fn test_validate_path_nested() {
let (_temp, dest) = create_test_dest();
let config = SecurityConfig::default();
let path = PathBuf::from("foo/bar/baz/file.txt");
assert!(validate_path(&path, &dest, &config).is_ok());
}
#[test]
fn test_validate_path_current_dir() {
let (_temp, dest) = create_test_dest();
let config = SecurityConfig::default();
let path = PathBuf::from("./foo/bar.txt");
let result = validate_path(&path, &dest, &config);
assert!(result.is_ok());
}
}