diff --git a/Cargo.lock b/Cargo.lock index 202c262..90c69e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -269,7 +269,6 @@ checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ "block-buffer", "crypto-common", - "subtle", ] [[package]] @@ -496,30 +495,13 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "hkdf" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - [[package]] name = "homedisk-core" version = "0.0.0" dependencies = [ "better-panic", "homedisk-server", + "homedisk-types", "homedisk-utils", "log", "simplelog", @@ -544,11 +526,14 @@ dependencies = [ name = "homedisk-types" version = "0.0.0" dependencies = [ + "anyhow", "axum", "chrono", + "dirs", "jsonwebtoken", "serde", "thiserror", + "toml", "uuid", ] @@ -556,8 +541,6 @@ dependencies = [ name = "homedisk-utils" version = "0.0.0" dependencies = [ - "anyhow", - "dirs", "hex", "log", "serde", @@ -565,7 +548,6 @@ dependencies = [ "sha2", "sqlx", "tokio", - "toml", "uuid", ] @@ -755,15 +737,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" -[[package]] -name = "md-5" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658646b21e0b72f7866c7038ab086d3d5e1cd6271f060fd37defb241949d0582" -dependencies = [ - "digest", -] - [[package]] name = "memchr" version = "2.4.1" @@ -1005,12 +978,6 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" -[[package]] -name = "ppv-lite86" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - [[package]] name = "proc-macro2" version = "1.0.37" @@ -1044,18 +1011,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", "rand_core", ] @@ -1322,13 +1277,11 @@ checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" dependencies = [ "ahash", "atoi", - "base64", "bitflags", "byteorder", "bytes", "crc", "crossbeam-queue", - "dirs", "either", "event-listener", "flume", @@ -1339,23 +1292,16 @@ dependencies = [ "futures-util", "hashlink", "hex", - "hkdf", - "hmac", "indexmap", "itoa", "libc", "libsqlite3-sys", "log", - "md-5", "memchr", "once_cell", "paste", "percent-encoding", - "rand", "rustls", - "serde", - "serde_json", - "sha-1", "sha2", "smallvec", "sqlformat", @@ -1366,7 +1312,6 @@ dependencies = [ "url", "webpki", "webpki-roots", - "whoami", ] [[package]] @@ -1409,12 +1354,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - [[package]] name = "syn" version = "1.0.91" @@ -1862,16 +1801,6 @@ dependencies = [ "webpki", ] -[[package]] -name = "whoami" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" -dependencies = [ - "wasm-bindgen", - "web-sys", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/core/Cargo.toml b/core/Cargo.toml index 41aff27..b49019a 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -31,3 +31,7 @@ features = ["full"] [dependencies.homedisk-server] path = "../server" + +[dependencies.homedisk-types] +path = "../types" +features = ["config"] diff --git a/core/src/main.rs b/core/src/main.rs index f823c00..16a09f9 100644 --- a/core/src/main.rs +++ b/core/src/main.rs @@ -1,6 +1,7 @@ mod init; -use homedisk_utils::{config::Config, database::Database}; +use homedisk_types::config::types::Config; +use homedisk_utils::database::Database; #[tokio::main] async fn main() { diff --git a/server/src/auth/register.rs b/server/src/auth/register.rs index 74db2a4..0e395ce 100644 --- a/server/src/auth/register.rs +++ b/server/src/auth/register.rs @@ -1,13 +1,11 @@ use axum::{Extension, Json}; use homedisk_types::{ auth::login::{Request, Response}, + config::types::Config, errors::{AuthError, ServerError}, token::{Claims, Token}, }; -use homedisk_utils::{ - config::Config, - database::{Database, User}, -}; +use homedisk_utils::database::{Database, User}; pub async fn handle( db: Extension, diff --git a/server/src/lib.rs b/server/src/lib.rs index 39c75a9..eb28591 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -2,7 +2,8 @@ pub mod auth; mod error; use axum::{http::HeaderValue, routing::get, Extension, Router, Server}; -use homedisk_utils::{config::Config, database::Database}; +use homedisk_types::config::types::Config; +use homedisk_utils::database::Database; use log::{debug, info}; use tower_http::cors::{CorsLayer, Origin}; diff --git a/types/Cargo.toml b/types/Cargo.toml index 3a95ced..181c29b 100644 --- a/types/Cargo.toml +++ b/types/Cargo.toml @@ -5,10 +5,12 @@ edition = "2021" [features] token = ["chrono", "jsonwebtoken"] +config = ["toml", "dirs"] [dependencies] thiserror = "1.0.30" uuid = "0.8.2" +anyhow = "1.0.56" [dependencies.serde] version = "1.0.136" @@ -18,6 +20,14 @@ features = ["derive"] version = "0.5.3" optional = true +# config +[dependencies.toml] +version = "0.5.9" +optional = true +[dependencies.dirs] +version = "4.0.0" +optional = true + # token [dependencies.chrono] version = "0.4.19" diff --git a/types/src/config/mod.rs b/types/src/config/mod.rs new file mode 100644 index 0000000..09cfeab --- /dev/null +++ b/types/src/config/mod.rs @@ -0,0 +1,4 @@ +pub mod types; + +#[cfg(feature = "config")] +pub mod toml; diff --git a/types/src/config/toml.rs b/types/src/config/toml.rs new file mode 100644 index 0000000..ce9ba0d --- /dev/null +++ b/types/src/config/toml.rs @@ -0,0 +1,20 @@ +use std::fs; + +use anyhow::Result; + +use crate::option_return; + +use super::types::Config; + +impl Config { + /// parse configuration file + pub fn parse() -> Result { + // configuration file path + let config_dir = option_return!(dirs::config_dir(), "s")?; + + let config_path = format!("{}/homedisk/config.toml", config_dir.to_string_lossy()); + + let config = fs::read_to_string(config_path)?; + Ok(toml::from_str(&config)?) + } +} diff --git a/types/src/config/types.rs b/types/src/config/types.rs new file mode 100644 index 0000000..b81bd5c --- /dev/null +++ b/types/src/config/types.rs @@ -0,0 +1,19 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Config { + pub http: ConfigHTTP, + pub jwt: ConfigJWT, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ConfigHTTP { + pub host: String, + pub port: u16, + pub cors: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ConfigJWT { + pub secret: String, +} diff --git a/types/src/lib.rs b/types/src/lib.rs index fa82f9d..f0a07d4 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -1,5 +1,7 @@ pub mod auth; +pub mod config; pub mod errors; +pub mod macros; #[cfg(feature = "token")] pub mod token; diff --git a/types/src/macros.rs b/types/src/macros.rs new file mode 100644 index 0000000..b50c508 --- /dev/null +++ b/types/src/macros.rs @@ -0,0 +1,12 @@ +#[macro_export] +macro_rules! option_return { + ($a:expr,$b:expr) => { + match $a { + Some(x) => Ok(x), + None => { + let err = std::io::Error::new(std::io::ErrorKind::Other, $b); + Err(anyhow::Error::from(err)) + } + } + }; +} diff --git a/utils/Cargo.toml b/utils/Cargo.toml index dfef9ec..403a10a 100644 --- a/utils/Cargo.toml +++ b/utils/Cargo.toml @@ -4,9 +4,8 @@ version = "0.0.0" edition = "2021" [features] -full = ["crypto", "config", "database"] +full = ["crypto", "database"] crypto = ["sha-1", "sha2", "hex"] -config = ["toml", "anyhow", "dirs"] database = ["sqlx", "uuid"] [dependencies] @@ -27,21 +26,10 @@ optional = true version = "0.4.3" optional = true -# config -[dependencies.toml] -version = "0.5.9" -optional = true -[dependencies.anyhow] -version = "1.0.56" -optional = true -[dependencies.dirs] -version = "4.0.0" -optional = true - # database [dependencies.sqlx] version = "0.5.13" -features = ["runtime-tokio-rustls", "postgres", "sqlite"] +features = ["runtime-tokio-rustls", "sqlite"] optional = true [dependencies.uuid] version = "0.8.2" diff --git a/utils/src/config/error.rs b/utils/src/config/error.rs deleted file mode 100644 index 1b9d48c..0000000 --- a/utils/src/config/error.rs +++ /dev/null @@ -1,32 +0,0 @@ -use std::fmt; - -#[derive(Debug)] -pub enum Error { - UnknowConfigDir(), - Io(std::io::Error), - Toml(toml::de::Error), -} - -impl From for Error { - fn from(err: std::io::Error) -> Self { - Error::Io(err) - } -} - -impl From for Error { - fn from(err: toml::de::Error) -> Self { - Error::Toml(err) - } -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - Error::UnknowConfigDir() => { - write!(f, "failed to lock up a system configuration directory") - } - Error::Io(err) => write!(f, "{}", err), - Error::Toml(err) => write!(f, "{}", err), - } - } -} diff --git a/utils/src/config/mod.rs b/utils/src/config/mod.rs deleted file mode 100644 index 16a3e8e..0000000 --- a/utils/src/config/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -mod error; -mod parser; - -use parser as config; - -pub use {config::*, error::*}; diff --git a/utils/src/config/parser.rs b/utils/src/config/parser.rs deleted file mode 100644 index 9d6e7b4..0000000 --- a/utils/src/config/parser.rs +++ /dev/null @@ -1,40 +0,0 @@ -use std::fs; - -use serde::{Deserialize, Serialize}; - -use super::Error; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Config { - pub http: ConfigHTTP, - pub jwt: ConfigJWT, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ConfigHTTP { - pub host: String, - pub port: u16, - pub cors: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ConfigJWT { - pub secret: String, -} - -impl Config { - /// parse configuration file - pub fn parse() -> Result { - // configuration file path - let config_dir = if dirs::config_dir() == None { - return Err(Error::UnknowConfigDir()); - } else { - dirs::config_dir().unwrap() - }; - - let config_path = format!("{}/homedisk/config.toml", config_dir.to_string_lossy()); - - let config = fs::read_to_string(config_path)?; - Ok(toml::from_str(&config)?) - } -} diff --git a/utils/src/lib.rs b/utils/src/lib.rs index 2be2f0b..d352f32 100644 --- a/utils/src/lib.rs +++ b/utils/src/lib.rs @@ -1,6 +1,3 @@ -#[cfg(feature = "config")] -pub mod config; - #[cfg(feature = "crypto")] pub mod crypto;