qwencode_rs/utils/
validation.rs1pub fn validate_model_name(model: &str) -> bool {
3 if model.is_empty() {
5 return false;
6 }
7
8 model
10 .chars()
11 .all(|c| c.is_alphanumeric() || c == '-' || c == '_' || c == '/')
12}
13
14pub fn validate_session_id(session_id: &str) -> bool {
16 if session_id.is_empty() || session_id.len() > 256 {
18 return false;
19 }
20
21 session_id
23 .chars()
24 .all(|c| c.is_alphanumeric() || c == '-' || c == '_')
25}
26
27pub fn validate_path(path: &str) -> bool {
29 if path.is_empty() {
31 return false;
32 }
33
34 !path.contains('\0')
36}
37
38pub 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}