pub fn generate(hostname: &str) -> String {
format!("{:x}", md5::compute(hostname))
}
pub fn validate(hostname: &str, authorization_header: &str) -> bool {
if !authorization_header.starts_with("Bearer ") {
return false;
}
let token = &authorization_header["Bearer ".len()..];
if token.len() != 32 {
return false;
}
let token_md5 = format!("{:x}", md5::compute(hostname));
token == token_md5
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generate_token() {
let hostname = "example.com";
let token = generate(hostname);
assert_eq!(token.len(), 32);
assert_eq!(generate(hostname), generate(hostname));
assert_eq!(
generate("test.com"),
"c97c1b3671fef2055e175ca2154d217a".to_string()
);
}
#[test]
fn test_validate_token() {
let hostname = "example.com";
let token = generate(hostname);
let valid_header = format!("Bearer {}", token);
assert!(validate(hostname, &valid_header));
assert!(!validate(hostname, &token));
assert!(!validate(hostname, "bearer 123"));
assert!(!validate(hostname, "Basic 123"));
assert!(!validate(hostname, ""));
assert!(!validate(hostname, "Bearer 123"));
assert!(!validate(
hostname,
"Bearer 123456789012345678901234567890123"
));
assert!(!validate(
hostname,
"Bearer 0000000000000000000000000000000"
));
let other_token = generate("other.com");
assert!(!validate(hostname, &format!("Bearer {}", other_token)));
}
}