From fc32996b51f5bf983fdd20d08028938841b10d3f Mon Sep 17 00:00:00 2001 From: ToastXC <100072983+toastxc@users.noreply.github.com> Date: Thu, 19 Jan 2023 02:16:27 +0800 Subject: [PATCH 01/23] chore: remove clippy warnings (#213) --- crates/quark/src/events/impl.rs | 6 +----- crates/quark/src/permissions/defn/mod.rs | 2 +- crates/quark/src/presence/mod.rs | 4 ++-- crates/quark/src/tasks/process_embeds.rs | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/crates/quark/src/events/impl.rs b/crates/quark/src/events/impl.rs index 0dd41e16..6da72a77 100644 --- a/crates/quark/src/events/impl.rs +++ b/crates/quark/src/events/impl.rs @@ -23,11 +23,7 @@ impl Cache { pub async fn can_view_channel(&self, db: &Database, channel: &Channel) -> bool { match &channel { Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - let member = self - .members - .iter() - .map(|(_, x)| x) - .find(|x| &x.id.server == server); + let member = self.members.values().find(|x| &x.id.server == server); let server = self.servers.get(server); let mut perms = perms(self.users.get(&self.user_id).unwrap()).channel(channel); diff --git a/crates/quark/src/permissions/defn/mod.rs b/crates/quark/src/permissions/defn/mod.rs index 6f46254f..a665b903 100644 --- a/crates/quark/src/permissions/defn/mod.rs +++ b/crates/quark/src/permissions/defn/mod.rs @@ -97,7 +97,7 @@ impl From for PermissionValue { impl From for PermissionValue { fn from(v: u64) -> Self { - Self(v as u64) + Self(v) } } diff --git a/crates/quark/src/presence/mod.rs b/crates/quark/src/presence/mod.rs index 2f301f84..73c14b6a 100644 --- a/crates/quark/src/presence/mod.rs +++ b/crates/quark/src/presence/mod.rs @@ -35,7 +35,7 @@ pub async fn presence_create_session(user_id: &str, flags: u8) -> (bool, u8) { __set_key_presence_entry(&mut conn, user_id, entry).await; // Add to region set in case of failure. - __add_to_set_sessions(&mut conn, &*REGION_KEY, user_id, session_id).await; + __add_to_set_sessions(&mut conn, ®ION_KEY, user_id, session_id).await; (was_empty, session_id) } @@ -74,7 +74,7 @@ async fn presence_delete_session_internal( // Remove from region set. if !skip_region { - __remove_from_set_sessions(&mut conn, &*REGION_KEY, user_id, session_id).await; + __remove_from_set_sessions(&mut conn, ®ION_KEY, user_id, session_id).await; } } diff --git a/crates/quark/src/tasks/process_embeds.rs b/crates/quark/src/tasks/process_embeds.rs index 5514c25c..11c37215 100644 --- a/crates/quark/src/tasks/process_embeds.rs +++ b/crates/quark/src/tasks/process_embeds.rs @@ -38,7 +38,7 @@ pub async fn queue(channel: String, id: String, content: String) { pub async fn worker(db: Database) { loop { let task = Q.pop().await; - if let Ok(embeds) = Embed::generate(task.content, &*JANUARY_URL, *MAX_EMBED_COUNT).await { + if let Ok(embeds) = Embed::generate(task.content, &JANUARY_URL, *MAX_EMBED_COUNT).await { if let Err(err) = Message::append( &db, task.id, From ce6b454874ef0cf4fe4e372b7fa16b35321113da Mon Sep 17 00:00:00 2001 From: Lea Date: Wed, 23 Nov 2022 22:49:14 +0100 Subject: [PATCH 02/23] fix: raise masquerade avatar URL length limit --- crates/quark/src/models/channels/message.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/quark/src/models/channels/message.rs b/crates/quark/src/models/channels/message.rs index af66c473..ee9e61cf 100644 --- a/crates/quark/src/models/channels/message.rs +++ b/crates/quark/src/models/channels/message.rs @@ -81,7 +81,7 @@ pub struct Masquerade { pub name: Option, /// Replace the avatar shown on this message (URL to image file) #[serde(skip_serializing_if = "Option::is_none")] - #[validate(length(min = 1, max = 128))] + #[validate(length(min = 1, max = 256))] pub avatar: Option, /// Replace the display role colour shown on this message /// From 4a7917e9ea1bd22b5f0e33aadf3d5ca46dfed049 Mon Sep 17 00:00:00 2001 From: Sophie L Date: Fri, 2 Sep 2022 17:18:44 +0100 Subject: [PATCH 03/23] feat: enable reactions by default in servers/DMs --- crates/quark/src/permissions/defn/permission.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/crates/quark/src/permissions/defn/permission.rs b/crates/quark/src/permissions/defn/permission.rs index 215710ad..2ebb0257 100644 --- a/crates/quark/src/permissions/defn/permission.rs +++ b/crates/quark/src/permissions/defn/permission.rs @@ -24,7 +24,7 @@ pub enum Permission { /// Manage server customisation (includes emoji) ManageCustomisation = 1 << 4, - // % 1 bits reserved + // % 1 bit reserved // * Member permissions /// Kick other members below their ranking @@ -109,10 +109,11 @@ lazy_static! { + Permission::Connect + Permission::Speak; pub static ref DEFAULT_PERMISSION_SAVED_MESSAGES: u64 = Permission::GrantAllSafe as u64; - pub static ref DEFAULT_PERMISSION_DIRECT_MESSAGE: u64 = - *DEFAULT_PERMISSION + Permission::ManageChannel; + pub static ref DEFAULT_PERMISSION_DIRECT_MESSAGE: u64 = *DEFAULT_PERMISSION + + Permission::ManageChannel + + Permission::React; pub static ref DEFAULT_PERMISSION_SERVER: u64 = - *DEFAULT_PERMISSION + Permission::ChangeNickname + Permission::ChangeAvatar; + *DEFAULT_PERMISSION + Permission::React + Permission::ChangeNickname + Permission::ChangeAvatar; } bitfield! { From 94b04729343979b5539faa60abdbf27d1f052e59 Mon Sep 17 00:00:00 2001 From: Ryan <38785445+ryanalexander@users.noreply.github.com> Date: Thu, 19 Jan 2023 04:17:59 +1000 Subject: [PATCH 04/23] feat: pass server flags with invite data (#203) --- crates/delta/src/routes/invites/invite_fetch.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/delta/src/routes/invites/invite_fetch.rs b/crates/delta/src/routes/invites/invite_fetch.rs index e931b66d..8eb3b439 100644 --- a/crates/delta/src/routes/invites/invite_fetch.rs +++ b/crates/delta/src/routes/invites/invite_fetch.rs @@ -23,6 +23,9 @@ pub enum InviteResponse { /// Attachment for server banner #[serde(skip_serializing_if = "Option::is_none")] server_banner: Option, + /// Enum of server flags + #[serde(skip_serializing_if = "Option::is_none")] + server_flags: Option, /// Id of server channel channel_id: String, /// Name of server channel @@ -94,6 +97,7 @@ pub async fn req(db: &Db, target: Ref) -> Result> { server_name: server.name, server_icon: server.icon, server_banner: server.banner, + server_flags: server.flags, channel_id: id, channel_name: name, channel_description: description, From d9d2735efae31b4bf3732ca524cd6e4a398bcee6 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Wed, 18 Jan 2023 18:26:00 +0000 Subject: [PATCH 05/23] fix(ratelimiter): re-calculate reset time closes #204 Co-authored-by: TheBobBobs <84781603+TheBobBobs@users.noreply.github.com> --- crates/quark/src/web/ratelimiter.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/crates/quark/src/web/ratelimiter.rs b/crates/quark/src/web/ratelimiter.rs index f7e0dd62..d77701db 100644 --- a/crates/quark/src/web/ratelimiter.rs +++ b/crates/quark/src/web/ratelimiter.rs @@ -51,7 +51,7 @@ impl Entry { } /// Deduct one unit from the bucket and save - pub fn deduct(mut self, key: u64) { + pub fn deduct(mut self) { let current_time = now().as_millis(); if current_time > self.reset { self.used = 1; @@ -59,7 +59,10 @@ impl Entry { } else { self.used += 1; } + } + /// Save information + pub fn save(self, key: u64) { MAP.insert(key, self); } @@ -189,10 +192,12 @@ impl Ratelimiter { let entry = Entry::from(key); let remaining = entry.get_remaining(limit); - let reset = entry.left_until_reset(); - if remaining > 0 { - entry.deduct(key); + entry.deduct(); + + let reset = entry.left_until_reset(); + entry.save(key); + Ok(Ratelimiter { key, limit, @@ -200,7 +205,7 @@ impl Ratelimiter { reset, }) } else { - Err(reset) + Err(entry.left_until_reset()) } } } From cc2054838a658e8d3141a88e075fc588827a0c85 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Wed, 18 Jan 2023 15:54:15 +0000 Subject: [PATCH 06/23] chore: swap okapi for revolt_okapi --- Cargo.lock | 75 ++++++++++++++++--- crates/delta/Cargo.toml | 5 +- crates/delta/src/main.rs | 2 +- crates/delta/src/routes/bots/mod.rs | 2 +- crates/delta/src/routes/channels/mod.rs | 2 +- crates/delta/src/routes/customisation/mod.rs | 2 +- crates/delta/src/routes/invites/mod.rs | 2 +- crates/delta/src/routes/mod.rs | 4 +- crates/delta/src/routes/onboard/mod.rs | 2 +- crates/delta/src/routes/push/mod.rs | 2 +- crates/delta/src/routes/servers/mod.rs | 2 +- crates/delta/src/routes/sync/mod.rs | 2 +- .../src/routes/users/get_default_avatar.rs | 8 +- crates/delta/src/routes/users/mod.rs | 2 +- crates/quark/Cargo.toml | 10 +-- crates/quark/src/impl/rocket.rs | 8 +- crates/quark/src/util/result.rs | 11 +-- crates/quark/src/web/idempotency.rs | 8 +- crates/quark/src/web/ratelimiter.rs | 6 +- crates/quark/src/web/swagger.rs | 2 +- 20 files changed, 103 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d74da317..63bd840a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2842,9 +2842,9 @@ dependencies = [ "regex", "reqwest", "revolt-quark", + "revolt_rocket_okapi", "rocket", - "rocket_empty", - "rocket_okapi", + "rocket_empty 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rocket_rauth", "schemars", "serde", @@ -2880,7 +2880,6 @@ dependencies = [ "mongodb", "nanoid", "num_enum", - "okapi", "once_cell", "optional_struct", "pretty_env_logger", @@ -2888,11 +2887,12 @@ dependencies = [ "redis-kiss", "regex", "reqwest", + "revolt_okapi", + "revolt_rocket_okapi", "rocket", "rocket_cors", - "rocket_empty", + "rocket_empty 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rocket_http", - "rocket_okapi", "schemars", "sentry", "serde", @@ -2902,6 +2902,47 @@ dependencies = [ "web-push", ] +[[package]] +name = "revolt_okapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23bfdf7ae769c3042fe727f6e5c17363b02a64b4b33ad60c3e5f73b26df7835b" +dependencies = [ + "log", + "schemars", + "serde", + "serde_json", +] + +[[package]] +name = "revolt_rocket_okapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "275e1e9bd3343f75225cafa64f4bfb939c8b21c5f861141180fc0e24769ff6cf" +dependencies = [ + "either", + "log", + "revolt_okapi", + "revolt_rocket_okapi_codegen", + "rocket", + "schemars", + "serde", + "serde_json", +] + +[[package]] +name = "revolt_rocket_okapi_codegen" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6620569d8ac8f0a1690fcca13f488503807a60e96ebf729749b59aca1dbef9" +dependencies = [ + "darling", + "proc-macro2", + "quote 1.0.18", + "rocket_http", + "syn 1.0.96", +] + [[package]] name = "ring" version = "0.16.20" @@ -2996,9 +3037,10 @@ dependencies = [ [[package]] name = "rocket_cors" -version = "0.5.2" -source = "git+https://github.com/lawliet89/rocket_cors?rev=5843861a88958c16bfaa0b40f0d8910772bcd2f6#5843861a88958c16bfaa0b40f0d8910772bcd2f6" +version = "0.6.0-alpha1" +source = "git+https://github.com/lawliet89/rocket_cors?rev=c17e8145baa4790319fdb6a473e465b960f55e7c#c17e8145baa4790319fdb6a473e465b960f55e7c" dependencies = [ + "http", "log", "regex", "rocket", @@ -3011,12 +3053,21 @@ dependencies = [ [[package]] name = "rocket_empty" -version = "0.1.0" -source = "git+https://github.com/insertish/rocket_empty?branch=master#9d8234fc3bb215ea241b787301e8cff68ae53652" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c0922e47f981204fee38578a8efcf47a5c1a4ac0eb7f59e6bdfa3e61c8e3d69" +dependencies = [ + "revolt_okapi", + "revolt_rocket_okapi", + "rocket", +] + +[[package]] +name = "rocket_empty" +version = "0.1.1" +source = "git+https://github.com/insertish/rocket_empty?branch=master#7488be6a5d2a70744fe81b9dcc60df5866b4c8ba" dependencies = [ - "okapi", "rocket", - "rocket_okapi", ] [[package]] @@ -3082,7 +3133,7 @@ dependencies = [ "okapi", "rauth", "rocket", - "rocket_empty", + "rocket_empty 0.1.1 (git+https://github.com/insertish/rocket_empty?branch=master)", "rocket_okapi", "schemars", "serde", diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index c59b7b50..39d2814b 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -51,13 +51,12 @@ mobc-redis = { version = "0.7.0", default-features = false, features = ["async-s # web rocket = { version = "0.5.0-rc.2", default-features = false, features = ["json"] } -rocket_empty = { git = "https://github.com/insertish/rocket_empty", branch = "master" } +rocket_empty = { version = "0.1.1", features = ["schema"] } rocket_rauth = { git = "https://github.com/insertish/rauth", rev = "cbdec69c684a4854fbedba9ed1f0e7ee466bf3f7" } # spec generation schemars = "0.8.8" -# rocket_okapi = "0.8.0-rc.1" -rocket_okapi = { git = "https://github.com/insertish/okapi", rev = "a1048d0c8cd771e424ec97d33d825c32e06aa120", features = [ "swagger" ] } +revolt_rocket_okapi = { version = "0.9.1", features = [ "swagger" ] } # quark revolt-quark = { path = "../quark" } diff --git a/crates/delta/src/main.rs b/crates/delta/src/main.rs index 1851101e..728bdcf6 100644 --- a/crates/delta/src/main.rs +++ b/crates/delta/src/main.rs @@ -1,7 +1,7 @@ #[macro_use] extern crate rocket; #[macro_use] -extern crate rocket_okapi; +extern crate revolt_rocket_okapi; #[macro_use] extern crate serde_json; #[macro_use] diff --git a/crates/delta/src/routes/bots/mod.rs b/crates/delta/src/routes/bots/mod.rs index c29b90e5..0ae1a954 100644 --- a/crates/delta/src/routes/bots/mod.rs +++ b/crates/delta/src/routes/bots/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod create; mod delete; diff --git a/crates/delta/src/routes/channels/mod.rs b/crates/delta/src/routes/channels/mod.rs index 255660d4..60ff88cd 100644 --- a/crates/delta/src/routes/channels/mod.rs +++ b/crates/delta/src/routes/channels/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod channel_ack; mod channel_delete; diff --git a/crates/delta/src/routes/customisation/mod.rs b/crates/delta/src/routes/customisation/mod.rs index 19ce099a..56d40995 100644 --- a/crates/delta/src/routes/customisation/mod.rs +++ b/crates/delta/src/routes/customisation/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod emoji_create; mod emoji_delete; diff --git a/crates/delta/src/routes/invites/mod.rs b/crates/delta/src/routes/invites/mod.rs index 059b6d94..7d64a7d9 100644 --- a/crates/delta/src/routes/invites/mod.rs +++ b/crates/delta/src/routes/invites/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod invite_delete; mod invite_fetch; diff --git a/crates/delta/src/routes/mod.rs b/crates/delta/src/routes/mod.rs index f50ef91f..b1af7ecf 100644 --- a/crates/delta/src/routes/mod.rs +++ b/crates/delta/src/routes/mod.rs @@ -1,7 +1,7 @@ +use revolt_rocket_okapi::{revolt_okapi::openapi3::OpenApi, settings::OpenApiSettings}; pub use rocket::http::Status; pub use rocket::response::Redirect; use rocket::{Build, Rocket}; -use rocket_okapi::{okapi::openapi3::OpenApi, settings::OpenApiSettings}; mod bots; mod channels; @@ -39,7 +39,7 @@ pub fn mount(mut rocket: Rocket) -> Rocket { } fn custom_openapi_spec() -> OpenApi { - use rocket_okapi::okapi::openapi3::*; + use revolt_rocket_okapi::revolt_okapi::openapi3::*; let mut extensions = schemars::Map::new(); extensions.insert( diff --git a/crates/delta/src/routes/onboard/mod.rs b/crates/delta/src/routes/onboard/mod.rs index 16ec2708..68da95ab 100644 --- a/crates/delta/src/routes/onboard/mod.rs +++ b/crates/delta/src/routes/onboard/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod complete; mod hello; diff --git a/crates/delta/src/routes/push/mod.rs b/crates/delta/src/routes/push/mod.rs index e5d5d151..2409dc60 100644 --- a/crates/delta/src/routes/push/mod.rs +++ b/crates/delta/src/routes/push/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod subscribe; mod unsubscribe; diff --git a/crates/delta/src/routes/servers/mod.rs b/crates/delta/src/routes/servers/mod.rs index 8cea54f2..15cdd735 100644 --- a/crates/delta/src/routes/servers/mod.rs +++ b/crates/delta/src/routes/servers/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod ban_create; mod ban_list; diff --git a/crates/delta/src/routes/sync/mod.rs b/crates/delta/src/routes/sync/mod.rs index 4083bd44..35acf239 100644 --- a/crates/delta/src/routes/sync/mod.rs +++ b/crates/delta/src/routes/sync/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod get_settings; mod get_unreads; diff --git a/crates/delta/src/routes/users/get_default_avatar.rs b/crates/delta/src/routes/users/get_default_avatar.rs index b388ba6b..5b39b320 100644 --- a/crates/delta/src/routes/users/get_default_avatar.rs +++ b/crates/delta/src/routes/users/get_default_avatar.rs @@ -1,7 +1,7 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::{self, MediaType, RefOr}; use rocket::http::ContentType; use rocket::response::{self, Responder}; use rocket::{Request, Response}; -use rocket_okapi::okapi::openapi3::{self, MediaType, RefOr}; use schemars::schema::{InstanceType, SchemaObject, SingleOrVec}; pub struct CachedFile((ContentType, Vec)); @@ -16,10 +16,10 @@ impl<'r> Responder<'r, 'static> for CachedFile { } } -impl rocket_okapi::response::OpenApiResponderInner for CachedFile { +impl revolt_rocket_okapi::response::OpenApiResponderInner for CachedFile { fn responses( - _gen: &mut rocket_okapi::gen::OpenApiGenerator, - ) -> std::result::Result { + _gen: &mut revolt_rocket_okapi::gen::OpenApiGenerator, + ) -> std::result::Result { let mut responses = schemars::Map::new(); let mut content = schemars::Map::new(); diff --git a/crates/delta/src/routes/users/mod.rs b/crates/delta/src/routes/users/mod.rs index 008ae216..2908148d 100644 --- a/crates/delta/src/routes/users/mod.rs +++ b/crates/delta/src/routes/users/mod.rs @@ -1,5 +1,5 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; use rocket::Route; -use rocket_okapi::okapi::openapi3::OpenApi; mod add_friend; mod block_user; diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index 52659170..4c85f53f 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -38,10 +38,8 @@ bson = { version = "2.1.0", features = ["chrono-0_4"] } # Spec Generation schemars = "0.8.8" -okapi = { git = "https://github.com/insertish/okapi", rev = "a1048d0c8cd771e424ec97d33d825c32e06aa120" } -rocket_okapi = { git = "https://github.com/insertish/okapi", rev = "a1048d0c8cd771e424ec97d33d825c32e06aa120" } -# okapi = "0.7.0-rc.1" -# rocket_okapi = "0.8.0-rc.1" +revolt_okapi = "0.9.1" +revolt_rocket_okapi = { version = "0.9.1", features = [ "swagger" ] } # Databases redis-kiss = { version = "0.1.3" } @@ -82,8 +80,8 @@ web-push = "0.7.2" # Implementations rocket_http = { optional = true, version = "0.5.0-rc.2" } rocket = { optional = true, version = "0.5.0-rc.2", default-features = false, features = ["json"] } -rocket_empty = { optional = true, git = "https://github.com/insertish/rocket_empty", branch = "master" } -rocket_cors = { optional = true, git = "https://github.com/lawliet89/rocket_cors", rev = "5843861a88958c16bfaa0b40f0d8910772bcd2f6" } +rocket_empty = { version = "0.1.1", optional = true, features = [ "schema" ] } +rocket_cors = { optional = true, git = "https://github.com/lawliet89/rocket_cors", rev = "c17e8145baa4790319fdb6a473e465b960f55e7c" } # rAuth rauth = { git = "https://github.com/insertish/rauth", rev = "cbdec69c684a4854fbedba9ed1f0e7ee466bf3f7", features = [ "async-std-runtime" ] } diff --git a/crates/quark/src/impl/rocket.rs b/crates/quark/src/impl/rocket.rs index f36c8e1a..0756bd38 100644 --- a/crates/quark/src/impl/rocket.rs +++ b/crates/quark/src/impl/rocket.rs @@ -1,7 +1,7 @@ -use okapi::openapi3::{SecurityScheme, SecuritySchemeData}; use rauth::models::Session; -use rocket_okapi::gen::OpenApiGenerator; -use rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; +use revolt_okapi::openapi3::{SecurityScheme, SecuritySchemeData}; +use revolt_rocket_okapi::gen::OpenApiGenerator; +use revolt_rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; use rocket::http::Status; use rocket::request::{self, FromRequest, Outcome, Request}; @@ -53,7 +53,7 @@ impl<'r> OpenApiFromRequest<'r> for User { _gen: &mut OpenApiGenerator, _name: String, _required: bool, - ) -> rocket_okapi::Result { + ) -> revolt_rocket_okapi::Result { let mut requirements = schemars::Map::new(); requirements.insert("Session Token".to_owned(), vec![]); diff --git a/crates/quark/src/util/result.rs b/crates/quark/src/util/result.rs index 6ee2fe63..995ad6e2 100644 --- a/crates/quark/src/util/result.rs +++ b/crates/quark/src/util/result.rs @@ -1,4 +1,5 @@ -use okapi::openapi3::{self, SchemaObject}; +use revolt_okapi::openapi3::SchemaObject; +use revolt_rocket_okapi::revolt_okapi::openapi3; use rocket::{ http::{ContentType, Status}, response::{self, Responder}, @@ -194,11 +195,11 @@ impl<'r> Responder<'r, 'static> for Error { } } -impl rocket_okapi::response::OpenApiResponderInner for Error { +impl revolt_rocket_okapi::response::OpenApiResponderInner for Error { fn responses( - gen: &mut rocket_okapi::gen::OpenApiGenerator, - ) -> std::result::Result { - let mut content = okapi::Map::new(); + gen: &mut revolt_rocket_okapi::gen::OpenApiGenerator, + ) -> std::result::Result { + let mut content = revolt_okapi::Map::new(); let settings = schemars::gen::SchemaSettings::default().with(|s| { s.option_nullable = true; diff --git a/crates/quark/src/web/idempotency.rs b/crates/quark/src/web/idempotency.rs index c1e0230c..769341e7 100644 --- a/crates/quark/src/web/idempotency.rs +++ b/crates/quark/src/web/idempotency.rs @@ -1,11 +1,11 @@ use crate::{Error, Result}; use async_std::sync::Mutex; +use revolt_rocket_okapi::gen::OpenApiGenerator; +use revolt_rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; +use revolt_rocket_okapi::revolt_okapi::openapi3::{Parameter, ParameterValue}; use rocket::http::Status; use rocket::request::{FromRequest, Outcome}; -use rocket_okapi::gen::OpenApiGenerator; -use rocket_okapi::okapi::openapi3::{Parameter, ParameterValue}; -use rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; use schemars::schema::{InstanceType, SchemaObject, SingleOrVec}; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -47,7 +47,7 @@ impl<'r> OpenApiFromRequest<'r> for IdempotencyKey { _gen: &mut OpenApiGenerator, _name: String, _required: bool, - ) -> rocket_okapi::Result { + ) -> revolt_rocket_okapi::Result { Ok(RequestHeaderInput::Parameter(Parameter { name: "Idempotency-Key".to_string(), description: Some("Unique key to prevent duplicate requests".to_string()), diff --git a/crates/quark/src/web/ratelimiter.rs b/crates/quark/src/web/ratelimiter.rs index d77701db..853d9aa8 100644 --- a/crates/quark/src/web/ratelimiter.rs +++ b/crates/quark/src/web/ratelimiter.rs @@ -16,8 +16,8 @@ use rocket::request::{FromRequest, Outcome}; use rocket::serde::json::Json; use rocket::{Data, Request, Response}; -use rocket_okapi::gen::OpenApiGenerator; -use rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; +use revolt_rocket_okapi::gen::OpenApiGenerator; +use revolt_rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; use serde::Serialize; @@ -241,7 +241,7 @@ impl<'r> OpenApiFromRequest<'r> for Ratelimiter { _gen: &mut OpenApiGenerator, _name: String, _required: bool, - ) -> rocket_okapi::Result { + ) -> revolt_rocket_okapi::Result { Ok(RequestHeaderInput::None) } } diff --git a/crates/quark/src/web/swagger.rs b/crates/quark/src/web/swagger.rs index d84bb643..fcfe3a91 100644 --- a/crates/quark/src/web/swagger.rs +++ b/crates/quark/src/web/swagger.rs @@ -1,7 +1,7 @@ use rocket::Route; pub fn routes() -> Vec { - rocket_okapi::swagger_ui::make_swagger_ui(&rocket_okapi::swagger_ui::SwaggerUIConfig { + revolt_rocket_okapi::swagger_ui::make_swagger_ui(&revolt_rocket_okapi::swagger_ui::SwaggerUIConfig { url: "../openapi.json".to_owned(), ..Default::default() }) From cf9c0bc5e15abf7ba06c71fbfe97f5a2aea574c1 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Wed, 18 Jan 2023 19:06:05 +0000 Subject: [PATCH 07/23] chore: bump rauth --- Cargo.lock | 64 ++++++----------------------------------- crates/delta/Cargo.toml | 2 +- crates/quark/Cargo.toml | 2 +- 3 files changed, 11 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 63bd840a..09263c63 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2069,17 +2069,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "okapi" -version = "0.7.0-rc.1" -source = "git+https://github.com/insertish/okapi?rev=a1048d0c8cd771e424ec97d33d825c32e06aa120#a1048d0c8cd771e424ec97d33d825c32e06aa120" -dependencies = [ - "log", - "schemars", - "serde", - "serde_json", -] - [[package]] name = "once_cell" version = "1.13.0" @@ -2592,7 +2581,7 @@ dependencies = [ [[package]] name = "rauth" version = "1.0.0" -source = "git+https://github.com/insertish/rauth?rev=cbdec69c684a4854fbedba9ed1f0e7ee466bf3f7#cbdec69c684a4854fbedba9ed1f0e7ee466bf3f7" +source = "git+https://github.com/insertish/rauth?rev=195f1703cc4c57be01a39f465296cab4e22524b3#195f1703cc4c57be01a39f465296cab4e22524b3" dependencies = [ "async-std", "async-trait", @@ -2607,12 +2596,12 @@ dependencies = [ "log", "mongodb", "nanoid", - "okapi", "rand 0.8.5", "regex", "reqwest", + "revolt_okapi", + "revolt_rocket_okapi", "rocket", - "rocket_okapi", "rust-argon2", "schemars", "serde", @@ -2844,7 +2833,7 @@ dependencies = [ "revolt-quark", "revolt_rocket_okapi", "rocket", - "rocket_empty 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket_empty", "rocket_rauth", "schemars", "serde", @@ -2891,7 +2880,7 @@ dependencies = [ "revolt_rocket_okapi", "rocket", "rocket_cors", - "rocket_empty 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket_empty", "rocket_http", "schemars", "sentry", @@ -3062,14 +3051,6 @@ dependencies = [ "rocket", ] -[[package]] -name = "rocket_empty" -version = "0.1.1" -source = "git+https://github.com/insertish/rocket_empty?branch=master#7488be6a5d2a70744fe81b9dcc60df5866b4c8ba" -dependencies = [ - "rocket", -] - [[package]] name = "rocket_http" version = "0.5.0-rc.2" @@ -3097,44 +3078,17 @@ dependencies = [ "uncased", ] -[[package]] -name = "rocket_okapi" -version = "0.8.0-rc.1" -source = "git+https://github.com/insertish/okapi?rev=a1048d0c8cd771e424ec97d33d825c32e06aa120#a1048d0c8cd771e424ec97d33d825c32e06aa120" -dependencies = [ - "either", - "log", - "okapi", - "rocket", - "rocket_okapi_codegen", - "schemars", - "serde", - "serde_json", -] - -[[package]] -name = "rocket_okapi_codegen" -version = "0.8.0-rc.1" -source = "git+https://github.com/insertish/okapi?rev=a1048d0c8cd771e424ec97d33d825c32e06aa120#a1048d0c8cd771e424ec97d33d825c32e06aa120" -dependencies = [ - "darling", - "proc-macro2", - "quote 1.0.18", - "rocket_http", - "syn 1.0.96", -] - [[package]] name = "rocket_rauth" version = "1.0.0" -source = "git+https://github.com/insertish/rauth?rev=cbdec69c684a4854fbedba9ed1f0e7ee466bf3f7#cbdec69c684a4854fbedba9ed1f0e7ee466bf3f7" +source = "git+https://github.com/insertish/rauth?rev=195f1703cc4c57be01a39f465296cab4e22524b3#195f1703cc4c57be01a39f465296cab4e22524b3" dependencies = [ "iso8601-timestamp", - "okapi", "rauth", + "revolt_okapi", + "revolt_rocket_okapi", "rocket", - "rocket_empty 0.1.1 (git+https://github.com/insertish/rocket_empty?branch=master)", - "rocket_okapi", + "rocket_empty", "schemars", "serde", ] diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index 39d2814b..056fcb9d 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -52,7 +52,7 @@ mobc-redis = { version = "0.7.0", default-features = false, features = ["async-s # web rocket = { version = "0.5.0-rc.2", default-features = false, features = ["json"] } rocket_empty = { version = "0.1.1", features = ["schema"] } -rocket_rauth = { git = "https://github.com/insertish/rauth", rev = "cbdec69c684a4854fbedba9ed1f0e7ee466bf3f7" } +rocket_rauth = { git = "https://github.com/insertish/rauth", rev = "195f1703cc4c57be01a39f465296cab4e22524b3" } # spec generation schemars = "0.8.8" diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index 4c85f53f..51b5666c 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -84,7 +84,7 @@ rocket_empty = { version = "0.1.1", optional = true, features = [ "schema" ] } rocket_cors = { optional = true, git = "https://github.com/lawliet89/rocket_cors", rev = "c17e8145baa4790319fdb6a473e465b960f55e7c" } # rAuth -rauth = { git = "https://github.com/insertish/rauth", rev = "cbdec69c684a4854fbedba9ed1f0e7ee466bf3f7", features = [ "async-std-runtime" ] } +rauth = { git = "https://github.com/insertish/rauth", rev = "195f1703cc4c57be01a39f465296cab4e22524b3", features = [ "async-std-runtime" ] } # Sentry sentry = "0.25.0" From fed1da72fdfe3c4a9865820f5362eb9f0e3f0fd7 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 20 Jan 2023 15:43:45 +0000 Subject: [PATCH 08/23] feat: support rauth events feat: add platform user wipe event --- Cargo.lock | 14 +++++++------- crates/bonfire/Cargo.toml | 2 +- crates/delta/Cargo.toml | 4 ++-- crates/delta/src/main.rs | 26 ++++++++++++++++++++++++-- crates/quark/Cargo.toml | 4 ++-- crates/quark/src/events/client.rs | 15 +++++++++++++++ crates/quark/src/events/impl.rs | 5 +++++ crates/quark/src/models/users/user.rs | 2 ++ 8 files changed, 58 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 09263c63..628e06cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2580,8 +2580,8 @@ dependencies = [ [[package]] name = "rauth" -version = "1.0.0" -source = "git+https://github.com/insertish/rauth?rev=195f1703cc4c57be01a39f465296cab4e22524b3#195f1703cc4c57be01a39f465296cab4e22524b3" +version = "1.0.2" +source = "git+https://github.com/insertish/rauth?tag=1.0.2#d466718bb4f1c8ca03f4a17265a646a52e07dff5" dependencies = [ "async-std", "async-trait", @@ -2790,7 +2790,7 @@ dependencies = [ [[package]] name = "revolt-bonfire" -version = "0.5.5" +version = "0.5.6" dependencies = [ "async-std", "async-tungstenite", @@ -2806,7 +2806,7 @@ dependencies = [ [[package]] name = "revolt-delta" -version = "0.5.5" +version = "0.5.6" dependencies = [ "async-channel", "async-std", @@ -2846,7 +2846,7 @@ dependencies = [ [[package]] name = "revolt-quark" -version = "0.1.0" +version = "0.5.6" dependencies = [ "async-recursion", "async-std", @@ -3080,8 +3080,8 @@ dependencies = [ [[package]] name = "rocket_rauth" -version = "1.0.0" -source = "git+https://github.com/insertish/rauth?rev=195f1703cc4c57be01a39f465296cab4e22524b3#195f1703cc4c57be01a39f465296cab4e22524b3" +version = "1.0.2" +source = "git+https://github.com/insertish/rauth?tag=1.0.2#d466718bb4f1c8ca03f4a17265a646a52e07dff5" dependencies = [ "iso8601-timestamp", "rauth", diff --git a/crates/bonfire/Cargo.toml b/crates/bonfire/Cargo.toml index ba684e55..bb7a05fd 100644 --- a/crates/bonfire/Cargo.toml +++ b/crates/bonfire/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "revolt-bonfire" -version = "0.5.5" +version = "0.5.6" license = "AGPL-3.0-or-later" edition = "2021" diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index 056fcb9d..5dcdc6e0 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "revolt-delta" -version = "0.5.5" +version = "0.5.6" license = "AGPL-3.0-or-later" authors = ["Paul Makles "] edition = "2018" @@ -52,7 +52,7 @@ mobc-redis = { version = "0.7.0", default-features = false, features = ["async-s # web rocket = { version = "0.5.0-rc.2", default-features = false, features = ["json"] } rocket_empty = { version = "0.1.1", features = ["schema"] } -rocket_rauth = { git = "https://github.com/insertish/rauth", rev = "195f1703cc4c57be01a39f465296cab4e22524b3" } +rocket_rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.2" } # spec generation schemars = "0.8.8" diff --git a/crates/delta/src/main.rs b/crates/delta/src/main.rs index 728bdcf6..4a7ab96d 100644 --- a/crates/delta/src/main.rs +++ b/crates/delta/src/main.rs @@ -10,7 +10,9 @@ extern crate lazy_static; pub mod routes; pub mod util; -use revolt_quark::rauth::RAuth; +use async_std::channel::unbounded; +use revolt_quark::events::client::EventV1; +use revolt_quark::rauth::{RAuth, RAuthEvent}; use revolt_quark::DatabaseInfo; #[launch] @@ -25,13 +27,33 @@ async fn rocket() -> _ { let db = DatabaseInfo::Auto.connect().await.unwrap(); db.migrate_database().await.unwrap(); + // Setup rAuth event channel + let (sender, receiver) = unbounded(); + // Setup rAuth let rauth = RAuth { database: db.clone().into(), config: revolt_quark::util::rauth::config(), + event_channel: Some(sender), }; - // Launch background task workers. + // Launch a listener for rAuth events + async_std::task::spawn(async move { + while let Ok(event) = receiver.recv().await { + match &event { + RAuthEvent::CreateSession { .. } | RAuthEvent::CreateAccount { .. } => { + EventV1::Auth(event).global().await + } + RAuthEvent::DeleteSession { user_id, .. } + | RAuthEvent::DeleteAllSessions { user_id, .. } => { + let id = user_id.to_string(); + EventV1::Auth(event).private(id).await + } + } + } + }); + + // Launch background task workers async_std::task::spawn(revolt_quark::tasks::start_workers(db.clone())); // Configure CORS diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index 51b5666c..6f67c6d9 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "revolt-quark" -version = "0.1.0" +version = "0.5.6" license = "AGPL-3.0-or-later" edition = "2021" @@ -84,7 +84,7 @@ rocket_empty = { version = "0.1.1", optional = true, features = [ "schema" ] } rocket_cors = { optional = true, git = "https://github.com/lawliet89/rocket_cors", rev = "c17e8145baa4790319fdb6a473e465b960f55e7c" } # rAuth -rauth = { git = "https://github.com/insertish/rauth", rev = "195f1703cc4c57be01a39f465296cab4e22524b3", features = [ "async-std-runtime" ] } +rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.2", features = [ "async-std-runtime" ] } # Sentry sentry = "0.25.0" diff --git a/crates/quark/src/events/client.rs b/crates/quark/src/events/client.rs index 28f7eb6a..f9275e9d 100644 --- a/crates/quark/src/events/client.rs +++ b/crates/quark/src/events/client.rs @@ -1,3 +1,4 @@ +use rauth::RAuthEvent; use serde::{Deserialize, Serialize}; use crate::models::channel::{FieldsChannel, PartialChannel}; @@ -195,9 +196,23 @@ pub enum EventV1 { /// Settings updated remotely UserSettingsUpdate { id: String, update: UserSettings }, + /// User has been platform banned or deleted their account + /// + /// Clients should remove the following associated data: + /// - Messages + /// - DM Channels + /// - Relationships + /// - Server Memberships + /// + /// User flags are specified to explain why a wipe is occurring though not all reasons will necessarily ever appear. + UserPlatformWipe { user_id: String, flags: i32 }, + /// New emoji EmojiCreate(Emoji), /// Delete emoji EmojiDelete { id: String }, + + /// Auth events + Auth(RAuthEvent), } diff --git a/crates/quark/src/events/impl.rs b/crates/quark/src/events/impl.rs index 6da72a77..d4b36c19 100644 --- a/crates/quark/src/events/impl.rs +++ b/crates/quark/src/events/impl.rs @@ -559,4 +559,9 @@ impl EventV1 { pub async fn private(self, id: String) { self.p(format!("{}!", id)).await; } + + /// Publish internal global event + pub async fn global(self) { + self.p("global".to_string()).await; + } } diff --git a/crates/quark/src/models/users/user.rs b/crates/quark/src/models/users/user.rs index 185bf286..1ea03fd9 100644 --- a/crates/quark/src/models/users/user.rs +++ b/crates/quark/src/models/users/user.rs @@ -105,6 +105,8 @@ pub enum Flags { Deleted = 2, /// User was banned off the platform Banned = 4, + /// User was marked as spam and removed from platform + Spam = 8, } /// Bot information for if the user is a bot From f5c95f9d126185530b0954e0e3ceb84c21ed7cd3 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 20 Jan 2023 15:57:58 +0000 Subject: [PATCH 09/23] chore: bump rauth for lockout reset on pwd reset --- Cargo.lock | 8 ++++---- crates/delta/Cargo.toml | 2 +- crates/quark/Cargo.toml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 628e06cb..19dc7f4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2580,8 +2580,8 @@ dependencies = [ [[package]] name = "rauth" -version = "1.0.2" -source = "git+https://github.com/insertish/rauth?tag=1.0.2#d466718bb4f1c8ca03f4a17265a646a52e07dff5" +version = "1.0.3" +source = "git+https://github.com/insertish/rauth?tag=1.0.3#a62eae5076d94730d06e76d438cbca0d70161856" dependencies = [ "async-std", "async-trait", @@ -3080,8 +3080,8 @@ dependencies = [ [[package]] name = "rocket_rauth" -version = "1.0.2" -source = "git+https://github.com/insertish/rauth?tag=1.0.2#d466718bb4f1c8ca03f4a17265a646a52e07dff5" +version = "1.0.3" +source = "git+https://github.com/insertish/rauth?tag=1.0.3#a62eae5076d94730d06e76d438cbca0d70161856" dependencies = [ "iso8601-timestamp", "rauth", diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index 5dcdc6e0..527bae57 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -52,7 +52,7 @@ mobc-redis = { version = "0.7.0", default-features = false, features = ["async-s # web rocket = { version = "0.5.0-rc.2", default-features = false, features = ["json"] } rocket_empty = { version = "0.1.1", features = ["schema"] } -rocket_rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.2" } +rocket_rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.3" } # spec generation schemars = "0.8.8" diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index 6f67c6d9..f06a4d9f 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -84,7 +84,7 @@ rocket_empty = { version = "0.1.1", optional = true, features = [ "schema" ] } rocket_cors = { optional = true, git = "https://github.com/lawliet89/rocket_cors", rev = "c17e8145baa4790319fdb6a473e465b960f55e7c" } # rAuth -rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.2", features = [ "async-std-runtime" ] } +rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.3", features = [ "async-std-runtime" ] } # Sentry sentry = "0.25.0" From c0ef3d295ac70e305b7c4935ebfa0a584702f060 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 20 Jan 2023 17:14:25 +0000 Subject: [PATCH 10/23] fix: fallback if vergen cannot generate data --- crates/delta/build.rs | 2 +- crates/delta/src/routes/root.rs | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/crates/delta/build.rs b/crates/delta/build.rs index e71dcd55..981237b4 100644 --- a/crates/delta/build.rs +++ b/crates/delta/build.rs @@ -12,5 +12,5 @@ fn main() { } } - vergen(Config::default()).unwrap(); + vergen(Config::default()).ok(); } diff --git a/crates/delta/src/routes/root.rs b/crates/delta/src/routes/root.rs index e44ae638..59bd8dc9 100644 --- a/crates/delta/src/routes/root.rs +++ b/crates/delta/src/routes/root.rs @@ -119,11 +119,12 @@ pub async fn root() -> Result> { app: APP_URL.to_string(), vapid: VAPID_PUBLIC_KEY.to_string(), build: BuildInformation { - commit_sha: env!("VERGEN_GIT_SHA").to_string(), - commit_timestamp: env!("VERGEN_GIT_COMMIT_TIMESTAMP").to_string(), - semver: env!("VERGEN_GIT_SEMVER").to_string(), - origin_url: env!("GIT_ORIGIN_URL", "").to_string(), - timestamp: env!("VERGEN_BUILD_TIMESTAMP").to_string(), + commit_sha: env!("VERGEN_GIT_SHA", "").to_string(), + commit_timestamp: env!("VERGEN_GIT_COMMIT_TIMESTAMP", "") + .to_string(), + semver: env!("VERGEN_GIT_SEMVER", "").to_string(), + origin_url: env!("GIT_ORIGIN_URL", "").to_string(), + timestamp: env!("VERGEN_BUILD_TIMESTAMP", "").to_string(), }, })) } From 7a6bd70dcd8bfee1d361e545f072bc093bc6a9b2 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 20 Jan 2023 17:47:26 +0000 Subject: [PATCH 11/23] feat: add route to fetch user flags chore: bump rauth to change disabled account behaviour --- crates/delta/Cargo.toml | 2 +- .../src/routes/users/fetch_user_flags.rs | 26 +++++++++++++++++++ crates/delta/src/routes/users/mod.rs | 2 ++ crates/quark/Cargo.toml | 2 +- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 crates/delta/src/routes/users/fetch_user_flags.rs diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index 527bae57..f3d3ffa3 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -52,7 +52,7 @@ mobc-redis = { version = "0.7.0", default-features = false, features = ["async-s # web rocket = { version = "0.5.0-rc.2", default-features = false, features = ["json"] } rocket_empty = { version = "0.1.1", features = ["schema"] } -rocket_rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.3" } +rocket_rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.4" } # spec generation schemars = "0.8.8" diff --git a/crates/delta/src/routes/users/fetch_user_flags.rs b/crates/delta/src/routes/users/fetch_user_flags.rs new file mode 100644 index 00000000..4025b649 --- /dev/null +++ b/crates/delta/src/routes/users/fetch_user_flags.rs @@ -0,0 +1,26 @@ +use revolt_quark::{Database, Ref, Result}; + +use rocket::{serde::json::Json, State}; +use serde::Serialize; + +/// # Flag Response +#[derive(Serialize, JsonSchema)] +pub struct FlagResponse { + /// Flags + flags: i32, +} + +/// # Fetch User Flags +/// +/// Retrieve a user's flags. +#[openapi(tag = "User Information")] +#[get("//flags")] +pub async fn fetch_user_flags(db: &State, target: Ref) -> Result> { + let flags = if let Ok(target) = target.as_user(db).await { + target.flags.unwrap_or_default() + } else { + 0 + }; + + Ok(Json(FlagResponse { flags })) +} diff --git a/crates/delta/src/routes/users/mod.rs b/crates/delta/src/routes/users/mod.rs index 2908148d..28e8ee0b 100644 --- a/crates/delta/src/routes/users/mod.rs +++ b/crates/delta/src/routes/users/mod.rs @@ -9,6 +9,7 @@ mod fetch_dms; mod fetch_profile; mod fetch_self; mod fetch_user; +mod fetch_user_flags; mod find_mutual; mod get_default_avatar; mod open_dm; @@ -21,6 +22,7 @@ pub fn routes() -> (Vec, OpenApi) { // User Information fetch_self::req, fetch_user::req, + fetch_user_flags::fetch_user_flags, edit_user::req, change_username::req, get_default_avatar::req, diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index f06a4d9f..e29eeff0 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -84,7 +84,7 @@ rocket_empty = { version = "0.1.1", optional = true, features = [ "schema" ] } rocket_cors = { optional = true, git = "https://github.com/lawliet89/rocket_cors", rev = "c17e8145baa4790319fdb6a473e465b960f55e7c" } # rAuth -rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.3", features = [ "async-std-runtime" ] } +rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.4", features = [ "async-std-runtime" ] } # Sentry sentry = "0.25.0" From e0b918771d9537ceeca05603fda69996b07de39e Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 20 Jan 2023 18:06:44 +0000 Subject: [PATCH 12/23] chore: ensure restrict_reactions is used in conjunction with reactions list --- Cargo.lock | 8 ++++---- .../delta/src/routes/channels/message_send.rs | 20 +++++++++++++++++++ crates/quark/src/models/channels/message.rs | 2 ++ crates/quark/src/util/result.rs | 16 ++++++++------- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 19dc7f4a..9919d355 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2580,8 +2580,8 @@ dependencies = [ [[package]] name = "rauth" -version = "1.0.3" -source = "git+https://github.com/insertish/rauth?tag=1.0.3#a62eae5076d94730d06e76d438cbca0d70161856" +version = "1.0.4" +source = "git+https://github.com/insertish/rauth?tag=1.0.4#2d3bc59623672e3ff57c49a90c4d3cd20780dbba" dependencies = [ "async-std", "async-trait", @@ -3080,8 +3080,8 @@ dependencies = [ [[package]] name = "rocket_rauth" -version = "1.0.3" -source = "git+https://github.com/insertish/rauth?tag=1.0.3#a62eae5076d94730d06e76d438cbca0d70161856" +version = "1.0.4" +source = "git+https://github.com/insertish/rauth?tag=1.0.4#2d3bc59623672e3ff57c49a90c4d3cd20780dbba" dependencies = [ "iso8601-timestamp", "rauth", diff --git a/crates/delta/src/routes/channels/message_send.rs b/crates/delta/src/routes/channels/message_send.rs index e7dceb4b..59aa03df 100644 --- a/crates/delta/src/routes/channels/message_send.rs +++ b/crates/delta/src/routes/channels/message_send.rs @@ -65,16 +65,20 @@ pub async fn message_send( data.validate() .map_err(|error| Error::FailedValidation { error })?; + // Validate Message is within reasonable length limits Message::validate_sum(&data.content, &data.embeds)?; + // Ensure the request is unique idempotency.consume_nonce(data.nonce).await?; + // Ensure we have permissions to send a message let channel = target.as_channel(db).await?; let mut permissions = perms(&user).channel(&channel); permissions .throw_permission_and_view_channel(db, Permission::SendMessage) .await?; + // Check the message is not empty if (data.content.as_ref().map_or(true, |v| v.is_empty())) && (data.attachments.as_ref().map_or(true, |v| v.is_empty())) && (data.embeds.as_ref().map_or(true, |v| v.is_empty())) @@ -82,6 +86,22 @@ pub async fn message_send( return Err(Error::EmptyMessage); } + // Ensure restrict_reactions is not specified without reactions list + if let Some(interactions) = &data.interactions { + if interactions.restrict_reactions { + let disallowed = if let Some(list) = &interactions.reactions { + list.len() == 0 + } else { + true + }; + + if disallowed { + return Err(Error::InvalidProperty); + } + } + } + + // Start constructing the message let message_id = Ulid::new().to_string(); let mut message = Message { id: message_id.clone(), diff --git a/crates/quark/src/models/channels/message.rs b/crates/quark/src/models/channels/message.rs index ee9e61cf..2eb91733 100644 --- a/crates/quark/src/models/channels/message.rs +++ b/crates/quark/src/models/channels/message.rs @@ -98,6 +98,8 @@ pub struct Interactions { #[serde(skip_serializing_if = "Option::is_none", default)] pub reactions: Option>, /// Whether reactions should be restricted to the given list + /// + /// Can only be set to true if reactions list is of at least length 1 #[serde(skip_serializing_if = "if_false", default)] pub restrict_reactions: bool, } diff --git a/crates/quark/src/util/result.rs b/crates/quark/src/util/result.rs index 995ad6e2..628c8303 100644 --- a/crates/quark/src/util/result.rs +++ b/crates/quark/src/util/result.rs @@ -20,10 +20,10 @@ pub enum Error { /// This error was not labeled :( LabelMe, - // ? Onboarding related errors. + // ? Onboarding related errors AlreadyOnboarded, - // ? User related errors. + // ? User related errors UsernameTaken, InvalidUsername, UnknownUser, @@ -33,7 +33,7 @@ pub enum Error { BlockedByOther, NotFriends, - // ? Channel related errors. + // ? Channel related errors UnknownChannel, UnknownAttachment, UnknownMessage, @@ -50,7 +50,7 @@ pub enum Error { AlreadyInGroup, NotInGroup, - // ? Server related errors. + // ? Server related errors UnknownServer, InvalidRole, Banned, @@ -59,12 +59,12 @@ pub enum Error { }, TooManyEmoji, - // ? Bot related errors. + // ? Bot related errors ReachedMaximumBots, IsBot, BotIsPrivate, - // ? Permission errors. + // ? Permission errors MissingPermission { permission: Permission, }, @@ -75,7 +75,7 @@ pub enum Error { CannotGiveMissingPermissions, NotOwner, - // ? General errors. + // ? General errors DatabaseError { operation: &'static str, with: &'static str, @@ -83,6 +83,7 @@ pub enum Error { InternalError, InvalidOperation, InvalidCredentials, + InvalidProperty, InvalidSession, DuplicateNonce, VosoUnavailable, @@ -175,6 +176,7 @@ impl<'r> Responder<'r, 'static> for Error { Error::InternalError => Status::InternalServerError, Error::InvalidOperation => Status::BadRequest, Error::InvalidCredentials => Status::Unauthorized, + Error::InvalidProperty => Status::BadRequest, Error::InvalidSession => Status::Unauthorized, Error::DuplicateNonce => Status::Conflict, Error::VosoUnavailable => Status::BadRequest, From 39e345af7436b333f02b2c8b64f38d1dc82061e6 Mon Sep 17 00:00:00 2001 From: insertish Date: Tue, 24 Jan 2023 19:43:40 +0000 Subject: [PATCH 13/23] ci: synced local '.github/workflows/triage_issue.yml' with remote 'workflows/triage_issue.yml' [skip ci] --- .github/workflows/triage_issue.yml | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/.github/workflows/triage_issue.yml b/.github/workflows/triage_issue.yml index b625a98b..ecc69f59 100644 --- a/.github/workflows/triage_issue.yml +++ b/.github/workflows/triage_issue.yml @@ -15,22 +15,27 @@ jobs: gh api graphql -f query=' query { organization(login: "revoltchat"){ - projectNext(number: 3) { + projectV2(number: 3) { id fields(first:20) { nodes { - id - name - settings + ... on ProjectV2SingleSelectField { + id + name + options { + id + name + } + } } } } } }' > project_data.json - echo 'PROJECT_ID='$(jq '.data.organization.projectNext.id' project_data.json) >> $GITHUB_ENV - echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV - echo 'TODO_OPTION_ID='$(jq '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.settings | fromjson.options[] | select(.name=="Todo") |.id' project_data.json) >> $GITHUB_ENV + echo 'PROJECT_ID='$(jq '.data.organization.projectV2.id' project_data.json) >> $GITHUB_ENV + echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV + echo 'TODO_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .options[] | select(.name=="Todo") |.id' project_data.json) >> $GITHUB_ENV - name: Add issue to project env: @@ -39,11 +44,11 @@ jobs: run: | item_id="$( gh api graphql -f query=' mutation($project:ID!, $issue:ID!) { - addProjectNextItem(input: {projectId: $project, contentId: $issue}) { - projectNextItem { + addProjectV2ItemById(input: {projectId: $project, contentId: $issue}) { + item { id } } - }' -f project=$PROJECT_ID -f issue=$ISSUE_ID --jq '.data.addProjectNextItem.projectNextItem.id')" - + }' -f project=$PROJECT_ID -f issue=$ISSUE_ID --jq '.data.addProjectV2ItemById.item.id')" + echo 'ITEM_ID='$item_id >> $GITHUB_ENV From 72595f30d4ba1182f5775647a41d2a1ce9e960c6 Mon Sep 17 00:00:00 2001 From: insertish Date: Tue, 24 Jan 2023 19:43:40 +0000 Subject: [PATCH 14/23] ci: synced local '.github/workflows/triage_pr.yml' with remote 'workflows/triage_pr.yml' [skip ci] --- .github/workflows/triage_pr.yml | 37 ++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/.github/workflows/triage_pr.yml b/.github/workflows/triage_pr.yml index df07fe88..de5a9421 100644 --- a/.github/workflows/triage_pr.yml +++ b/.github/workflows/triage_pr.yml @@ -15,22 +15,27 @@ jobs: gh api graphql -f query=' query { organization(login: "revoltchat"){ - projectNext(number: 3) { + projectV2(number: 3) { id fields(first:20) { nodes { - id - name - settings + ... on ProjectV2SingleSelectField { + id + name + options { + id + name + } + } } } } } }' > project_data.json - echo 'PROJECT_ID='$(jq '.data.organization.projectNext.id' project_data.json) >> $GITHUB_ENV - echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV - echo 'INCOMING_OPTION_ID='$(jq '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.settings | fromjson.options[] | select(.name=="Incoming PRs") |.id' project_data.json) >> $GITHUB_ENV + echo 'PROJECT_ID='$(jq '.data.organization.projectV2.id' project_data.json) >> $GITHUB_ENV + echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV + echo 'INCOMING_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .options[] | select(.name=="Incoming PRs") |.id' project_data.json) >> $GITHUB_ENV - name: Add PR to project env: @@ -39,13 +44,13 @@ jobs: run: | item_id="$( gh api graphql -f query=' mutation($project:ID!, $pr:ID!) { - addProjectNextItem(input: {projectId: $project, contentId: $pr}) { - projectNextItem { + addProjectV2ItemById(input: {projectId: $project, contentId: $pr}) { + item { id } } - }' -f project=$PROJECT_ID -f pr=$PR_ID --jq '.data.addProjectNextItem.projectNextItem.id')" - + }' -f project=$PROJECT_ID -f pr=$PR_ID --jq '.data.addProjectV2ItemById.item.id')" + echo 'ITEM_ID='$item_id >> $GITHUB_ENV - name: Set fields @@ -59,14 +64,16 @@ jobs: $status_field: ID! $status_value: String! ) { - set_status: updateProjectNextItemField(input: { + set_status: updateProjectV2ItemFieldValue(input: { projectId: $project itemId: $item fieldId: $status_field - value: $status_value + value: { + singleSelectOptionId: $status_value + } }) { - projectNextItem { + projectV2Item { id - } + } } }' -f project=$PROJECT_ID -f item=$ITEM_ID -f status_field=$STATUS_FIELD_ID -f status_value=${{ env.INCOMING_OPTION_ID }} --silent From e8c233f60b3aad8c78df87c562cdaa64ce428619 Mon Sep 17 00:00:00 2001 From: Zomatree Date: Fri, 27 Jan 2023 16:06:27 +0000 Subject: [PATCH 15/23] feat: concurrently query January for embeds (#221) --- Cargo.lock | 96 ++++++++++++------------ crates/quark/Cargo.toml | 1 + crates/quark/src/tasks/process_embeds.rs | 40 ++++++---- crates/quark/src/types/january.rs | 51 +++++++++---- crates/quark/src/util/variables/delta.rs | 2 + 5 files changed, 113 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9919d355..78e2f244 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -106,7 +106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -172,11 +172,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" +checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" dependencies = [ "event-listener", + "futures-lite", ] [[package]] @@ -204,7 +205,7 @@ checksum = "2cda8f4bcc10624c4e85bc66b3f452cca98cfa5ca002dc83a16aad2367641bea" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -269,7 +270,7 @@ checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -286,7 +287,7 @@ checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -681,7 +682,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" dependencies = [ "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -714,7 +715,7 @@ dependencies = [ "proc-macro2", "quote 1.0.18", "strsim", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -725,7 +726,7 @@ checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -774,7 +775,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -807,7 +808,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -881,7 +882,7 @@ dependencies = [ "heck", "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -901,7 +902,7 @@ checksum = "828de45d0ca18782232dfb8f3ea9cc428e8ced380eb26a520baaacfc70de39ce" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -1085,7 +1086,7 @@ checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -1176,7 +1177,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -2057,7 +2058,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -2110,7 +2111,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -2215,7 +2216,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -2253,7 +2254,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -2284,7 +2285,7 @@ checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -2371,7 +2372,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", "version_check", ] @@ -2388,9 +2389,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.39" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" dependencies = [ "unicode-ident", ] @@ -2403,7 +2404,7 @@ checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", "version_check", "yansi", ] @@ -2704,7 +2705,7 @@ checksum = "a043824e29c94169374ac5183ac0ed43f5724dc4556b19568007486bd840fa1f" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -2848,6 +2849,7 @@ dependencies = [ name = "revolt-quark" version = "0.5.6" dependencies = [ + "async-lock", "async-recursion", "async-std", "async-trait", @@ -2929,7 +2931,7 @@ dependencies = [ "proc-macro2", "quote 1.0.18", "rocket_http", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -3020,7 +3022,7 @@ dependencies = [ "proc-macro2", "quote 1.0.18", "rocket_http", - "syn 1.0.96", + "syn 1.0.107", "unicode-xid 0.2.3", ] @@ -3210,7 +3212,7 @@ dependencies = [ "proc-macro2", "quote 1.0.18", "serde_derive_internals", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -3361,9 +3363,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.137" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" dependencies = [ "serde_derive", ] @@ -3379,13 +3381,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -3396,14 +3398,14 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" dependencies = [ "indexmap", "itoa 1.0.2", @@ -3442,7 +3444,7 @@ dependencies = [ "darling", "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -3620,9 +3622,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.96" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ "proc-macro2", "quote 1.0.18", @@ -3698,7 +3700,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -3807,7 +3809,7 @@ checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -3943,7 +3945,7 @@ checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -4073,7 +4075,7 @@ checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -4284,7 +4286,7 @@ dependencies = [ "proc-macro2", "quote 1.0.18", "regex", - "syn 1.0.96", + "syn 1.0.107", "validator_types", ] @@ -4295,7 +4297,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded9d97e1d42327632f5f3bae6403c04886e2de3036261ef42deebd931a6a291" dependencies = [ "proc-macro2", - "syn 1.0.96", + "syn 1.0.107", ] [[package]] @@ -4393,7 +4395,7 @@ dependencies = [ "log", "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", "wasm-bindgen-shared", ] @@ -4427,7 +4429,7 @@ checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ "proc-macro2", "quote 1.0.18", - "syn 1.0.96", + "syn 1.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index e29eeff0..1f08b715 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -69,6 +69,7 @@ reqwest = "0.11.10" bitfield = "0.13.2" once_cell = "1.13.0" lazy_static = "1.4.0" +async-lock = "2.6.0" lru = { version = "0.7.6", optional = true } dashmap = { version = "5.2.0", optional = true } diff --git a/crates/quark/src/tasks/process_embeds.rs b/crates/quark/src/tasks/process_embeds.rs index 11c37215..d36d0496 100644 --- a/crates/quark/src/tasks/process_embeds.rs +++ b/crates/quark/src/tasks/process_embeds.rs @@ -1,11 +1,14 @@ -use crate::util::variables::delta::{JANUARY_URL, MAX_EMBED_COUNT}; +use crate::util::variables::delta::{JANUARY_URL, MAX_EMBED_COUNT, JANUARY_CONCURRENT_CONNECTIONS}; use crate::{ models::{message::AppendMessage, Message}, types::january::Embed, Database, }; +use async_lock::Semaphore; +use async_std::task::spawn; use deadqueue::limited::Queue; +use std::sync::Arc; /// Task information #[derive(Debug)] @@ -36,21 +39,30 @@ pub async fn queue(channel: String, id: String, content: String) { /// Start a new worker pub async fn worker(db: Database) { + let semaphore = Arc::new(Semaphore::new(*JANUARY_CONCURRENT_CONNECTIONS)); + loop { let task = Q.pop().await; - if let Ok(embeds) = Embed::generate(task.content, &JANUARY_URL, *MAX_EMBED_COUNT).await { - if let Err(err) = Message::append( - &db, - task.id, - task.channel, - AppendMessage { - embeds: Some(embeds), - }, - ) - .await - { - error!("Encountered an error appending to message: {:?}", err); + let db = db.clone(); + let semaphore = semaphore.clone(); + + spawn(async move { + let embeds = Embed::generate(task.content, &JANUARY_URL, *MAX_EMBED_COUNT, semaphore).await; + + if let Ok(embeds) = embeds { + if let Err(err) = Message::append( + &db, + task.id, + task.channel, + AppendMessage { + embeds: Some(embeds), + }, + ) + .await + { + error!("Encountered an error appending to message: {:?}", err); + } } - } + }); } } diff --git a/crates/quark/src/types/january.rs b/crates/quark/src/types/january.rs index 24aca7dc..f626150b 100644 --- a/crates/quark/src/types/january.rs +++ b/crates/quark/src/types/january.rs @@ -1,7 +1,10 @@ +use async_lock::Semaphore; +use async_std::task::spawn; +use futures::future::join_all; use linkify::{LinkFinder, LinkKind}; use regex::Regex; use serde::{Deserialize, Serialize}; -use std::collections::HashSet; +use std::{collections::HashSet, sync::Arc}; use crate::{models::attachment::File, Error, Result}; @@ -172,7 +175,7 @@ pub enum Embed { impl Embed { /// Generate embeds from given content - pub async fn generate(content: String, host: &str, max_embeds: usize) -> Result> { + pub async fn generate(content: String, host: &str, max_embeds: usize, semaphore: Arc) -> Result> { lazy_static! { static ref RE_CODE: Regex = Regex::new("```(?:.|\n)+?```|`(?:.|\n)+?`").unwrap(); static ref RE_IGNORED: Regex = Regex::new("()").unwrap(); @@ -223,26 +226,42 @@ impl Embed { } // ! FIXME: batch request to january? - let mut embeds: Vec = Vec::new(); let client = reqwest::Client::new(); + + let mut tasks = Vec::new(); + let url = format!("{host}/embed"); + for link in links { - let result = client - .get(&format!("{}/embed", host)) - .query(&[("url", link)]) - .send() - .await; + let client = client.clone(); + let url = url.clone(); + let semaphore = semaphore.clone(); - if result.is_err() { - continue; - } + tasks.push(spawn(async move { + let guard = semaphore.acquire().await; - let response = result.unwrap(); - if response.status().is_success() { - let res: Embed = response.json().await.map_err(|_| Error::InvalidOperation)?; - embeds.push(res); - } + let response = client + .get(url) + .query(&[("url", link)]) + .send() + .await + .ok()?; + + drop(guard); + + if response.status().is_success() { + response.json::().await.ok() + } else { + None + } + })); } + let embeds = join_all(tasks) + .await + .into_iter() + .flatten() + .collect::>(); + // Prevent database update when no embeds are found. if !embeds.is_empty() { Ok(embeds) diff --git a/crates/quark/src/util/variables/delta.rs b/crates/quark/src/util/variables/delta.rs index c180aa96..f81ff087 100644 --- a/crates/quark/src/util/variables/delta.rs +++ b/crates/quark/src/util/variables/delta.rs @@ -13,6 +13,8 @@ lazy_static! { env::var("AUTUMN_PUBLIC_URL").unwrap_or_else(|_| "https://example.com".to_string()); pub static ref JANUARY_URL: String = env::var("JANUARY_PUBLIC_URL").unwrap_or_else(|_| "https://example.com".to_string()); + pub static ref JANUARY_CONCURRENT_CONNECTIONS: usize = + env::var("JANUARY_CONCURRENT_CONNECTIONS").map_or(50, |v| v.parse().unwrap()); pub static ref VOSO_URL: String = env::var("VOSO_PUBLIC_URL").unwrap_or_else(|_| "https://example.com".to_string()); pub static ref VOSO_WS_HOST: String = From a406e5504d123971495090def83dd127d0aebef7 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 27 Jan 2023 16:17:47 +0000 Subject: [PATCH 16/23] chore: add support for Streamable in media struct --- crates/quark/src/types/january.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/crates/quark/src/types/january.rs b/crates/quark/src/types/january.rs index f626150b..2a8859f5 100644 --- a/crates/quark/src/types/january.rs +++ b/crates/quark/src/types/january.rs @@ -98,6 +98,8 @@ pub enum Special { content_type: BandcampType, id: String, }, + /// Streamable Video + Streamable { id: String }, } /// Website metadata @@ -175,7 +177,12 @@ pub enum Embed { impl Embed { /// Generate embeds from given content - pub async fn generate(content: String, host: &str, max_embeds: usize, semaphore: Arc) -> Result> { + pub async fn generate( + content: String, + host: &str, + max_embeds: usize, + semaphore: Arc, + ) -> Result> { lazy_static! { static ref RE_CODE: Regex = Regex::new("```(?:.|\n)+?```|`(?:.|\n)+?`").unwrap(); static ref RE_IGNORED: Regex = Regex::new("()").unwrap(); @@ -239,12 +246,7 @@ impl Embed { tasks.push(spawn(async move { let guard = semaphore.acquire().await; - let response = client - .get(url) - .query(&[("url", link)]) - .send() - .await - .ok()?; + let response = client.get(url).query(&[("url", link)]).send().await.ok()?; drop(guard); From 0afbcc065fff02dafd0788de620ee5d849714712 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 27 Jan 2023 16:18:00 +0000 Subject: [PATCH 17/23] refactor: clippy warning for empty list --- crates/delta/src/routes/channels/message_send.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/delta/src/routes/channels/message_send.rs b/crates/delta/src/routes/channels/message_send.rs index 59aa03df..3b45b1b8 100644 --- a/crates/delta/src/routes/channels/message_send.rs +++ b/crates/delta/src/routes/channels/message_send.rs @@ -90,7 +90,7 @@ pub async fn message_send( if let Some(interactions) = &data.interactions { if interactions.restrict_reactions { let disallowed = if let Some(list) = &interactions.reactions { - list.len() == 0 + list.is_empty() } else { true }; From c03fcda85bab3a7d084e525a67c90a5f826b903f Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 29 Jan 2023 14:14:35 +0000 Subject: [PATCH 18/23] refactor: switch from "rauth" to Authifier crate --- Cargo.lock | 104 +++++++++--------- crates/delta/Cargo.toml | 4 +- crates/delta/src/main.rs | 20 ++-- crates/delta/src/routes/mod.rs | 6 +- crates/delta/src/routes/onboard/complete.rs | 4 +- crates/delta/src/routes/onboard/hello.rs | 2 +- crates/delta/src/routes/push/subscribe.rs | 8 +- crates/delta/src/routes/push/unsubscribe.rs | 6 +- .../delta/src/routes/users/change_username.rs | 2 +- crates/quark/Cargo.toml | 10 +- crates/quark/src/database.rs | 10 +- crates/quark/src/events/client.rs | 4 +- .../impl/mongo/admin/migrations/scripts.rs | 16 +-- crates/quark/src/impl/rocket.rs | 6 +- crates/quark/src/lib.rs | 2 +- crates/quark/src/tasks/web_push.rs | 2 +- .../quark/src/util/{rauth.rs => authifier.rs} | 22 +++- crates/quark/src/util/mod.rs | 2 +- crates/quark/src/util/variables/delta.rs | 2 + crates/quark/src/web/ratelimiter.rs | 2 +- 20 files changed, 128 insertions(+), 106 deletions(-) rename crates/quark/src/util/{rauth.rs => authifier.rs} (80%) diff --git a/Cargo.lock b/Cargo.lock index 78e2f244..f501da5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -330,6 +330,40 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "authifier" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84411393a4326726ead660991ce8047f1865fa89900fb6c18e1e6c513cf1f9b" +dependencies = [ + "async-std", + "async-trait", + "base32", + "bson", + "chrono", + "futures", + "handlebars", + "iso8601-timestamp", + "lazy_static", + "lettre", + "log", + "mongodb", + "nanoid", + "rand 0.8.5", + "regex", + "reqwest", + "revolt_okapi", + "revolt_rocket_okapi", + "rocket", + "rust-argon2", + "schemars", + "serde", + "serde_json", + "totp-lite", + "ulid 0.5.0", + "validator 0.15.0", +] + [[package]] name = "autocfg" version = "0.1.8" @@ -2579,39 +2613,6 @@ dependencies = [ "rand_core 0.3.1", ] -[[package]] -name = "rauth" -version = "1.0.4" -source = "git+https://github.com/insertish/rauth?tag=1.0.4#2d3bc59623672e3ff57c49a90c4d3cd20780dbba" -dependencies = [ - "async-std", - "async-trait", - "base32", - "bson", - "chrono", - "futures", - "handlebars", - "iso8601-timestamp", - "lazy_static", - "lettre", - "log", - "mongodb", - "nanoid", - "rand 0.8.5", - "regex", - "reqwest", - "revolt_okapi", - "revolt_rocket_okapi", - "rocket", - "rust-argon2", - "schemars", - "serde", - "serde_json", - "totp-lite", - "ulid 0.5.0", - "validator 0.15.0", -] - [[package]] name = "rdrand" version = "0.4.0" @@ -2807,7 +2808,7 @@ dependencies = [ [[package]] name = "revolt-delta" -version = "0.5.6" +version = "0.5.5" dependencies = [ "async-channel", "async-std", @@ -2834,8 +2835,8 @@ dependencies = [ "revolt-quark", "revolt_rocket_okapi", "rocket", + "rocket_authifier", "rocket_empty", - "rocket_rauth", "schemars", "serde", "serde_json", @@ -2853,6 +2854,7 @@ dependencies = [ "async-recursion", "async-std", "async-trait", + "authifier", "base64 0.13.0", "bincode", "bitfield", @@ -2874,7 +2876,6 @@ dependencies = [ "once_cell", "optional_struct", "pretty_env_logger", - "rauth", "redis-kiss", "regex", "reqwest", @@ -3010,6 +3011,22 @@ dependencies = [ "yansi", ] +[[package]] +name = "rocket_authifier" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4554a81937341d8c3cd3e43431ac2d23624444dc3a88e7ffd3ff66593779293" +dependencies = [ + "authifier", + "iso8601-timestamp", + "revolt_okapi", + "revolt_rocket_okapi", + "rocket", + "rocket_empty", + "schemars", + "serde", +] + [[package]] name = "rocket_codegen" version = "0.5.0-rc.2" @@ -3080,21 +3097,6 @@ dependencies = [ "uncased", ] -[[package]] -name = "rocket_rauth" -version = "1.0.4" -source = "git+https://github.com/insertish/rauth?tag=1.0.4#2d3bc59623672e3ff57c49a90c4d3cd20780dbba" -dependencies = [ - "iso8601-timestamp", - "rauth", - "revolt_okapi", - "revolt_rocket_okapi", - "rocket", - "rocket_empty", - "schemars", - "serde", -] - [[package]] name = "rust-argon2" version = "1.0.0" diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index f3d3ffa3..0e0bfdbd 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "revolt-delta" -version = "0.5.6" +version = "0.5.5" license = "AGPL-3.0-or-later" authors = ["Paul Makles "] edition = "2018" @@ -52,7 +52,7 @@ mobc-redis = { version = "0.7.0", default-features = false, features = ["async-s # web rocket = { version = "0.5.0-rc.2", default-features = false, features = ["json"] } rocket_empty = { version = "0.1.1", features = ["schema"] } -rocket_rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.4" } +rocket_authifier = { version = "1.0.7" } # spec generation schemars = "0.8.8" diff --git a/crates/delta/src/main.rs b/crates/delta/src/main.rs index 4a7ab96d..4e9bba0a 100644 --- a/crates/delta/src/main.rs +++ b/crates/delta/src/main.rs @@ -11,8 +11,8 @@ pub mod routes; pub mod util; use async_std::channel::unbounded; +use revolt_quark::authifier::{Authifier, AuthifierEvent}; use revolt_quark::events::client::EventV1; -use revolt_quark::rauth::{RAuth, RAuthEvent}; use revolt_quark::DatabaseInfo; #[launch] @@ -27,25 +27,25 @@ async fn rocket() -> _ { let db = DatabaseInfo::Auto.connect().await.unwrap(); db.migrate_database().await.unwrap(); - // Setup rAuth event channel + // Setup Authifier event channel let (sender, receiver) = unbounded(); - // Setup rAuth - let rauth = RAuth { + // Setup Authifier + let authifier = Authifier { database: db.clone().into(), - config: revolt_quark::util::rauth::config(), + config: revolt_quark::util::authifier::config(), event_channel: Some(sender), }; - // Launch a listener for rAuth events + // Launch a listener for Authifier events async_std::task::spawn(async move { while let Ok(event) = receiver.recv().await { match &event { - RAuthEvent::CreateSession { .. } | RAuthEvent::CreateAccount { .. } => { + AuthifierEvent::CreateSession { .. } | AuthifierEvent::CreateAccount { .. } => { EventV1::Auth(event).global().await } - RAuthEvent::DeleteSession { user_id, .. } - | RAuthEvent::DeleteAllSessions { user_id, .. } => { + AuthifierEvent::DeleteSession { user_id, .. } + | AuthifierEvent::DeleteAllSessions { user_id, .. } => { let id = user_id.to_string(); EventV1::Auth(event).private(id).await } @@ -65,7 +65,7 @@ async fn rocket() -> _ { .mount("/", revolt_quark::web::cors::catch_all_options_routes()) .mount("/", revolt_quark::web::ratelimiter::routes()) .mount("/swagger/", revolt_quark::web::swagger::routes()) - .manage(rauth) + .manage(authifier) .manage(db) .manage(cors.clone()) .attach(revolt_quark::web::ratelimiter::RatelimitFairing) diff --git a/crates/delta/src/routes/mod.rs b/crates/delta/src/routes/mod.rs index b1af7ecf..dcde9768 100644 --- a/crates/delta/src/routes/mod.rs +++ b/crates/delta/src/routes/mod.rs @@ -27,9 +27,9 @@ pub fn mount(mut rocket: Rocket) -> Rocket { "/servers" => servers::routes(), "/invites" => invites::routes(), "/custom" => customisation::routes(), - "/auth/account" => rocket_rauth::routes::account::routes(), - "/auth/session" => rocket_rauth::routes::session::routes(), - "/auth/mfa" => rocket_rauth::routes::mfa::routes(), + "/auth/account" => rocket_authifier::routes::account::routes(), + "/auth/session" => rocket_authifier::routes::session::routes(), + "/auth/mfa" => rocket_authifier::routes::mfa::routes(), "/onboard" => onboard::routes(), "/push" => push::routes(), "/sync" => sync::routes(), diff --git a/crates/delta/src/routes/onboard/complete.rs b/crates/delta/src/routes/onboard/complete.rs index 1098091b..a96444f7 100644 --- a/crates/delta/src/routes/onboard/complete.rs +++ b/crates/delta/src/routes/onboard/complete.rs @@ -1,5 +1,7 @@ use crate::util::regex::RE_USERNAME; -use revolt_quark::{models::User, rauth::models::Session, Database, EmptyResponse, Error, Result}; +use revolt_quark::{ + authifier::models::Session, models::User, Database, EmptyResponse, Error, Result, +}; use rocket::{serde::json::Json, State}; use serde::{Deserialize, Serialize}; diff --git a/crates/delta/src/routes/onboard/hello.rs b/crates/delta/src/routes/onboard/hello.rs index 55bf5cf2..e8caa430 100644 --- a/crates/delta/src/routes/onboard/hello.rs +++ b/crates/delta/src/routes/onboard/hello.rs @@ -1,4 +1,4 @@ -use revolt_quark::{models::User, rauth::models::Session}; +use revolt_quark::{authifier::models::Session, models::User}; use rocket::serde::json::Json; use serde::Serialize; diff --git a/crates/delta/src/routes/push/subscribe.rs b/crates/delta/src/routes/push/subscribe.rs index 30740449..dea9f412 100644 --- a/crates/delta/src/routes/push/subscribe.rs +++ b/crates/delta/src/routes/push/subscribe.rs @@ -1,7 +1,7 @@ use revolt_quark::{ - rauth::{ + authifier::{ models::{Session, WebPushSubscription}, - RAuth, + Authifier, }, EmptyResponse, Error, Result, }; @@ -16,13 +16,13 @@ use rocket::{serde::json::Json, State}; #[openapi(tag = "Web Push")] #[post("/subscribe", data = "")] pub async fn req( - rauth: &State, + authifier: &State, mut session: Session, data: Json, ) -> Result { session.subscription = Some(data.into_inner()); session - .save(rauth) + .save(authifier) .await .map(|_| EmptyResponse) .map_err(|_| Error::DatabaseError { diff --git a/crates/delta/src/routes/push/unsubscribe.rs b/crates/delta/src/routes/push/unsubscribe.rs index 440ace0f..cbbe70de 100644 --- a/crates/delta/src/routes/push/unsubscribe.rs +++ b/crates/delta/src/routes/push/unsubscribe.rs @@ -1,5 +1,5 @@ use revolt_quark::{ - rauth::{models::Session, RAuth}, + authifier::{models::Session, Authifier}, EmptyResponse, Error, Result, }; @@ -10,10 +10,10 @@ use rocket::State; /// Remove the Web Push subscription associated with the current session. #[openapi(tag = "Web Push")] #[post("/unsubscribe")] -pub async fn req(rauth: &State, mut session: Session) -> Result { +pub async fn req(authifier: &State, mut session: Session) -> Result { session.subscription = None; session - .save(rauth) + .save(authifier) .await .map(|_| EmptyResponse) .map_err(|_| Error::DatabaseError { diff --git a/crates/delta/src/routes/users/change_username.rs b/crates/delta/src/routes/users/change_username.rs index 512e00cf..2941a2eb 100644 --- a/crates/delta/src/routes/users/change_username.rs +++ b/crates/delta/src/routes/users/change_username.rs @@ -1,5 +1,5 @@ use crate::util::regex::RE_USERNAME; -use revolt_quark::{models::User, rauth::models::Account, Database, Error, Result}; +use revolt_quark::{authifier::models::Account, models::User, Database, Error, Result}; use rocket::{serde::json::Json, State}; use serde::{Deserialize, Serialize}; use validator::Validate; diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index 1f08b715..b9c2fb83 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -16,9 +16,9 @@ rocket_impl = [ "lru", "dashmap", - "rauth/database-mongodb", - "rauth/rocket_impl", - "rauth/okapi_impl" + "authifier/database-mongodb", + "authifier/rocket_impl", + "authifier/okapi_impl" ] test = [ "async-std", "mongo", "mongodb/async-std-runtime", "rocket_impl" ] @@ -84,8 +84,8 @@ rocket = { optional = true, version = "0.5.0-rc.2", default-features = false, fe rocket_empty = { version = "0.1.1", optional = true, features = [ "schema" ] } rocket_cors = { optional = true, git = "https://github.com/lawliet89/rocket_cors", rev = "c17e8145baa4790319fdb6a473e465b960f55e7c" } -# rAuth -rauth = { git = "https://github.com/insertish/rauth", tag = "1.0.4", features = [ "async-std-runtime" ] } +# Authifier +authifier = { version = "1.0.7", features = [ "async-std-runtime" ] } # Sentry sentry = "0.25.0" diff --git a/crates/quark/src/database.rs b/crates/quark/src/database.rs index 1a0b382a..1388c850 100644 --- a/crates/quark/src/database.rs +++ b/crates/quark/src/database.rs @@ -61,13 +61,13 @@ impl Deref for Database { } } -impl From for rauth::Database { +impl From for authifier::Database { fn from(val: Database) -> Self { match val { - Database::Dummy(_) => rauth::Database::default(), - Database::MongoDb(MongoDb(client)) => { - rauth::Database::MongoDb(rauth::database::MongoDb(client.database("revolt"))) - } + Database::Dummy(_) => authifier::Database::default(), + Database::MongoDb(MongoDb(client)) => authifier::Database::MongoDb( + authifier::database::MongoDb(client.database("revolt")), + ), } } } diff --git a/crates/quark/src/events/client.rs b/crates/quark/src/events/client.rs index f9275e9d..ee91fab1 100644 --- a/crates/quark/src/events/client.rs +++ b/crates/quark/src/events/client.rs @@ -1,4 +1,4 @@ -use rauth::RAuthEvent; +use authifier::AuthifierEvent; use serde::{Deserialize, Serialize}; use crate::models::channel::{FieldsChannel, PartialChannel}; @@ -214,5 +214,5 @@ pub enum EventV1 { EmojiDelete { id: String }, /// Auth events - Auth(RAuthEvent), + Auth(AuthifierEvent), } diff --git a/crates/quark/src/impl/mongo/admin/migrations/scripts.rs b/crates/quark/src/impl/mongo/admin/migrations/scripts.rs index e986ac02..5fbd4b9c 100644 --- a/crates/quark/src/impl/mongo/admin/migrations/scripts.rs +++ b/crates/quark/src/impl/mongo/admin/migrations/scripts.rs @@ -215,7 +215,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } if revision <= 8 { - info!("Running migration [revision 8 / 2021-09-10]: Update to rAuth version 1."); + info!("Running migration [revision 8 / 2021-09-10]: Update to Authifier version 1."); db.db() .run_command( @@ -603,20 +603,20 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } if revision <= 15 { - info!("Running migration [revision 15 / 04-06-2022]: Migrate rAuth to latest version."); + info!("Running migration [revision 15 / 04-06-2022]: Migrate Authifier to latest version."); - let db = rauth::Database::MongoDb(rauth::database::MongoDb(db.db())); - db.run_migration(rauth::Migration::M2022_06_03EnsureUpToSpec) + let db = authifier::Database::MongoDb(authifier::database::MongoDb(db.db())); + db.run_migration(authifier::Migration::M2022_06_03EnsureUpToSpec) .await .unwrap(); } if revision <= 16 { - info!("Running migration [revision 16 / 07-07-2022]: Add `emojis` collection and rAuth migration."); + info!("Running migration [revision 16 / 07-07-2022]: Add `emojis` collection and Authifier migration."); - let rauth_db = rauth::Database::MongoDb(rauth::database::MongoDb(db.db())); - rauth_db - .run_migration(rauth::Migration::M2022_06_09AddIndexForDeletion) + let authifier_db = authifier::Database::MongoDb(authifier::database::MongoDb(db.db())); + authifier_db + .run_migration(authifier::Migration::M2022_06_09AddIndexForDeletion) .await .unwrap(); diff --git a/crates/quark/src/impl/rocket.rs b/crates/quark/src/impl/rocket.rs index 0756bd38..22c1466c 100644 --- a/crates/quark/src/impl/rocket.rs +++ b/crates/quark/src/impl/rocket.rs @@ -1,4 +1,4 @@ -use rauth::models::Session; +use authifier::models::Session; use revolt_okapi::openapi3::{SecurityScheme, SecuritySchemeData}; use revolt_rocket_okapi::gen::OpenApiGenerator; use revolt_rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; @@ -12,7 +12,7 @@ use crate::Database; #[rocket::async_trait] impl<'r> FromRequest<'r> for User { - type Error = rauth::Error; + type Error = authifier::Error; async fn from_request(request: &'r Request<'_>) -> request::Outcome { let user: &Option = request @@ -43,7 +43,7 @@ impl<'r> FromRequest<'r> for User { if let Some(user) = user { Outcome::Success(user.clone()) } else { - Outcome::Failure((Status::Unauthorized, rauth::Error::InvalidSession)) + Outcome::Failure((Status::Unauthorized, authifier::Error::InvalidSession)) } } } diff --git a/crates/quark/src/lib.rs b/crates/quark/src/lib.rs index f3a77166..2d063639 100644 --- a/crates/quark/src/lib.rs +++ b/crates/quark/src/lib.rs @@ -17,8 +17,8 @@ extern crate bitfield; #[macro_use] extern crate bson; +pub use authifier; pub use iso8601_timestamp::Timestamp; -pub use rauth; pub use redis_kiss; pub mod events; diff --git a/crates/quark/src/tasks/web_push.rs b/crates/quark/src/tasks/web_push.rs index 08a6d851..c9428f6f 100644 --- a/crates/quark/src/tasks/web_push.rs +++ b/crates/quark/src/tasks/web_push.rs @@ -1,8 +1,8 @@ use crate::bson::doc; use crate::util::variables::delta::VAPID_PRIVATE_KEY; +use authifier::Database; use deadqueue::limited::Queue; -use rauth::Database; use web_push::{ ContentEncoding, SubscriptionInfo, SubscriptionKeys, VapidSignatureBuilder, WebPushClient, WebPushMessageBuilder, diff --git a/crates/quark/src/util/rauth.rs b/crates/quark/src/util/authifier.rs similarity index 80% rename from crates/quark/src/util/rauth.rs rename to crates/quark/src/util/authifier.rs index 02d8b26b..e87803d5 100644 --- a/crates/quark/src/util/rauth.rs +++ b/crates/quark/src/util/authifier.rs @@ -1,9 +1,11 @@ +use authifier::config::{ResolveIp, Shield}; + use super::variables::delta::{ - APP_URL, HCAPTCHA_KEY, INVITE_ONLY, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME, - USE_EMAIL, USE_HCAPTCHA, + APP_URL, AUTHIFIER_SHIELD_KEY, HCAPTCHA_KEY, INVITE_ONLY, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, + SMTP_USERNAME, USE_EMAIL, USE_HCAPTCHA, }; -use crate::rauth::config::{ +use crate::authifier::config::{ Captcha, Config, EmailVerificationConfig, SMTPSettings, Template, Templates, }; @@ -59,5 +61,19 @@ pub fn config() -> Config { }; } + if let Some(api_key) = &*AUTHIFIER_SHIELD_KEY { + config.shield = Shield::Enabled { + api_key: api_key.to_string(), + strict: false, + }; + } + + if std::env::var("TRUST_CLOUDFLARE") + .map(|x| x == "1") + .unwrap_or_default() + { + config.resolve_ip = ResolveIp::Cloudflare; + } + config } diff --git a/crates/quark/src/util/mod.rs b/crates/quark/src/util/mod.rs index bb83ded1..a4aa2814 100644 --- a/crates/quark/src/util/mod.rs +++ b/crates/quark/src/util/mod.rs @@ -1,7 +1,7 @@ +pub mod authifier; pub mod log; pub mod manipulation; pub mod pfp; -pub mod rauth; pub mod r#ref; pub mod regex; pub mod result; diff --git a/crates/quark/src/util/variables/delta.rs b/crates/quark/src/util/variables/delta.rs index f81ff087..bb789987 100644 --- a/crates/quark/src/util/variables/delta.rs +++ b/crates/quark/src/util/variables/delta.rs @@ -30,6 +30,8 @@ lazy_static! { env::var("REVOLT_VAPID_PRIVATE_KEY").expect("Missing REVOLT_VAPID_PRIVATE_KEY environment variable."); pub static ref VAPID_PUBLIC_KEY: String = env::var("REVOLT_VAPID_PUBLIC_KEY").expect("Missing REVOLT_VAPID_PUBLIC_KEY environment variable."); + pub static ref AUTHIFIER_SHIELD_KEY: Option = + env::var("REVOLT_AUTHIFIER_SHIELD_KEY").ok(); // Application Flags pub static ref INVITE_ONLY: bool = env::var("REVOLT_INVITE_ONLY").map_or(false, |v| v == "1"); diff --git a/crates/quark/src/web/ratelimiter.rs b/crates/quark/src/web/ratelimiter.rs index 853d9aa8..5a4ec96a 100644 --- a/crates/quark/src/web/ratelimiter.rs +++ b/crates/quark/src/web/ratelimiter.rs @@ -8,7 +8,7 @@ use std::hash::Hasher; use std::ops::Add; use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use crate::rauth::models::Session; +use crate::authifier::models::Session; use rocket::fairing::{Fairing, Info, Kind}; use rocket::http::uri::Origin; use rocket::http::{Method, Status}; From 0da4baf777b17316b701964dbfd9dfa40e386303 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 29 Jan 2023 14:16:18 +0000 Subject: [PATCH 19/23] chore: bump version and clean up repo --- .github/FUNDING.yml | 2 -- Cargo.lock | 6 +++--- build.sh | 7 ------- crates/bonfire/Cargo.toml | 2 +- crates/delta/Cargo.toml | 2 +- crates/quark/Cargo.toml | 2 +- 6 files changed, 6 insertions(+), 15 deletions(-) delete mode 100644 .github/FUNDING.yml delete mode 100755 build.sh diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index dcf3dd90..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -ko_fi: insertish -custom: https://insrt.uk/donate diff --git a/Cargo.lock b/Cargo.lock index f501da5a..05d72cb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2792,7 +2792,7 @@ dependencies = [ [[package]] name = "revolt-bonfire" -version = "0.5.6" +version = "0.5.7" dependencies = [ "async-std", "async-tungstenite", @@ -2808,7 +2808,7 @@ dependencies = [ [[package]] name = "revolt-delta" -version = "0.5.5" +version = "0.5.7" dependencies = [ "async-channel", "async-std", @@ -2848,7 +2848,7 @@ dependencies = [ [[package]] name = "revolt-quark" -version = "0.5.6" +version = "0.5.7" dependencies = [ "async-lock", "async-recursion", diff --git a/build.sh b/build.sh deleted file mode 100755 index 9c9a9162..00000000 --- a/build.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -# Build base image -docker build -t revolt.chat/base:latest -f Dockerfile . - -# Build crates -docker build -t revolt.chat/delta:latest -f crates/delta/Dockerfile . -docker build -t revolt.chat/bonfire:latest -f crates/bonfire/Dockerfile . diff --git a/crates/bonfire/Cargo.toml b/crates/bonfire/Cargo.toml index bb7a05fd..29cdab6a 100644 --- a/crates/bonfire/Cargo.toml +++ b/crates/bonfire/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "revolt-bonfire" -version = "0.5.6" +version = "0.5.7" license = "AGPL-3.0-or-later" edition = "2021" diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index 0e0bfdbd..7ae7064b 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "revolt-delta" -version = "0.5.5" +version = "0.5.7" license = "AGPL-3.0-or-later" authors = ["Paul Makles "] edition = "2018" diff --git a/crates/quark/Cargo.toml b/crates/quark/Cargo.toml index b9c2fb83..0dff3b61 100644 --- a/crates/quark/Cargo.toml +++ b/crates/quark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "revolt-quark" -version = "0.5.6" +version = "0.5.7" license = "AGPL-3.0-or-later" edition = "2021" From 8e0addc3e09cf8cd2e49b8bbcd7206312ac76ee2 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 29 Jan 2023 14:22:57 +0000 Subject: [PATCH 20/23] fix: fallback properly if no VERGEN strings can generate --- crates/delta/src/routes/root.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/crates/delta/src/routes/root.rs b/crates/delta/src/routes/root.rs index 59bd8dc9..c6743142 100644 --- a/crates/delta/src/routes/root.rs +++ b/crates/delta/src/routes/root.rs @@ -119,12 +119,21 @@ pub async fn root() -> Result> { app: APP_URL.to_string(), vapid: VAPID_PUBLIC_KEY.to_string(), build: BuildInformation { - commit_sha: env!("VERGEN_GIT_SHA", "").to_string(), - commit_timestamp: env!("VERGEN_GIT_COMMIT_TIMESTAMP", "") + commit_sha: option_env!("VERGEN_GIT_SHA") + .unwrap_or_else(|| "") + .to_string(), + commit_timestamp: option_env!("VERGEN_GIT_COMMIT_TIMESTAMP") + .unwrap_or_else(|| "") + .to_string(), + semver: option_env!("VERGEN_GIT_SEMVER") + .unwrap_or_else(|| "") + .to_string(), + origin_url: option_env!("GIT_ORIGIN_URL") + .unwrap_or_else(|| "") + .to_string(), + timestamp: option_env!("VERGEN_BUILD_TIMESTAMP") + .unwrap_or_else(|| "") .to_string(), - semver: env!("VERGEN_GIT_SEMVER", "").to_string(), - origin_url: env!("GIT_ORIGIN_URL", "").to_string(), - timestamp: env!("VERGEN_BUILD_TIMESTAMP", "").to_string(), }, })) } From fdab997d1749109e128c26fb23a186cb22a08e68 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 29 Jan 2023 14:23:56 +0000 Subject: [PATCH 21/23] chore(ci): switch testing to stable Rust --- .github/workflows/rust.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index 08abe127..4c77fb41 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Install latest nightly + - name: Install latest stable uses: actions-rs/toolchain@v1 with: - toolchain: nightly + toolchain: stable override: true components: rustfmt, clippy From c4b98848258f2bfc4b8bffd25d97119e9a40f8bf Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 29 Jan 2023 16:36:44 +0000 Subject: [PATCH 22/23] fix(ci): use correct token --- .github/workflows/rust.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index 4c77fb41..24d0aaf9 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -72,4 +72,4 @@ jobs: add: "*.json" message: "chore: generate OpenAPI specification" env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.PAT }} From e780178cc07f2443d381ec115883aacc0dcc294d Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 29 Jan 2023 16:46:19 +0000 Subject: [PATCH 23/23] fix(ci): move token definition to correct stage --- .github/workflows/rust.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index 24d0aaf9..abcbaf8d 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -59,6 +59,7 @@ jobs: with: repository: revoltchat/api path: api + token: ${{ secrets.PAT }} - name: Download OpenAPI specification if: github.event_name != 'pull_request' @@ -71,5 +72,3 @@ jobs: cwd: "api" add: "*.json" message: "chore: generate OpenAPI specification" - env: - GITHUB_TOKEN: ${{ secrets.PAT }}