From 02c70deecba955c1b01f661ed7a709038e90addc Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Fri, 22 Apr 2022 19:24:38 +0100 Subject: [PATCH] refactor (#327) --- Cargo.lock | 12 ++-------- Cargo.toml | 3 +-- atuin-client/Cargo.toml | 3 +-- atuin-client/src/encryption.rs | 1 + atuin-client/src/history.rs | 1 + atuin-client/src/import/resh.rs | 1 + atuin-client/src/lib.rs | 3 --- atuin-client/src/settings.rs | 1 + atuin-common/Cargo.toml | 7 +----- atuin-common/src/api.rs | 36 +--------------------------- atuin-common/src/calendar.rs | 1 + atuin-common/src/lib.rs | 3 --- atuin-common/src/utils.rs | 19 ++------------- atuin-server/Cargo.toml | 3 +-- atuin-server/src/calendar.rs | 2 ++ atuin-server/src/handlers/history.rs | 2 ++ atuin-server/src/handlers/mod.rs | 35 +++++++++++++++++++++++++++ atuin-server/src/handlers/user.rs | 17 ++++++++++++- atuin-server/src/lib.rs | 3 --- atuin-server/src/settings.rs | 1 + src/command/client/history.rs | 4 ++-- 21 files changed, 72 insertions(+), 86 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 48b0a5c..1d03a8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,7 +86,6 @@ dependencies = [ "log", "pretty_env_logger", "serde", - "serde_derive", "serde_json", "tabwriter", "termion", @@ -119,7 +118,6 @@ dependencies = [ "rmp-serde", "rust-crypto", "serde", - "serde_derive", "serde_json", "shellexpand", "sodiumoxide", @@ -134,14 +132,9 @@ dependencies = [ name = "atuin-common" version = "0.8.1" dependencies = [ - "axum", "chrono", - "http", "rust-crypto", "serde", - "serde_derive", - "serde_json", - "sodiumoxide", "uuid", ] @@ -162,7 +155,6 @@ dependencies = [ "rand 0.8.5", "rust-crypto", "serde", - "serde_derive", "serde_json", "sodiumoxide", "sqlx", @@ -1068,9 +1060,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e70ee094dc02fd9c13fdad4940090f22dbd6ac7c9e7094a46cf0232a50bc7c" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itertools" diff --git a/Cargo.toml b/Cargo.toml index 833003a..be1c1b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,8 +40,7 @@ chrono = { version = "0.4", features = ["serde"] } eyre = "0.6" directories = "4" indicatif = "0.16.2" -serde_derive = "1.0.125" -serde = "1.0.126" +serde = { version = "1.0.126", features = ["derive"] } serde_json = "1.0.75" tui = "0.16" termion = "1.5" diff --git a/atuin-client/Cargo.toml b/atuin-client/Cargo.toml index 923fe1b..49ff933 100644 --- a/atuin-client/Cargo.toml +++ b/atuin-client/Cargo.toml @@ -21,8 +21,7 @@ uuid = { version = "0.8", features = ["v4"] } whoami = "1.1.2" chrono-english = "0.1.4" config = "0.13" -serde_derive = "1.0.125" -serde = "1.0.126" +serde = { version = "1.0.126", features = ["derive"] } serde_json = "1.0.75" rmp-serde = "1.0.0" sodiumoxide = "0.2.6" diff --git a/atuin-client/src/encryption.rs b/atuin-client/src/encryption.rs index 9b6f8a7..4746c23 100644 --- a/atuin-client/src/encryption.rs +++ b/atuin-client/src/encryption.rs @@ -9,6 +9,7 @@ // to decrypt use fs_err as fs; +use serde::{Deserialize, Serialize}; use std::io::prelude::*; use std::path::PathBuf; diff --git a/atuin-client/src/history.rs b/atuin-client/src/history.rs index 111e463..6610b98 100644 --- a/atuin-client/src/history.rs +++ b/atuin-client/src/history.rs @@ -3,6 +3,7 @@ use std::env; use chrono::Utc; use atuin_common::utils::uuid_v4; +use serde::{Deserialize, Serialize}; // Any new fields MUST be Optional<>! #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, sqlx::FromRow)] diff --git a/atuin-client/src/import/resh.rs b/atuin-client/src/import/resh.rs index c55220c..cd5dccf 100644 --- a/atuin-client/src/import/resh.rs +++ b/atuin-client/src/import/resh.rs @@ -8,6 +8,7 @@ use atuin_common::utils::uuid_v4; use chrono::{TimeZone, Utc}; use directories::UserDirs; use eyre::{eyre, Result}; +use serde::Deserialize; use super::{count_lines, Importer}; use crate::history::History; diff --git a/atuin-client/src/lib.rs b/atuin-client/src/lib.rs index fa01c17..98e2f3a 100644 --- a/atuin-client/src/lib.rs +++ b/atuin-client/src/lib.rs @@ -3,9 +3,6 @@ #[macro_use] extern crate log; -#[macro_use] -extern crate serde_derive; - pub mod api_client; pub mod database; pub mod encryption; diff --git a/atuin-client/src/settings.rs b/atuin-client/src/settings.rs index 537b1ca..ee3376a 100644 --- a/atuin-client/src/settings.rs +++ b/atuin-client/src/settings.rs @@ -1,4 +1,5 @@ use fs_err::{create_dir_all, File}; +use serde::Deserialize; use std::io::prelude::*; use std::path::{Path, PathBuf}; diff --git a/atuin-common/Cargo.toml b/atuin-common/Cargo.toml index 93814ac..59caa79 100644 --- a/atuin-common/Cargo.toml +++ b/atuin-common/Cargo.toml @@ -12,11 +12,6 @@ repository = "https://github.com/ellie/atuin" [dependencies] rust-crypto = "^0.2" -sodiumoxide = "0.2.6" chrono = { version = "0.4", features = ["serde"] } -serde_derive = "1.0.125" -serde = "1.0.126" -serde_json = "1.0.75" +serde = { version = "1.0.126", features = ["derive"] } uuid = { version = "0.8", features = ["v4"] } -axum = "0.5" -http = "0.2" diff --git a/atuin-common/src/api.rs b/atuin-common/src/api.rs index 803fbbc..47bbcde 100644 --- a/atuin-common/src/api.rs +++ b/atuin-common/src/api.rs @@ -1,8 +1,5 @@ -use std::borrow::Cow; - -use axum::{response::IntoResponse, Json}; use chrono::Utc; -use serde::Serialize; +use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] pub struct UserResponse { @@ -56,34 +53,3 @@ pub struct SyncHistoryRequest { pub struct SyncHistoryResponse { pub history: Vec, } - -#[derive(Debug, Serialize, Deserialize)] -pub struct ErrorResponse<'a> { - pub reason: Cow<'a, str>, -} - -impl<'a> IntoResponse for ErrorResponseStatus<'a> { - fn into_response(self) -> axum::response::Response { - (self.status, Json(self.error)).into_response() - } -} - -pub struct ErrorResponseStatus<'a> { - pub error: ErrorResponse<'a>, - pub status: http::StatusCode, -} - -impl<'a> ErrorResponse<'a> { - pub fn with_status(self, status: http::StatusCode) -> ErrorResponseStatus<'a> { - ErrorResponseStatus { - error: self, - status, - } - } - - pub fn reply(reason: &'a str) -> ErrorResponse { - Self { - reason: reason.into(), - } - } -} diff --git a/atuin-common/src/calendar.rs b/atuin-common/src/calendar.rs index d576f1a..d3b1d92 100644 --- a/atuin-common/src/calendar.rs +++ b/atuin-common/src/calendar.rs @@ -1,4 +1,5 @@ // Calendar data +use serde::{Serialize, Deserialize}; pub enum TimePeriod { YEAR, diff --git a/atuin-common/src/lib.rs b/atuin-common/src/lib.rs index 77cd644..e76a7ab 100644 --- a/atuin-common/src/lib.rs +++ b/atuin-common/src/lib.rs @@ -1,7 +1,4 @@ #![forbid(unsafe_code)] -#[macro_use] -extern crate serde_derive; - pub mod api; pub mod utils; diff --git a/atuin-common/src/utils.rs b/atuin-common/src/utils.rs index 35647bd..23e3425 100644 --- a/atuin-common/src/utils.rs +++ b/atuin-common/src/utils.rs @@ -1,26 +1,11 @@ use std::path::PathBuf; use chrono::NaiveDate; -use crypto::digest::Digest; -use crypto::sha2::Sha256; -use sodiumoxide::crypto::pwhash::argon2id13; use uuid::Uuid; -pub fn hash_secret(secret: &str) -> String { - sodiumoxide::init().unwrap(); - let hash = argon2id13::pwhash( - secret.as_bytes(), - argon2id13::OPSLIMIT_INTERACTIVE, - argon2id13::MEMLIMIT_INTERACTIVE, - ) - .unwrap(); - let texthash = std::str::from_utf8(&hash.0).unwrap().to_string(); - - // postgres hates null chars. don't do that to postgres - texthash.trim_end_matches('\u{0}').to_string() -} - pub fn hash_str(string: &str) -> String { + use crypto::digest::Digest; + use crypto::sha2::Sha256; let mut hasher = Sha256::new(); hasher.input_str(string); diff --git a/atuin-server/Cargo.toml b/atuin-server/Cargo.toml index 33f5f7c..c1342bf 100644 --- a/atuin-server/Cargo.toml +++ b/atuin-server/Cargo.toml @@ -17,8 +17,7 @@ eyre = "0.6" uuid = { version = "0.8", features = ["v4"] } whoami = "1.1.2" config = "0.13" -serde_derive = "1.0.125" -serde = "1.0.126" +serde = { version = "1.0.126", features = ["derive"] } serde_json = "1.0.75" sodiumoxide = "0.2.6" base64 = "0.13.0" diff --git a/atuin-server/src/calendar.rs b/atuin-server/src/calendar.rs index d576f1a..7c05dce 100644 --- a/atuin-server/src/calendar.rs +++ b/atuin-server/src/calendar.rs @@ -1,5 +1,7 @@ // Calendar data +use serde::{Deserialize, Serialize}; + pub enum TimePeriod { YEAR, MONTH, diff --git a/atuin-server/src/handlers/history.rs b/atuin-server/src/handlers/history.rs index b711252..aca9ecc 100644 --- a/atuin-server/src/handlers/history.rs +++ b/atuin-server/src/handlers/history.rs @@ -10,6 +10,8 @@ use atuin_common::api::*; use crate::calendar::{TimePeriod, TimePeriodInfo}; +use super::{ErrorResponse, ErrorResponseStatus}; + #[instrument(skip_all, fields(user.id = user.id))] pub async fn count( user: User, diff --git a/atuin-server/src/handlers/mod.rs b/atuin-server/src/handlers/mod.rs index 83c2d0c..9e6659e 100644 --- a/atuin-server/src/handlers/mod.rs +++ b/atuin-server/src/handlers/mod.rs @@ -1,6 +1,41 @@ +use axum::{response::IntoResponse, Json}; +use serde::{Deserialize, Serialize}; +use std::borrow::Cow; + pub mod history; pub mod user; pub async fn index() -> &'static str { "\"Through the fathomless deeps of space swims the star turtle Great A\u{2019}Tuin, bearing on its back the four giant elephants who carry on their shoulders the mass of the Discworld.\"\n\t-- Sir Terry Pratchett" } + +#[derive(Debug, Serialize, Deserialize)] +pub struct ErrorResponse<'a> { + pub reason: Cow<'a, str>, +} + +impl<'a> IntoResponse for ErrorResponseStatus<'a> { + fn into_response(self) -> axum::response::Response { + (self.status, Json(self.error)).into_response() + } +} + +pub struct ErrorResponseStatus<'a> { + pub error: ErrorResponse<'a>, + pub status: http::StatusCode, +} + +impl<'a> ErrorResponse<'a> { + pub fn with_status(self, status: http::StatusCode) -> ErrorResponseStatus<'a> { + ErrorResponseStatus { + error: self, + status, + } + } + + pub fn reply(reason: &'a str) -> ErrorResponse { + Self { + reason: reason.into(), + } + } +} diff --git a/atuin-server/src/handlers/user.rs b/atuin-server/src/handlers/user.rs index a9a48fd..862f228 100644 --- a/atuin-server/src/handlers/user.rs +++ b/atuin-server/src/handlers/user.rs @@ -1,7 +1,6 @@ use std::borrow::Borrow; use atuin_common::api::*; -use atuin_common::utils::hash_secret; use axum::extract::Path; use axum::{Extension, Json}; use http::StatusCode; @@ -13,6 +12,8 @@ use crate::database::{Database, Postgres}; use crate::models::{NewSession, NewUser}; use crate::settings::Settings; +use super::{ErrorResponse, ErrorResponseStatus}; + pub fn verify_str(secret: &str, verify: &str) -> bool { sodiumoxide::init().unwrap(); @@ -139,3 +140,17 @@ pub async fn login( session: session.token, })) } + +fn hash_secret(secret: &str) -> String { + sodiumoxide::init().unwrap(); + let hash = argon2id13::pwhash( + secret.as_bytes(), + argon2id13::OPSLIMIT_INTERACTIVE, + argon2id13::MEMLIMIT_INTERACTIVE, + ) + .unwrap(); + let texthash = std::str::from_utf8(&hash.0).unwrap().to_string(); + + // postgres hates null chars. don't do that to postgres + texthash.trim_end_matches('\u{0}').to_string() +} diff --git a/atuin-server/src/lib.rs b/atuin-server/src/lib.rs index 8811986..7be54e5 100644 --- a/atuin-server/src/lib.rs +++ b/atuin-server/src/lib.rs @@ -8,9 +8,6 @@ use eyre::{Context, Result}; use crate::settings::Settings; -#[macro_use] -extern crate serde_derive; - pub mod auth; pub mod calendar; pub mod database; diff --git a/atuin-server/src/settings.rs b/atuin-server/src/settings.rs index 251e6d7..6f4d36b 100644 --- a/atuin-server/src/settings.rs +++ b/atuin-server/src/settings.rs @@ -1,4 +1,5 @@ use fs_err::{create_dir_all, File}; +use serde::{Deserialize, Serialize}; use std::io::prelude::*; use std::path::PathBuf; diff --git a/src/command/client/history.rs b/src/command/client/history.rs index 6eaa640..b2f68f9 100644 --- a/src/command/client/history.rs +++ b/src/command/client/history.rs @@ -55,7 +55,7 @@ pub enum Cmd { pub fn print_list(h: &[History], human: bool, cmd_only: bool) { let mut writer = TabWriter::new(std::io::stdout()).padding(2); - let lines = h.iter().map(|h| { + let lines = h.iter().rev().map(|h| { if human { let duration = humantime::format_duration(Duration::from_nanos(std::cmp::max( h.duration, 0, @@ -82,7 +82,7 @@ pub fn print_list(h: &[History], human: bool, cmd_only: bool) { } }); - for i in lines.rev() { + for i in lines { writer .write_all(i.as_bytes()) .expect("failed to write to tab writer");