From 10cac358a9cc4e3db03e1dca90bff4c29514cfc1 Mon Sep 17 00:00:00 2001
From: Paul <paulmakles@gmail.com>
Date: Fri, 19 Feb 2021 13:26:04 +0000
Subject: [PATCH] Label permission errors, and too many ids for /stale.

---
 src/routes/channels/delete_channel.rs      | 2 +-
 src/routes/channels/fetch_channel.rs       | 2 +-
 src/routes/channels/group_add_member.rs    | 2 +-
 src/routes/channels/group_remove_member.rs | 2 +-
 src/routes/channels/message_delete.rs      | 2 +-
 src/routes/channels/message_edit.rs        | 2 +-
 src/routes/channels/message_fetch.rs       | 2 +-
 src/routes/channels/message_query.rs       | 2 +-
 src/routes/channels/message_query_stale.rs | 4 ++--
 src/routes/channels/message_send.rs        | 2 +-
 src/routes/users/fetch_user.rs             | 2 +-
 src/routes/users/find_mutual.rs            | 4 ++--
 src/util/result.rs                         | 6 ++++++
 13 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/routes/channels/delete_channel.rs b/src/routes/channels/delete_channel.rs
index 9fd0881..7fc65de 100644
--- a/src/routes/channels/delete_channel.rs
+++ b/src/routes/channels/delete_channel.rs
@@ -12,7 +12,7 @@ pub async fn req(user: User, target: Ref) -> Result<()> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     match &target {
diff --git a/src/routes/channels/fetch_channel.rs b/src/routes/channels/fetch_channel.rs
index d5e6867..75a7d5b 100644
--- a/src/routes/channels/fetch_channel.rs
+++ b/src/routes/channels/fetch_channel.rs
@@ -12,7 +12,7 @@ pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     Ok(json!(target))
diff --git a/src/routes/channels/group_add_member.rs b/src/routes/channels/group_add_member.rs
index 4ff36fd..e925fd9 100644
--- a/src/routes/channels/group_add_member.rs
+++ b/src/routes/channels/group_add_member.rs
@@ -16,7 +16,7 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     if let Channel::Group { id, recipients, .. } = &channel {
diff --git a/src/routes/channels/group_remove_member.rs b/src/routes/channels/group_remove_member.rs
index 08bd4e3..e12414b 100644
--- a/src/routes/channels/group_remove_member.rs
+++ b/src/routes/channels/group_remove_member.rs
@@ -20,7 +20,7 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> {
     {
         if &user.id != owner {
             // figure out if we want to use perm system here
-            Err(Error::LabelMe)?
+            Err(Error::MissingPermission)?
         }
 
         if recipients.iter().find(|x| *x == &member.id).is_none() {
diff --git a/src/routes/channels/message_delete.rs b/src/routes/channels/message_delete.rs
index 85bdfed..fa794d7 100644
--- a/src/routes/channels/message_delete.rs
+++ b/src/routes/channels/message_delete.rs
@@ -12,7 +12,7 @@ pub async fn req(user: User, target: Ref, msg: Ref) -> Result<()> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let message = msg.fetch_message(&channel).await?;
diff --git a/src/routes/channels/message_edit.rs b/src/routes/channels/message_edit.rs
index dc559c2..15cdc48 100644
--- a/src/routes/channels/message_edit.rs
+++ b/src/routes/channels/message_edit.rs
@@ -24,7 +24,7 @@ pub async fn req(user: User, target: Ref, msg: Ref, edit: Json<Data>) -> Result<
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let message = msg.fetch_message(&channel).await?;
diff --git a/src/routes/channels/message_fetch.rs b/src/routes/channels/message_fetch.rs
index 162e48d..d308c84 100644
--- a/src/routes/channels/message_fetch.rs
+++ b/src/routes/channels/message_fetch.rs
@@ -12,7 +12,7 @@ pub async fn req(user: User, target: Ref, msg: Ref) -> Result<JsonValue> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let message = msg.fetch_message(&channel).await?;
diff --git a/src/routes/channels/message_query.rs b/src/routes/channels/message_query.rs
index c30967f..dadf8b5 100644
--- a/src/routes/channels/message_query.rs
+++ b/src/routes/channels/message_query.rs
@@ -34,7 +34,7 @@ pub async fn req(user: User, target: Ref, options: Form<Options>) -> Result<Json
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let mut query = doc! { "channel": target.id() };
diff --git a/src/routes/channels/message_query_stale.rs b/src/routes/channels/message_query_stale.rs
index 300ae76..2930a42 100644
--- a/src/routes/channels/message_query_stale.rs
+++ b/src/routes/channels/message_query_stale.rs
@@ -14,7 +14,7 @@ pub struct Options {
 #[post("/<target>/messages/stale", data = "<data>")]
 pub async fn req(user: User, target: Ref, data: Json<Options>) -> Result<JsonValue> {
     if data.ids.len() > 150 {
-        return Err(Error::LabelMe);
+        return Err(Error::TooManyIds);
     }
 
     let target = target.fetch_channel().await?;
@@ -24,7 +24,7 @@ pub async fn req(user: User, target: Ref, data: Json<Options>) -> Result<JsonVal
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let mut cursor = get_collection("messages")
diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs
index aaf275e..9f6fb93 100644
--- a/src/routes/channels/message_send.rs
+++ b/src/routes/channels/message_send.rs
@@ -34,7 +34,7 @@ pub async fn req(user: User, target: Ref, message: Json<Data>) -> Result<JsonVal
         .for_channel()
         .await?;
     if !perm.get_send_message() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     if get_collection("messages")
diff --git a/src/routes/users/fetch_user.rs b/src/routes/users/fetch_user.rs
index 9a66071..063ddf3 100644
--- a/src/routes/users/fetch_user.rs
+++ b/src/routes/users/fetch_user.rs
@@ -13,7 +13,7 @@ pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
         .await?;
 
     if !perm.get_access() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     Ok(json!(target.from(&user).with(perm)))
diff --git a/src/routes/users/find_mutual.rs b/src/routes/users/find_mutual.rs
index 7b3f1f6..2a31d4b 100644
--- a/src/routes/users/find_mutual.rs
+++ b/src/routes/users/find_mutual.rs
@@ -12,8 +12,8 @@ pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
         .find(
             doc! {
                 "$and": [
-                    { "relations.id": &user.id },
-                    { "relations.id": &target.id }
+                    { "relations._id": &user.id },
+                    { "relations._id": &target.id }
                 ]
             },
             FindOptions::builder().projection(doc! { "_id": 1 }).build(),
diff --git a/src/util/result.rs b/src/util/result.rs
index e69c48a..0a1e982 100644
--- a/src/util/result.rs
+++ b/src/util/result.rs
@@ -50,6 +50,8 @@ pub enum Error {
     NotInGroup,
 
     // ? General errors.
+    #[snafu(display("Trying to fetch too much data."))]
+    TooManyIds,
     #[snafu(display("Failed to validate fields."))]
     FailedValidation { error: ValidationErrors },
     #[snafu(display("Encountered a database error."))]
@@ -59,6 +61,8 @@ pub enum Error {
     },
     #[snafu(display("Internal server error."))]
     InternalError,
+    #[snafu(display("Missing permission."))]
+    MissingPermission,
     #[snafu(display("Operation cannot be performed on this object."))]
     InvalidOperation,
     #[snafu(display("Already created an object with this nonce."))]
@@ -96,7 +100,9 @@ impl<'r> Responder<'r, 'static> for Error {
             Error::FailedValidation { .. } => Status::UnprocessableEntity,
             Error::DatabaseError { .. } => Status::InternalServerError,
             Error::InternalError => Status::InternalServerError,
+            Error::MissingPermission => Status::Forbidden,
             Error::InvalidOperation => Status::BadRequest,
+            Error::TooManyIds => Status::BadRequest,
             Error::DuplicateNonce => Status::Conflict,
             Error::NoEffect => Status::Ok,
         };
-- 
GitLab