1use std::path::{Component, PathBuf};
2
3#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
5#[non_exhaustive]
6pub enum RequestError {
7 #[error("invalid command program")]
9 InvalidProgram,
10 #[error("invalid command argument at index {index}")]
12 InvalidArgument {
13 index: usize,
15 },
16 #[error("command has {count} arguments; maximum is {max}")]
18 TooManyArguments {
19 count: usize,
21 max: usize,
23 },
24 #[error("fleet path must be absolute and contain no parent traversal: {0}")]
26 InvalidAbsolutePath(PathBuf),
27 #[error("invalid {stream} output limit: {bytes} bytes")]
29 InvalidOutputLimit {
30 stream: &'static str,
32 bytes: usize,
34 },
35 #[error("invalid command stdin length: {bytes} bytes; maximum is {max}")]
37 InvalidStdinLimit {
38 bytes: usize,
40 max: usize,
42 },
43 #[error("invalid transfer limit {bytes}; maximum is {max}")]
45 InvalidTransferLimit {
46 bytes: u64,
48 max: u64,
50 },
51 #[error("fleet request deadline has elapsed")]
53 DeadlineElapsed,
54 #[error("invalid SHA-256 digest")]
56 InvalidSha256,
57}
58
59pub(crate) fn validate_absolute_path(path: PathBuf) -> Result<PathBuf, RequestError> {
60 if !path.is_absolute()
61 || path
62 .components()
63 .any(|component| matches!(component, Component::ParentDir | Component::CurDir))
64 {
65 Err(RequestError::InvalidAbsolutePath(path))
66 } else {
67 Ok(path)
68 }
69}
70
71#[cfg(test)]
72#[path = "request_tests.rs"]
73mod tests;