Error messages for downloads

This commit is contained in:
Emi Simpson 2022-08-17 22:55:31 -04:00
parent 9a02ab991e
commit c69bbec8df
Signed by: Emi
GPG key ID: A12F2C2FFDC3D847
2 changed files with 133 additions and 6 deletions

View file

@ -281,10 +281,12 @@ pub enum AviaryDownloadError {
/// An important reason this might occur is if the gallery expired and the server re-assigned
/// the ID to another file, and both used the .bin extension.
///
/// Handling: If this occurs for an image where the URL and key are both provided by the
/// index, it should always be interpreted as an expiration. If it occurs for an index, ask
/// the user to verify that they key and file ID were copied correctly, and if they are
/// correct, then the gallery expired.
/// Note: If there is a key mismatch for an image in a gallery, rather than on the index, this
/// should be interpretted as an expiration instead, and should use the [`ExpiredImage`][]
/// variant.
///
/// Handling: Ask the user to verify that they key and file ID were copied correctly, and if
/// they are correct, then the gallery expired.
KeyMismatch,
/// Indicates that the index did not conform to the protobuf spec
@ -376,3 +378,125 @@ impl AviaryDownloadError {
}
}}
}
impl fmt::Display for AviaryDownloadError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let AviaryDownloadError::Cancelled = self {
writeln!(f, "\x1b[31mCancelled\x1b[0m")?;
} else {
writeln!(f, "\x1b[31mError!\x1b[0m\n")?;
}
match self {
AviaryDownloadError::MalformedKey(invalid) =>
write!(f, concat!(
"It looks like that key {} Double check to make sure that you ",
"copied it correctly. If you did, ask the person who sent you the ",
"link to make sure that /they/ copied it correctly."
), if *invalid {
"isn't valid base64, and won't work here."
} else {
"is the wrong length!"
}),
AviaryDownloadError::ServerError(err_code, msg) =>
write!(f, concat!(
"The server storing this gallery seems to be behaving in a way we ",
"didn't expect. Double check to make sure that you've set the ",
"correct instance with \x1b[35m-s\x1b[0m/\x1b[35m--server\x1b[0m, ",
"and if the problem persists, reach out the server administrator to ",
"let them know that something went wrong.\n\n",
"This information might help to diagnose the issue:\n\x1b[31m{}",
), if let Some(err_code) = err_code {
format!("Error code {:03}:\n{}", err_code, &msg[..usize::min(50, msg.len())])
} else {
format!("Server misbehaviour: {}", msg)
}),
AviaryDownloadError::PermissionDenied(path) =>
write!(f, concat!(
"It looks like you don't have permission for the directory you're ",
"trying to download this album into. Specifically, permission was ",
"denied for \x1b[36m{}\x1b[0m\n\n",
"Try acquiring permission, or picking a different directory with ",
"\x1b[35m-ox1b[0m/x1b[35m--outputx1b[0m."
), path.display()),
AviaryDownloadError::FilesystemError(err, path) =>
write!(f, concat!(
"Some uncommon filesystem error happened while we were trying to ",
"write to/create \x1b[36m{}\x1b[0m. This shouldn't happen very ",
"often, but here's a few guesses as to what might have happened:\n",
"\x1b[37m- \x1b[0mA disk was ejected while we were saving a file\n",
"\x1b[37m- \x1b[0mYou're using a special filesystem that ",
"encountered an error\n",
"\x1b[37m- \x1b[0mThe disk you were writing to is read only\n\n",
"If you're getting this error and you don't know why, we'd really ",
"appreciate it if you could open an issue on our bug tracker. Even ",
"just the filesystem you were using and the error you got could be ",
"enough to help.\n\n",
"The full error that we got is:\n\x1b[31m{:?}",
), path.display(), err),
AviaryDownloadError::BadServerParameter =>
write!(f, concat!(
"Oops! The server you entered looks like it might not be correct. ",
"Double check that your \x1b[35m-s\x1b[0m/\x1b[35m--server\x1b[0m ",
"parameter is correct"
)),
AviaryDownloadError::ConnectionError(msg) =>
write!(f, concat!(
"There was an issue connecting to the server! Check that your ",
"internet is online, and you can access websites normally. ",
"This information might help diagnose the issue:\n\n",
"\x1b[31m{}\x1b[0m"
), msg),
AviaryDownloadError::MissingIndex =>
write!(f, concat!(
"No album found at this URL! Double check that the file ID you ",
"entered is correct and that you've specified the right instance ",
"using \x1b[35m-s\x1b[0m/\x1b[35m--server\x1b[0m. If you have, this ",
"album may have expired."
)),
AviaryDownloadError::ExpiredImage =>
write!(f, concat!(
"One or more images in this album have expired. Currently, the ",
"command line tool has no support for downloading partially expired ",
"albums, although this may change in the future. Please contact the ",
"original uploader to get a new album link."
)),
AviaryDownloadError::KeyMismatch =>
write!(f, concat!(
"Wrong key! Either the base64 key that you entered isn't right, or ",
"it doesn't go to this album. Double check that you've copied both ",
"the album ID and the key correctly. If you're not using the main ",
"instance, you should also double check that you've set the ",
"\x1b[35m-s\x1b[0m/\x1b[35m--server\x1b[0m. If all of this is ",
"correct, then the album may be expired."
)),
AviaryDownloadError::CorruptIndex(msg) =>
write!(f, concat!(
"Something very strange has occurred. \x1b[31;1mIf you are a ",
"non-technical user, feel free to stop here and open an issue, and ",
"we can help figure out why this happened and how we can stop it ",
"from happening in the future.\x1b[0m If you are a technical user, ",
"read on to learn what happened.\n\n",
"The index which stores a listing of the files in this album (along ",
"with metadata like the title and description) was corrupt. ",
"However, the decryption was succeeded, including the MAC ",
"checking. This could stem from a couple possibilities:\n",
"\x1b[37m- \x1b[0mThe key/file id pair provided was valid, but ",
"points to an image rather than a gallery\n",
"\x1b[37m- \x1b[0mA very poorly behaved client generated this ",
"album, and produced a corrupt index\n",
"\x1b[37m- \x1b[0mThis is a key/file pair which is meant to be ",
"used with a different project with a very similar encryption scheme\n\n",
"The specific error is as follows:\n\x1b[31m{}"
), msg),
AviaryDownloadError::NotOverwriting(path) =>
write!(f, concat!(
"The file \x1b[36m{}\x1b[0m already exists! To keep your data ",
"safe, we won't overwrite it unless you pass the ",
"\x1b[35m-f\x1b[0m/\x1b[35m--force\x1b[0m flag. Consider removing ",
"the file yourself or choosing a new directory with the ",
"\x1b[35m-o\x1b[0m/\x1b[35m--output\x1b[0m flag.",
), path.display()),
AviaryDownloadError::Cancelled => Ok(()),
}
}
}

View file

@ -46,7 +46,10 @@ fn main() {
};
match args.command {
Command::Create(create_args) => create(&*full_server, create_args),
Command::Download(download_args) => download(&*full_server, download_args).unwrap(),
Command::Download(download_args) =>
if let Err(e) = download(&*full_server, download_args) {
println!("{e}")
},
}
}
@ -243,7 +246,7 @@ fn download(server: &str, args: DownloadArgs) -> Result<(), AviaryDownloadError>
_ => println!(""),
}
}
print!("\x1b[37m├─\x1b[0m Reserving file... ");
print!("\x1b[37m├─\x1b[0m Reserving file... ");
stdout().flush().unwrap();
let path = dest_dir.join(format!("{indx:03}.{extension}"));
let mut dest_file = OpenOptions::new()