Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 0 additions & 50 deletions server_manager/src/core/validate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,56 +60,6 @@ pub fn validate_username(name: &str) -> Result<&str> {
Ok(name)
}

/// Validates an RFC 1123 domain name.
pub fn validate_domain(domain: &str) -> Result<&str> {
ensure!(
!domain.is_empty(),
"Validation error: domain cannot be empty"
);
ensure!(
domain.len() <= 253,
"Validation error: domain cannot exceed 253 characters"
);

for label in domain.split('.') {
ensure!(
!label.is_empty(),
"Validation error: domain label cannot be empty"
);
ensure!(
label.len() <= 63,
"Validation error: domain label cannot exceed 63 characters: '{}'",
label
);

let first = label.chars().next().unwrap_or('\0');
let last = label.chars().last().unwrap_or('\0');

ensure!(
first.is_ascii_alphanumeric(),
"Validation error: domain label must start with alphanumeric: '{}'",
label
);
ensure!(
last.is_ascii_alphanumeric(),
"Validation error: domain label must end with alphanumeric: '{}'",
label
);

for c in label.chars() {
if !c.is_ascii_alphanumeric() && c != '-' {
bail!(
"Validation error: invalid character '{}' in domain label '{}'",
c,
label
);
}
}
}

Ok(domain)
}

/// Validates a network port number (1..=65535).
pub fn validate_port(port: u32) -> Result<u16> {
if (1..=65535).contains(&port) {
Expand Down
21 changes: 2 additions & 19 deletions server_manager/tests/contract_input_validation.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use server_manager::core::validate::{
validate_domain, validate_ip, validate_port, validate_port_str, validate_safe_path,
validate_service_name, validate_username,
validate_ip, validate_port, validate_port_str, validate_safe_path, validate_service_name,
validate_username,
};
use std::path::Path;

Expand Down Expand Up @@ -50,23 +50,6 @@ fn test_validate_username() {
assert!(validate_username(&long_user).is_err());
}

#[test]
fn test_validate_domain() {
// Valid domains
assert!(validate_domain("example.com").is_ok());
assert!(validate_domain("cloud.sub.example.org").is_ok());
assert!(validate_domain("my-server-01.local").is_ok());
assert!(validate_domain("localhost").is_ok());

// Invalid domains
assert!(validate_domain("").is_err());
assert!(validate_domain("-leading-hyphen.com").is_err());
assert!(validate_domain("trailing-hyphen-.com").is_err());
assert!(validate_domain("double..dot.com").is_err());
assert!(validate_domain("domain;curl evil.com").is_err());
assert!(validate_domain("domain with spaces.com").is_err());
}

#[test]
fn test_validate_port() {
// Valid ports
Expand Down
Loading