#![forbid(unsafe_code)]
use crate::errors::{SshCliError, SshCliResult};
pub fn validate_remote_socket(path: &str) -> SshCliResult<()> {
if path.is_empty() {
return Err(SshCliError::InvalidArgument(
"--remote-socket requires a path".to_string(),
));
}
if !path.starts_with('/') {
return Err(SshCliError::InvalidArgument(format!(
"--remote-socket must be an absolute remote path, got `{path}`"
)));
}
if path.contains('\0') {
return Err(SshCliError::InvalidArgument(
"--remote-socket must not contain a NUL byte".to_string(),
));
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn absolute_socket_path_is_accepted() {
assert!(validate_remote_socket("/var/run/docker.sock").is_ok());
}
#[test]
fn empty_path_is_rejected() {
let err = validate_remote_socket("").expect_err("empty path must be rejected");
assert_eq!(err.exit_code(), crate::errors::exit_codes::EX_USAGE);
}
#[test]
fn relative_path_is_rejected() {
let err =
validate_remote_socket("run/docker.sock").expect_err("relative path must be rejected");
assert!(matches!(err, SshCliError::InvalidArgument(_)));
}
#[test]
fn nul_byte_is_rejected() {
assert!(validate_remote_socket("/var/run/x\0y.sock").is_err());
}
#[test]
fn windows_style_path_is_rejected_because_the_target_is_posix() {
assert!(validate_remote_socket("C:\\pipe\\docker").is_err());
}
}