use crate::session_logger::core::PASSWORD_PROMPT_PATTERNS;
pub(super) fn strip_ansi_escapes(data: &[u8]) -> String {
let text = String::from_utf8_lossy(data);
let mut result = String::with_capacity(text.len());
let mut chars = text.chars().peekable();
while let Some(c) = chars.next() {
if c == '\x1b' {
if let Some(&next) = chars.peek() {
if next == '[' {
chars.next(); while let Some(&c) = chars.peek() {
chars.next();
if c.is_ascii_alphabetic() || c == '@' || c == '`' {
break;
}
}
} else if next == ']' {
chars.next(); while let Some(c) = chars.next() {
if c == '\x07' {
break;
}
if c == '\x1b'
&& let Some(&'\\') = chars.peek()
{
chars.next();
break;
}
}
} else if next == '(' || next == ')' || next == '*' || next == '+' {
chars.next();
chars.next();
} else {
chars.next();
}
}
} else {
result.push(c);
}
}
result
}
pub(super) fn html_escape(text: &str) -> String {
let mut result = String::with_capacity(text.len());
for c in text.chars() {
match c {
'<' => result.push_str("<"),
'>' => result.push_str(">"),
'&' => result.push_str("&"),
'"' => result.push_str("""),
'\'' => result.push_str("'"),
_ => result.push(c),
}
}
result
}
pub fn contains_password_prompt(output: &str) -> bool {
let last_line = output
.lines()
.rev()
.find(|line| !line.trim().is_empty())
.unwrap_or("")
.to_ascii_lowercase();
if last_line.is_empty() {
return false;
}
PASSWORD_PROMPT_PATTERNS
.iter()
.any(|pattern| last_line.contains(pattern))
}