From c306730c0bc653acb8775332fbdd816c8b0eaeb0 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 10 Jul 2021 13:30:31 -0400 Subject: [PATCH] use common delete permission check --- .../endpoints/tts/delete_tts_model.rs | 110 +++++++----------- ...ation.rs => delete_role_disambiguation.rs} | 2 +- src/util/mod.rs | 2 +- 3 files changed, 46 insertions(+), 68 deletions(-) rename src/util/{delete_request_role_disambiguation.rs => delete_role_disambiguation.rs} (95%) diff --git a/src/http_server/endpoints/tts/delete_tts_model.rs b/src/http_server/endpoints/tts/delete_tts_model.rs index 5beaf9c408..86e3a0af5f 100644 --- a/src/http_server/endpoints/tts/delete_tts_model.rs +++ b/src/http_server/endpoints/tts/delete_tts_model.rs @@ -16,6 +16,8 @@ use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; use crate::http_server::web_utils::response_success_helpers::simple_json_success; use crate::server_state::ServerState; +use crate::util::delete_role_disambiguation::DeleteRole; +use crate::util::delete_role_disambiguation::delete_role_disambiguation; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; @@ -110,46 +112,54 @@ pub async fn delete_tts_model_handler( Ok(Some(model)) => model, }; - // NB: Second set of permission checks - let is_author = &tts_model.creator_user_token == &user_session.user_token; - - if !is_author && !is_mod { - warn!("user is not allowed to delete model: {}", user_session.user_token); - return Err(DeleteTtsModelError::NotAuthorized); - } - let ip_address = get_request_ip(&http_request); - let as_mod = delete_as_mod(is_mod, is_author, request.as_mod); + // NB: Second set of permission checks + let is_author = &tts_model.creator_user_token == &user_session.user_token; + let delete_role = delete_role_disambiguation(is_mod, is_author, request.as_mod); let query_result = if request.set_delete { - if as_mod { - delete_tts_model_as_mod( - &path.token, - &user_session.user_token, - &server_state.mysql_pool - ).await - } else { - delete_tts_model_as_user( - &path.token, - &ip_address, - &server_state.mysql_pool, - ).await + match delete_role { + DeleteRole::ErrorDoNotDelete => { + warn!("user is not allowed to delete model: {}", user_session.user_token); + return Err(DeleteTtsModelError::NotAuthorized); + } + DeleteRole::AsUser => { + delete_tts_model_as_user( + &path.token, + &ip_address, + &server_state.mysql_pool, + ).await + } + DeleteRole::AsMod => { + delete_tts_model_as_mod( + &path.token, + &user_session.user_token, + &server_state.mysql_pool + ).await + } } } else { - if as_mod { - undelete_tts_model_as_mod( - &path.token, - &user_session.user_token, - &server_state.mysql_pool - ).await - } else { - // NB: Technically only mods can see their own inference_results here - undelete_tts_model_as_user( - &path.token, - &ip_address, - &server_state.mysql_pool - ).await + match delete_role { + DeleteRole::ErrorDoNotDelete => { + warn!("user is not allowed to delete model: {}", user_session.user_token); + return Err(DeleteTtsModelError::NotAuthorized); + } + DeleteRole::AsUser => { + // NB: Technically only mods can see their own inference_results here + undelete_tts_model_as_user( + &path.token, + &ip_address, + &server_state.mysql_pool + ).await + } + DeleteRole::AsMod => { + undelete_tts_model_as_mod( + &path.token, + &user_session.user_token, + &server_state.mysql_pool + ).await + } } }; @@ -163,35 +173,3 @@ pub async fn delete_tts_model_handler( Ok(simple_json_success()) } - -fn delete_as_mod(user_is_mod: bool, user_is_author: bool, as_mod_flag: Option) -> bool { - // NB: Explored this with a truth table. - let as_mod_flag_value = as_mod_flag.unwrap_or(false); - user_is_mod && !(user_is_author && as_mod_flag.is_some() && !as_mod_flag_value) -} - -#[cfg(test)] -mod tests { - use crate::http_server::endpoints::tts::delete_tts_model::delete_as_mod; - - #[test] - fn test_delete_as_mod() { - // Deleted as a user - assert!(!delete_as_mod(false, false, None)); - assert!(!delete_as_mod(false, true, None)); - assert!(!delete_as_mod(false, true, Some(false))); - assert!(!delete_as_mod(false, true, Some(true))); - - // Deleted as a mod - assert!(delete_as_mod(true, false, None)); - assert!(delete_as_mod(true, false, Some(false))); - assert!(delete_as_mod(true, false, Some(true))); - - // Moderator + Author, deleting as a user - assert!(!delete_as_mod(true, true, Some(false))); - - // Moderator + Author, deleting as a mod - assert!(delete_as_mod(true, true, None)); - assert!(delete_as_mod(true, true, Some(true))); - } -} diff --git a/src/util/delete_request_role_disambiguation.rs b/src/util/delete_role_disambiguation.rs similarity index 95% rename from src/util/delete_request_role_disambiguation.rs rename to src/util/delete_role_disambiguation.rs index 0aca876160..7519a71373 100644 --- a/src/util/delete_request_role_disambiguation.rs +++ b/src/util/delete_role_disambiguation.rs @@ -25,7 +25,7 @@ pub fn delete_role_disambiguation( #[cfg(test)] mod tests { - use crate::util::delete_request_role_disambiguation::{delete_role_disambiguation, DeleteRole}; + use crate::util::delete_role_disambiguation::{delete_role_disambiguation, DeleteRole}; #[test] fn test_delete_as_mod() { diff --git a/src/util/mod.rs b/src/util/mod.rs index 9af7627c74..12d47f5db4 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -1,6 +1,6 @@ pub mod anyhow_result; pub mod buckets; -pub mod delete_request_role_disambiguation; +pub mod delete_role_disambiguation; pub mod email_to_gravatar; pub mod encrypted_sort_id; pub mod filesystem;