From effe3763da408fc0fbf5803322f25bde6c40f9e3 Mon Sep 17 00:00:00 2001 From: Yannick Funk Date: Wed, 25 Aug 2021 00:10:20 +0200 Subject: [PATCH 01/18] Shorten regex and adapt capture evaluation --- src/routes/channels/message_send.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs index b49d4698..f3bbe03d 100644 --- a/src/routes/channels/message_send.rs +++ b/src/routes/channels/message_send.rs @@ -30,7 +30,7 @@ pub struct Data { } lazy_static! { - static ref RE_ULID: Regex = Regex::new(r"<@([0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26})>").unwrap(); + static ref RE_ULID: Regex = Regex::new(r"<@([0-9A-Z]{26})>").unwrap(); } #[post("//messages", data = "")] @@ -80,9 +80,10 @@ pub async fn message_send(_r: RateLimited<'_>, user: User, target: Ref, message: let id = Ulid::new().to_string(); let mut mentions = HashSet::new(); - if let Some(captures) = RE_ULID.captures_iter(&message.content).next() { - // ! FIXME: in the future, verify in group so we can send out push - mentions.insert(captures[1].to_string()); + for capture in RE_ULID.captures_iter(&message.content) { + if let Some(mention) = capture.get(1) { + mentions.insert(mention.as_str().to_string()); + } } let mut replies = HashSet::new(); From c29f6d830cabaa5dc71b48f5496bdf379343ea05 Mon Sep 17 00:00:00 2001 From: Yannick Funk Date: Wed, 25 Aug 2021 16:32:11 +0200 Subject: [PATCH 02/18] Ignore I L O and u --- src/routes/channels/message_send.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs index f3bbe03d..d83e9a38 100644 --- a/src/routes/channels/message_send.rs +++ b/src/routes/channels/message_send.rs @@ -30,7 +30,8 @@ pub struct Data { } lazy_static! { - static ref RE_ULID: Regex = Regex::new(r"<@([0-9A-Z]{26})>").unwrap(); + // ignoring I L O and U is intentional + static ref RE_ULID: Regex = Regex::new(r"<@([0-9A-HJKMNPQRSTVWXYZ]{26})>").unwrap(); } #[post("//messages", data = "")] From ffa721117e3e28706f83304601168bd6925af882 Mon Sep 17 00:00:00 2001 From: Yannick Funk Date: Wed, 25 Aug 2021 16:34:42 +0200 Subject: [PATCH 03/18] Shorten regex further --- src/routes/channels/message_send.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs index d83e9a38..8285c885 100644 --- a/src/routes/channels/message_send.rs +++ b/src/routes/channels/message_send.rs @@ -31,7 +31,7 @@ pub struct Data { lazy_static! { // ignoring I L O and U is intentional - static ref RE_ULID: Regex = Regex::new(r"<@([0-9A-HJKMNPQRSTVWXYZ]{26})>").unwrap(); + static ref RE_ULID: Regex = Regex::new(r"<@([0-9A-HJKMNP-TV-Z]{26})>").unwrap(); } #[post("//messages", data = "")] From 697132082aee39c705439c66752a9a56a882a177 Mon Sep 17 00:00:00 2001 From: Yannick Funk Date: Wed, 1 Sep 2021 21:52:24 +0200 Subject: [PATCH 04/18] First draft for push notifications --- src/database/entities/message.rs | 71 +++++++++++++++++++- src/database/entities/microservice/autumn.rs | 5 ++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index 4e8192a4..5e9682cb 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -1,4 +1,4 @@ -use crate::util::variables::{USE_JANUARY, VAPID_PRIVATE_KEY}; +use crate::util::variables::{USE_JANUARY, VAPID_PRIVATE_KEY, PUBLIC_URL}; use crate::{ database::*, notifications::{events::ClientboundNotification, websocket::is_online}, @@ -17,6 +17,55 @@ use ulid::Ulid; use web_push::{ ContentEncoding, SubscriptionInfo, VapidSignatureBuilder, WebPushClient, WebPushMessageBuilder, }; +use std::time::SystemTime; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PushNotification { + pub icon: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub image: Option, + pub body: String, + pub timestamp: u64, +} + +impl PushNotification { + pub async fn new(msg: Message) -> Self { + let author = Ref::from(msg.author) + .expect("id valid") + .fetch_user() + .await + .expect("user valid"); + + let icon = if let Some(avatar) = author.avatar { + avatar.get_autumn_url() + } else { + format!("{}/users/{}/default_avatar", PUBLIC_URL.as_str(), &author.id) + }; + + let image = msg.attachments.map_or(None, |attachments| { + attachments + .first() + .map_or(None, |v| Some(v.get_autumn_url())) + }); + + let body = match msg.content { + Content::Text(body) => body, + Content::SystemMessage(sys_msg) => sys_msg.into() + }; + + let timestamp = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .expect("system time should be valid") + .as_secs(); + + Self { + icon, + image, + body, + timestamp, + } + } +} #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "type")] @@ -43,6 +92,23 @@ pub enum SystemMessage { ChannelIconChanged { by: String }, } +impl Into for SystemMessage { + fn into(self) -> String { + match self { + SystemMessage::Text { content } => content, + SystemMessage::UserAdded { .. } => "User added to the channel.".to_string(), + SystemMessage::UserRemove { .. } => "User removed from the channel.".to_string(), + SystemMessage::UserJoined { .. } => "User joined the channel.".to_string(), + SystemMessage::UserLeft { .. } => "User left the channel.".to_string(), + SystemMessage::UserKicked { .. } => "User kicked from the channel.".to_string(), + SystemMessage::UserBanned { .. } => "User banned from the channel.".to_string(), + SystemMessage::ChannelRenamed { .. } => "Channel renamed.".to_string(), + SystemMessage::ChannelDescriptionChanged { .. } => "Channel description changed.".to_string(), + SystemMessage::ChannelIconChanged { .. } => "Channel icon changed.".to_string() + } + } +} + #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(untagged)] pub enum Content { @@ -235,7 +301,7 @@ impl Message { } let mentions = self.mentions.clone(); - let enc = serde_json::to_string(&self).unwrap(); + let enc = serde_json::to_string(&PushNotification::new(self.clone()).await).unwrap(); ClientboundNotification::Message(self).publish(channel.id().to_string()); /* @@ -312,6 +378,7 @@ impl Message { .unwrap(); let signature = sig_builder.build().unwrap(); builder.set_vapid_signature(signature); + println!("{:#}", enc); builder.set_payload(ContentEncoding::AesGcm, enc.as_bytes()); let m = builder.build().unwrap(); client.send(m).await.ok(); diff --git a/src/database/entities/microservice/autumn.rs b/src/database/entities/microservice/autumn.rs index d9cf3c5f..0cac5a9f 100644 --- a/src/database/entities/microservice/autumn.rs +++ b/src/database/entities/microservice/autumn.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::database::*; use crate::util::result::{Error, Result}; +use crate::util::variables::AUTUMN_URL; #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "type")] @@ -112,4 +113,8 @@ impl File { with: "attachment", }) } + + pub fn get_autumn_url(&self) -> String { + format!("{}/{}/{}", AUTUMN_URL.as_str(), self.tag, self.id) + } } From b5aa0ee9717d2e4cd34b3be9cc2dab3f611d1051 Mon Sep 17 00:00:00 2001 From: Yannick Funk Date: Thu, 2 Sep 2021 18:24:22 +0200 Subject: [PATCH 05/18] Remove print --- src/database/entities/message.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index 5e9682cb..bbdbb9b3 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -378,7 +378,6 @@ impl Message { .unwrap(); let signature = sig_builder.build().unwrap(); builder.set_vapid_signature(signature); - println!("{:#}", enc); builder.set_payload(ContentEncoding::AesGcm, enc.as_bytes()); let m = builder.build().unwrap(); client.send(m).await.ok(); From f6b55574b133a795e1978fc2fc47149671e66243 Mon Sep 17 00:00:00 2001 From: Yannick Funk Date: Thu, 2 Sep 2021 20:32:36 +0200 Subject: [PATCH 06/18] Only build notification when there are subscriptions --- src/database/entities/message.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index bbdbb9b3..89f71d34 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -301,8 +301,8 @@ impl Message { } let mentions = self.mentions.clone(); - let enc = serde_json::to_string(&PushNotification::new(self.clone()).await).unwrap(); - ClientboundNotification::Message(self).publish(channel.id().to_string()); + + ClientboundNotification::Message(self.clone()).publish(channel.id().to_string()); /* Web Push Test Code @@ -365,6 +365,7 @@ impl Message { } if subscriptions.len() > 0 { + let enc = serde_json::to_string(&PushNotification::new(self).await).unwrap(); let client = WebPushClient::new(); let key = base64::decode_config(VAPID_PRIVATE_KEY.clone(), base64::URL_SAFE).unwrap(); From 5a17038012820fd4e7bfb19c606ae139344eebfc Mon Sep 17 00:00:00 2001 From: Yannick Funk Date: Thu, 2 Sep 2021 20:34:26 +0200 Subject: [PATCH 07/18] Remove whitespace --- src/database/entities/message.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index 89f71d34..26d4bef0 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -301,7 +301,6 @@ impl Message { } let mentions = self.mentions.clone(); - ClientboundNotification::Message(self.clone()).publish(channel.id().to_string()); /* From 43b75a2310e61197174757fb82e800193bf20c2a Mon Sep 17 00:00:00 2001 From: Yannick Funk Date: Thu, 2 Sep 2021 23:22:23 +0200 Subject: [PATCH 08/18] Add author and tag to push notification --- src/database/entities/message.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index 26d4bef0..c92d6f0c 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -21,15 +21,17 @@ use std::time::SystemTime; #[derive(Serialize, Deserialize, Debug, Clone)] pub struct PushNotification { + pub author: String, pub icon: String, #[serde(skip_serializing_if = "Option::is_none")] pub image: Option, pub body: String, + pub tag: String, pub timestamp: u64, } impl PushNotification { - pub async fn new(msg: Message) -> Self { + pub async fn new(msg: Message, channel: &Channel) -> Self { let author = Ref::from(msg.author) .expect("id valid") .fetch_user() @@ -59,9 +61,11 @@ impl PushNotification { .as_secs(); Self { + author: author.username, icon, image, body, + tag: channel.id().to_string(), timestamp, } } @@ -364,7 +368,7 @@ impl Message { } if subscriptions.len() > 0 { - let enc = serde_json::to_string(&PushNotification::new(self).await).unwrap(); + let enc = serde_json::to_string(&PushNotification::new(self, &c_clone).await).unwrap(); let client = WebPushClient::new(); let key = base64::decode_config(VAPID_PRIVATE_KEY.clone(), base64::URL_SAFE).unwrap(); From dbfed52f1746631b0e03a6baa90875d00511350b Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 3 Sep 2021 14:37:40 +0100 Subject: [PATCH 09/18] Prevent access to bot routes as bot. --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/routes/bots/create.rs | 4 ++++ src/routes/bots/delete.rs | 4 ++++ src/routes/bots/edit.rs | 4 ++++ src/routes/bots/fetch.rs | 4 ++++ src/routes/bots/fetch_owned.rs | 4 ++++ src/routes/bots/fetch_public.rs | 4 ++++ src/routes/bots/invite.rs | 4 ++++ 9 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85243f11..54a0f2a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2528,7 +2528,7 @@ dependencies = [ [[package]] name = "rauth" version = "0.3.0" -source = "git+https://gitlab.insrt.uk/insert/rauth?rev=19bef300ecc269c028e3d746f0a2f09842d3b37b#19bef300ecc269c028e3d746f0a2f09842d3b37b" +source = "git+https://github.com/insertish/rauth?rev=19bef300ecc269c028e3d746f0a2f09842d3b37b#19bef300ecc269c028e3d746f0a2f09842d3b37b" dependencies = [ "chrono", "handlebars", diff --git a/Cargo.toml b/Cargo.toml index c9be9731..e1e6c522 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ async-std = { version = "1.8.0", features = ["tokio1", "tokio02", "attributes"] 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 = "19bef300ecc269c028e3d746f0a2f09842d3b37b" } +rauth = { git = "https://github.com/insertish/rauth", rev = "19bef300ecc269c028e3d746f0a2f09842d3b37b" } hive_pubsub = { git = "https://gitlab.insrt.uk/insert/hive", rev = "a89826df2b30166220e68a6ed01a58b751456604", features = ["mongo"] } # web diff --git a/src/routes/bots/create.rs b/src/routes/bots/create.rs index fab17ac7..e8231b7f 100644 --- a/src/routes/bots/create.rs +++ b/src/routes/bots/create.rs @@ -24,6 +24,10 @@ pub struct Data { #[post("/create", data = "")] pub async fn create_bot(user: User, info: Json) -> Result { + if user.bot.is_some() { + return Err(Error::IsBot) + } + let info = info.into_inner(); info.validate() .map_err(|error| Error::FailedValidation { error })?; diff --git a/src/routes/bots/delete.rs b/src/routes/bots/delete.rs index 45efe287..c374fe4d 100644 --- a/src/routes/bots/delete.rs +++ b/src/routes/bots/delete.rs @@ -6,6 +6,10 @@ use mongodb::bson::doc; #[delete("/")] pub async fn delete_bot(user: User, target: Ref) -> Result { + if user.bot.is_some() { + return Err(Error::IsBot) + } + let bot = target.fetch_bot().await?; if bot.owner != user.id { return Err(Error::MissingPermission); diff --git a/src/routes/bots/edit.rs b/src/routes/bots/edit.rs index b0717066..546bd4d2 100644 --- a/src/routes/bots/edit.rs +++ b/src/routes/bots/edit.rs @@ -26,6 +26,10 @@ pub struct Data { #[patch("/", data = "")] pub async fn edit_bot(user: User, target: Ref, data: Json) -> Result { + if user.bot.is_some() { + return Err(Error::IsBot) + } + let data = data.into_inner(); data.validate() .map_err(|error| Error::FailedValidation { error })?; diff --git a/src/routes/bots/fetch.rs b/src/routes/bots/fetch.rs index 2820bef5..b3b20491 100644 --- a/src/routes/bots/fetch.rs +++ b/src/routes/bots/fetch.rs @@ -5,6 +5,10 @@ use serde_json::Value; #[get("/")] pub async fn fetch_bot(user: User, target: Ref) -> Result { + if user.bot.is_some() { + return Err(Error::IsBot) + } + let bot = target.fetch_bot().await?; if !bot.public { diff --git a/src/routes/bots/fetch_owned.rs b/src/routes/bots/fetch_owned.rs index 42f08b15..d9deb731 100644 --- a/src/routes/bots/fetch_owned.rs +++ b/src/routes/bots/fetch_owned.rs @@ -7,6 +7,10 @@ use serde_json::Value; #[get("/@me")] pub async fn fetch_owned_bots(user: User) -> Result { + if user.bot.is_some() { + return Err(Error::IsBot) + } + let bots = get_collection("bots") .find( doc! { diff --git a/src/routes/bots/fetch_public.rs b/src/routes/bots/fetch_public.rs index 33bf82f2..181bb391 100644 --- a/src/routes/bots/fetch_public.rs +++ b/src/routes/bots/fetch_public.rs @@ -5,6 +5,10 @@ use serde_json::Value; #[get("//invite")] pub async fn fetch_public_bot(user: User, target: Ref) -> Result { + if user.bot.is_some() { + return Err(Error::IsBot) + } + let bot = target.fetch_bot().await?; if !bot.public { diff --git a/src/routes/bots/invite.rs b/src/routes/bots/invite.rs index b12b3ede..eb24b5f7 100644 --- a/src/routes/bots/invite.rs +++ b/src/routes/bots/invite.rs @@ -23,6 +23,10 @@ pub enum Destination { #[post("//invite", data = "")] pub async fn invite_bot(user: User, target: Ref, dest: Json) -> Result { + if user.bot.is_some() { + return Err(Error::IsBot) + } + let bot = target.fetch_bot().await?; if !bot.public { From 862f57235cc0dca3e8c5a0b680cddfc63905e57e Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 3 Sep 2021 16:26:34 +0100 Subject: [PATCH 10/18] Fallback to unknown user. Add GitHub CI. --- .github/FUNDING.yml | 2 + .github/workflows/docker.yml | 101 +++++++++++++++++++++++++++++++ set_version.sh | 2 +- src/database/entities/message.rs | 18 +++--- src/version.rs | 2 +- 5 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/docker.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..dcf3dd90 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +ko_fi: insertish +custom: https://insrt.uk/donate diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000..424f4a8c --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,101 @@ +name: Docker + +on: + push: + branches: + - "master" + tags: + - "v*" + paths-ignore: + - ".github/**" + - "!.github/workflows/docker.yml" + - ".vscode/**" + - ".gitignore" + - ".gitlab-ci.yml" + - "LICENSE" + - "README" + pull_request: + branches: + - "master" + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + architecture: [linux/amd64] + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: "recursive" + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Cache Docker layers + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache/${{ matrix.architecture }} + key: ${{ runner.os }}-buildx-${{ matrix.architecture }}-${{ github.sha }} + - name: Build + uses: docker/build-push-action@v2 + with: + context: . + platforms: ${{ matrix.architecture }} + cache-from: type=local,src=/tmp/.buildx-cache/${{ matrix.architecture }} + cache-to: type=local,dest=/tmp/.buildx-cache-new/${{ matrix.architecture }},mode=max + - name: Move cache + run: | + rm -rf /tmp/.buildx-cache/${{ matrix.architecture }} + mv /tmp/.buildx-cache-new/${{ matrix.architecture }} /tmp/.buildx-cache/${{ matrix.architecture }} + + publish: + needs: [test] + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: "recursive" + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Cache amd64 Docker layers + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache/linux/amd64 + key: ${{ runner.os }}-buildx-linux/amd64-${{ github.sha }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v3 + with: + images: revoltchat/client, ghcr.io/revoltchat/client + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Github Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and publish + uses: docker/build-push-action@v2 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64,linux/arm/v7 + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=local,src=/tmp/.buildx-cache/linux/amd64 + cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max + - name: Move cache + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/set_version.sh b/set_version.sh index 3671c212..ff61a82a 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.2-alpha.1 +export version=0.5.2-alpha.2 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index c92d6f0c..468c2aba 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -32,16 +32,20 @@ pub struct PushNotification { impl PushNotification { pub async fn new(msg: Message, channel: &Channel) -> Self { - let author = Ref::from(msg.author) - .expect("id valid") + let author = Ref::from_unchecked(msg.author.clone()) .fetch_user() - .await - .expect("user valid"); + .await; - let icon = if let Some(avatar) = author.avatar { + let (author, avatar) = if let Ok(author) = author { + (Some(author.username), author.avatar) + } else { + (None, None) + }; + + let icon = if let Some(avatar) = avatar { avatar.get_autumn_url() } else { - format!("{}/users/{}/default_avatar", PUBLIC_URL.as_str(), &author.id) + format!("{}/users/{}/default_avatar", PUBLIC_URL.as_str(), msg.author) }; let image = msg.attachments.map_or(None, |attachments| { @@ -61,7 +65,7 @@ impl PushNotification { .as_secs(); Self { - author: author.username, + author: author.unwrap_or_else(|| "Unknown".into()), icon, image, body, diff --git a/src/version.rs b/src/version.rs index 3b0322fe..25a82cc9 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.2-alpha.1"; +pub const VERSION: &str = "0.5.2-alpha.2"; From 5328c66cbbe9369f23a13344591e3e7e3dfd859a Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 3 Sep 2021 16:27:53 +0100 Subject: [PATCH 11/18] Fix image name. --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 424f4a8c..39a81445 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -73,7 +73,7 @@ jobs: id: meta uses: docker/metadata-action@v3 with: - images: revoltchat/client, ghcr.io/revoltchat/client + images: revoltchat/server, ghcr.io/revoltchat/server - name: Login to DockerHub uses: docker/login-action@v1 with: From 77422f023ea51a2b1da28ecd2cd51e92f60f80de Mon Sep 17 00:00:00 2001 From: goat <16760685+goaaats@users.noreply.github.com> Date: Tue, 7 Sep 2021 17:10:44 +0200 Subject: [PATCH 12/18] fix(january): add youtube timestamp field --- src/database/entities/microservice/january.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/database/entities/microservice/january.rs b/src/database/entities/microservice/january.rs index 39df9ef0..79c3fbcd 100644 --- a/src/database/entities/microservice/january.rs +++ b/src/database/entities/microservice/january.rs @@ -46,6 +46,9 @@ pub enum Special { None, YouTube { id: String, + + #[serde(skip_serializing_if = "Option::is_none")] + timestamp: Option, }, Twitch { content_type: TwitchType, From 06f968022d05752555c374db3fdf2c53634263f5 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 11 Sep 2021 11:23:15 +0100 Subject: [PATCH 13/18] Update to rAuth v1, closes #63. Add Pong packet for normal frames. --- Cargo.lock | 1021 +++++++++++++++------------ Cargo.toml | 4 +- assets/templates/reset.txt | 5 + assets/templates/verify.txt | 6 + set_version.sh | 2 +- src/database/entities/message.rs | 89 +-- src/database/guards/user.rs | 55 +- src/database/migrations/init.rs | 33 - src/database/migrations/mod.rs | 5 +- src/database/migrations/scripts.rs | 76 +- src/main.rs | 98 ++- src/notifications/events.rs | 28 +- src/notifications/websocket.rs | 147 ++-- src/routes/mod.rs | 4 +- src/routes/onboard/complete.rs | 2 +- src/routes/onboard/hello.rs | 2 +- src/routes/push/subscribe.rs | 40 +- src/routes/push/unsubscribe.rs | 31 +- src/routes/root.rs | 12 +- src/routes/sync/get_settings.rs | 4 +- src/routes/sync/get_unreads.rs | 4 +- src/routes/sync/set_settings.rs | 4 +- src/routes/users/change_username.rs | 9 +- src/version.rs | 2 +- 24 files changed, 888 insertions(+), 795 deletions(-) create mode 100644 assets/templates/reset.txt create mode 100644 assets/templates/verify.txt diff --git a/Cargo.lock b/Cargo.lock index 54a0f2a1..5d886c20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,19 +3,29 @@ version = 3 [[package]] -name = "addr2line" -version = "0.14.1" +name = "Inflector" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" dependencies = [ "gimli", ] [[package]] name = "adler" -version = "0.2.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" @@ -25,9 +35,9 @@ checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] @@ -56,9 +66,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9" +checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" dependencies = [ "concurrent-queue", "event-listener", @@ -67,16 +77,16 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146" +checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", "once_cell", - "vec-arena", + "slab", ] [[package]] @@ -94,34 +104,33 @@ dependencies = [ "num_cpus", "once_cell", "tokio 0.2.25", - "tokio 1.9.0", + "tokio 1.11.0", ] [[package]] name = "async-io" -version = "1.3.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd" +checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" dependencies = [ "concurrent-queue", - "fastrand", "futures-lite", "libc", "log", - "nb-connect", "once_cell", "parking", "polling", - "vec-arena", + "slab", + "socket2 0.4.1", "waker-fn", "winapi 0.3.9", ] [[package]] name = "async-lock" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1996609732bde4a9988bc42125f55f2af5f3c36370e27c778d5191a4a1b63bfb" +checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" dependencies = [ "event-listener", ] @@ -137,9 +146,9 @@ dependencies = [ [[package]] name = "async-std" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f06685bad74e0570f5213741bea82158279a4103d988e57bfada11ad230341" +checksum = "f8056f1455169ab86dd47b47391e4ab0cbd25410a70e9fe675544f49bafaf952" dependencies = [ "async-attributes", "async-channel", @@ -157,7 +166,7 @@ dependencies = [ "memchr", "num_cpus", "once_cell", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "pin-utils", "slab", "wasm-bindgen-futures", @@ -211,7 +220,7 @@ dependencies = [ "futures-io", "futures-util", "log", - "pin-project 1.0.5", + "pin-project", "tungstenite", ] @@ -255,11 +264,12 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.56" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +checksum = "e7a905d892734eea339e896738c14b9afce22b5318f64b951e70bf3844419b01" dependencies = [ "addr2line", + "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", @@ -273,6 +283,12 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +[[package]] +name = "base32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" + [[package]] name = "base64" version = "0.7.0" @@ -315,15 +331,15 @@ checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitvec" -version = "0.19.4" +version = "0.19.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ba35e9565969edb811639dbebfe34edc0368e472c5018474c8eb2543397f81" +checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321" dependencies = [ "funty", "radium", @@ -351,7 +367,7 @@ dependencies = [ "block-padding", "byte-tools", "byteorder", - "generic-array 0.12.3", + "generic-array 0.12.4", ] [[package]] @@ -388,9 +404,9 @@ dependencies = [ [[package]] name = "bson" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b6553abdb9d2d8f262f0b5bccf807321d5b7d1a12796bcede8e1f150e85f2e" +checksum = "903a4f4c7aa97921f1703acac1fd524e9e082b3228edd34dde07758c0c92c672" dependencies = [ "base64 0.13.0", "chrono", @@ -405,9 +421,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.6.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099e596ef14349721d9016f6b80dd3419ea1bf289ab9b44df8e4dfd3a005d5d9" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" [[package]] name = "byte-tools" @@ -417,9 +433,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" @@ -429,9 +445,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cache-padded" @@ -441,9 +457,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cc" -version = "1.0.66" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" +checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" [[package]] name = "cfg-if" @@ -467,6 +483,7 @@ dependencies = [ "libc", "num-integer", "num-traits", + "serde", "time 0.1.44", "wasm-bindgen", "winapi 0.3.9", @@ -492,9 +509,9 @@ dependencies = [ [[package]] name = "const_fn" -version = "0.4.5" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" +checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" [[package]] name = "constant_time_eq" @@ -509,7 +526,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f1c7727e460397e56abc4bddc1d49e07a1ad78fc98eb2e1c8f032a58a2f80d" dependencies = [ "percent-encoding", - "time 0.2.25", + "time 0.2.27", "version_check", ] @@ -530,37 +547,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] -name = "cpuid-bool" -version = "0.1.2" +name = "cpufeatures" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] [[package]] name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" dependencies = [ - "autocfg 1.0.1", "cfg-if 1.0.0", "lazy_static", ] [[package]] name = "crypto-mac" -version = "0.7.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ - "generic-array 0.12.3", + "generic-array 0.14.4", "subtle", ] [[package]] name = "ctor" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8f45d9ad417bcef4817d614a501ab55cdd96a6fdb24f49aab89a54acfd66b19" +checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" dependencies = [ "quote", "syn", @@ -568,9 +587,9 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.1.7" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b57a92e9749e10f25a171adcebfafe72991d45e7ec2dcb853e8f83d9dafaeb08" +checksum = "377c9b002a72a0b2c1a18c62e2f3864bdfea4a015e3683a96e24aa45dd6c02d1" dependencies = [ "nix", "winapi 0.3.9", @@ -582,8 +601,18 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.10.2", + "darling_macro 0.10.2", +] + +[[package]] +name = "darling" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +dependencies = [ + "darling_core 0.13.0", + "darling_macro 0.13.0", ] [[package]] @@ -600,13 +629,38 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", +] + [[package]] name = "darling_macro" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ - "darling_core", + "darling_core 0.10.2", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +dependencies = [ + "darling_core 0.13.0", "quote", "syn", ] @@ -671,7 +725,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array 0.12.3", + "generic-array 0.12.4", ] [[package]] @@ -737,9 +791,9 @@ dependencies = [ [[package]] name = "erased-serde" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0465971a8cc1fa2455c8465aaa377131e1f1cf4983280f474a13e68793aa770c" +checksum = "3de9ad4541d99dc22b59134e7ff8dc3d6c988c89ecd7324bf10a8362b07a2afa" dependencies = [ "serde", ] @@ -772,9 +826,9 @@ checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fastrand" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" dependencies = [ "instant", ] @@ -816,9 +870,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ "matches", "percent-encoding", @@ -854,9 +908,9 @@ checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" [[package]] name = "futures" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9052a1a50244d8d5aa9bf55cbc2fb6f357c86cc52e46c62ed390a7180cf150" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" dependencies = [ "futures-channel", "futures-core", @@ -869,9 +923,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d31b7ec7efab6eefc7c57233bb10b847986139d88cc2f5a02a1ae6871a1846" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" dependencies = [ "futures-core", "futures-sink", @@ -879,15 +933,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e5145dde8da7d1b3892dad07a9c98fc04bc39892b1ecc9692cf53e2b780a65" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" [[package]] name = "futures-executor" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e59fdc009a4b3096bf94f740a0f2424c082521f20a9b08c5c07c48d90fd9b9" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" dependencies = [ "futures-core", "futures-task", @@ -896,31 +950,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28be053525281ad8259d47e4de5de657b25e7bac113458555bb4b70bc6870500" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" [[package]] name = "futures-lite" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4481d0cd0de1d204a4fa55e7d45f07b1d958abcb06714b3446438e2eff695fb" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" dependencies = [ "fastrand", "futures-core", "futures-io", "memchr", "parking", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "waker-fn", ] [[package]] name = "futures-macro" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c287d25add322d9f9abdcdc5927ca398917996600182178774032e9f8258fedd" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" dependencies = [ + "autocfg 1.0.1", "proc-macro-hack", "proc-macro2", "quote", @@ -929,18 +984,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5c69029bda2e743fddd0582d1083951d65cc9539aebf8812f36c3491342d6" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" [[package]] name = "futures-task" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13de07eb8ea81ae445aca7b69f5f7bf15d7bf4912d8ca37d6645c77ae8a58d86" -dependencies = [ - "once_cell", -] +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" [[package]] name = "futures-timer" @@ -950,10 +1002,11 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632a8cd0f2a4b3fdea1657f08bde063848c3bd00f9bbf6e256b8be78802e624b" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" dependencies = [ + "autocfg 1.0.1", "futures-channel", "futures-core", "futures-io", @@ -961,7 +1014,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "pin-utils", "proc-macro-hack", "proc-macro-nested", @@ -983,9 +1036,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" dependencies = [ "typenum", ] @@ -1013,9 +1066,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1024,9 +1077,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.23.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" [[package]] name = "glob" @@ -1060,7 +1113,7 @@ dependencies = [ "nonzero_ext", "parking_lot", "quanta", - "rand 0.8.3", + "rand 0.8.4", "smallvec", ] @@ -1086,11 +1139,11 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" +checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "fnv", "futures-core", "futures-sink", @@ -1098,21 +1151,21 @@ dependencies = [ "http", "indexmap", "slab", - "tokio 1.9.0", - "tokio-util 0.6.7", + "tokio 1.11.0", + "tokio-util 0.6.8", "tracing", ] [[package]] name = "handlebars" -version = "3.5.2" +version = "3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964d0e99a61fe9b1b347389b77ebf8b7e1587b70293676aaca7d27e59b9073b2" +checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3" dependencies = [ "log", "pest", "pest_derive", - "quick-error 2.0.0", + "quick-error 2.0.1", "serde", "serde_json", ] @@ -1129,33 +1182,33 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "heck" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "hex" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hive_pubsub" @@ -1172,12 +1225,12 @@ dependencies = [ [[package]] name = "hmac" -version = "0.7.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", - "digest 0.8.1", + "digest 0.9.0", ] [[package]] @@ -1197,7 +1250,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "fnv", "itoa", ] @@ -1214,20 +1267,20 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" +checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "http", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", ] [[package]] name = "httparse" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" [[package]] name = "httpdate" @@ -1266,7 +1319,7 @@ dependencies = [ "httparse", "httpdate 0.3.2", "itoa", - "pin-project 1.0.5", + "pin-project", "socket2 0.3.19", "tokio 0.2.25", "tower-service", @@ -1276,23 +1329,23 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.11" +version = "0.14.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11" +checksum = "13f67199e765030fa08fe0bd581af683f0d5bc04ea09c2b1102012c5fb90e7fd" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "futures-channel", "futures-core", "futures-util", - "h2 0.3.3", + "h2 0.3.4", "http", - "http-body 0.4.2", + "http-body 0.4.3", "httparse", "httpdate 1.0.1", "itoa", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "socket2 0.4.1", - "tokio 1.9.0", + "tokio 1.11.0", "tower-service", "tracing", "want", @@ -1333,10 +1386,10 @@ 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", + "bytes 1.1.0", + "hyper 0.14.12", "native-tls", - "tokio 1.9.0", + "tokio 1.11.0", "tokio-native-tls", ] @@ -1348,9 +1401,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de910d521f7cc3135c4de8db1cb910e0b5ed1dc6f57c381cd07e8e661ce10094" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -1359,9 +1412,9 @@ dependencies = [ [[package]] name = "if_chain" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7280c75fb2e2fc47080ec80ccc481376923acb04501957fc38f935c3de5088" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "impl_ops" @@ -1371,12 +1424,12 @@ checksum = "90f97a5f38dd3ccfbe7aa80f4a0c00930f21b922c74195be0201c51028f22dcf" [[package]] name = "indexmap" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg 1.0.1", - "hashbrown 0.9.1", + "hashbrown 0.11.2", "serde", ] @@ -1397,9 +1450,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" dependencies = [ "cfg-if 1.0.0", ] @@ -1427,21 +1480,21 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "js-sys" -version = "0.3.47" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cfb73131c35423a367daf8cbd24100af0d077668c8c2943f0e7dd775fef0f65" +checksum = "1866b355d9c878e5e607473cbe3f63282c0b7aad2db1dbebf55076c686918254" dependencies = [ "wasm-bindgen", ] @@ -1499,9 +1552,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.98" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" +checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" [[package]] name = "linked-hash-map" @@ -1520,9 +1573,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.2" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ "scopeguard", ] @@ -1579,26 +1632,35 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "md-5" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18af3dcaf2b0219366cdb4e2af65a6101457b415c3d1a5c71dd9c2b7c77b9c8" +checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "opaque-debug 0.2.3", + "block-buffer 0.9.0", + "digest 0.9.0", + "opaque-debug 0.3.0", ] [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg 1.0.1", +] [[package]] name = "mime" @@ -1618,9 +1680,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", "autocfg 1.0.1", @@ -1681,9 +1743,9 @@ dependencies = [ [[package]] name = "mongodb" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af18a0f10c2355e5b9382603076c84159923dd434d0287fe6bf9c1a656dbc09c" +checksum = "dd2a1cb6fd58c27e51ee650dca3b6924c4ce533dc0384f05b3219709ea1f1eb6" dependencies = [ "async-trait", "base64 0.11.0", @@ -1706,7 +1768,7 @@ dependencies = [ "serde", "serde_bytes", "serde_with", - "sha-1 0.8.2", + "sha-1 0.9.8", "sha2", "socket2 0.3.19", "stringprep", @@ -1721,7 +1783,7 @@ dependencies = [ "uuid", "version_check", "webpki", - "webpki-roots 0.18.0", + "webpki-roots 0.21.1", ] [[package]] @@ -1730,7 +1792,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "408327e2999b839cd1af003fc01b2019a6c10a1361769542203f6fedc5179680" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "encoding_rs", "futures-util", "http", @@ -1738,35 +1800,26 @@ dependencies = [ "log", "mime", "spin 0.9.2", - "tokio 1.9.0", - "tokio-util 0.6.7", + "tokio 1.11.0", + "tokio-util 0.6.8", "twoway", "version_check", ] -[[package]] -name = "nanoid" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6226bc4e142124cb44e309a37a04cd9bb10e740d8642855441d3b14808f635e" -dependencies = [ - "rand 0.6.5", -] - [[package]] name = "nanoid" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" dependencies = [ - "rand 0.8.3", + "rand 0.8.4", ] [[package]] name = "native-tls" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" dependencies = [ "lazy_static", "libc", @@ -1780,16 +1833,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nb-connect" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8123a81538e457d44b933a02faf885d3fe8408806b23fa700e8f01c6c3a98998" -dependencies = [ - "libc", - "winapi 0.3.9", -] - [[package]] name = "net2" version = "0.2.37" @@ -1803,14 +1846,15 @@ dependencies = [ [[package]] name = "nix" -version = "0.18.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" +checksum = "cf1e25ee6b412c2a1e3fcb6a4499a5c1bfe7f43e014bdce9a6b6666e5aa2d187" dependencies = [ "bitflags", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", + "memoffset", ] [[package]] @@ -1824,11 +1868,12 @@ dependencies = [ [[package]] name = "nom" -version = "6.1.0" +version = "6.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6f70b46d6325aa300f1c7bb3d470127dfc27806d8ea6bf294ee0ce643ce2b1" +checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" dependencies = [ "bitvec", + "funty", "memchr", "version_check", ] @@ -1879,9 +1924,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b45a5c2ac4dd696ed30fa6b94b057ad909c7b7fc2e0d0808192bced894066" +checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" dependencies = [ "derivative", "num_enum_derive", @@ -1889,9 +1934,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" +checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1901,15 +1946,18 @@ dependencies = [ [[package]] name = "object" -version = "0.23.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" +checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2" +dependencies = [ + "memchr", +] [[package]] name = "once_cell" -version = "1.5.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "opaque-debug" @@ -1925,29 +1973,29 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.32" +version = "0.10.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038d43985d1ddca7a9900630d8cd031b56e4794eecc2e9ea39dd17aa04399a70" +checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" dependencies = [ "bitflags", "cfg-if 1.0.0", "foreign-types", - "lazy_static", "libc", + "once_cell", "openssl-sys", ] [[package]] name = "openssl-probe" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.60" +version = "0.9.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921fc71883267538946025deffb622905ecad223c28efbfdef9bb59a0175f3e6" +checksum = "1996d2d305e561b70d1ee0c53f1542833f4e1ac6ce9a6708b6ff2738ca67dc82" dependencies = [ "autocfg 1.0.1", "cc", @@ -1958,9 +2006,9 @@ dependencies = [ [[package]] name = "os_info" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d2536ab8ff7605e8dc7044ec2f3eb0d49750cb559af9e5373c4564a3706cdd" +checksum = "6ac91020bfed8cc3f8aa450d4c3b5fa1d3373fc091c8a92009f3b27749d5a227" dependencies = [ "log", "winapi 0.3.9", @@ -1974,9 +2022,9 @@ checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", @@ -1985,25 +2033,24 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccb628cad4f84851442432c60ad8e1f607e29752d0bf072cbd0baf28aa34272" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall 0.1.57", + "redox_syscall", "smallvec", "winapi 0.3.9", ] [[package]] name = "pbkdf2" -version = "0.3.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" dependencies = [ - "byteorder", "crypto-mac", ] @@ -2092,12 +2139,12 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc1437ada0f3a97d538f0bb608137bf53c53969028cab74c89893e1e9a12f0e" +checksum = "d43f3220d96e0080cc9ea234978ccd80d904eafb17be31bb0f76daaea6493082" dependencies = [ "phf_shared", - "rand 0.8.3", + "rand 0.8.4", ] [[package]] @@ -2125,38 +2172,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "0.4.27" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" +checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" dependencies = [ - "pin-project-internal 0.4.27", -] - -[[package]] -name = "pin-project" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96fa8ebb90271c4477f144354485b8068bd8f6b78b428b01ba892ca26caf0b63" -dependencies = [ - "pin-project-internal 1.0.5", + "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "0.4.27" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b" +checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ "proc-macro2", "quote", @@ -2165,15 +2192,15 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" @@ -2189,14 +2216,14 @@ checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" [[package]] name = "polling" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4" +checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", "log", - "wepoll-sys", + "wepoll-ffi", "winapi 0.3.9", ] @@ -2208,10 +2235,11 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "proc-macro-crate" -version = "0.1.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92" dependencies = [ + "thiserror", "toml", ] @@ -2253,9 +2281,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" dependencies = [ "unicode-xid", ] @@ -2291,9 +2319,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick-error" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ac73b1112776fc109b2e61909bc46c7e1bf0d7f690ffb1676553acce16d5cda" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" @@ -2306,9 +2334,9 @@ dependencies = [ [[package]] name = "quoted_printable" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b080c5db639b292ac79cbd34be0cfc5d36694768d8341109634d90b86930e2" +checksum = "1238256b09923649ec89b08104c4dfe9f6cb2fea734a5db5384e44916d59e9c5" [[package]] name = "r2d2" @@ -2362,14 +2390,14 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.1", - "rand_hc 0.3.0", + "rand_chacha 0.3.1", + "rand_core 0.6.3", + "rand_hc 0.3.1", ] [[package]] @@ -2394,12 +2422,12 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.1", + "rand_core 0.6.3", ] [[package]] @@ -2428,11 +2456,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.3", ] [[package]] @@ -2455,11 +2483,11 @@ dependencies = [ [[package]] name = "rand_hc" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ - "rand_core 0.6.1", + "rand_core 0.6.3", ] [[package]] @@ -2527,24 +2555,30 @@ dependencies = [ [[package]] name = "rauth" -version = "0.3.0" -source = "git+https://github.com/insertish/rauth?rev=19bef300ecc269c028e3d746f0a2f09842d3b37b#19bef300ecc269c028e3d746f0a2f09842d3b37b" +version = "1.0.0" +source = "git+https://github.com/insertish/rauth?rev=df88fa8ec723663908a210f9da2d192826cbe736#df88fa8ec723663908a210f9da2d192826cbe736" dependencies = [ + "async-std", + "base32", "chrono", + "futures", "handlebars", "json", "lazy_static", "lettre", "mongodb", - "nanoid 0.3.0", + "nanoid", + "rand 0.8.4", "regex", "reqwest 0.11.4", "rocket", "rust-argon2", "serde", "serde_json", + "totp-lite", "ulid", - "validator", + "validator 0.14.0", + "wither", ] [[package]] @@ -2558,15 +2592,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] @@ -2593,21 +2621,20 @@ dependencies = [ [[package]] name = "regex" -version = "1.4.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", ] [[package]] name = "regex-syntax" -version = "0.6.22" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "remove_dir_all" @@ -2640,7 +2667,7 @@ dependencies = [ "mime", "mime_guess", "percent-encoding", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "rustls 0.18.1", "serde", "serde_json", @@ -2662,13 +2689,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" dependencies = [ "base64 0.13.0", - "bytes 1.0.1", + "bytes 1.1.0", "encoding_rs", "futures-core", "futures-util", "http", - "http-body 0.4.2", - "hyper 0.14.11", + "http-body 0.4.3", + "hyper 0.14.12", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -2677,11 +2704,11 @@ dependencies = [ "mime", "native-tls", "percent-encoding", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "serde", "serde_json", "serde_urlencoded", - "tokio 1.9.0", + "tokio 1.11.0", "tokio-native-tls", "url", "wasm-bindgen", @@ -2721,7 +2748,7 @@ dependencies = [ "log", "many-to-many", "mongodb", - "nanoid 0.4.0", + "nanoid", "num_enum", "once_cell", "phf", @@ -2736,7 +2763,7 @@ dependencies = [ "serde_json", "ulid", "url", - "validator", + "validator 0.11.0", "web-push", ] @@ -2787,7 +2814,7 @@ dependencies = [ "atomic", "atty", "binascii", - "bytes 1.0.1", + "bytes 1.1.0", "either", "figment", "futures", @@ -2797,8 +2824,8 @@ dependencies = [ "multer", "num_cpus", "parking_lot", - "pin-project-lite 0.2.4", - "rand 0.8.3", + "pin-project-lite 0.2.7", + "rand 0.8.4", "ref-cast", "rocket_codegen", "rocket_http", @@ -2806,10 +2833,10 @@ dependencies = [ "serde_json", "state", "tempfile", - "time 0.2.25", - "tokio 1.9.0", + "time 0.2.27", + "tokio 1.11.0", "tokio-stream", - "tokio-util 0.6.7", + "tokio-util 0.6.8", "ubyte", "version_check", "yansi", @@ -2866,7 +2893,7 @@ dependencies = [ "cookie", "either", "http", - "hyper 0.14.11", + "hyper 0.14.12", "indexmap", "log", "memchr", @@ -2874,14 +2901,14 @@ dependencies = [ "parking_lot", "pear", "percent-encoding", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "ref-cast", "serde", "smallvec", "stable-pattern", "state", - "time 0.2.25", - "tokio 1.9.0", + "time 0.2.27", + "tokio 1.11.0", "uncased", ] @@ -2899,9 +2926,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc_version" @@ -2940,9 +2967,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" [[package]] name = "ryu" @@ -2989,9 +3016,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "sct" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ "ring", "untrusted 0.7.1", @@ -2999,9 +3026,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.0.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1759c2e3c8580017a484a7ac56d3abc5a6c1feadf88db2f3633f12ae4268c69" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" dependencies = [ "bitflags", "core-foundation", @@ -3012,9 +3039,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.0.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f99b9d5e26d2a71633cc4f2ebae7cc9f874044e0c351a27e17892d76dce5678b" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" dependencies = [ "core-foundation-sys", "libc", @@ -3037,9 +3064,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.123" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" dependencies = [ "serde_derive", ] @@ -3055,9 +3082,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.123" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2", "quote", @@ -3066,9 +3093,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.62" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486" +checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950" dependencies = [ "indexmap", "itoa", @@ -3090,21 +3117,22 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.6.2" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42fa8fb0da0bf5aa7dd5d8fe1f9ec769833eb7cf97ff89942903809e600de908" +checksum = "062b87e45d8f26714eacfaef0ed9a583e2bfd50ebd96bdd3c200733bd5758e2c" dependencies = [ + "rustversion", "serde", "serde_with_macros", ] [[package]] name = "serde_with_macros" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1197ff7de45494f290c1e3e1a6f80e108974681984c87a3e480991ef3d0f1950" +checksum = "98c1fcca18d55d1763e1c16873c4bde0ac3ef75179a28c7b372917e0494625be" dependencies = [ - "darling", + "darling 0.13.0", "proc-macro2", "quote", "syn", @@ -3124,13 +3152,13 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.9.3" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4b312c3731e3fe78a185e6b9b911a7aa715b8e31cce117975219aab2acf285d" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpuid-bool", + "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] @@ -3143,36 +3171,37 @@ checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" [[package]] name = "sha2" -version = "0.8.2" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +checksum = "9204c41a1597a8c5af23c82d1c921cb01ec0a4c59e07a9c7306062829a3903f3" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", ] [[package]] name = "signal-hook-registry" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "siphasher" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729a25c17d72b06c68cb47955d44fda88ad2d3e7d77e025663fdd69b93dd71a1" +checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" [[package]] name = "slab" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "smallvec" @@ -3224,9 +3253,9 @@ dependencies = [ [[package]] name = "standback" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2beb4d1860a61f571530b3f855a1b538d0200f7871c63331ecd6f17b1f014f8" +checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" dependencies = [ "version_check", ] @@ -3313,15 +3342,15 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "1.0.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.74" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" +checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84" dependencies = [ "proc-macro2", "quote", @@ -3330,9 +3359,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" +checksum = "474aaa926faa1603c40b7885a9eaea29b444d1cb2850cb7c0e37bb1a4182f4fa" dependencies = [ "proc-macro2", "quote", @@ -3348,9 +3377,9 @@ checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" [[package]] name = "tap" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36474e732d1affd3a6ed582781b3683df3d0563714c59c39591e8ff707cf078e" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" @@ -3360,8 +3389,8 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ "cfg-if 1.0.0", "libc", - "rand 0.8.3", - "redox_syscall 0.2.4", + "rand 0.8.4", + "redox_syscall", "remove_dir_all", "winapi 0.3.9", ] @@ -3377,33 +3406,24 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "thread_local" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" -dependencies = [ - "once_cell", -] - [[package]] name = "time" version = "0.1.44" @@ -3417,9 +3437,9 @@ dependencies = [ [[package]] name = "time" -version = "0.2.25" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1195b046942c221454c2539395f85413b33383a067449d78aab2b7b052a142f7" +checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" dependencies = [ "const_fn", "libc", @@ -3442,9 +3462,9 @@ dependencies = [ [[package]] name = "time-macros-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" +checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" dependencies = [ "proc-macro-hack", "proc-macro2", @@ -3455,9 +3475,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" dependencies = [ "tinyvec_macros", ] @@ -3482,25 +3502,25 @@ dependencies = [ "memchr", "mio 0.6.23", "num_cpus", - "pin-project-lite 0.1.11", + "pin-project-lite 0.1.12", "slab", "tokio-macros 0.2.6", ] [[package]] name = "tokio" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7b349f11a7047e6d1276853e612d152f5e8a352c61917887cc2169e2366b4c" +checksum = "b4efe6fc2395938c8155973d7be49fe8d03a843726e285e100a8a383cc0154ce" dependencies = [ "autocfg 1.0.1", - "bytes 1.0.1", + "bytes 1.1.0", "libc", "memchr", "mio 0.7.13", "num_cpus", "once_cell", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "signal-hook-registry", "tokio-macros 1.3.0", "winapi 0.3.9", @@ -3535,7 +3555,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ "native-tls", - "tokio 1.9.0", + "tokio 1.11.0", ] [[package]] @@ -3569,8 +3589,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" dependencies = [ "futures-core", - "pin-project-lite 0.2.4", - "tokio 1.9.0", + "pin-project-lite 0.2.7", + "tokio 1.11.0", ] [[package]] @@ -3593,22 +3613,22 @@ dependencies = [ "futures-core", "futures-sink", "log", - "pin-project-lite 0.1.11", + "pin-project-lite 0.1.12", "tokio 0.2.25", ] [[package]] name = "tokio-util" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" +checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "futures-core", "futures-sink", "log", - "pin-project-lite 0.2.4", - "tokio 1.9.0", + "pin-project-lite 0.2.7", + "tokio 1.11.0", ] [[package]] @@ -3620,6 +3640,18 @@ dependencies = [ "serde", ] +[[package]] +name = "totp-lite" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b18009e8be74bfb2e2cc59a63d078d95c042858a1ca1128a294e1f9ce225148b" +dependencies = [ + "digest 0.9.0", + "hmac", + "sha-1 0.9.8", + "sha2", +] + [[package]] name = "tower-service" version = "0.3.1" @@ -3628,43 +3660,44 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d40a22fd029e33300d8d89a5cc8ffce18bb7c587662f54629e94c9de5487f3" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", "log", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "tracing-core", ] [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "2ca517f43f0fb96e0c3072ed5c275fe5eece87e8cb52f4a77b69226d3b1c9df8" dependencies = [ "lazy_static", ] [[package]] name = "tracing-futures" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "pin-project 0.4.27", + "pin-project", "tracing", ] [[package]] name = "trust-dns-proto" -version = "0.19.6" +version = "0.19.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53861fcb288a166aae4c508ae558ed18b53838db728d4d310aad08270a7d4c2b" +checksum = "1cad71a0c0d68ab9941d2fb6e82f8fb2e86d9945b94e1661dd0aaea2b88215a9" dependencies = [ "async-trait", "backtrace", + "cfg-if 1.0.0", "enum-as-inner", "futures", "idna", @@ -3679,11 +3712,10 @@ dependencies = [ [[package]] name = "trust-dns-resolver" -version = "0.19.6" +version = "0.19.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759e8efc40465547b0dfce9500d733c65f969a4cbbfbe3ccf68daaa46ef179e" +checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" dependencies = [ - "backtrace", "cfg-if 0.1.10", "futures", "ipconfig", @@ -3717,7 +3749,7 @@ dependencies = [ "input_buffer", "log", "rand 0.7.3", - "sha-1 0.9.3", + "sha-1 0.9.8", "url", "utf-8", ] @@ -3745,9 +3777,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" [[package]] name = "ubyte" @@ -3812,33 +3844,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] +checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" [[package]] name = "unicode-normalization" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "untrusted" @@ -3866,9 +3895,9 @@ dependencies = [ [[package]] name = "utf-8" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" @@ -3876,7 +3905,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.3", ] [[package]] @@ -3893,7 +3922,23 @@ dependencies = [ "serde_json", "url", "validator_derive", - "validator_types", + "validator_types 0.11.0", +] + +[[package]] +name = "validator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0f08911ab0fee2c5009580f04615fa868898ee57de10692a45da0c3bcc3e5e" +dependencies = [ + "idna", + "lazy_static", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_types 0.14.0", ] [[package]] @@ -3909,7 +3954,7 @@ dependencies = [ "quote", "regex", "syn", - "validator_types", + "validator_types 0.11.0", ] [[package]] @@ -3919,31 +3964,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "add324da7950ac1f76b1c16ce8b5406147953d5d6a2ac1c5da93785f2cfc738b" [[package]] -name = "value-bag" -version = "1.0.0-alpha.6" +name = "validator_types" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b676010e055c99033117c2343b33a40a30b91fecd6c49055ac9cd2d6c305ab1" +checksum = "ded9d97e1d42327632f5f3bae6403c04886e2de3036261ef42deebd931a6a291" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "value-bag" +version = "1.0.0-alpha.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd320e1520f94261153e96f7534476ad869c14022aee1e59af7c778075d840ae" dependencies = [ "ctor", + "version_check", ] [[package]] name = "vcpkg" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" - -[[package]] -name = "vec-arena" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "waker-fn" @@ -3975,9 +4025,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" +checksum = "5e68338db6becec24d3c7977b5bf8a48be992c934b5d07177e3931f5dc9b076c" dependencies = [ "cfg-if 1.0.0", "serde", @@ -3987,9 +4037,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc45447f0d4573f3d65720f636bbcc3dd6ce920ed704670118650bcd47764c7" +checksum = "f34c405b4f0658583dba0c1c7c9b694f3cac32655db463b56c254a1c75269523" dependencies = [ "bumpalo", "lazy_static", @@ -4002,9 +4052,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.20" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de431a2910c86679c34283a33f66f4e4abd7e0aec27b6669060148872aadf94" +checksum = "a87d738d4abc4cf22f6eb142f5b9a81301331ee3c767f2fef2fda4e325492060" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -4014,9 +4064,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b8853882eef39593ad4174dd26fc9865a64e84026d223f63bb2c42affcbba2c" +checksum = "b9d5a6580be83b19dc570a8f9c324251687ab2184e57086f71625feb57ec77c8" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4024,9 +4074,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4133b5e7f2a531fa413b3a1695e925038a05a71cf67e87dafa295cb645a01385" +checksum = "e3775a030dc6f5a0afd8a84981a21cc92a781eb429acef9ecce476d0c9113e92" dependencies = [ "proc-macro2", "quote", @@ -4037,9 +4087,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4945e4943ae02d15c13962b38a5b1e81eadd4b71214eee75af64a4d6a4fd64" +checksum = "c279e376c7a8e8752a8f1eaa35b7b0bee6bb9fb0cdacfa97cc3f1f289c87e2b4" [[package]] name = "web-push" @@ -4068,9 +4118,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.47" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c40dc691fc48003eba817c38da7113c15698142da971298003cac3ef175680b3" +checksum = "0a84d70d1ec7d2da2d26a5bd78f4bca1b8c3254805363ce743b7a05bc30d195a" dependencies = [ "js-sys", "wasm-bindgen", @@ -4086,15 +4136,6 @@ dependencies = [ "untrusted 0.7.1", ] -[[package]] -name = "webpki-roots" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" -dependencies = [ - "webpki", -] - [[package]] name = "webpki-roots" version = "0.20.0" @@ -4105,10 +4146,19 @@ dependencies = [ ] [[package]] -name = "wepoll-sys" -version = "3.0.1" +name = "webpki-roots" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb14dea929042224824779fbc82d9fab8d2e6d3cbc0ac404de8edf489e77ff" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" dependencies = [ "cc", ] @@ -4180,6 +4230,37 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "wither" +version = "0.9.0" +source = "git+https://github.com/insertish/wither?branch=master#25226946ff9a2cafac390968b317df83eaafe31f" +dependencies = [ + "async-trait", + "chrono", + "futures", + "log", + "mongodb", + "serde", + "thiserror", + "ulid", + "wither_derive", +] + +[[package]] +name = "wither_derive" +version = "0.9.0" +source = "git+https://github.com/insertish/wither?branch=master#25226946ff9a2cafac390968b317df83eaafe31f" +dependencies = [ + "Inflector", + "async-trait", + "darling 0.10.2", + "proc-macro-error", + "proc-macro2", + "quote", + "serde", + "syn", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index e1e6c522..868e9ce9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ edition = "2018" [dependencies] # Utility +url = "2.2.2" log = "0.4.11" dotenv = "0.15.0" linkify = "0.6.0" @@ -18,7 +19,6 @@ once_cell = "1.4.1" env_logger = "0.7.1" lazy_static = "1.4.0" ctrlc = { version = "3.0", features = ["termination"] } -url = "2.2.2" # Lang. Utilities regex = "1" @@ -48,7 +48,7 @@ async-std = { version = "1.8.0", features = ["tokio1", "tokio02", "attributes"] web-push = "0.7.2" many-to-many = "0.1.2" lettre = "0.10.0-alpha.4" -rauth = { git = "https://github.com/insertish/rauth", rev = "19bef300ecc269c028e3d746f0a2f09842d3b37b" } +rauth = { git = "https://github.com/insertish/rauth", rev = "df88fa8ec723663908a210f9da2d192826cbe736" } hive_pubsub = { git = "https://gitlab.insrt.uk/insert/hive", rev = "a89826df2b30166220e68a6ed01a58b751456604", features = ["mongo"] } # web diff --git a/assets/templates/reset.txt b/assets/templates/reset.txt new file mode 100644 index 00000000..6da746ec --- /dev/null +++ b/assets/templates/reset.txt @@ -0,0 +1,5 @@ +You requested a password reset, if you did not perform this action you can safely ignore this email. + +Reset your password here: {{url}} + +Sent by Revolt. \ No newline at end of file diff --git a/assets/templates/verify.txt b/assets/templates/verify.txt new file mode 100644 index 00000000..7bfbd58e --- /dev/null +++ b/assets/templates/verify.txt @@ -0,0 +1,6 @@ +You're almost there! +If you did not perform this action you can safely ignore this email. + +Please verify your account here: {{url}} + +Sent by Revolt. \ No newline at end of file diff --git a/set_version.sh b/set_version.sh index ff61a82a..d5dff1d1 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.2-alpha.2 +export version=0.5.3-alpha.0 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index 468c2aba..aa286bdd 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -9,14 +9,12 @@ use futures::StreamExt; use mongodb::options::UpdateOptions; use mongodb::{ bson::{doc, to_bson, DateTime}, - options::FindOptions, }; +use rauth::entities::{Model, Session}; use rocket::serde::json::Value; use serde::{Deserialize, Serialize}; use ulid::Ulid; -use web_push::{ - ContentEncoding, SubscriptionInfo, VapidSignatureBuilder, WebPushClient, WebPushMessageBuilder, -}; +use web_push::{ContentEncoding, SubscriptionInfo, SubscriptionKeys, VapidSignatureBuilder, WebPushClient, WebPushMessageBuilder}; use std::time::SystemTime; #[derive(Serialize, Deserialize, Debug, Clone)] @@ -335,60 +333,47 @@ impl Message { } // Fetch their corresponding sessions. - if let Ok(mut cursor) = get_collection("accounts") - .find( - doc! { - "_id": { - "$in": target_ids - }, - "sessions.subscription": { - "$exists": true - } - }, - FindOptions::builder() - .projection(doc! { "sessions": 1 }) - .build(), - ) - .await - { - let mut subscriptions = vec![]; - while let Some(result) = cursor.next().await { - if let Ok(doc) = result { - if let Ok(sessions) = doc.get_array("sessions") { - for session in sessions { - if let Some(doc) = session.as_document() { - if let Ok(sub) = doc.get_document("subscription") { - let endpoint = sub.get_str("endpoint").unwrap().to_string(); - let p256dh = sub.get_str("p256dh").unwrap().to_string(); - let auth = sub.get_str("auth").unwrap().to_string(); - - subscriptions - .push(SubscriptionInfo::new(endpoint, p256dh, auth)); - } - } + if target_ids.len() > 0 { + if let Ok(mut cursor) = Session::find( + &get_db(), + doc! { + "_id": { + "$in": target_ids + }, + "subscription": { + "$exists": true } - } - } - } - - if subscriptions.len() > 0 { + }, + None + ) + .await { let enc = serde_json::to_string(&PushNotification::new(self, &c_clone).await).unwrap(); let client = WebPushClient::new(); let key = base64::decode_config(VAPID_PRIVATE_KEY.clone(), base64::URL_SAFE).unwrap(); - for subscription in subscriptions { - let mut builder = WebPushMessageBuilder::new(&subscription).unwrap(); - let sig_builder = VapidSignatureBuilder::from_pem( - std::io::Cursor::new(&key), - &subscription, - ) - .unwrap(); - let signature = sig_builder.build().unwrap(); - builder.set_vapid_signature(signature); - builder.set_payload(ContentEncoding::AesGcm, enc.as_bytes()); - let m = builder.build().unwrap(); - client.send(m).await.ok(); + while let Some(Ok(session)) = cursor.next().await { + if let Some(sub) = session.subscription { + let subscription = SubscriptionInfo { + endpoint: sub.endpoint, + keys: SubscriptionKeys { + auth: sub.auth, + p256dh: sub.p256dh + } + }; + + let mut builder = WebPushMessageBuilder::new(&subscription).unwrap(); + let sig_builder = VapidSignatureBuilder::from_pem( + std::io::Cursor::new(&key), + &subscription, + ) + .unwrap(); + let signature = sig_builder.build().unwrap(); + builder.set_vapid_signature(signature); + builder.set_payload(ContentEncoding::AesGcm, enc.as_bytes()); + let m = builder.build().unwrap(); + client.send(m).await.ok(); + } } } } diff --git a/src/database/guards/user.rs b/src/database/guards/user.rs index 2f498849..48253b84 100644 --- a/src/database/guards/user.rs +++ b/src/database/guards/user.rs @@ -1,7 +1,7 @@ use crate::database::*; use mongodb::bson::{doc, from_document}; -use rauth::auth::Session; +use rauth::entities::Session; use rocket::http::Status; use rocket::request::{self, FromRequest, Outcome, Request}; @@ -15,7 +15,7 @@ impl<'r> FromRequest<'r> for User { .get("x-bot-token") .next() .map(|x| x.to_string()); - + if let Some(bot_token) = header_bot_token { return if let Ok(result) = get_collection("bots") .find_one( @@ -40,7 +40,10 @@ impl<'r> FromRequest<'r> for User { if let Some(doc) = result { Outcome::Success(from_document(doc).unwrap()) } else { - Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) + Outcome::Failure(( + Status::Forbidden, + rauth::util::Error::InvalidSession, + )) } } else { Outcome::Failure(( @@ -62,32 +65,34 @@ impl<'r> FromRequest<'r> for User { with: "bot", }, )) - } + }; } else { - let session: Session = request.guard::().await.unwrap(); - - if let Ok(result) = get_collection("users") - .find_one( - doc! { - "_id": &session.user_id - }, - None, - ) - .await - { - if let Some(doc) = result { - Outcome::Success(from_document(doc).unwrap()) + if let Outcome::Success(session) = request.guard::().await { + if let Ok(result) = get_collection("users") + .find_one( + doc! { + "_id": &session.user_id + }, + None, + ) + .await + { + if let Some(doc) = result { + Outcome::Success(from_document(doc).unwrap()) + } else { + Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) + } } else { - Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) + Outcome::Failure(( + Status::InternalServerError, + rauth::util::Error::DatabaseError { + operation: "find_one", + with: "user", + }, + )) } } else { - Outcome::Failure(( - Status::InternalServerError, - rauth::util::Error::DatabaseError { - operation: "find_one", - with: "user", - }, - )) + Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) } } } diff --git a/src/database/migrations/init.rs b/src/database/migrations/init.rs index 7bb929a8..4dae83a4 100644 --- a/src/database/migrations/init.rs +++ b/src/database/migrations/init.rs @@ -71,39 +71,6 @@ pub async fn create_database() { .await .expect("Failed to create pubsub collection."); - db.run_command( - doc! { - "createIndexes": "accounts", - "indexes": [ - { - "key": { - "email": 1 - }, - "name": "email", - "unique": true, - "collation": { - "locale": "en", - "strength": 2 - } - }, - { - "key": { - "email_normalised": 1 - }, - "name": "email_normalised", - "unique": true, - "collation": { - "locale": "en", - "strength": 2 - } - } - ] - }, - None, - ) - .await - .expect("Failed to create account index."); - db.run_command( doc! { "createIndexes": "users", diff --git a/src/database/migrations/mod.rs b/src/database/migrations/mod.rs index 0067518b..8470444d 100644 --- a/src/database/migrations/mod.rs +++ b/src/database/migrations/mod.rs @@ -10,10 +10,13 @@ pub async fn run_migrations() { .list_database_names(None, None) .await .expect("Failed to fetch database names."); - + if list.iter().position(|x| x == "revolt").is_none() { init::create_database().await; } else { scripts::migrate_database().await; } + + // panic!("https://pbs.twimg.com/media/EDTpB5JWwAUvyxd.jpg"); + rauth::entities::sync_models(&super::get_db()).await; } diff --git a/src/database/migrations/scripts.rs b/src/database/migrations/scripts.rs index 14e30e8c..bfca19dc 100644 --- a/src/database/migrations/scripts.rs +++ b/src/database/migrations/scripts.rs @@ -2,7 +2,7 @@ use crate::database::{permissions, get_collection, get_db, PermissionTuple}; use futures::StreamExt; use log::info; -use mongodb::{bson::{doc, from_document, to_document}, options::FindOptions}; +use mongodb::{bson::{Document, doc, from_bson, from_document, to_document}, options::FindOptions}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] @@ -11,7 +11,7 @@ struct MigrationInfo { revision: i32, } -pub const LATEST_REVISION: i32 = 8; +pub const LATEST_REVISION: i32 = 9; pub async fn migrate_database() { let migrations = get_collection("migrations"); @@ -212,6 +212,78 @@ pub async fn run_migrations(revision: i32) -> i32 { .expect("Failed to create bots collection."); } + if revision <= 8 { + info!("Running migration [revision 8 / 2021-09-10]: Update to rAuth version 1."); + + get_db() + .run_command( + doc! { + "dropIndexes": "accounts", + "index": ["email", "email_normalised"] + }, + None, + ) + .await + .expect("Failed to delete legacy account indexes."); + + let col = get_collection("sessions"); + let mut cursor = get_collection("accounts") + .find(doc! { }, None) + .await + .unwrap(); + + while let Some(doc) = cursor.next().await { + if let Ok(mut account) = doc { + if let Some(sessions) = account.remove("sessions") { + #[derive(Deserialize)] + struct Session { + id: String, + token: String, + friendly_name: String, + subscription: Option, + } + + let sessions = from_bson::>(sessions).unwrap(); + for session in sessions { + info!("Converting session {} to new format.", &session.id); + + let mut doc = doc! { + "_id": session.id, + "token": session.token, + "name": session.friendly_name, + }; + + if let Some(sub) = session.subscription { + doc.insert("subscription", sub); + } + + col.insert_one(doc, None).await.ok(); + } + } else { + info!("Account doesn't have any sessions!"); + } + } + } + + get_collection("accounts") + .update_many( + doc! { }, + doc! { + "$unset": { + "sessions": 1, + }, + "$set": { + "mfa": { + "recovery_codes": [] + } + } + }, + None + ) + .await + .unwrap(); + } + // Reminder to update LATEST_REVISION when adding new migrations. LATEST_REVISION } diff --git a/src/main.rs b/src/main.rs index d0756e0c..ea939b6d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,20 +21,18 @@ pub mod util; pub mod version; use async_std::task; -use chrono::Duration; use futures::join; use log::info; -use rauth::options::{EmailVerification, Options, SMTP}; use rauth::{ - auth::Auth, - options::{Template, Templates}, + config::{Captcha, Config, EmailVerification, SMTPSettings, Template, Templates}, + logic::Auth, }; -use std::str::FromStr; -use rocket_cors::AllowedOrigins; use rocket::catchers; +use rocket_cors::AllowedOrigins; +use std::str::FromStr; use util::variables::{ - APP_URL, HCAPTCHA_KEY, INVITE_ONLY, PUBLIC_URL, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, - SMTP_USERNAME, USE_EMAIL, USE_HCAPTCHA, + APP_URL, HCAPTCHA_KEY, INVITE_ONLY, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME, + USE_EMAIL, USE_HCAPTCHA, }; #[async_std::main] @@ -71,79 +69,67 @@ async fn launch_web() { let cors = rocket_cors::CorsOptions { allowed_origins: AllowedOrigins::All, allowed_methods: [ - "Get", - "Put", - "Post", - "Delete", - "Options", - "Head", - "Trace", - "Connect", - "Patch", + "Get", "Put", "Post", "Delete", "Options", "Head", "Trace", "Connect", "Patch", ] - .iter() - .map(|s| FromStr::from_str(s).unwrap()) - .collect(), + .iter() + .map(|s| FromStr::from_str(s).unwrap()) + .collect(), ..Default::default() } .to_cors() .expect("Failed to create CORS."); - let mut options = Options::new() - .base_url(format!("{}/auth", *PUBLIC_URL)) - .email_verification(if *USE_EMAIL { + let mut config = Config { + email_verification: if *USE_EMAIL { EmailVerification::Enabled { - success_redirect_uri: format!("{}/login", *APP_URL), - welcome_redirect_uri: format!("{}/welcome", *APP_URL), - password_reset_url: Some(format!("{}/login/reset", *APP_URL)), - - verification_expiry: Duration::days(1), - password_reset_expiry: Duration::hours(1), - - templates: Templates { - verify_email: Template { - title: "Verify your Revolt account.", - text: "You're almost there! -If you did not perform this action you can safely ignore this email. - -Please verify your account here: {{url}}", - html: None, - }, - reset_password: Template { - title: "Reset your Revolt password.", - text: "You requested a password reset, if you did not perform this action you can safely ignore this email. - -Reset your password here: {{url}}", - html: None, - }, - welcome: None, - }, - - smtp: SMTP { + smtp: SMTPSettings { from: (*SMTP_FROM).to_string(), host: (*SMTP_HOST).to_string(), username: (*SMTP_USERNAME).to_string(), password: (*SMTP_PASSWORD).to_string(), + reply_to: Some("support@revolt.chat".into()), + port: None, + use_tls: None, + }, + expiry: Default::default(), + templates: Templates { + verify: Template { + title: "Verify your Revolt account.".into(), + text: include_str!("../assets/templates/verify.txt").into(), + url: format!("{}/login/verify/", *APP_URL), + html: None, + }, + reset: Template { + title: "Reset your Revolt password.".into(), + text: include_str!("../assets/templates/reset.txt").into(), + url: format!("{}/login/reset/", *APP_URL), + html: None, + }, + welcome: None, }, } } else { EmailVerification::Disabled - }); + }, + ..Default::default() + }; if *INVITE_ONLY { - options = options.invite_only_collection(database::get_collection("invites")) + config.invite_only = true; } if *USE_HCAPTCHA { - options = options.hcaptcha_secret(HCAPTCHA_KEY.clone()); + config.captcha = Captcha::HCaptcha { + secret: HCAPTCHA_KEY.clone(), + }; } - let auth = Auth::new(database::get_collection("accounts"), options); + let auth = Auth::new(database::get_db(), config); let rocket = rocket::build(); - routes::mount(rocket) .mount("/", rocket_cors::catch_all_options_routes()) - .mount("/auth", rauth::routes::routes()) + .mount("/auth/account", rauth::web::account::routes()) + .mount("/auth/session", rauth::web::session::routes()) .manage(auth) .manage(cors.clone()) .attach(cors) diff --git a/src/notifications/events.rs b/src/notifications/events.rs index 5ec1fc85..93bab262 100644 --- a/src/notifications/events.rs +++ b/src/notifications/events.rs @@ -1,6 +1,5 @@ use hive_pubsub::PubSub; use mongodb::bson::doc; -use rauth::auth::Session; use rocket::serde::json::Value; use serde::{Deserialize, Serialize}; @@ -19,24 +18,17 @@ pub enum WebSocketError { } #[derive(Deserialize, Debug)] -pub struct BotAuth { - pub token: String -} - -#[derive(Deserialize, Debug)] -#[serde(untagged)] -pub enum AuthType { - User(Session), - Bot(BotAuth) +pub struct Auth { + pub token: String, } #[derive(Deserialize, Debug)] #[serde(tag = "type")] pub enum ServerboundNotification { - Authenticate(AuthType), + Authenticate(Auth), BeginTyping { channel: String }, EndTyping { channel: String }, - Ping { data: Vec } + Ping { data: Vec, responded: Option<()> }, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -50,7 +42,7 @@ pub enum RemoveUserField { #[derive(Serialize, Deserialize, Debug, Clone)] pub enum RemoveChannelField { Icon, - Description + Description, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -85,8 +77,9 @@ pub enum ClientboundNotification { users: Vec, servers: Vec, channels: Vec, - members: Vec + members: Vec, }, + Pong { data: Vec }, Message(Message), MessageUpdate { @@ -159,11 +152,11 @@ pub enum ClientboundNotification { role_id: String, data: Value, #[serde(skip_serializing_if = "Option::is_none")] - clear: Option + clear: Option, }, ServerRoleDelete { id: String, - role_id: String + role_id: String, }, UserUpdate { @@ -222,8 +215,7 @@ pub async fn prehandle_hook(notification: &ClientboundNotification) -> Result<() subscribe_if_exists(recipient.clone(), channel_id.to_string()).ok(); } } - Channel::TextChannel { server, .. } - | Channel::VoiceChannel { server, .. } => { + Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { // ! FIXME: write a better algorithm? let members = Server::fetch_member_ids(server).await?; for member in members { diff --git a/src/notifications/websocket.rs b/src/notifications/websocket.rs index e6ae3506..88dd5b59 100644 --- a/src/notifications/websocket.rs +++ b/src/notifications/websocket.rs @@ -1,28 +1,27 @@ use crate::database::*; -use crate::notifications::events::{AuthType, BotAuth}; use crate::util::variables::WS_HOST; use super::subscriptions; use async_std::net::{TcpListener, TcpStream}; use async_std::task; -use async_tungstenite::tungstenite::{Message, handshake::server}; -use futures::channel::{oneshot, mpsc::{unbounded, UnboundedSender}}; +use async_tungstenite::tungstenite::{handshake::server, Message}; +use futures::channel::{ + mpsc::{unbounded, UnboundedSender}, + oneshot, +}; use futures::stream::TryStreamExt; use futures::{pin_mut, prelude::*}; use hive_pubsub::PubSub; use log::{debug, info}; use many_to_many::ManyToMany; use mongodb::bson::doc; -use rauth::{ - auth::{Auth}, - options::Options, -}; +use rauth::entities::{Model, Session}; use rmp_serde; -use url::Url; use std::collections::HashMap; use std::net::SocketAddr; use std::sync::{Arc, Mutex, RwLock}; +use url::Url; use super::{ events::{ClientboundNotification, ServerboundNotification, WebSocketError}, @@ -51,28 +50,43 @@ pub async fn launch_server() { #[derive(Debug)] enum MSGFormat { JSON, - MSGPACK + MSGPACK, } struct HeaderCallback { - sender: oneshot::Sender + sender: oneshot::Sender, } impl server::Callback for HeaderCallback { - fn on_request(self, request: &server::Request, response: server::Response) -> Result { + fn on_request( + self, + request: &server::Request, + response: server::Response, + ) -> Result { // we dont get some of the data sometimes so im generating a fake url with the only data we actually need - let url = format!("ws://example.com?{}", request.uri().query().unwrap_or("?format=json")); - let mut query: HashMap<_, _> = url.parse::().unwrap().query_pairs().into_owned().collect(); // should be safe to use unwrap here as we just made the url ourself + let url = format!( + "ws://example.com?{}", + request.uri().query().unwrap_or("?format=json") + ); + let mut query: HashMap<_, _> = url + .parse::() + .unwrap() + .query_pairs() + .into_owned() + .collect(); // should be safe to use unwrap here as we just made the url ourself let format_query: Option = query.remove("format"); let format = match format_query.as_deref().unwrap_or("json") { "msgpack" => MSGFormat::MSGPACK, "json" => MSGFormat::JSON, - _ => panic!("unknown format") // TODO: not use panic + _ => MSGFormat::JSON, // Fallback to JSON. }; - self.sender.send(format).unwrap(); // TODO: not use unwrap - Ok(response) + if self.sender.send(format).is_ok() { + Ok(response) + } else { + Err(server::ErrorResponse::new(None)) + } } } @@ -81,12 +95,13 @@ async fn accept(stream: TcpStream) { .peer_addr() .expect("Connected streams should have a peer address."); let (sender, receiver) = oneshot::channel::(); - - let ws_stream = async_tungstenite::accept_hdr_async_with_config(stream, HeaderCallback { sender }, None) - .await - .expect("Error during websocket handshake."); - let msg_format = receiver.await.unwrap(); // TODO: not use unwrap + let ws_stream = + async_tungstenite::accept_hdr_async_with_config(stream, HeaderCallback { sender }, None) + .await + .expect("Error during websocket handshake."); + + let msg_format = receiver.await.unwrap(); // TODO: not use unwrap info!("User established WebSocket connection from {}.", &addr); @@ -98,12 +113,12 @@ async fn accept(stream: TcpStream) { let res = match msg_format { MSGFormat::JSON => match serde_json::to_string(¬ification) { Ok(s) => Message::Text(s), - Err(_) => return - } + Err(_) => return, + }, MSGFormat::MSGPACK => match rmp_serde::to_vec(¬ification) { Ok(v) => Message::Binary(v), - Err(_) => return - } + Err(_) => return, + }, }; if let Err(_) = tx.unbounded_send(res) { @@ -118,21 +133,27 @@ async fn accept(stream: TcpStream) { let mutex = mutex_generator(); let maybe_decoded = match msg { - Message::Text(text) => serde_json::from_str::(&text).map_err(|e| e.to_string()), - Message::Binary(vec) => rmp_serde::decode::from_read::<&[u8], ServerboundNotification>(vec.as_slice()).map_err(|e| e.to_string()), - Message::Ping(vec) => Ok(ServerboundNotification::Ping { data: vec }), - _ => return Ok(()) + Message::Text(text) => { + serde_json::from_str::(&text).map_err(|e| e.to_string()) + } + Message::Binary(vec) => { + rmp_serde::decode::from_read::<&[u8], ServerboundNotification>(vec.as_slice()) + .map_err(|e| e.to_string()) + } + Message::Ping(vec) => Ok(ServerboundNotification::Ping { data: vec, responded: Some(()) }), + _ => return Ok(()), }; let notification = match maybe_decoded { Err(why) => { send(ClientboundNotification::Error( WebSocketError::MalformedData { - msg: why.to_string() - })); - return Ok(()) - }, - Ok(n) => n + msg: why.to_string(), + }, + )); + return Ok(()); + } + Ok(n) => n, }; match notification { @@ -147,34 +168,28 @@ async fn accept(stream: TcpStream) { } } - if let Some(id) = match auth { - AuthType::User(new_session) => { - if let Ok(validated_session) = - Auth::new(get_collection("accounts"), Options::new()) - .verify_session(new_session) - .await - { - Some(validated_session.user_id.clone()) - } else { - None - } + let id = if let Ok(result) = + Session::find_one(&get_db(), doc! { "token": &auth.token }, None).await + { + if let Some(session) = result { + Some(session.user_id) + } else { + None } - AuthType::Bot(BotAuth { token }) => { - if let Ok(doc) = get_collection("bots") - .find_one( - doc! { "token": token }, - None - ).await { - if let Some(doc) = doc { - Some(doc.get_str("_id").unwrap().to_string()) - } else { - None - } - } else { - None - } + } else if let Ok(result) = get_collection("bots") + .find_one(doc! { "token": auth.token }, None) + .await + { + if let Some(bot) = result { + Some(bot.get_str("_id").unwrap().to_string()) + } else { + None } - } { + } else { + None + }; + + if let Some(id) = id { if let Ok(user) = (Ref { id: id.clone() }).fetch_user().await { let is_invisible = if let Some(status) = &user.status { if let Some(presence) = &status.presence { @@ -229,7 +244,7 @@ async fn accept(stream: TcpStream) { data: json!({ "online": true }), - clear: None + clear: None, } .publish_as_user(id); } @@ -297,8 +312,12 @@ async fn accept(stream: TcpStream) { return Ok(()); } } - ServerboundNotification::Ping { data } => { - info!("Ping received from User {}. Payload: {:?}", &addr, data); + ServerboundNotification::Ping { data, responded } => { + debug!("Ping received from connection {}. Payload: {:?}", &addr, data); + + if responded.is_none() { + send(ClientboundNotification::Pong { data }); + } } } Ok(()) @@ -329,7 +348,7 @@ async fn accept(stream: TcpStream) { data: json!({ "online": false }), - clear: None + clear: None, } .publish_as_user(id); } diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 1e647e31..03a2902b 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,7 +1,8 @@ -pub use rocket::response::Redirect; pub use rocket::http::Status; +pub use rocket::response::Redirect; use rocket::{Build, Rocket}; +mod bots; mod channels; mod invites; mod onboard; @@ -10,7 +11,6 @@ mod root; mod servers; mod sync; mod users; -mod bots; pub fn mount(rocket: Rocket) -> Rocket { rocket diff --git a/src/routes/onboard/complete.rs b/src/routes/onboard/complete.rs index 54f2e330..8a51cac4 100644 --- a/src/routes/onboard/complete.rs +++ b/src/routes/onboard/complete.rs @@ -2,7 +2,7 @@ use crate::database::*; use crate::util::result::{Error, Result, EmptyResponse}; use mongodb::bson::doc; -use rauth::auth::Session; +use rauth::entities::Session; use regex::Regex; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; diff --git a/src/routes/onboard/hello.rs b/src/routes/onboard/hello.rs index 050e7561..ca4f1ca8 100644 --- a/src/routes/onboard/hello.rs +++ b/src/routes/onboard/hello.rs @@ -1,6 +1,6 @@ use crate::database::*; -use rauth::auth::Session; +use rauth::entities::Session; use rocket::serde::json::Value; #[get("/hello")] diff --git a/src/routes/push/subscribe.rs b/src/routes/push/subscribe.rs index 2b28b6f2..343e953c 100644 --- a/src/routes/push/subscribe.rs +++ b/src/routes/push/subscribe.rs @@ -1,37 +1,19 @@ use crate::database::*; use crate::util::result::{EmptyResponse, Error, Result}; -use mongodb::bson::{doc, to_document}; -use rauth::auth::Session; +use mongodb::bson::doc; +use rauth::entities::{Model, Session, WebPushSubscription}; use rocket::serde::json::Json; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize)] -pub struct Subscription { - endpoint: String, - p256dh: String, - auth: String, -} #[post("/subscribe", data = "")] -pub async fn req(session: Session, data: Json) -> Result { - let data = data.into_inner(); - get_collection("accounts") - .update_one( - doc! { - "_id": session.user_id, - "sessions.id": session.id.unwrap() - }, - doc! { - "$set": { - "sessions.$.subscription": to_document(&data) - .map_err(|_| Error::DatabaseError { operation: "to_document", with: "subscription" })? - } - }, - None, - ) +pub async fn req(mut session: Session, data: Json) -> Result { + session.subscription = Some(data.into_inner()); + session + .save(&get_db(), None) .await - .map_err(|_| Error::DatabaseError { operation: "update_one", with: "account" })?; - - Ok(EmptyResponse {}) + .map(|_| EmptyResponse) + .map_err(|_| Error::DatabaseError { + operation: "save", + with: "session", + }) } diff --git a/src/routes/push/unsubscribe.rs b/src/routes/push/unsubscribe.rs index 19deaeb9..68521171 100644 --- a/src/routes/push/unsubscribe.rs +++ b/src/routes/push/unsubscribe.rs @@ -1,29 +1,18 @@ use crate::database::*; -use crate::util::result::{Error, Result, EmptyResponse}; +use crate::util::result::{EmptyResponse, Error, Result}; use mongodb::bson::doc; -use rauth::auth::Session; +use rauth::entities::{Model, Session}; #[post("/unsubscribe")] -pub async fn req(session: Session) -> Result { - get_collection("accounts") - .update_one( - doc! { - "_id": session.user_id, - "sessions.id": session.id.unwrap() - }, - doc! { - "$unset": { - "sessions.$.subscription": 1 - } - }, - None, - ) +pub async fn req(mut session: Session) -> Result { + session.subscription = None; + session + .save(&get_db(), None) .await + .map(|_| EmptyResponse) .map_err(|_| Error::DatabaseError { - operation: "to_document", - with: "subscription", - })?; - - Ok(EmptyResponse {}) + operation: "save", + with: "session", + }) } diff --git a/src/routes/root.rs b/src/routes/root.rs index 1b0a15d4..7dae4ff7 100644 --- a/src/routes/root.rs +++ b/src/routes/root.rs @@ -1,7 +1,11 @@ -use crate::util::{ratelimit::RateLimitGuard, variables::{ - APP_URL, AUTUMN_URL, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY, JANUARY_URL, USE_AUTUMN, - USE_EMAIL, USE_HCAPTCHA, USE_JANUARY, USE_VOSO, VAPID_PUBLIC_KEY, VOSO_URL, VOSO_WS_HOST, -}}; +use crate::util::{ + ratelimit::RateLimitGuard, + variables::{ + APP_URL, AUTUMN_URL, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY, JANUARY_URL, + USE_AUTUMN, USE_EMAIL, USE_HCAPTCHA, USE_JANUARY, USE_VOSO, VAPID_PUBLIC_KEY, VOSO_URL, + VOSO_WS_HOST, + }, +}; use mongodb::bson::doc; use rocket::{http::Status, serde::json::Value}; diff --git a/src/routes/sync/get_settings.rs b/src/routes/sync/get_settings.rs index 93bb1d86..bcdc8d80 100644 --- a/src/routes/sync/get_settings.rs +++ b/src/routes/sync/get_settings.rs @@ -14,9 +14,9 @@ pub struct Options { #[post("/settings/fetch", data = "")] pub async fn req(user: User, options: Json) -> Result { if user.bot.is_some() { - return Err(Error::IsBot) + return Err(Error::IsBot); } - + let options = options.into_inner(); let mut projection = doc! { "_id": 0, diff --git a/src/routes/sync/get_unreads.rs b/src/routes/sync/get_unreads.rs index a83149a7..efd41202 100644 --- a/src/routes/sync/get_unreads.rs +++ b/src/routes/sync/get_unreads.rs @@ -7,8 +7,8 @@ use rocket::serde::json::Value; #[get("/unreads")] pub async fn req(user: User) -> Result { if user.bot.is_some() { - return Err(Error::IsBot) + return Err(Error::IsBot); } - + Ok(json!(User::fetch_unreads(&user.id).await?)) } diff --git a/src/routes/sync/set_settings.rs b/src/routes/sync/set_settings.rs index 18f6867b..a4f42d1d 100644 --- a/src/routes/sync/set_settings.rs +++ b/src/routes/sync/set_settings.rs @@ -1,6 +1,6 @@ use crate::database::*; use crate::notifications::events::ClientboundNotification; -use crate::util::result::{Error, Result, EmptyResponse}; +use crate::util::result::{EmptyResponse, Error, Result}; use chrono::prelude::*; use mongodb::bson::{doc, to_bson}; @@ -20,7 +20,7 @@ pub struct Options { #[post("/settings/set?", data = "")] pub async fn req(user: User, data: Json, options: Options) -> Result { if user.bot.is_some() { - return Err(Error::IsBot) + return Err(Error::IsBot); } let data = data.into_inner(); diff --git a/src/routes/users/change_username.rs b/src/routes/users/change_username.rs index 95a08ca5..2c4a8c55 100644 --- a/src/routes/users/change_username.rs +++ b/src/routes/users/change_username.rs @@ -3,9 +3,8 @@ use crate::notifications::events::ClientboundNotification; use crate::util::result::{Error, Result, EmptyResponse}; use mongodb::bson::doc; -use rauth::auth::{Auth, Session}; +use rauth::entities::Account; use regex::Regex; -use rocket::State; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -26,8 +25,7 @@ pub struct Data { #[patch("/<_ignore_id>/username", data = "")] pub async fn req( - auth: &State, - session: Session, + account: Account, user: User, data: Json, _ignore_id: String, @@ -39,8 +37,7 @@ pub async fn req( data.validate() .map_err(|error| Error::FailedValidation { error })?; - auth.verify_password(&session, data.password.clone()) - .await + account.verify_password(&data.password) .map_err(|_| Error::InvalidCredentials)?; let mut set = doc! {}; diff --git a/src/version.rs b/src/version.rs index 25a82cc9..fde9e8c7 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.2-alpha.2"; +pub const VERSION: &str = "0.5.3-alpha.0"; From fa8eb874d070559cbc9258945d885f77e6687361 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 11 Sep 2021 12:43:26 +0100 Subject: [PATCH 14/18] Handle both numerical and binary pings. --- src/notifications/events.rs | 11 +++++++++-- src/notifications/websocket.rs | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/notifications/events.rs b/src/notifications/events.rs index 93bab262..314359e5 100644 --- a/src/notifications/events.rs +++ b/src/notifications/events.rs @@ -22,13 +22,20 @@ pub struct Auth { pub token: String, } +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(untagged)] +pub enum Ping { + Binary(Vec), + Number(usize) +} + #[derive(Deserialize, Debug)] #[serde(tag = "type")] pub enum ServerboundNotification { Authenticate(Auth), BeginTyping { channel: String }, EndTyping { channel: String }, - Ping { data: Vec, responded: Option<()> }, + Ping { data: Ping, responded: Option<()> }, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -79,7 +86,7 @@ pub enum ClientboundNotification { channels: Vec, members: Vec, }, - Pong { data: Vec }, + Pong { data: Ping }, Message(Message), MessageUpdate { diff --git a/src/notifications/websocket.rs b/src/notifications/websocket.rs index 88dd5b59..6f615060 100644 --- a/src/notifications/websocket.rs +++ b/src/notifications/websocket.rs @@ -1,4 +1,5 @@ use crate::database::*; +use crate::notifications::events::Ping; use crate::util::variables::WS_HOST; use super::subscriptions; @@ -140,7 +141,7 @@ async fn accept(stream: TcpStream) { rmp_serde::decode::from_read::<&[u8], ServerboundNotification>(vec.as_slice()) .map_err(|e| e.to_string()) } - Message::Ping(vec) => Ok(ServerboundNotification::Ping { data: vec, responded: Some(()) }), + Message::Ping(vec) => Ok(ServerboundNotification::Ping { data: Ping::Binary(vec), responded: Some(()) }), _ => return Ok(()), }; From 8bb5fb25ddec3d6bafaf6ab0ae08bb1efcabf3d7 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 11 Sep 2021 17:46:20 +0100 Subject: [PATCH 15/18] Fix bot logon, should do nested match. Add comment to migrations. Fix attachment deletes on messages. --- src/database/entities/message.rs | 4 ++-- src/database/migrations/scripts.rs | 2 ++ src/notifications/websocket.rs | 16 ++++------------ 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index aa286bdd..dcc36506 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -467,7 +467,7 @@ impl Message { let attachment_ids: Vec = attachments.iter().map(|f| f.id.to_string()).collect(); get_collection("attachments") - .update_one( + .update_many( doc! { "_id": { "$in": attachment_ids @@ -482,7 +482,7 @@ impl Message { ) .await .map_err(|_| Error::DatabaseError { - operation: "update_one", + operation: "update_many", with: "attachment", })?; } diff --git a/src/database/migrations/scripts.rs b/src/database/migrations/scripts.rs index bfca19dc..8d72f4df 100644 --- a/src/database/migrations/scripts.rs +++ b/src/database/migrations/scripts.rs @@ -284,6 +284,8 @@ pub async fn run_migrations(revision: i32) -> i32 { .unwrap(); } + // Need to migrate fields on attachments, change `user_id`, `object_id`, etc to `parent`. + // Reminder to update LATEST_REVISION when adding new migrations. LATEST_REVISION } diff --git a/src/notifications/websocket.rs b/src/notifications/websocket.rs index 6f615060..529da091 100644 --- a/src/notifications/websocket.rs +++ b/src/notifications/websocket.rs @@ -169,23 +169,15 @@ async fn accept(stream: TcpStream) { } } - let id = if let Ok(result) = + let id = if let Ok(Some(session)) = Session::find_one(&get_db(), doc! { "token": &auth.token }, None).await { - if let Some(session) = result { - Some(session.user_id) - } else { - None - } - } else if let Ok(result) = get_collection("bots") + Some(session.user_id) + } else if let Ok(Some(bot)) = get_collection("bots") .find_one(doc! { "token": auth.token }, None) .await { - if let Some(bot) = result { - Some(bot.get_str("_id").unwrap().to_string()) - } else { - None - } + Some(bot.get_str("_id").unwrap().to_string()) } else { None }; From d0cb73106db47b80e3e9b6609bd873fa34b0b563 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 11 Sep 2021 18:41:06 +0100 Subject: [PATCH 16/18] Fix session migration. --- src/database/migrations/scripts.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/database/migrations/scripts.rs b/src/database/migrations/scripts.rs index 8d72f4df..c8d3a6b3 100644 --- a/src/database/migrations/scripts.rs +++ b/src/database/migrations/scripts.rs @@ -239,6 +239,7 @@ pub async fn run_migrations(revision: i32) -> i32 { struct Session { id: String, token: String, + user_id: String, friendly_name: String, subscription: Option, } @@ -250,6 +251,7 @@ pub async fn run_migrations(revision: i32) -> i32 { let mut doc = doc! { "_id": session.id, "token": session.token, + "user_id": session.user_id, "name": session.friendly_name, }; From 0b0249f5449474775e1b99c8d3bde0b3bf8e6701 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 11 Sep 2021 21:11:15 +0100 Subject: [PATCH 17/18] Fix migration again. --- src/database/migrations/scripts.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/database/migrations/scripts.rs b/src/database/migrations/scripts.rs index c8d3a6b3..d8ef0b81 100644 --- a/src/database/migrations/scripts.rs +++ b/src/database/migrations/scripts.rs @@ -233,25 +233,25 @@ pub async fn run_migrations(revision: i32) -> i32 { .unwrap(); while let Some(doc) = cursor.next().await { - if let Ok(mut account) = doc { - if let Some(sessions) = account.remove("sessions") { + if let Ok(account) = doc { + let id = account.get_str("_id").unwrap(); + if let Some(sessions) = account.get("sessions") { #[derive(Deserialize)] struct Session { id: String, token: String, - user_id: String, friendly_name: String, subscription: Option, } - let sessions = from_bson::>(sessions).unwrap(); + let sessions = from_bson::>(sessions.clone()).unwrap(); for session in sessions { info!("Converting session {} to new format.", &session.id); let mut doc = doc! { "_id": session.id, "token": session.token, - "user_id": session.user_id, + "user_id": id.clone(), "name": session.friendly_name, }; From ad364320c873d3fb5cf7409c2ccb5f42d0eba663 Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 12 Sep 2021 21:37:42 +0100 Subject: [PATCH 18/18] Fix route definitions for change pass / email. --- Cargo.lock | 2 +- Cargo.toml | 2 +- set_version.sh | 2 +- src/version.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d886c20..22c41246 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2556,7 +2556,7 @@ dependencies = [ [[package]] name = "rauth" version = "1.0.0" -source = "git+https://github.com/insertish/rauth?rev=df88fa8ec723663908a210f9da2d192826cbe736#df88fa8ec723663908a210f9da2d192826cbe736" +source = "git+https://github.com/insertish/rauth?rev=ad2f5ad1657f4b20c8e483cc1d6c513ff9b22ae1#ad2f5ad1657f4b20c8e483cc1d6c513ff9b22ae1" dependencies = [ "async-std", "base32", diff --git a/Cargo.toml b/Cargo.toml index 868e9ce9..21175858 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ async-std = { version = "1.8.0", features = ["tokio1", "tokio02", "attributes"] web-push = "0.7.2" many-to-many = "0.1.2" lettre = "0.10.0-alpha.4" -rauth = { git = "https://github.com/insertish/rauth", rev = "df88fa8ec723663908a210f9da2d192826cbe736" } +rauth = { git = "https://github.com/insertish/rauth", rev = "ad2f5ad1657f4b20c8e483cc1d6c513ff9b22ae1" } 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 d5dff1d1..b576d45c 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.3-alpha.0 +export version=0.5.3-alpha.0-patch.1 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/version.rs b/src/version.rs index fde9e8c7..6e66639f 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.3-alpha.0"; +pub const VERSION: &str = "0.5.3-alpha.0-patch.1";