diff options
author | Ellie Huxtable <e@elm.sh> | 2021-04-20 21:53:07 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-20 20:53:07 +0000 |
commit | a21737e2b7f8d1e426726bdd7536033f299d476a (patch) | |
tree | e940afdff9c145d25d9a2895fd44a77d70719a2e /atuin-common | |
parent | 34888827f8a06de835cbe5833a06914f28cce514 (diff) |
Use cargo workspaces (#37)
* Switch to Cargo workspaces
Breaking things into "client", "server" and "common" makes managing the
codebase much easier!
client - anything running on a user's machine for adding history
server - handles storing/syncing history and running a HTTP server
common - request/response API definitions, common utils, etc
* Update dockerfile
Diffstat (limited to 'atuin-common')
-rw-r--r-- | atuin-common/Cargo.toml | 21 | ||||
-rw-r--r-- | atuin-common/src/api.rs | 70 | ||||
-rw-r--r-- | atuin-common/src/lib.rs | 5 | ||||
-rw-r--r-- | atuin-common/src/utils.rs | 29 |
4 files changed, 125 insertions, 0 deletions
diff --git a/atuin-common/Cargo.toml b/atuin-common/Cargo.toml new file mode 100644 index 00000000..efe7da63 --- /dev/null +++ b/atuin-common/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "atuin-common" +version = "0.1.0" +authors = ["Ellie Huxtable <ellie@elliehuxtable.com>"] +edition = "2018" +license = "MIT" +description = "common library for atuin" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rust-crypto = "^0.2" +sodiumoxide = "0.2.6" +chrono = { version = "0.4", features = ["serde"] } +eyre = "0.6" +serde_derive = "1.0.125" +serde = "1.0.125" +serde_json = "1.0.64" +rmp-serde = "0.15.4" +warp = "0.3" +uuid = { version = "0.8", features = ["v4"] } diff --git a/atuin-common/src/api.rs b/atuin-common/src/api.rs new file mode 100644 index 00000000..82ee6604 --- /dev/null +++ b/atuin-common/src/api.rs @@ -0,0 +1,70 @@ +use chrono::Utc; + +#[derive(Debug, Serialize, Deserialize)] +pub struct UserResponse { + pub username: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct RegisterRequest { + pub email: String, + pub username: String, + pub password: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct RegisterResponse { + pub session: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct LoginRequest { + pub username: String, + pub password: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct LoginResponse { + pub session: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct AddHistoryRequest { + pub id: String, + pub timestamp: chrono::DateTime<Utc>, + pub data: String, + pub hostname: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct CountResponse { + pub count: i64, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct SyncHistoryRequest { + pub sync_ts: chrono::DateTime<chrono::FixedOffset>, + pub history_ts: chrono::DateTime<chrono::FixedOffset>, + pub host: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct SyncHistoryResponse { + pub history: Vec<String>, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct ErrorResponse { + pub reason: String, +} + +impl ErrorResponse { + pub fn reply(reason: &str, status: warp::http::StatusCode) -> impl warp::Reply { + warp::reply::with_status( + warp::reply::json(&ErrorResponse { + reason: String::from(reason), + }), + status, + ) + } +} diff --git a/atuin-common/src/lib.rs b/atuin-common/src/lib.rs new file mode 100644 index 00000000..0a01e10d --- /dev/null +++ b/atuin-common/src/lib.rs @@ -0,0 +1,5 @@ +#[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 new file mode 100644 index 00000000..ac5738b3 --- /dev/null +++ b/atuin-common/src/utils.rs @@ -0,0 +1,29 @@ +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 { + let mut hasher = Sha256::new(); + hasher.input_str(string); + + hasher.result_str() +} + +pub fn uuid_v4() -> String { + Uuid::new_v4().to_simple().to_string() +} |