summaryrefslogtreecommitdiffstats
path: root/atuin-common
diff options
context:
space:
mode:
authorEllie Huxtable <e@elm.sh>2021-04-20 21:53:07 +0100
committerGitHub <noreply@github.com>2021-04-20 20:53:07 +0000
commita21737e2b7f8d1e426726bdd7536033f299d476a (patch)
treee940afdff9c145d25d9a2895fd44a77d70719a2e /atuin-common
parent34888827f8a06de835cbe5833a06914f28cce514 (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.toml21
-rw-r--r--atuin-common/src/api.rs70
-rw-r--r--atuin-common/src/lib.rs5
-rw-r--r--atuin-common/src/utils.rs29
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()
+}