Add message queue

This commit is contained in:
Evie Viau-Chow-Stuart 2022-09-13 09:16:28 -04:00
parent f7f62c35d2
commit 6a22481d31
Signed by: evie
GPG key ID: 928652CDFCEC8099
12 changed files with 369 additions and 16 deletions

336
Cargo.lock generated
View file

@ -34,6 +34,54 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" 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]] [[package]]
name = "android_system_properties" name = "android_system_properties"
version = "0.1.5" version = "0.1.5"
@ -126,6 +174,17 @@ dependencies = [
"tokio", "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]] [[package]]
name = "async-io" name = "async-io"
version = "1.9.0" version = "1.9.0"
@ -155,6 +214,18 @@ dependencies = [
"event-listener", "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]] [[package]]
name = "async-std" name = "async-std"
version = "1.12.0" version = "1.12.0"
@ -375,6 +446,15 @@ dependencies = [
"generic-array", "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]] [[package]]
name = "blocking" name = "blocking"
version = "1.2.0" version = "1.2.0"
@ -413,6 +493,15 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
[[package]]
name = "cbc"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"
dependencies = [
"cipher",
]
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.73" version = "1.0.73"
@ -441,6 +530,16 @@ dependencies = [
"winapi", "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]] [[package]]
name = "clap" name = "clap"
version = "3.2.20" version = "3.2.20"
@ -495,6 +594,22 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 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]] [[package]]
name = "core-foundation-sys" name = "core-foundation-sys"
version = "0.8.3" version = "0.8.3"
@ -631,6 +746,15 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "des"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e"
dependencies = [
"cipher",
]
[[package]] [[package]]
name = "digest" name = "digest"
version = "0.10.3" version = "0.10.3"
@ -662,6 +786,12 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "doc-comment"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]] [[package]]
name = "dotenv" name = "dotenv"
version = "0.15.0" version = "0.15.0"
@ -689,6 +819,7 @@ dependencies = [
"chrono", "chrono",
"dotenv", "dotenv",
"futures", "futures",
"lapin",
"lazy_static", "lazy_static",
"log", "log",
"migration", "migration",
@ -732,6 +863,15 @@ version = "2.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 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]] [[package]]
name = "fallible-iterator" name = "fallible-iterator"
version = "0.2.0" version = "0.2.0"
@ -757,6 +897,18 @@ dependencies = [
"instant", "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]] [[package]]
name = "fnv" name = "fnv"
version = "1.0.7" version = "1.0.7"
@ -1101,6 +1253,16 @@ dependencies = [
"hashbrown", "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]] [[package]]
name = "instant" name = "instant"
version = "0.1.12" version = "0.1.12"
@ -1143,6 +1305,28 @@ dependencies = [
"log", "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]] [[package]]
name = "lazy_static" name = "lazy_static"
version = "1.4.0" version = "1.4.0"
@ -1330,6 +1514,12 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "openssl-probe"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]] [[package]]
name = "os_str_bytes" name = "os_str_bytes"
version = "6.3.0" version = "6.3.0"
@ -1359,6 +1549,23 @@ dependencies = [
"syn", "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]] [[package]]
name = "parking" name = "parking"
version = "2.0.0" version = "2.0.0"
@ -1468,6 +1675,18 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 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]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.25" version = "0.3.25"
@ -1622,6 +1841,26 @@ dependencies = [
"getrandom", "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]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.2.16" version = "0.2.16"
@ -1677,7 +1916,7 @@ dependencies = [
"cc", "cc",
"libc", "libc",
"once_cell", "once_cell",
"spin", "spin 0.5.2",
"untrusted", "untrusted",
"web-sys", "web-sys",
"winapi", "winapi",
@ -1728,6 +1967,30 @@ dependencies = [
"webpki", "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]] [[package]]
name = "rustls-pemfile" name = "rustls-pemfile"
version = "1.0.1" version = "1.0.1"
@ -1749,6 +2012,16 @@ version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 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]] [[package]]
name = "scopeguard" name = "scopeguard"
version = "1.1.0" version = "1.1.0"
@ -1923,6 +2196,29 @@ dependencies = [
"syn", "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]] [[package]]
name = "serde" name = "serde"
version = "1.0.144" version = "1.0.144"
@ -1977,6 +2273,17 @@ dependencies = [
"digest", "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]] [[package]]
name = "sha2" name = "sha2"
version = "0.10.5" version = "0.10.5"
@ -2037,6 +2344,15 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 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]] [[package]]
name = "sqlformat" name = "sqlformat"
version = "0.1.8" version = "0.1.8"
@ -2186,6 +2502,18 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" 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]] [[package]]
name = "termcolor" name = "termcolor"
version = "1.1.3" version = "1.1.3"
@ -2776,6 +3104,12 @@ dependencies = [
"linked-hash-map", "linked-hash-map",
] ]
[[package]]
name = "yasna"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c"
[[package]] [[package]]
name = "zxcvbn" name = "zxcvbn"
version = "2.2.1" version = "2.2.1"

View file

@ -43,4 +43,6 @@ regex = "1.6.0"
async-trait = "0.1.57" async-trait = "0.1.57"
user-agent-parser = "0.3.3" user-agent-parser = "0.3.3"
lapin = "2.1.1"

View file

@ -7,16 +7,19 @@ For more information, visit https://driptorch.net/
## Requirements: ## Requirements:
#### Deployment #### Deployment
* PostgreSQL * PostgreSQL
* RabbitMQ
#### Development #### Development
* Rust 1.60+ * Rust 1.60+
* PostgreSQL * PostgreSQL
* RabbitMQ
## Environment Variables: ## Environment Variables:
| **Variable** | **Description** | | **Required?** | | **Variable** | **Description** | **Required?** |
|--------------|----------------------------------------------------------------------------------------------------------|-----|---------------| |:------------:|:--------------------------------------------------------------------------------------------------------:|:-------------:|
| DATABASE_URL | PostgreSQL database connection URL | | Y | | 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 | | 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 |
--- ---

View file

@ -8,6 +8,7 @@ use axum::extract::Extension;
use axum::Router; use axum::Router;
use axum::routing::{delete, get, post}; use axum::routing::{delete, get, post};
use dotenv::dotenv; use dotenv::dotenv;
use lapin::ConnectionProperties;
use sea_orm::{ConnectOptions, Database}; use sea_orm::{ConnectOptions, Database};
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
use tower::ServiceBuilder; use tower::ServiceBuilder;
@ -67,14 +68,27 @@ async fn main() {
.await .await
.expect("Failed to run migrations! Halting start-up."); .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..."); info!("Starting web server...");
let app = Router::new() let app = Router::new()
// Auth // Users
.route("/user/register", post(routes::auth::register::register)) //-- Auth
.route("/user/login", post(routes::auth::login::login)) .route("/user/register", post(routes::users::register::register))
.route("/user/logout", post(routes::auth::logout::logout)) .route("/user/login", post(routes::users::login::login))
.route("/user/delete", delete(routes::auth::delete::delete)) .route("/user/logout", post(routes::users::logout::logout))
.route("/user/list_sessions", get(routes::auth::list_sessions::list_sessions)) .route("/user/delete", delete(routes::users::delete::delete))
//-- Information
.route("/user/list_sessions", get(routes::users::list_sessions::list_sessions))
//-- Settings
// Teams // Teams
@ -93,6 +107,7 @@ async fn main() {
.layer( .layer(
ServiceBuilder::new() ServiceBuilder::new()
.layer(Extension(connection)) .layer(Extension(connection))
.layer(Extension(amqp_channel))
); );
let addr = env::var("LISTEN_ADDR") let addr = env::var("LISTEN_ADDR")
@ -103,11 +118,10 @@ async fn main() {
let axum_builder = axum::Server::try_bind(&socket_addr); let axum_builder = axum::Server::try_bind(&socket_addr);
match axum_builder { match axum_builder {
Ok(_) => { Ok(axum_builder) => {
info!("Driptorch Controller v{} is now listening on {}!", VERSION, socket_addr); info!("Driptorch Controller v{} is now listening on {}!", VERSION, socket_addr);
axum_builder axum_builder
.expect("Passed builder match but still returned error? Halting start-up.")
.serve(app.into_make_service_with_connect_info::<SocketAddr>()) .serve(app.into_make_service_with_connect_info::<SocketAddr>())
.await .await
.expect("Failed to bind to port! Halting start-up."); .expect("Failed to bind to port! Halting start-up.");

View file

@ -1,2 +1,2 @@
pub mod status; pub mod status;
pub mod auth; pub mod users;

View file

@ -97,7 +97,7 @@ impl<S> FromRequestParts<S> for UserFromBearer
Some((name, contents)) if name == "Bearer" => { Some((name, contents)) if name == "Bearer" => {
// Get database connection from header // Get database connection from header
let connection: &DatabaseConnection = parts.extensions.get::<DatabaseConnection>() let connection: &DatabaseConnection = parts.extensions.get::<DatabaseConnection>()
.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 { match get_user_from_token(contents.to_string(), connection).await {
None => { None => {