Validate a session ID to prevent path traversal. Rejects IDs containing `..`, `/`, `\`, or null bytes.
(session_id: &str)
| 672 | /// |
| 673 | /// Rejects IDs containing `..`, `/`, `\`, or null bytes. |
| 674 | fn validate_session_id(session_id: &str) -> AgentResult<()> { |
| 675 | if session_id.is_empty() { |
| 676 | return Err(AgentError::SessionIdInvalid { |
| 677 | session_id: "(empty)".to_string(), |
| 678 | }); |
| 679 | } |
| 680 | |
| 681 | if session_id.contains("..") |
| 682 | || session_id.contains('/') |
| 683 | || session_id.contains('\\') |
| 684 | || session_id.contains('\0') |
| 685 | { |
| 686 | return Err(AgentError::SessionIdInvalid { |
| 687 | session_id: session_id.to_string(), |
| 688 | }); |
| 689 | } |
| 690 | |
| 691 | // Reject very long session IDs (filesystem path limits) |
| 692 | if session_id.len() > 255 { |
| 693 | return Err(AgentError::SessionIdInvalid { |
| 694 | session_id: format!( |
| 695 | "{}... (too long: {} chars)", |
| 696 | &session_id[..20], |
| 697 | session_id.len() |
| 698 | ), |
| 699 | }); |
| 700 | } |
| 701 | |
| 702 | Ok(()) |
| 703 | } |
| 704 | |
| 705 | // Tests |
| 706 |