diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index aec7c0f..1d9e0d4 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -19,7 +19,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: upgrade run: rustup override set nightly - name: nightly-clippy diff --git a/Cargo.lock b/Cargo.lock index 2d2bfe7..bd18c85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -361,6 +361,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bitflags" version = "1.3.2" @@ -630,11 +636,12 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.5.3" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28" dependencies = [ "cfg-if", + "crossbeam-utils", "hashbrown", "lock_api", "once_cell", @@ -1124,9 +1131,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" dependencies = [ "equivalent", "hashbrown", @@ -1202,13 +1209,14 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "8.3.0" +version = "9.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" dependencies = [ "base64 0.21.7", + "js-sys", "pem", - "ring 0.16.20", + "ring", "serde", "serde_json", "simple_asn1", @@ -1332,9 +1340,9 @@ dependencies = [ [[package]] name = "mongodb" -version = "2.8.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef206acb1b72389b49bc9985efe7eb1f8a9bb18e5680d262fac26c07f44025f1" +checksum = "60f61f1556ee1d65e0b256e5bbc6d61e10022d1e3df86c23526d469bd832fa24" dependencies = [ "async-trait", "base64 0.13.1", @@ -1349,8 +1357,9 @@ dependencies = [ "futures-util", "hex", "hmac", - "lazy_static", "md-5", + "mongodb-internal-macros", + "once_cell", "pbkdf2", "percent-encoding", "rand", @@ -1362,7 +1371,7 @@ dependencies = [ "serde_with", "sha-1", "sha2", - "socket2 0.4.10", + "socket2 0.5.7", "stringprep", "strsim", "take_mut", @@ -1377,6 +1386,17 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "mongodb-internal-macros" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "934305ae9c66ef6a3aa728c66dec8fa2424de4dfcd043c7acaffacae2bf99442" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -1488,11 +1508,12 @@ dependencies = [ [[package]] name = "pem" -version = "1.1.1" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.13.1", + "base64 0.22.1", + "serde", ] [[package]] @@ -1714,21 +1735,6 @@ dependencies = [ "quick-error", ] -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - [[package]] name = "ring" version = "0.17.8" @@ -1739,8 +1745,8 @@ dependencies = [ "cfg-if", "getrandom", "libc", - "spin 0.9.8", - "untrusted 0.9.0", + "spin", + "untrusted", "windows-sys 0.52.0", ] @@ -1834,7 +1840,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.8", + "ring", "rustls-webpki", "sct", ] @@ -1854,8 +1860,8 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -1876,8 +1882,8 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -2060,12 +2066,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -2391,12 +2391,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" diff --git a/Cargo.toml b/Cargo.toml index 2398205..aaeab73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ async-std = { version = "1.12.0", features = ["attributes", "tokio1"] } async-trait = "0.1.73" futures-util = "0.3.28" -dashmap = "5.5.0" +dashmap = "6.0.0" lazy_static = "1.4.0" once_cell = "1.18.0" @@ -24,8 +24,8 @@ log = "0.4.20" async-tungstenite = "0.27.0" -mongodb = "2.6.0" -jsonwebtoken = "8.3.0" +mongodb = "3.0.0" +jsonwebtoken = "9.0.0" redis = { version = "0.26.0", features = ["async-std-comp"] } serde = { version = "1.0.183", features = ["derive"] } diff --git a/src/services/database/calls.rs b/src/services/database/calls.rs index 75ac352..7e2ca80 100644 --- a/src/services/database/calls.rs +++ b/src/services/database/calls.rs @@ -20,7 +20,7 @@ impl Call { let database = super::get_database(); database .collection::("calls") - .insert_one(self.clone(), None) + .insert_one(self.clone()) .await?; Ok(()) } @@ -39,7 +39,6 @@ impl Call { "ended_at": chrono::Utc::now().timestamp_millis(), }, }, - None, ) .await?; Ok(()) diff --git a/src/services/database/channels.rs b/src/services/database/channels.rs index 09e699e..276cad0 100644 --- a/src/services/database/channels.rs +++ b/src/services/database/channels.rs @@ -56,12 +56,9 @@ impl Channel { let database = super::get_database(); let channel = database .collection::("channels") - .find_one( - doc! { - "id": id, - }, - None, - ) + .find_one(doc! { + "id": id, + }) .await?; match channel { Some(channel) => Ok(channel), @@ -94,7 +91,8 @@ impl Channel { .build(); let messages: Vec<_> = database .collection::("messages") - .find(query, options) + .find(query) + .with_options(options) .await? .collect() .await; diff --git a/src/services/database/events.rs b/src/services/database/events.rs index d912420..f63f6a9 100644 --- a/src/services/database/events.rs +++ b/src/services/database/events.rs @@ -129,12 +129,9 @@ pub async fn get_event(event_id: String) -> Result { let database = super::get_database(); let event = database .collection::("events") - .find_one( - doc! { - "id": event_id, - }, - None, - ) + .find_one(doc! { + "id": event_id, + }) .await?; match event { Some(event) => Ok(event), diff --git a/src/services/database/infractions.rs b/src/services/database/infractions.rs index 51bb463..c7a9c93 100644 --- a/src/services/database/infractions.rs +++ b/src/services/database/infractions.rs @@ -45,7 +45,7 @@ pub async fn create_ban( }; database .collection::("infraction") - .insert_one(ban, None) + .insert_one(ban) .await?; Ok(()) } @@ -54,17 +54,14 @@ pub async fn is_banned(user_id: String, space_id: String) -> Result { let database = super::get_database(); let bans = database .collection::("infractions") - .find( - doc! { - "member_id": user_id, - "space_id": space_id, - "expires_at": { - "$gt": chrono::Utc::now().timestamp_millis() - }, - "infraction_type": "BAN" + .find(doc! { + "member_id": user_id, + "space_id": space_id, + "expires_at": { + "$gt": chrono::Utc::now().timestamp_millis() }, - None, - ) + "infraction_type": "BAN" + }) .await?; let is_banned = bans.count().await > 0; Ok(is_banned) @@ -74,13 +71,10 @@ pub async fn revoke_ban(ban_id: String) -> Result<()> { let database = super::get_database(); database .collection::("infractions") - .delete_one( - doc! { - "id": ban_id, - "infraction_type": "BAN" - }, - None, - ) + .delete_one(doc! { + "id": ban_id, + "infraction_type": "BAN" + }) .await?; Ok(()) } diff --git a/src/services/database/invites.rs b/src/services/database/invites.rs index db8ac0b..fcf43d1 100644 --- a/src/services/database/invites.rs +++ b/src/services/database/invites.rs @@ -48,7 +48,7 @@ impl Invite { let database = super::get_database(); database .collection::("invites") - .insert_one(invite.clone(), None) + .insert_one(invite.clone()) .await?; Ok(invite) } @@ -57,12 +57,9 @@ impl Invite { let database = super::get_database(); let invite = database .collection::("invites") - .find_one( - doc! { - "id": code, - }, - None, - ) + .find_one(doc! { + "id": code, + }) .await?; match invite { Some(invite) => Ok(invite), @@ -73,12 +70,9 @@ impl Invite { let database = super::get_database(); let result = database .collection::("invites") - .delete_one( - doc! { - "id": &self.id, - }, - None, - ) + .delete_one(doc! { + "id": &self.id, + }) .await? .deleted_count > 0; @@ -104,7 +98,7 @@ pub async fn get_invites(channel_id: String, space_id: Option) -> Result } let invites: std::result::Result, _> = database .collection::("invites") - .find(query, None) + .find(query) .await? .collect::>() .await diff --git a/src/services/database/members.rs b/src/services/database/members.rs index 327d892..5d9f237 100644 --- a/src/services/database/members.rs +++ b/src/services/database/members.rs @@ -123,13 +123,10 @@ impl Member { let database = super::get_database(); let member = database .collection::("members") - .find_one( - doc! { - "id": id, - "space_id": space_id, - }, - None, - ) + .find_one(doc! { + "id": id, + "space_id": space_id, + }) .await? .ok_or(crate::errors::Error::NotFound)?; Ok(member) @@ -139,13 +136,10 @@ impl Member { let database = super::get_database(); database .collection::("members") - .delete_one( - doc! { - "id": self.id.clone(), - "space_id": space_id - }, - None, - ) + .delete_one(doc! { + "id": self.id.clone(), + "space_id": space_id + }) .await?; Ok(()) } diff --git a/src/services/database/messages.rs b/src/services/database/messages.rs index 4f84fd2..183cecd 100644 --- a/src/services/database/messages.rs +++ b/src/services/database/messages.rs @@ -30,7 +30,7 @@ impl Message { let database = super::get_database(); database .collection::("messages") - .insert_one(message.clone(), None) + .insert_one(message.clone()) .await?; Ok(message) } @@ -45,7 +45,6 @@ impl Message { "edited": true, "editedAt": chrono::Utc::now().timestamp_millis(), } }, - None, ) .await?; match message { @@ -58,7 +57,7 @@ impl Message { let database = super::get_database(); let message = database .collection::("messages") - .find_one_and_delete(doc! { "id": &self.id }, None) + .find_one_and_delete(doc! { "id": &self.id }) .await?; match message { Some(message) => Ok(message), diff --git a/src/services/database/roles.rs b/src/services/database/roles.rs index fa706d6..f7cccad 100644 --- a/src/services/database/roles.rs +++ b/src/services/database/roles.rs @@ -43,19 +43,16 @@ impl Role { space_id: space.id.clone(), scope_id: "global".to_string(), // FIXME: scope_id }; - roles.insert_one(role.clone(), None).await?; + roles.insert_one(role.clone()).await?; Ok(role) } pub async fn delete(&self) -> Result<()> { let roles = super::get_database().collection::("roles"); roles - .delete_one( - doc! { - "id": &self.id, - }, - None, - ) + .delete_one(doc! { + "id": &self.id, + }) .await?; Ok(()) } @@ -63,12 +60,9 @@ impl Role { pub async fn get(id: &String) -> Result { let roles = super::get_database().collection::("roles"); let role = roles - .find_one( - doc! { - "id": &id, - }, - None, - ) + .find_one(doc! { + "id": &id, + }) .await?; match role { Some(role) => Ok(role), @@ -90,7 +84,6 @@ impl Role { "color": bson::to_bson(&color)?, }, }, - None, ) .await?; match role { diff --git a/src/services/database/scopes.rs b/src/services/database/scopes.rs index 6b28211..89dee1d 100644 --- a/src/services/database/scopes.rs +++ b/src/services/database/scopes.rs @@ -20,17 +20,14 @@ impl Scope { pub async fn create(name: String) -> Result<()> { let scopes = super::get_database().collection::("scopes"); scopes - .insert_one( - Scope { - id: Ulid::new().to_string(), - name, - disabled: false, - nexuses: Vec::new(), - channels: Vec::new(), - users: Vec::new(), - }, - None, - ) + .insert_one(Scope { + id: Ulid::new().to_string(), + name, + disabled: false, + nexuses: Vec::new(), + channels: Vec::new(), + users: Vec::new(), + }) .await?; Ok(()) } @@ -43,12 +40,9 @@ impl Scope { ) -> Result { let scopes = super::get_database().collection::("scopes"); let scope = scopes - .find_one( - doc! { - "id": &self.id - }, - None, - ) + .find_one(doc! { + "id": &self.id + }) .await?; match scope { Some(mut s) => { @@ -80,12 +74,9 @@ impl Scope { } else { let scopes = super::get_database().collection::("scopes"); scopes - .delete_one( - doc! { - "id": &self.id - }, - None, - ) + .delete_one(doc! { + "id": &self.id + }) .await?; Ok(true) } diff --git a/src/services/database/spaces.rs b/src/services/database/spaces.rs index 9c31f1a..d738bfc 100644 --- a/src/services/database/spaces.rs +++ b/src/services/database/spaces.rs @@ -41,55 +41,40 @@ impl Space { scope_id: scope_id.unwrap_or_else(|| "global".to_owned()), base_permissions: 0x16, }; - spaces.insert_one(space.clone(), None).await?; + spaces.insert_one(space.clone()).await?; Ok(space) } pub async fn delete(&self) -> Result<()> { let spaces = super::get_database().collection::("spaces"); spaces - .delete_one( - doc! { - "id": &self.id, - }, - None, - ) + .delete_one(doc! { + "id": &self.id, + }) .await?; let channels = super::get_database().collection::("channels"); channels - .delete_many( - doc! { - "space_id": &self.id, - }, - None, - ) + .delete_many(doc! { + "space_id": &self.id, + }) .await?; let invites = super::get_database().collection::("invites"); invites - .delete_many( - doc! { - "space_id": &self.id, - }, - None, - ) + .delete_many(doc! { + "space_id": &self.id, + }) .await?; let roles = super::get_database().collection::("roles"); roles - .delete_many( - doc! { - "space_id": &self.id, - }, - None, - ) + .delete_many(doc! { + "space_id": &self.id, + }) .await?; let members = super::get_database().collection::("members"); members - .delete_many( - doc! { - "space_id": &self.id, - }, - None, - ) + .delete_many(doc! { + "space_id": &self.id, + }) .await?; Ok(()) } @@ -97,12 +82,9 @@ impl Space { pub async fn get(id: &String) -> Result { let spaces = super::get_database().collection::("spaces"); let space = spaces - .find_one( - doc! { - "id": id, - }, - None, - ) + .find_one(doc! { + "id": id, + }) .await?; if let Some(space) = space { Ok(space) @@ -122,7 +104,6 @@ impl Space { "members": id, }, }, - None, ) .await?; Ok(()) @@ -139,7 +120,6 @@ impl Space { "members": id, }, }, - None, ) .await?; Ok(()) @@ -169,7 +149,6 @@ impl Space { doc! { "$set": update, }, - None, ) .await?; match space { @@ -189,7 +168,6 @@ impl Space { "owner": user_id, }, }, - None, ) .await?; Ok(()) @@ -199,12 +177,9 @@ impl Space { let database = super::get_database(); let channels: Vec = database .collection::("channels") - .find( - doc! { - "space_id": &self.id, - }, - None, - ) + .find(doc! { + "space_id": &self.id, + }) .await? .try_collect() .await?; @@ -215,13 +190,10 @@ impl Space { let database = super::get_database(); let channel = database .collection::("channels") - .find_one( - doc! { - "id": id, - "space_id": &self.id, - }, - None, - ) + .find_one(doc! { + "id": id, + "space_id": &self.id, + }) .await?; match channel { Some(channel) => Ok(channel), @@ -232,12 +204,9 @@ impl Space { pub async fn get_roles(&self) -> Result> { let roles = super::get_database().collection::("roles"); let roles = roles - .find( - doc! { - "space_id": &self.id, - }, - None, - ) + .find(doc! { + "space_id": &self.id, + }) .await?; Ok(roles.try_collect().await?) } diff --git a/src/services/database/users.rs b/src/services/database/users.rs index 1c354d5..64d7aea 100644 --- a/src/services/database/users.rs +++ b/src/services/database/users.rs @@ -52,14 +52,11 @@ impl User { pub async fn get_spaces(&self) -> Result> { let spaces = super::get_database().collection::("spaces"); let spaces = spaces - .find( - doc! { - "members": { - "$in": [&self.id], - }, + .find(doc! { + "members": { + "$in": [&self.id], }, - None, - ) + }) .await?; let mut spaces: Vec = spaces .filter_map(|space| async { space.ok() }) @@ -72,15 +69,12 @@ impl User { pub async fn in_space(&self, space_id: &String) -> Result { let spaces = super::get_database().collection::("spaces"); let space = spaces - .find_one( - doc! { - "id": space_id, - "members": { - "$in": [&self.id], - }, + .find_one(doc! { + "id": space_id, + "members": { + "$in": [&self.id], }, - None, - ) + }) .await?; Ok(space.is_some()) } @@ -113,12 +107,9 @@ impl User { pub async fn get(id: &String) -> Result { let users = super::get_database().collection::("users"); let user = users - .find_one( - doc! { - "id": id - }, - None, - ) + .find_one(doc! { + "id": id + }) .await?; match user { Some(user) => Ok(user), @@ -136,7 +127,7 @@ impl User { online: None, presence: None, }; - users.insert_one(user.clone(), None).await?; + users.insert_one(user.clone()).await?; Ok(user) } @@ -159,7 +150,7 @@ impl User { "$set": { "affinities.$[affinity].relationship": bson::to_bson(&Relationship::Friend)? } - }, + }).with_options( Some(mongodb::options::UpdateOptions::builder() .array_filters(vec![doc! { "affinity.id": &friend_id @@ -176,7 +167,7 @@ impl User { "$set": { "affinities.$[affinity].relationship": bson::to_bson(&Relationship::Friend)? } - }, + }).with_options( Some(mongodb::options::UpdateOptions::builder() .array_filters(vec![doc! { "affinity.id": &self.id @@ -201,7 +192,6 @@ impl User { } } }, - None, ) .await?; users @@ -217,7 +207,6 @@ impl User { } } }, - None, ) .await?; Ok(()) @@ -237,7 +226,6 @@ impl User { "uses": &self.id, } }, - None, ) .await?; let invite = match invite { @@ -245,12 +233,9 @@ impl User { None => return Err(Error::NotFound), }; let space = spaces - .find_one( - doc! { - "id": invite.space_id, - }, - None, - ) + .find_one(doc! { + "id": invite.space_id, + }) .await?; let space = match space { Some(space) => space, @@ -262,24 +247,21 @@ impl User { pub async fn get_channels(&self) -> Result> { let channels = super::get_database().collection::("channels"); let channels = channels - .find( - doc! { - "$or": [ - { - "initiator_id": &self.id - }, - { - "target_id": &self.id - }, - { - "members": { - "$in": [&self.id], - } + .find(doc! { + "$or": [ + { + "initiator_id": &self.id + }, + { + "target_id": &self.id + }, + { + "members": { + "$in": [&self.id], } - ] - }, - None, - ) + } + ] + }) .await?; let channels: Vec = channels .filter_map(|channel| async { channel.ok() }) diff --git a/src/services/webrtc.rs b/src/services/webrtc.rs index eed7c7c..c47332c 100644 --- a/src/services/webrtc.rs +++ b/src/services/webrtc.rs @@ -170,12 +170,10 @@ impl FromRedisValue for ActiveCall { let data = deserialize(bytes); match data { Ok(data) => Ok(data), - Err(_) => { - Err(redis::RedisError::from(( - redis::ErrorKind::TypeError, - "Deserialization error", - ))) - } + Err(_) => Err(redis::RedisError::from(( + redis::ErrorKind::TypeError, + "Deserialization error", + ))), } } @@ -194,12 +192,10 @@ impl FromRedisValue for NodeEvent { let data = deserialize(bytes); match data { Ok(data) => Ok(data), - Err(_) => { - Err(redis::RedisError::from(( - redis::ErrorKind::TypeError, - "Deserialization error", - ))) - } + Err(_) => Err(redis::RedisError::from(( + redis::ErrorKind::TypeError, + "Deserialization error", + ))), } } @@ -228,11 +224,7 @@ pub struct RtcAuthorization { } impl ActiveCall { - pub async fn create( - space: &String, - channel: &String, - initiator: &str, - ) -> Result { + pub async fn create(space: &String, channel: &String, initiator: &str) -> Result { let mut redis = get_connection().await; let call = Self::get_in_channel(space, channel).await?; if call.is_some() {