diff --git a/Cargo.lock b/Cargo.lock index 1959b4c..1290197 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,6 +34,54 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "amq-protocol" +version = "7.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acc7cad07d1b4533fcb46f0819a6126fa201fd0385469aba75e405424f3fe009" +dependencies = [ + "amq-protocol-tcp", + "amq-protocol-types", + "amq-protocol-uri", + "cookie-factory", + "nom", + "serde", +] + +[[package]] +name = "amq-protocol-tcp" +version = "7.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d8b20aba8c35a0b885e1e978eff456ced925730a4e012e63e4ff89a1deb602b" +dependencies = [ + "amq-protocol-uri", + "tcp-stream", + "tracing", +] + +[[package]] +name = "amq-protocol-types" +version = "7.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e245e0e9083b6a6db5f8c10013074cb382266eb9e2a37204d19c651b8d3b8114" +dependencies = [ + "cookie-factory", + "nom", + "serde", + "serde_json", +] + +[[package]] +name = "amq-protocol-uri" +version = "7.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56987108bf48d2eb500cae8896cd9291564eedd8744776ecc5c3338a8b2ca5f8" +dependencies = [ + "amq-protocol-types", + "percent-encoding", + "url", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -126,6 +174,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-global-executor-trait" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33dd14c5a15affd2abcff50d84efd4009ada28a860f01c14f9d654f3e81b3f75" +dependencies = [ + "async-global-executor", + "async-trait", + "executor-trait", +] + [[package]] name = "async-io" version = "1.9.0" @@ -155,6 +214,18 @@ dependencies = [ "event-listener", ] +[[package]] +name = "async-reactor-trait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6012d170ad00de56c9ee354aef2e358359deb1ec504254e0e5a3774771de0e" +dependencies = [ + "async-io", + "async-trait", + "futures-core", + "reactor-trait", +] + [[package]] name = "async-std" version = "1.12.0" @@ -375,6 +446,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-padding" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78" +dependencies = [ + "generic-array", +] + [[package]] name = "blocking" version = "1.2.0" @@ -413,6 +493,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + [[package]] name = "cc" version = "1.0.73" @@ -441,6 +530,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "cipher" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "3.2.20" @@ -495,6 +594,22 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "cookie-factory" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.3" @@ -631,6 +746,15 @@ dependencies = [ "syn", ] +[[package]] +name = "des" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" +dependencies = [ + "cipher", +] + [[package]] name = "digest" version = "0.10.3" @@ -662,6 +786,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + [[package]] name = "dotenv" version = "0.15.0" @@ -689,6 +819,7 @@ dependencies = [ "chrono", "dotenv", "futures", + "lapin", "lazy_static", "log", "migration", @@ -732,6 +863,15 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "executor-trait" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a1052dd43212a7777ec6a69b117da52f5e52f07aec47d00c1a2b33b85d06b08" +dependencies = [ + "async-trait", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -757,6 +897,18 @@ dependencies = [ "instant", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project", + "spin 0.9.4", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1101,6 +1253,16 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "block-padding", + "generic-array", +] + [[package]] name = "instant" version = "0.1.12" @@ -1143,6 +1305,28 @@ dependencies = [ "log", ] +[[package]] +name = "lapin" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd03ea5831b44775e296239a64851e2fd14a80a363d202ba147009ffc994ff0f" +dependencies = [ + "amq-protocol", + "async-global-executor-trait", + "async-reactor-trait", + "async-trait", + "executor-trait", + "flume", + "futures-core", + "futures-io", + "parking_lot 0.12.1", + "pinky-swear", + "reactor-trait", + "serde", + "tracing", + "waker-fn", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1330,6 +1514,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + [[package]] name = "os_str_bytes" version = "6.3.0" @@ -1359,6 +1549,23 @@ dependencies = [ "syn", ] +[[package]] +name = "p12" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4873306de53fe82e7e484df31e1e947d61514b6ea2ed6cd7b45d63006fd9224" +dependencies = [ + "cbc", + "cipher", + "des", + "getrandom", + "hmac", + "lazy_static", + "rc2", + "sha1", + "yasna", +] + [[package]] name = "parking" version = "2.0.0" @@ -1468,6 +1675,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pinky-swear" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d894b67aa7a4bf295db5e85349078c604edaa6fa5c8721e8eca3c7729a27f2ac" +dependencies = [ + "doc-comment", + "flume", + "parking_lot 0.12.1", + "tracing", +] + [[package]] name = "pkg-config" version = "0.3.25" @@ -1622,6 +1841,26 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rc2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" +dependencies = [ + "cipher", +] + +[[package]] +name = "reactor-trait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "438a4293e4d097556730f4711998189416232f009c137389e0f961d2bc0ddc58" +dependencies = [ + "async-trait", + "futures-core", + "futures-io", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -1677,7 +1916,7 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", + "spin 0.5.2", "untrusted", "web-sys", "winapi", @@ -1728,6 +1967,30 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls-connector" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c6a18f8d10f71bce9bca6eaeb80429460e652f3bcf0381f0c5f8954abf7b3b8" +dependencies = [ + "log", + "rustls", + "rustls-native-certs", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.1" @@ -1749,6 +2012,16 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] + [[package]] name = "scopeguard" version = "1.1.0" @@ -1923,6 +2196,29 @@ dependencies = [ "syn", ] +[[package]] +name = "security-framework" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.144" @@ -1977,6 +2273,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha1" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006769ba83e921b3085caa8334186b00cf92b4cb1a6cf4632fbccc8eff5c7549" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.5" @@ -2037,6 +2344,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +dependencies = [ + "lock_api", +] + [[package]] name = "sqlformat" version = "0.1.8" @@ -2186,6 +2502,18 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" +[[package]] +name = "tcp-stream" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a4b0a70bac0a58ca6a7659d1328e34ee462339c70b0fa49f72bad1f278910a" +dependencies = [ + "cfg-if", + "p12", + "rustls-connector", + "rustls-pemfile", +] + [[package]] name = "termcolor" version = "1.1.3" @@ -2776,6 +3104,12 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yasna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c" + [[package]] name = "zxcvbn" version = "2.2.1" diff --git a/Cargo.toml b/Cargo.toml index 4b3105d..99fbda0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,4 +43,6 @@ regex = "1.6.0" async-trait = "0.1.57" -user-agent-parser = "0.3.3" \ No newline at end of file +user-agent-parser = "0.3.3" + +lapin = "2.1.1" \ No newline at end of file diff --git a/README.md b/README.md index e3558a2..43a0c84 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,19 @@ For more information, visit https://driptorch.net/ ## Requirements: #### Deployment * PostgreSQL +* RabbitMQ #### Development * Rust 1.60+ * PostgreSQL +* RabbitMQ ## Environment Variables: -| **Variable** | **Description** | | **Required?** | -|--------------|----------------------------------------------------------------------------------------------------------|-----|---------------| -| DATABASE_URL | PostgreSQL database connection URL | | Y | -| UAP_REGEXES | Path to the [BrowserScope UA regex YAML](https://github.com/ua-parser/uap-core/blob/master/regexes.yaml) | | N | +| **Variable** | **Description** | **Required?** | +|:------------:|:--------------------------------------------------------------------------------------------------------:|:-------------:| +| DATABASE_URL | PostgreSQL database connection URL | Y | +| AMQP_ADDR | Message queue (RabbitMQ) connection URL | Y | +| UAP_REGEXES | Path to the [BrowserScope UA regex YAML](https://github.com/ua-parser/uap-core/blob/master/regexes.yaml) | N | --- diff --git a/src/main.rs b/src/main.rs index 22bbb01..ec0af5f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use axum::extract::Extension; use axum::Router; use axum::routing::{delete, get, post}; use dotenv::dotenv; +use lapin::ConnectionProperties; use sea_orm::{ConnectOptions, Database}; use sea_orm_migration::prelude::*; use tower::ServiceBuilder; @@ -67,14 +68,27 @@ async fn main() { .await .expect("Failed to run migrations! Halting start-up."); + info!("Connecting to message broker..."); + let amqp_addr = env::var("AMQP_ADDR") + .expect("AMQP_ADDR mut be set! Halting start-up."); + let amqp_connection = lapin::Connection::connect(&amqp_addr, ConnectionProperties::default()) + .await + .expect("Failed to connect to the message broker! Halting start-up."); + let amqp_channel = amqp_connection.create_channel() + .await + .expect("Failed to create a message broker channel! Halting start-up."); + info!("Starting web server..."); let app = Router::new() - // Auth - .route("/user/register", post(routes::auth::register::register)) - .route("/user/login", post(routes::auth::login::login)) - .route("/user/logout", post(routes::auth::logout::logout)) - .route("/user/delete", delete(routes::auth::delete::delete)) - .route("/user/list_sessions", get(routes::auth::list_sessions::list_sessions)) + // Users + //-- Auth + .route("/user/register", post(routes::users::register::register)) + .route("/user/login", post(routes::users::login::login)) + .route("/user/logout", post(routes::users::logout::logout)) + .route("/user/delete", delete(routes::users::delete::delete)) + //-- Information + .route("/user/list_sessions", get(routes::users::list_sessions::list_sessions)) + //-- Settings // Teams @@ -93,6 +107,7 @@ async fn main() { .layer( ServiceBuilder::new() .layer(Extension(connection)) + .layer(Extension(amqp_channel)) ); let addr = env::var("LISTEN_ADDR") @@ -103,11 +118,10 @@ async fn main() { let axum_builder = axum::Server::try_bind(&socket_addr); match axum_builder { - Ok(_) => { + Ok(axum_builder) => { info!("Driptorch Controller v{} is now listening on {}!", VERSION, socket_addr); axum_builder - .expect("Passed builder match but still returned error? Halting start-up.") .serve(app.into_make_service_with_connect_info::()) .await .expect("Failed to bind to port! Halting start-up."); diff --git a/src/routes/mod.rs b/src/routes/mod.rs index b42dd41..fc3c87d 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,2 +1,2 @@ pub mod status; -pub mod auth; \ No newline at end of file +pub mod users; \ No newline at end of file diff --git a/src/routes/auth/delete.rs b/src/routes/users/delete.rs similarity index 100% rename from src/routes/auth/delete.rs rename to src/routes/users/delete.rs diff --git a/src/routes/auth/list_sessions.rs b/src/routes/users/list_sessions.rs similarity index 100% rename from src/routes/auth/list_sessions.rs rename to src/routes/users/list_sessions.rs diff --git a/src/routes/auth/login.rs b/src/routes/users/login.rs similarity index 100% rename from src/routes/auth/login.rs rename to src/routes/users/login.rs diff --git a/src/routes/auth/logout.rs b/src/routes/users/logout.rs similarity index 100% rename from src/routes/auth/logout.rs rename to src/routes/users/logout.rs diff --git a/src/routes/auth/mod.rs b/src/routes/users/mod.rs similarity index 100% rename from src/routes/auth/mod.rs rename to src/routes/users/mod.rs diff --git a/src/routes/auth/register.rs b/src/routes/users/register.rs similarity index 100% rename from src/routes/auth/register.rs rename to src/routes/users/register.rs diff --git a/src/util/auth.rs b/src/util/auth.rs index ed176dc..cf29232 100644 --- a/src/util/auth.rs +++ b/src/util/auth.rs @@ -97,7 +97,7 @@ impl FromRequestParts for UserFromBearer Some((name, contents)) if name == "Bearer" => { // Get database connection from header let connection: &DatabaseConnection = parts.extensions.get::() - .expect("Failed to get database connection from auth extractor"); + .expect("Failed to get database connection from users extractor"); match get_user_from_token(contents.to_string(), connection).await { None => {