use crate::validator::virtual_root::VirtualRoot;
use std::fs;
#[test]
fn symlink_escape_clamped_via_virtual() {
use std::os::unix::fs as unix_fs;
let jail_td = tempfile::tempdir().unwrap();
let jail_root = jail_td.path();
let outside_td = tempfile::tempdir().unwrap();
let outside_dir = outside_td.path();
let out_link = jail_root.join("out");
unix_fs::symlink(outside_dir, &out_link).unwrap();
let vroot: VirtualRoot = VirtualRoot::try_new(jail_root).unwrap();
let vp = vroot
.virtual_join("out/../etc/passwd")
.expect("VirtualPath clamps escapes; should not error");
let virtual_display = vp.virtualpath_display().to_string();
assert!(
virtual_display.starts_with('/'),
"virtual display should be rooted: {virtual_display}"
);
}
#[test]
fn symlink_inside_ok_via_virtual() {
use std::os::unix::fs as unix_fs;
let td = tempfile::tempdir().unwrap();
let jail_root = td.path();
let data = jail_root.join("data");
fs::create_dir_all(&data).unwrap();
let file_path = data.join("file.txt");
fs::write(&file_path, b"ok").unwrap();
let link = jail_root.join("ln");
unix_fs::symlink("data", &link).unwrap();
let vroot: VirtualRoot = VirtualRoot::try_new(jail_root).unwrap();
let vp = vroot
.virtual_join("ln/../ln/file.txt")
.expect("path should remain in PathBoundary");
assert_eq!(vp.virtualpath_display().to_string(), "/data/file.txt");
}
#[test]
fn absolute_input_clamps_to_virtual_root() {
let td = tempfile::tempdir().unwrap();
let vroot: VirtualRoot = VirtualRoot::try_new(td.path()).unwrap();
let vp = vroot
.virtual_join("/etc/hosts")
.expect("absolute inputs clamp to virtual root, then validate");
assert_eq!(vp.virtualpath_display().to_string(), "/etc/hosts");
}