From 955e482daef8a00e2ad4c9c4aa2dac964c5f156d Mon Sep 17 00:00:00 2001 From: Paul Makles <paulmakles@gmail.com> Date: Sun, 26 Jan 2020 15:20:32 +0000 Subject: [PATCH] Add extra guards, begin working on channels. --- Cargo.lock | 41 ++++++++++++++++++++++++++++ Cargo.toml | 1 + src/{ => guards}/auth.rs | 4 +-- src/guards/channel.rs | 58 ++++++++++++++++++++++++++++++++++++++++ src/guards/mod.rs | 2 ++ src/main.rs | 2 +- src/routes/channel.rs | 12 +++++++++ src/routes/user.rs | 2 +- 8 files changed, 118 insertions(+), 4 deletions(-) rename src/{ => guards}/auth.rs (97%) create mode 100644 src/guards/channel.rs create mode 100644 src/guards/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 4e5d179..7076900 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,6 +1160,26 @@ dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num_enum" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num_enum_derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num_enum_derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "once_cell" version = "1.3.1" @@ -1321,6 +1341,14 @@ name = "ppv-lite86" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro-crate" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "proc-macro-error" version = "0.2.6" @@ -1627,6 +1655,7 @@ dependencies = [ "lettre 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "lettre_email 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "mongodb 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_enum 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2272,6 +2301,14 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "toml" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tower-service" version = "0.3.0" @@ -2828,6 +2865,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" "checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" "checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72" +"checksum num_enum 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "be601e38e20a6f3d01049d85801cb9b7a34a8da7a0da70df507bbde7735058c8" +"checksum num_enum_derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b59f30f6a043f2606adbd0addbf1eef6f2e28e8c4968918b63b7ff97ac0db2a7" "checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" "checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585" @@ -2847,6 +2886,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aeccfe4d5d8ea175d5f0e4a2ad0637e0f4121d63bd99d356fb1f39ab2e7c6097" "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" @@ -2940,6 +2980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" "checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum trust-dns-proto 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05457ece29839d056d8cb66ec080209d34492b3d2e7e00641b486977be973db9" diff --git a/Cargo.toml b/Cargo.toml index 4ff41a7..282c0d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,3 +24,4 @@ chrono = "0.4.10" rand = "0.7.3" time = "0.2.4" reqwest = { version = "0.10.1", features = ["blocking", "json"] } +num_enum = "0.4.2" diff --git a/src/auth.rs b/src/guards/auth.rs similarity index 97% rename from src/auth.rs rename to src/guards/auth.rs index 2e5e9ef..6d60c33 100644 --- a/src/auth.rs +++ b/src/guards/auth.rs @@ -33,7 +33,7 @@ impl<'a, 'r> FromRequest<'a, 'r> for User { let result = col.find_one(doc! { "access_token": key }, None).unwrap(); if let Some(user) = result { - Outcome::Success(User( + Outcome::Success(User ( Ulid::from_string(user.get_str("_id").unwrap()).unwrap(), user.get_str("username").unwrap().to_string(), user @@ -55,7 +55,7 @@ impl<'r> FromParam<'r> for User { let result = col.find_one(doc! { "_id": param.to_string() }, None).unwrap(); if let Some(user) = result { - Ok(User( + Ok(User ( Ulid::from_string(user.get_str("_id").unwrap()).unwrap(), user.get_str("username").unwrap().to_string(), user diff --git a/src/guards/channel.rs b/src/guards/channel.rs new file mode 100644 index 0000000..5681ee9 --- /dev/null +++ b/src/guards/channel.rs @@ -0,0 +1,58 @@ +use rocket::Outcome; +use rocket::http::{ Status, RawStr }; +use rocket::request::{ self, Request, FromRequest, FromParam }; + +use bson::{ bson, doc, ordered::OrderedDocument }; +use std::convert::TryFrom; +use ulid::Ulid; + +use crate::database; +use crate::routes::channel::ChannelType; + +pub struct Channel ( + pub Ulid, + pub ChannelType, + pub OrderedDocument, +); + +pub struct Message ( + pub Ulid, + pub OrderedDocument, +); + +impl<'r> FromParam<'r> for Channel { + type Error = &'r RawStr; + + fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> { + let col = database::get_db().collection("channels"); + let result = col.find_one(doc! { "_id": param.to_string() }, None).unwrap(); + + if let Some(channel) = result { + Ok(Channel ( + Ulid::from_string(channel.get_str("_id").unwrap()).unwrap(), + ChannelType::try_from(channel.get_i32("username").unwrap() as usize).unwrap(), + channel + )) + } else { + Err(param) + } + } +} + +impl<'r> FromParam<'r> for Message { + type Error = &'r RawStr; + + fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> { + let col = database::get_db().collection("messages"); + let result = col.find_one(doc! { "_id": param.to_string() }, None).unwrap(); + + if let Some(message) = result { + Ok(Message ( + Ulid::from_string(message.get_str("_id").unwrap()).unwrap(), + message + )) + } else { + Err(param) + } + } +} diff --git a/src/guards/mod.rs b/src/guards/mod.rs new file mode 100644 index 0000000..4ea651a --- /dev/null +++ b/src/guards/mod.rs @@ -0,0 +1,2 @@ +pub mod auth; +pub mod channel; diff --git a/src/main.rs b/src/main.rs index 1c6dc60..1c2738f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,9 +3,9 @@ #[macro_use] extern crate rocket_contrib; pub mod database; +pub mod guards; pub mod routes; pub mod email; -pub mod auth; use dotenv; diff --git a/src/routes/channel.rs b/src/routes/channel.rs index 7472909..c7c8f11 100644 --- a/src/routes/channel.rs +++ b/src/routes/channel.rs @@ -1,3 +1,15 @@ +use crate::guards::auth::User; +use crate::database; + +use rocket_contrib::json::{ Json, JsonValue }; +use serde::{ Serialize, Deserialize }; +use mongodb::options::FindOptions; +use num_enum::TryFromPrimitive; +use bson::{ bson, doc }; +use ulid::Ulid; + +#[derive(Debug, TryFromPrimitive)] +#[repr(usize)] pub enum ChannelType { DM = 0, GROUP_DM = 1, diff --git a/src/routes/user.rs b/src/routes/user.rs index 3ca0284..52f069f 100644 --- a/src/routes/user.rs +++ b/src/routes/user.rs @@ -1,4 +1,4 @@ -use crate::auth::User; +use crate::guards::auth::User; use crate::database; use crate::routes::channel; -- GitLab