diff --git a/Cargo.lock b/Cargo.lock index b5fdd49c..e5a1118a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1327,6 +1327,19 @@ dependencies = [ "tokio-tls", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes 1.0.1", + "hyper 0.14.11", + "native-tls", + "tokio 1.9.0", + "tokio-native-tls", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1688,7 +1701,7 @@ dependencies = [ "pbkdf2", "percent-encoding", "rand 0.7.3", - "reqwest", + "reqwest 0.10.10", "rustls 0.17.0", "serde", "serde_bytes", @@ -2515,7 +2528,7 @@ dependencies = [ [[package]] name = "rauth" version = "0.3.0" -source = "git+https://gitlab.insrt.uk/insert/rauth?rev=840ad003263fd5570aba4866e7d72e4fc1b3e95a#840ad003263fd5570aba4866e7d72e4fc1b3e95a" +source = "git+https://gitlab.insrt.uk/insert/rauth?rev=19bef300ecc269c028e3d746f0a2f09842d3b37b#19bef300ecc269c028e3d746f0a2f09842d3b37b" dependencies = [ "chrono", "handlebars", @@ -2525,7 +2538,7 @@ dependencies = [ "mongodb", "nanoid 0.3.0", "regex", - "reqwest", + "reqwest 0.11.4", "rocket", "rust-argon2", "serde", @@ -2620,14 +2633,12 @@ dependencies = [ "http-body 0.3.1", "hyper 0.13.10", "hyper-rustls", - "hyper-tls", "ipnet", "js-sys", "lazy_static", "log", "mime", "mime_guess", - "native-tls", "percent-encoding", "pin-project-lite 0.2.4", "rustls 0.18.1", @@ -2636,7 +2647,6 @@ dependencies = [ "serde_urlencoded", "tokio 0.2.25", "tokio-rustls 0.14.1", - "tokio-tls", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -2645,6 +2655,41 @@ dependencies = [ "winreg 0.7.0", ] +[[package]] +name = "reqwest" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" +dependencies = [ + "base64 0.13.0", + "bytes 1.0.1", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body 0.4.2", + "hyper 0.14.11", + "hyper-tls 0.5.0", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite 0.2.4", + "serde", + "serde_json", + "serde_urlencoded", + "tokio 1.9.0", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.7.0", +] + [[package]] name = "resolv-conf" version = "0.7.0" @@ -2682,7 +2727,7 @@ dependencies = [ "phf", "rauth", "regex", - "reqwest", + "reqwest 0.11.4", "rocket", "rocket-governor", "rocket_cors", @@ -3460,6 +3505,16 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio 1.9.0", +] + [[package]] name = "tokio-rustls" version = "0.13.1" @@ -3975,7 +4030,7 @@ dependencies = [ "futures", "http", "hyper 0.13.10", - "hyper-tls", + "hyper-tls 0.4.3", "lazy_static", "log", "native-tls", diff --git a/Cargo.toml b/Cargo.toml index ace75f98..8564a6a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,14 +39,14 @@ validator = { version = "0.11", features = ["derive"] } # async futures = "0.3.8" chrono = "0.4.15" -reqwest = { version = "0.10.8", features = ["json"] } +reqwest = { version = "0.11.4", features = ["json"] } async-std = { version = "1.8.0", features = ["tokio1", "tokio02", "attributes"] } # internal util web-push = "0.7.2" many-to-many = "0.1.2" lettre = "0.10.0-alpha.4" -rauth = { git = "https://gitlab.insrt.uk/insert/rauth", rev = "840ad003263fd5570aba4866e7d72e4fc1b3e95a" } +rauth = { git = "https://gitlab.insrt.uk/insert/rauth", rev = "19bef300ecc269c028e3d746f0a2f09842d3b37b" } hive_pubsub = { git = "https://gitlab.insrt.uk/insert/hive", rev = "a89826df2b30166220e68a6ed01a58b751456604", features = ["mongo"] } # web diff --git a/set_version.sh b/set_version.sh index 39b6b3b7..bff20736 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.1-alpha.22 +export version=0.5.1-alpha.23 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/entities/server.rs b/src/database/entities/server.rs index cd0731b1..daac8eac 100644 --- a/src/database/entities/server.rs +++ b/src/database/entities/server.rs @@ -10,6 +10,7 @@ use mongodb::bson::to_document; use mongodb::bson::Document; use rocket::serde::json::Value; use serde::{Deserialize, Serialize}; +use ulid::Ulid; #[derive(Serialize, Deserialize, Debug, Clone)] pub struct MemberCompositeKey { @@ -246,7 +247,48 @@ impl Server { .collect::>()) } + pub async fn mark_as_read(&self, id: &str) -> Result<()> { + let current_time = Ulid::new().to_string(); + let unreads = get_collection("channel_unreads"); + + unreads.delete_many( + doc! { + "_id.channel": { + "$in": &self.channels + }, + "_id.user": &id + }, + None + ) + .await + .map_err(|_| Error::DatabaseError { + operation: "delete_many", + with: "channel_unreads", + })?; + + unreads.insert_many( + self.channels + .iter() + .map(|channel| doc! { + "_id": { + "channel": channel, + "user": &id + }, + "last_id": ¤t_time + }) + .collect::>(), + None + ) + .await + .map_err(|_| Error::DatabaseError { + operation: "update_many", + with: "channel_unreads", + }) + .map(|_| ()) + } + pub async fn join_member(&self, id: &str) -> Result<()> { + // Check if user is banned. if get_collection("server_bans") .find_one( doc! { @@ -265,6 +307,7 @@ impl Server { return Err(Error::Banned); } + // Add user to server. get_collection("server_members") .insert_one( doc! { @@ -281,12 +324,14 @@ impl Server { with: "server_members", })?; + // Announce that user joined server. ClientboundNotification::ServerMemberJoin { id: self.id.clone(), user: id.to_string(), } .publish(self.id.clone()); + // Broadcast join message. if let Some(channels) = &self.system_messages { if let Some(cid) = &channels.user_joined { let channel = Ref::from_unchecked(cid.clone()).fetch_channel().await?; @@ -296,6 +341,9 @@ impl Server { } } + // Mark entire server as read. + self.mark_as_read(&id).await?; + Ok(()) } diff --git a/src/routes/servers/mod.rs b/src/routes/servers/mod.rs index b137d264..4c455d9f 100644 --- a/src/routes/servers/mod.rs +++ b/src/routes/servers/mod.rs @@ -4,6 +4,7 @@ mod server_create; mod server_delete; mod server_edit; mod server_fetch; +mod server_ack; mod channel_create; @@ -30,6 +31,7 @@ pub fn routes() -> Vec { server_delete::req, server_fetch::req, server_edit::req, + server_ack::req, channel_create::req, member_fetch_all::req, member_remove::req, diff --git a/src/routes/servers/server_ack.rs b/src/routes/servers/server_ack.rs new file mode 100644 index 00000000..35cd8cf8 --- /dev/null +++ b/src/routes/servers/server_ack.rs @@ -0,0 +1,18 @@ +use crate::database::*; +use crate::util::result::{Error, Result}; + +#[put("//ack")] +pub async fn req(user: User, target: Ref) -> Result<()> { + let target = target.fetch_server().await?; + + let perm = permissions::PermissionCalculator::new(&user) + .with_server(&target) + .for_server() + .await?; + + if !perm.get_view() { + Err(Error::MissingPermission)? + } + + target.mark_as_read(&user.id).await +} diff --git a/src/version.rs b/src/version.rs index db95f6fe..cbf777ca 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.1-alpha.22"; +pub const VERSION: &str = "0.5.1-alpha.23";