Skip to main content

qwencode_rs/utils/
validation.rs

1/// Validate a model name
2pub fn validate_model_name(model: &str) -> bool {
3    // Basic validation: non-empty and contains only valid characters
4    if model.is_empty() {
5        return false;
6    }
7
8    // Model names should be reasonable ASCII strings
9    model
10        .chars()
11        .all(|c| c.is_alphanumeric() || c == '-' || c == '_' || c == '/')
12}
13
14/// Validate a session ID
15pub fn validate_session_id(session_id: &str) -> bool {
16    // Session IDs should be non-empty and reasonable length
17    if session_id.is_empty() || session_id.len() > 256 {
18        return false;
19    }
20
21    // Should contain only valid characters
22    session_id
23        .chars()
24        .all(|c| c.is_alphanumeric() || c == '-' || c == '_')
25}
26
27/// Validate a file path
28pub fn validate_path(path: &str) -> bool {
29    // Basic path validation
30    if path.is_empty() {
31        return false;
32    }
33
34    // Should not contain null bytes
35    !path.contains('\0')
36}
37
38/// Sanitize a string for safe use
39pub fn sanitize_string(input: &str) -> String {
40    input
41        .chars()
42        .filter(|c| c.is_ascii_graphic() || c.is_whitespace())
43        .collect()
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn test_validate_model_name_valid() {
52        assert!(validate_model_name("qwen-max"));
53        assert!(validate_model_name("qwen-plus"));
54        assert!(validate_model_name("model_123"));
55        assert!(validate_model_name("org/model-v1"));
56    }
57
58    #[test]
59    fn test_validate_model_name_empty() {
60        assert!(!validate_model_name(""));
61    }
62
63    #[test]
64    fn test_validate_model_name_invalid_chars() {
65        assert!(!validate_model_name("model name"));
66        assert!(!validate_model_name("model@name"));
67        assert!(!validate_model_name("model/name!"));
68    }
69
70    #[test]
71    fn test_validate_session_id_valid() {
72        assert!(validate_session_id("session-123"));
73        assert!(validate_session_id("abc_def"));
74        assert!(validate_session_id("session123"));
75    }
76
77    #[test]
78    fn test_validate_session_id_empty() {
79        assert!(!validate_session_id(""));
80    }
81
82    #[test]
83    fn test_validate_session_id_too_long() {
84        let long_id = "a".repeat(257);
85        assert!(!validate_session_id(&long_id));
86    }
87
88    #[test]
89    fn test_validate_session_id_max_length() {
90        let max_id = "a".repeat(256);
91        assert!(validate_session_id(&max_id));
92    }
93
94    #[test]
95    fn test_validate_session_id_invalid_chars() {
96        assert!(!validate_session_id("session@id"));
97        assert!(!validate_session_id("session/id"));
98        assert!(!validate_session_id("session id"));
99    }
100
101    #[test]
102    fn test_validate_path_valid() {
103        assert!(validate_path("/tmp/test"));
104        assert!(validate_path("./relative"));
105        assert!(validate_path("C:\\Windows\\path"));
106    }
107
108    #[test]
109    fn test_validate_path_empty() {
110        assert!(!validate_path(""));
111    }
112
113    #[test]
114    fn test_validate_path_with_null() {
115        assert!(!validate_path("/tmp/test\0malicious"));
116    }
117
118    #[test]
119    fn test_sanitize_string_removes_non_ascii() {
120        let input = "Hello\x00World\x01Test";
121        let sanitized = sanitize_string(input);
122        assert_eq!(sanitized, "HelloWorldTest");
123    }
124
125    #[test]
126    fn test_sanitize_string_keeps_valid_chars() {
127        let input = "Hello World 123!@#";
128        let sanitized = sanitize_string(input);
129        assert_eq!(sanitized, "Hello World 123!@#");
130    }
131
132    #[test]
133    fn test_sanitize_string_empty() {
134        let sanitized = sanitize_string("");
135        assert_eq!(sanitized, "");
136    }
137
138    #[test]
139    fn test_sanitize_string_only_invalid_chars() {
140        let input = "\x00\x01\x02\x03";
141        let sanitized = sanitize_string(input);
142        assert_eq!(sanitized, "");
143    }
144}