#[cfg(feature = "virtual-path")]
use crate::VirtualRoot;
#[cfg(feature = "virtual-path")]
fn display_of(name: &str) -> String {
let td = tempfile::tempdir().unwrap();
let vroot: VirtualRoot = VirtualRoot::try_new(td.path()).unwrap();
let vpath = vroot.virtual_join(name).unwrap();
vpath.virtualpath_display().to_string()
}
#[cfg(feature = "virtual-path")]
#[test]
fn f6a_virtualpath_display_scrubs_nel_u0085() {
let display = display_of("foo\u{0085}bar");
assert!(
!display.contains('\u{0085}'),
"virtualpath_display leaked U+0085 NEL (acts as newline in HTTP/XML): {:?}",
display
);
}
#[cfg(feature = "virtual-path")]
#[test]
fn f6a_virtualpath_display_scrubs_c1_range() {
for &cp in &[0x008Du32, 0x008F, 0x0090, 0x009B, 0x009C] {
let ch = char::from_u32(cp).unwrap();
let name = format!("foo{ch}bar");
let display = display_of(&name);
assert!(
!display.contains(ch),
"virtualpath_display leaked C1 control U+{:04X} in {:?}",
cp,
display
);
}
}
#[cfg(feature = "virtual-path")]
#[test]
fn f6b_virtualpath_display_scrubs_line_separator_u2028() {
let display = display_of("foo\u{2028}bar");
assert!(
!display.contains('\u{2028}'),
"virtualpath_display leaked U+2028 LINE SEPARATOR: {:?}",
display
);
}
#[cfg(feature = "virtual-path")]
#[test]
fn f6b_virtualpath_display_scrubs_paragraph_separator_u2029() {
let display = display_of("foo\u{2029}bar");
assert!(
!display.contains('\u{2029}'),
"virtualpath_display leaked U+2029 PARAGRAPH SEPARATOR: {:?}",
display
);
}
#[cfg(feature = "virtual-path")]
#[test]
fn f6c_virtualpath_display_scrubs_right_to_left_override_u202e() {
let display = display_of("exec\u{202e}txt.");
assert!(
!display.contains('\u{202e}'),
"virtualpath_display leaked U+202E RIGHT-TO-LEFT OVERRIDE (Trojan Source): {:?}",
display
);
}
#[cfg(feature = "virtual-path")]
#[test]
fn f6c_virtualpath_display_scrubs_directional_embedding_range() {
for cp in 0x202Au32..=0x202E {
let ch = char::from_u32(cp).unwrap();
let name = format!("a{ch}b");
let display = display_of(&name);
assert!(
!display.contains(ch),
"virtualpath_display leaked directional char U+{:04X} in {:?}",
cp,
display
);
}
}
#[cfg(feature = "virtual-path")]
#[test]
fn f6c_virtualpath_display_scrubs_directional_isolate_range() {
for cp in 0x2066u32..=0x2069 {
let ch = char::from_u32(cp).unwrap();
let name = format!("a{ch}b");
let display = display_of(&name);
assert!(
!display.contains(ch),
"virtualpath_display leaked directional isolate U+{:04X} in {:?}",
cp,
display
);
}
}
#[cfg(feature = "virtual-path")]
#[test]
fn f6c_virtualpath_display_scrubs_directional_marks() {
for &cp in &[0x200Eu32, 0x200F] {
let ch = char::from_u32(cp).unwrap();
let name = format!("file{ch}.txt");
let display = display_of(&name);
assert!(
!display.contains(ch),
"virtualpath_display leaked directional mark U+{:04X} in {:?}",
cp,
display
);
}
}