cloudillo_types/
validation.rs1use regex::Regex;
12use std::sync::LazyLock;
13
14static ID_TAG_RE: LazyLock<Regex> = LazyLock::new(|| {
22 Regex::new(r"^[a-z0-9-][a-z0-9.-]{3,60}[a-z0-9-]$")
23 .unwrap_or_else(|e| unreachable!("ID_TAG_RE regex compilation failed: {}", e))
24});
25
26pub fn validate_id_tag(id_tag: &str) -> bool {
29 ID_TAG_RE.is_match(id_tag)
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35
36 #[test]
37 fn test_validate_id_tag() {
38 assert!(validate_id_tag("alice"));
39 assert!(validate_id_tag("bob-123"));
40 assert!(validate_id_tag("user-name-123"));
41 assert!(validate_id_tag("home.w9.hu"));
42
43 assert!(!validate_id_tag("Al")); assert!(!validate_id_tag("Alice")); assert!(!validate_id_tag("alice_123")); }
47
48 #[test]
49 fn test_validate_id_tag_rejects_url_injection() {
50 assert!(!validate_id_tag("alice/../../etc"));
53 assert!(!validate_id_tag("alice/admin"));
54 assert!(!validate_id_tag("alice@evil.com"));
55 assert!(!validate_id_tag("alice:8080"));
56 assert!(!validate_id_tag("alice evil"));
57 assert!(!validate_id_tag("alice?x=1"));
58 assert!(!validate_id_tag("alice#frag"));
59 assert!(!validate_id_tag("alice\\evil"));
60 assert!(!validate_id_tag("")); }
62}
63
64