fluidattacks_core_git/
errors.rs1use std::io;
2use std::path::PathBuf;
3use std::process::ExitStatus;
4use std::time::Duration;
5
6#[derive(Debug, thiserror::Error)]
8#[error("{action} {}: {source}", path.display())]
9pub struct FileError {
10 pub action: &'static str,
11 pub path: PathBuf,
12 #[source]
13 pub source: io::Error,
14}
15
16#[derive(Debug, thiserror::Error)]
18pub enum PruneError {
19 #[error(transparent)]
20 File(#[from] FileError),
21 #[error(transparent)]
23 Git(#[from] GitCallError),
24}
25
26#[derive(Debug, thiserror::Error)]
28pub enum ResetError {
29 #[error(transparent)]
31 Git(#[from] GitCallError),
32 #[error(transparent)]
33 Symlinks(#[from] FileError),
34}
35
36#[derive(Debug, PartialEq, Eq, thiserror::Error)]
38pub enum HttpsAccessError {
39 #[error("Invalid credentials: a line break or a nul byte")]
41 CredentialLineBreak,
42 #[error("expected an http or https url")]
43 NotHttp,
44 #[error("Invalid url: its host or port could not be parsed")]
46 Unparsable,
47 #[error("expected an https credential")]
48 NotHttpsCredential,
49}
50
51#[derive(Debug, thiserror::Error)]
53pub enum CloneError {
54 #[error(transparent)]
55 Access(#[from] HttpsAccessError),
56 #[error(transparent)]
57 Git(#[from] GitCallError),
58 #[error(transparent)]
60 Info(#[from] FileError),
61 #[error("the SSH key is not base64: {0}")]
62 Key(#[from] base64::DecodeError),
63 #[error("the SSH key could not be written: {0}")]
64 KeyFile(#[source] io::Error),
65 #[error("the SSH key path cannot be quoted for the shell: {0}")]
66 KeyPath(#[from] shlex::QuoteError),
67 #[error(transparent)]
68 Sts(#[from] StsError),
69}
70
71#[derive(Debug, thiserror::Error)]
73pub enum StsError {
74 #[error("STS refused the role {arn}: {code}: {message}")]
76 Refused {
77 arn: String,
78 code: String,
79 message: String,
80 },
81 #[error("STS could not be asked for the role {arn}: {reason}")]
83 Unreachable { arn: String, reason: String },
84 #[error("STS answered the role {arn} without credentials")]
85 NoCredentials { arn: String },
86}
87
88#[derive(Debug, thiserror::Error)]
89pub enum GitCallError {
90 #[error("git {command} could not start: {source}")]
91 NotStarted {
92 command: &'static str,
93 source: io::Error,
94 },
95 #[error("git {command} did not finish within {after:?}")]
96 TimedOut {
97 command: &'static str,
98 after: Duration,
99 },
100 #[error("git {command} exited with {status}: {stderr}")]
102 Refused {
103 command: &'static str,
104 status: ExitStatus,
105 stderr: String,
106 },
107 #[error("git {command} got an argument with an embedded null byte")]
109 NullByte { command: &'static str },
110 #[error("git {command} printed something unreadable: {reason}")]
111 Malformed {
112 command: &'static str,
113 reason: String,
114 },
115}
116
117#[derive(Debug, thiserror::Error)]
119pub enum DownloadError {
120 #[error("writing the archive: {0}")]
123 Write(#[source] io::Error),
124 #[error(transparent)]
125 Fetch(#[from] FetchError),
126 #[error(transparent)]
127 Extract(#[from] ExtractError),
128 #[error(transparent)]
130 Reset(#[from] GitCallError),
131 #[error("pruning the working tree: {0}")]
132 Prune(#[from] PruneError),
133 #[error("placing the repository: {0}")]
136 Place(#[source] io::Error),
137}
138
139#[derive(Debug, thiserror::Error)]
141pub enum FetchError {
142 #[error("invalid url {url}: {reason}")]
143 InvalidUrl { url: String, reason: String },
144 #[error("not an http url: {0}")]
145 NonHttpUrl(String),
146 #[error("could not connect: {0}")]
148 Connect(#[source] reqwest::Error),
149 #[error("connecting timed out: {0}")]
150 ConnectTimeout(#[source] reqwest::Error),
151 #[error("no response in time: {0}")]
153 Timeout(#[source] reqwest::Error),
154 #[error("the server disconnected: {0}")]
156 Disconnected(#[source] reqwest::Error),
157 #[error("the socket failed: {source}")]
160 Socket {
161 reset: bool,
162 errno: Option<i32>,
163 source: reqwest::Error,
164 },
165 #[error("malformed response: {0}")]
166 Malformed(#[source] reqwest::Error),
167 #[error("the server answered {0}")]
168 Status(reqwest::StatusCode),
169 #[error("the body was cut: {0}")]
171 BodyCut(#[source] reqwest::Error),
172 #[error("the body did not arrive in time: {0}")]
174 BodyTimeout(#[source] reqwest::Error),
175 #[error("the request failed: {0}")]
176 Other(#[source] reqwest::Error),
177}
178
179#[derive(Debug, thiserror::Error)]
181pub enum ExtractError {
182 #[error("corrupt archive: {0}")]
185 Corrupt(#[source] io::Error),
186 #[error("truncated archive: {0}")]
188 Truncated(#[source] io::Error),
189 #[error("the archive holds no repository: {0}")]
191 NoRepository(String),
192 #[error("extracting the archive: {0}")]
193 Io(#[source] io::Error),
194}