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-server | |
| parent | Switch to Warp + SQLx, use async, switch to Rust stable (#36) (diff) | |
| download | atuin-a21737e2b7f8d1e426726bdd7536033f299d476a.zip | |
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 '')
| -rw-r--r-- | atuin-server/Cargo.toml | 38 | ||||
| -rw-r--r-- | atuin-server/server.toml | 11 | ||||
| -rw-r--r-- | atuin-server/src/auth.rs (renamed from src/server/auth.rs) | 0 | ||||
| -rw-r--r-- | atuin-server/src/database.rs (renamed from src/server/database.rs) | 0 | ||||
| -rw-r--r-- | atuin-server/src/handlers/history.rs (renamed from src/server/handlers/history.rs) | 6 | ||||
| -rw-r--r-- | atuin-server/src/handlers/mod.rs (renamed from src/server/handlers/mod.rs) | 0 | ||||
| -rw-r--r-- | atuin-server/src/handlers/user.rs (renamed from src/server/handlers/user.rs) | 11 | ||||
| -rw-r--r-- | atuin-server/src/lib.rs (renamed from src/server/mod.rs) | 7 | ||||
| -rw-r--r-- | atuin-server/src/models.rs (renamed from src/server/models.rs) | 0 | ||||
| -rw-r--r-- | atuin-server/src/router.rs (renamed from src/server/router.rs) | 8 | ||||
| -rw-r--r-- | atuin-server/src/settings.rs | 57 |
11 files changed, 127 insertions, 11 deletions
diff --git a/atuin-server/Cargo.toml b/atuin-server/Cargo.toml new file mode 100644 index 00000000..2cf85d26 --- /dev/null +++ b/atuin-server/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "atuin-server" +version = "0.1.0" +authors = ["Ellie Huxtable <ellie@elliehuxtable.com>"] +edition = "2018" +license = "MIT" +description = "server library for atuin" + +[dependencies] +atuin-common = { path = "../atuin-common", version = "0.1.0" } + +log = "0.4" +fern = {version = "0.6.0", features = ["colored"] } +chrono = { version = "0.4", features = ["serde"] } +eyre = "0.6" +directories = "3" +uuid = { version = "0.8", features = ["v4"] } +indicatif = "0.15.0" +whoami = "1.1.2" +chrono-english = "0.1.4" +config = "0.11" +serde_derive = "1.0.125" +serde = "1.0.125" +serde_json = "1.0.64" +rmp-serde = "0.15.4" +unicode-width = "0.1" +sodiumoxide = "0.2.6" +reqwest = { version = "0.11", features = ["blocking", "json"] } +base64 = "0.13.0" +fork = "0.1.18" +parse_duration = "2.1.1" +rand = "0.8.3" +rust-crypto = "^0.2" +tokio = { version = "1", features = ["full"] } +warp = "0.3" +sqlx = { version = "0.5", features = [ "runtime-tokio-native-tls", "uuid", "chrono", "postgres" ] } +async-trait = "0.1.49" +urlencoding = "1.1.1" diff --git a/atuin-server/server.toml b/atuin-server/server.toml new file mode 100644 index 00000000..808f15f1 --- /dev/null +++ b/atuin-server/server.toml @@ -0,0 +1,11 @@ +## host to bind, can also be passed via CLI args +# host = "127.0.0.1" + +## port to bind, can also be passed via CLI args +# port = 8888 + +## whether to allow anyone to register an account +# open_registration = false + +## URI for postgres (using development creds here) +# db_uri="postgres://username:password@localhost/atuin" diff --git a/src/server/auth.rs b/atuin-server/src/auth.rs index 52a73108..52a73108 100644 --- a/src/server/auth.rs +++ b/atuin-server/src/auth.rs diff --git a/src/server/database.rs b/atuin-server/src/database.rs index 5945baaf..5945baaf 100644 --- a/src/server/database.rs +++ b/atuin-server/src/database.rs diff --git a/src/server/handlers/history.rs b/atuin-server/src/handlers/history.rs index 4fd6f03f..1aebdde1 100644 --- a/src/server/handlers/history.rs +++ b/atuin-server/src/handlers/history.rs @@ -2,11 +2,11 @@ use std::convert::Infallible; use warp::{http::StatusCode, reply::json}; -use crate::api::{ +use crate::database::Database; +use crate::models::{NewHistory, User}; +use atuin_common::api::{ AddHistoryRequest, CountResponse, ErrorResponse, SyncHistoryRequest, SyncHistoryResponse, }; -use crate::server::database::Database; -use crate::server::models::{NewHistory, User}; pub async fn count( user: User, diff --git a/src/server/handlers/mod.rs b/atuin-server/src/handlers/mod.rs index 3c20538c..3c20538c 100644 --- a/src/server/handlers/mod.rs +++ b/atuin-server/src/handlers/mod.rs diff --git a/src/server/handlers/user.rs b/atuin-server/src/handlers/user.rs index 782d7dbd..6b142cdc 100644 --- a/src/server/handlers/user.rs +++ b/atuin-server/src/handlers/user.rs @@ -5,13 +5,14 @@ use uuid::Uuid; use warp::http::StatusCode; use warp::reply::json; -use crate::api::{ +use atuin_common::api::{ ErrorResponse, LoginRequest, LoginResponse, RegisterRequest, RegisterResponse, UserResponse, }; -use crate::server::database::Database; -use crate::server::models::{NewSession, NewUser}; +use atuin_common::utils::hash_secret; + +use crate::database::Database; +use crate::models::{NewSession, NewUser}; use crate::settings::Settings; -use crate::utils::hash_secret; pub fn verify_str(secret: &str, verify: &str) -> bool { sodiumoxide::init().unwrap(); @@ -52,7 +53,7 @@ pub async fn register( settings: Settings, db: impl Database + Clone + Send + Sync, ) -> Result<Box<dyn warp::Reply>, Infallible> { - if !settings.server.open_registration { + if !settings.open_registration { return Ok(Box::new(ErrorResponse::reply( "this server is not open for registrations", StatusCode::BAD_REQUEST, diff --git a/src/server/mod.rs b/atuin-server/src/lib.rs index d5e083df..36b6ffa7 100644 --- a/src/server/mod.rs +++ b/atuin-server/src/lib.rs @@ -4,11 +4,18 @@ use eyre::Result; use crate::settings::Settings; +#[macro_use] +extern crate log; + +#[macro_use] +extern crate serde_derive; + pub mod auth; pub mod database; pub mod handlers; pub mod models; pub mod router; +pub mod settings; pub async fn launch(settings: &Settings, host: String, port: u16) -> Result<()> { // routes to run: diff --git a/src/server/models.rs b/atuin-server/src/models.rs index fbf1897e..fbf1897e 100644 --- a/src/server/models.rs +++ b/atuin-server/src/models.rs diff --git a/src/server/router.rs b/atuin-server/src/router.rs index ed317ab2..d106068d 100644 --- a/src/server/router.rs +++ b/atuin-server/src/router.rs @@ -3,10 +3,12 @@ use std::convert::Infallible; use eyre::Result; use warp::Filter; +use atuin_common::api::SyncHistoryRequest; + use super::handlers; use super::{database::Database, database::Postgres}; -use crate::server::models::User; -use crate::{api::SyncHistoryRequest, settings::Settings}; +use crate::models::User; +use crate::settings::Settings; fn with_settings( settings: Settings, @@ -55,7 +57,7 @@ fn with_user( pub async fn router( settings: &Settings, ) -> Result<impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone> { - let postgres = Postgres::new(settings.server.db_uri.as_str()).await?; + let postgres = Postgres::new(settings.db_uri.as_str()).await?; let index = warp::get().and(warp::path::end()).map(handlers::index); let count = warp::get() diff --git a/atuin-server/src/settings.rs b/atuin-server/src/settings.rs new file mode 100644 index 00000000..596b9018 --- /dev/null +++ b/atuin-server/src/settings.rs @@ -0,0 +1,57 @@ +use std::fs::{create_dir_all, File}; +use std::io::prelude::*; +use std::path::PathBuf; + +use config::{Config, Environment, File as ConfigFile}; +use directories::ProjectDirs; +use eyre::{eyre, Result}; + +pub const HISTORY_PAGE_SIZE: i64 = 100; + +#[derive(Clone, Debug, Deserialize)] +pub struct Settings { + pub host: String, + pub port: u16, + pub db_uri: String, + pub open_registration: bool, +} + +impl Settings { + pub fn new() -> Result<Self> { + let config_dir = ProjectDirs::from("com", "elliehuxtable", "atuin").unwrap(); + let config_dir = config_dir.config_dir(); + + create_dir_all(config_dir)?; + + let config_file = if let Ok(p) = std::env::var("ATUIN_CONFIG") { + PathBuf::from(p) + } else { + let mut config_file = PathBuf::new(); + config_file.push(config_dir); + config_file.push("server.toml"); + config_file + }; + + // create the config file if it does not exist + + let mut s = Config::new(); + + if config_file.exists() { + s.merge(ConfigFile::with_name(config_file.to_str().unwrap()))?; + } else { + let example_config = include_bytes!("../server.toml"); + let mut file = File::create(config_file)?; + file.write_all(example_config)?; + } + + s.set_default("host", "127.0.0.1")?; + s.set_default("port", 8888)?; + s.set_default("open_registration", false)?; + s.set_default("db_uri", "default_uri")?; + + s.merge(Environment::with_prefix("atuin").separator("_"))?; + + s.try_into() + .map_err(|e| eyre!("failed to deserialize: {}", e)) + } +} |
