pub mod iso8859_1;
pub mod max_length;
pub mod safe;
pub mod safe_platform;
pub mod uncgi;
pub mod utf8;
pub mod wipeup;
pub const DEFAULT_UNSAFE_CHARS: &[u8] = b" ()[]{}<>\'\"!@#$&*?;|\\/\x7f";
pub const DEFAULT_SEPARATOR: u8 = b'_';
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Filter {
Uncgi,
Iso8859_1,
Utf8,
Safe {
replacement: u8,
unsafe_chars: Vec<u8>,
},
Wipeup {
separator: u8,
remove_trailing: bool,
},
MaxLength {
limit: usize,
},
SafePlatform,
}
impl Filter {
pub fn safe_default() -> Self {
Filter::Safe {
replacement: b'_',
unsafe_chars: DEFAULT_UNSAFE_CHARS.to_vec(),
}
}
pub fn wipeup_default() -> Self {
Filter::Wipeup {
separator: DEFAULT_SEPARATOR,
remove_trailing: true,
}
}
pub fn apply(&self, input: &[u8]) -> Vec<u8> {
match self {
Filter::Uncgi => uncgi::apply(input),
Filter::Iso8859_1 => iso8859_1::apply(input),
Filter::Utf8 => utf8::apply(input),
Filter::Safe {
replacement,
unsafe_chars,
} => safe::apply(input, *replacement, unsafe_chars),
Filter::Wipeup {
separator,
remove_trailing,
} => wipeup::apply(input, *separator, *remove_trailing),
Filter::MaxLength { limit } => max_length::apply(input, *limit),
Filter::SafePlatform => safe_platform::apply(input),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn safe_default_matches_fr004() {
match Filter::safe_default() {
Filter::Safe {
replacement,
unsafe_chars,
} => {
assert_eq!(replacement, b'_');
assert!(unsafe_chars.contains(&b' '));
assert!(unsafe_chars.contains(&b'/')); assert!(unsafe_chars.contains(&b'('));
}
_ => panic!("safe_default must return Filter::Safe"),
}
}
#[test]
fn wipeup_default_collapses_underscores() {
let f = Filter::wipeup_default();
assert_eq!(f.apply(b"a__b___c"), b"a_b_c");
}
}