diff options
author | Conrad Ludgate <conradludgate@gmail.com> | 2021-05-09 21:17:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-09 21:17:24 +0100 |
commit | de2e34ac500c17e80fe4dcf2ed1c08add8998fa3 (patch) | |
tree | aca08817ace6e0bd6a7dfc21615b2ed8b62f3a05 /atuin-client | |
parent | e43e5ce74a85d87a625295b9b089a1b5b8e26fab (diff) |
some changes :shrug: (#83)
* make everything a cow
* fmt + clippy
Diffstat (limited to 'atuin-client')
-rw-r--r-- | atuin-client/src/api_client.rs | 90 | ||||
-rw-r--r-- | atuin-client/src/lib.rs | 2 | ||||
-rw-r--r-- | atuin-client/src/sync.rs | 12 |
3 files changed, 31 insertions, 73 deletions
diff --git a/atuin-client/src/api_client.rs b/atuin-client/src/api_client.rs index a8ce7b27..4b0c98c7 100644 --- a/atuin-client/src/api_client.rs +++ b/atuin-client/src/api_client.rs @@ -7,21 +7,21 @@ use reqwest::{StatusCode, Url}; use sodiumoxide::crypto::secretbox; use atuin_common::api::{ - AddHistoryRequest, CountResponse, LoginResponse, RegisterResponse, SyncHistoryResponse, + AddHistoryRequest, CountResponse, LoginRequest, LoginResponse, RegisterResponse, + SyncHistoryResponse, }; use atuin_common::utils::hash_str; -use crate::encryption::{decode_key, decrypt}; +use crate::encryption::{decode_key, decrypt, EncryptedHistory}; use crate::history::History; -const VERSION: &str = env!("CARGO_PKG_VERSION"); +static APP_USER_AGENT: &str = concat!("atuin/", env!("CARGO_PKG_VERSION"),); // TODO: remove all references to the encryption key from this // It should be handled *elsewhere* pub struct Client<'a> { sync_addr: &'a str, - token: &'a str, key: secretbox::Key, client: reqwest::Client, } @@ -31,7 +31,7 @@ pub fn register( username: &str, email: &str, password: &str, -) -> Result<RegisterResponse> { +) -> Result<RegisterResponse<'static>> { let mut map = HashMap::new(); map.insert("username", username); map.insert("email", email); @@ -48,7 +48,7 @@ pub fn register( let client = reqwest::blocking::Client::new(); let resp = client .post(url) - .header(USER_AGENT, format!("atuin/{}", VERSION)) + .header(USER_AGENT, APP_USER_AGENT) .json(&map) .send()?; @@ -60,18 +60,14 @@ pub fn register( Ok(session) } -pub fn login(address: &str, username: &str, password: &str) -> Result<LoginResponse> { - let mut map = HashMap::new(); - map.insert("username", username); - map.insert("password", password); - +pub fn login(address: &str, req: LoginRequest) -> Result<LoginResponse<'static>> { let url = format!("{}/login", address); let client = reqwest::blocking::Client::new(); let resp = client .post(url) - .header(USER_AGENT, format!("atuin/{}", VERSION)) - .json(&map) + .header(USER_AGENT, APP_USER_AGENT) + .json(&req) .send()?; if resp.status() != reqwest::StatusCode::OK { @@ -83,31 +79,25 @@ pub fn login(address: &str, username: &str, password: &str) -> Result<LoginRespo } impl<'a> Client<'a> { - pub fn new(sync_addr: &'a str, token: &'a str, key: String) -> Result<Self> { + pub fn new(sync_addr: &'a str, session_token: &'a str, key: String) -> Result<Self> { + let mut headers = HeaderMap::new(); + headers.insert(AUTHORIZATION, format!("Token {}", session_token).parse()?); + Ok(Client { sync_addr, - token, key: decode_key(key)?, - client: reqwest::Client::new(), + client: reqwest::Client::builder() + .user_agent(APP_USER_AGENT) + .default_headers(headers) + .build()?, }) } pub async fn count(&self) -> Result<i64> { let url = format!("{}/sync/count", self.sync_addr); let url = Url::parse(url.as_str())?; - let token = format!("Token {}", self.token); - let token = token.parse()?; - let mut headers = HeaderMap::new(); - headers.insert(AUTHORIZATION, token); - - let resp = self - .client - .get(url) - .header(USER_AGENT, format!("atuin/{}", VERSION)) - .headers(headers) - .send() - .await?; + let resp = self.client.get(url).send().await?; if resp.status() != StatusCode::OK { return Err(eyre!("failed to get count (are you logged in?)")); @@ -137,13 +127,7 @@ impl<'a> Client<'a> { host, ); - let resp = self - .client - .get(url) - .header(AUTHORIZATION, format!("Token {}", self.token)) - .header(USER_AGENT, format!("atuin/{}", VERSION)) - .send() - .await?; + let resp = self.client.get(url).send().await?; let history = resp.json::<SyncHistoryResponse>().await?; let history = history @@ -156,41 +140,15 @@ impl<'a> Client<'a> { Ok(history) } - pub async fn post_history(&self, history: &[AddHistoryRequest]) -> Result<()> { + pub async fn post_history( + &self, + history: &[AddHistoryRequest<'_, EncryptedHistory>], + ) -> Result<()> { let url = format!("{}/history", self.sync_addr); let url = Url::parse(url.as_str())?; - self.client - .post(url) - .json(history) - .header(AUTHORIZATION, format!("Token {}", self.token)) - .header(USER_AGENT, format!("atuin/{}", VERSION)) - .send() - .await?; + self.client.post(url).json(history).send().await?; Ok(()) } - - pub async fn login(&self, username: &str, password: &str) -> Result<LoginResponse> { - let mut map = HashMap::new(); - map.insert("username", username); - map.insert("password", password); - - let url = format!("{}/login", self.sync_addr); - let resp = self - .client - .post(url) - .json(&map) - .header(USER_AGENT, format!("atuin/{}", VERSION)) - .send() - .await?; - - if resp.status() != reqwest::StatusCode::OK { - return Err(eyre!("invalid login details")); - } - - let session = resp.json::<LoginResponse>().await?; - - Ok(session) - } } diff --git a/atuin-client/src/lib.rs b/atuin-client/src/lib.rs index 1207bfdb..82f19b52 100644 --- a/atuin-client/src/lib.rs +++ b/atuin-client/src/lib.rs @@ -1,3 +1,5 @@ +#![forbid(unsafe_code)] + #[macro_use] extern crate log; diff --git a/atuin-client/src/sync.rs b/atuin-client/src/sync.rs index 5c6405df..16524fc6 100644 --- a/atuin-client/src/sync.rs +++ b/atuin-client/src/sync.rs @@ -99,7 +99,7 @@ async fn sync_upload( while local_count > remote_count { let last = db.before(cursor, HISTORY_PAGE_SIZE).await?; - let mut buffer = Vec::<AddHistoryRequest>::new(); + let mut buffer = Vec::new(); if last.is_empty() { break; @@ -107,13 +107,11 @@ async fn sync_upload( for i in last { let data = encrypt(&i, &key)?; - let data = serde_json::to_string(&data)?; - let add_hist = AddHistoryRequest { - id: i.id, + id: i.id.into(), timestamp: i.timestamp, data, - hostname: hash_str(i.hostname.as_str()), + hostname: hash_str(&i.hostname).into(), }; buffer.push(add_hist); @@ -132,8 +130,8 @@ async fn sync_upload( pub async fn sync(settings: &Settings, force: bool, db: &mut (impl Database + Send)) -> Result<()> { let client = api_client::Client::new( - settings.sync_address.as_str(), - settings.session_token.as_str(), + &settings.sync_address, + &settings.session_token, load_encoded_key(settings)?, )?; |