From 3c5fbc573443a7a4e59a0b898e1586d219f105eb Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Wed, 13 Apr 2022 18:08:49 +0100 Subject: [PATCH] provide better error messages (#300) --- Cargo.lock | 9 +++++++++ Cargo.toml | 1 + atuin-client/Cargo.toml | 1 + atuin-client/src/database.rs | 3 ++- atuin-client/src/encryption.rs | 19 ++++++++++--------- atuin-client/src/settings.rs | 8 ++++---- atuin-server/Cargo.toml | 1 + atuin-server/src/settings.rs | 2 +- src/command/logout.rs | 2 +- 9 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9f802eb..e7fe019 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,6 +70,7 @@ dependencies = [ "crossbeam-channel", "directories", "eyre", + "fs-err", "humantime 2.1.0", "indicatif", "itertools", @@ -97,6 +98,7 @@ dependencies = [ "config", "directories", "eyre", + "fs-err", "itertools", "log", "minspan", @@ -144,6 +146,7 @@ dependencies = [ "chrono", "config", "eyre", + "fs-err", "http", "log", "rand 0.8.5", @@ -676,6 +679,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs-err" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd79fa345a495d3ae89fb7165fec01c0e72f41821d642dda363a1e97975652e" + [[package]] name = "fuchsia-cprng" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index eb937c8..9ed345c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,6 +57,7 @@ tabwriter = "1.2.1" crossbeam-channel = "0.5.1" clap = { version = "3.1.8", features = ["derive"] } clap_complete = "3.1.1" +fs-err = "2.7" [profile.release] lto = "fat" diff --git a/atuin-client/Cargo.toml b/atuin-client/Cargo.toml index ef45e48..923fe1b 100644 --- a/atuin-client/Cargo.toml +++ b/atuin-client/Cargo.toml @@ -48,3 +48,4 @@ sqlx = { version = "0.5", features = [ ] } minspan = "0.1.1" regex = "1.5.4" +fs-err = "2.7" diff --git a/atuin-client/src/database.rs b/atuin-client/src/database.rs index 3ca6171..8b950de 100644 --- a/atuin-client/src/database.rs +++ b/atuin-client/src/database.rs @@ -9,6 +9,7 @@ use eyre::Result; use itertools::Itertools; use regex::Regex; +use fs_err as fs; use sqlx::sqlite::{ SqliteConnectOptions, SqliteJournalMode, SqlitePool, SqlitePoolOptions, SqliteRow, }; @@ -62,7 +63,7 @@ impl Sqlite { let create = !path.exists(); if create { if let Some(dir) = path.parent() { - std::fs::create_dir_all(dir)?; + fs::create_dir_all(dir)?; } } diff --git a/atuin-client/src/encryption.rs b/atuin-client/src/encryption.rs index 5721c2f..d91ad07 100644 --- a/atuin-client/src/encryption.rs +++ b/atuin-client/src/encryption.rs @@ -8,11 +8,11 @@ // clients must share the secret in order to be able to sync, as it is needed // to decrypt -use std::fs::File; +use fs_err as fs; use std::io::prelude::*; use std::path::PathBuf; -use eyre::{eyre, Result}; +use eyre::{eyre, Context, Result}; use sodiumoxide::crypto::secretbox; use crate::history::History; @@ -30,7 +30,7 @@ pub fn new_key(settings: &Settings) -> Result { let key = secretbox::gen_key(); let encoded = encode_key(key.clone())?; - let mut file = File::create(path)?; + let mut file = fs::File::create(path)?; file.write_all(encoded.as_bytes())?; Ok(key) @@ -41,7 +41,7 @@ pub fn load_key(settings: &Settings) -> Result { let path = settings.key_path.as_str(); let key = if PathBuf::from(path).exists() { - let key = std::fs::read_to_string(path)?; + let key = fs_err::read_to_string(path)?; decode_key(key)? } else { new_key(settings)? @@ -54,13 +54,13 @@ pub fn load_encoded_key(settings: &Settings) -> Result { let path = settings.key_path.as_str(); if PathBuf::from(path).exists() { - let key = std::fs::read_to_string(path)?; + let key = fs::read_to_string(path)?; Ok(key) } else { let key = secretbox::gen_key(); let encoded = encode_key(key)?; - let mut file = File::create(path)?; + let mut file = fs::File::create(path)?; file.write_all(encoded.as_bytes())?; Ok(encoded) @@ -68,15 +68,16 @@ pub fn load_encoded_key(settings: &Settings) -> Result { } pub fn encode_key(key: secretbox::Key) -> Result { - let buf = rmp_serde::to_vec(&key)?; + let buf = rmp_serde::to_vec(&key).wrap_err("could not encode key to message pack")?; let buf = base64::encode(buf); Ok(buf) } pub fn decode_key(key: String) -> Result { - let buf = base64::decode(key)?; - let buf: secretbox::Key = rmp_serde::from_read_ref(&buf)?; + let buf = base64::decode(key).wrap_err("encryption key is not a valid base64 encoding")?; + let buf: secretbox::Key = rmp_serde::from_read_ref(&buf) + .wrap_err("encryption key is not a valid message pack encoding")?; Ok(buf) } diff --git a/atuin-client/src/settings.rs b/atuin-client/src/settings.rs index 0e11590..537b1ca 100644 --- a/atuin-client/src/settings.rs +++ b/atuin-client/src/settings.rs @@ -1,4 +1,4 @@ -use std::fs::{create_dir_all, File}; +use fs_err::{create_dir_all, File}; use std::io::prelude::*; use std::path::{Path, PathBuf}; @@ -76,7 +76,7 @@ impl Settings { let sync_time_path = data_dir.join("last_sync_time"); - std::fs::write(sync_time_path, Utc::now().to_rfc3339())?; + fs_err::write(sync_time_path, Utc::now().to_rfc3339())?; Ok(()) } @@ -91,7 +91,7 @@ impl Settings { return Ok(Utc.ymd(1970, 1, 1).and_hms(0, 0, 0)); } - let time = std::fs::read_to_string(sync_time_path)?; + let time = fs_err::read_to_string(sync_time_path)?; let time = chrono::DateTime::parse_from_rfc3339(time.as_str())?; Ok(time.with_timezone(&Utc)) @@ -188,7 +188,7 @@ impl Settings { // Finally, set the auth token if Path::new(session_path.to_string().as_str()).exists() { - let token = std::fs::read_to_string(session_path.to_string())?; + let token = fs_err::read_to_string(session_path.to_string())?; settings.session_token = token.trim().to_string(); } else { settings.session_token = String::from("not logged in"); diff --git a/atuin-server/Cargo.toml b/atuin-server/Cargo.toml index 16a9fa0..17e5d72 100644 --- a/atuin-server/Cargo.toml +++ b/atuin-server/Cargo.toml @@ -29,3 +29,4 @@ sqlx = { version = "0.5", features = [ "runtime-tokio-rustls", "uuid", "chrono", async-trait = "0.1.49" axum = "0.5" http = "0.2" +fs-err = "2.7" diff --git a/atuin-server/src/settings.rs b/atuin-server/src/settings.rs index 8a8d618..251e6d7 100644 --- a/atuin-server/src/settings.rs +++ b/atuin-server/src/settings.rs @@ -1,4 +1,4 @@ -use std::fs::{create_dir_all, File}; +use fs_err::{create_dir_all, File}; use std::io::prelude::*; use std::path::PathBuf; diff --git a/src/command/logout.rs b/src/command/logout.rs index ec7d8dc..26d689c 100644 --- a/src/command/logout.rs +++ b/src/command/logout.rs @@ -1,4 +1,4 @@ -use std::fs::remove_file; +use fs_err::remove_file; pub fn run() { let session_path = atuin_common::utils::data_dir().join("session");