error::LemmyError,
utils::{
slurs::{check_slurs, check_slurs_opt},
- validation::is_valid_body_field,
+ validation::{check_site_visibility_valid, is_valid_body_field},
},
};
use url::Url;
let local_user_view = local_user_view_from_jwt(&data.auth, context).await?;
+ // Make sure user is an admin
+ is_admin(&local_user_view)?;
+
+ check_site_visibility_valid(
+ local_site.private_instance,
+ local_site.federation_enabled,
+ &data.private_instance,
+ &data.federation_enabled,
+ )?;
+
let sidebar = diesel_option_overwrite(&data.sidebar);
let description = diesel_option_overwrite(&data.description);
let icon = diesel_option_overwrite_to_url(&data.icon)?;
check_slurs(&data.name, &slur_regex)?;
check_slurs_opt(&data.description, &slur_regex)?;
- // Make sure user is an admin
- is_admin(&local_user_view)?;
-
if let Some(Some(desc)) = &description {
site_description_length_check(desc)?;
}
use lemmy_db_views::structs::SiteView;
use lemmy_utils::{
error::LemmyError,
- utils::{slurs::check_slurs_opt, validation::is_valid_body_field},
+ utils::{
+ slurs::check_slurs_opt,
+ validation::{check_site_visibility_valid, is_valid_body_field},
+ },
};
#[async_trait::async_trait(?Send)]
// Make sure user is an admin
is_admin(&local_user_view)?;
+ check_site_visibility_valid(
+ local_site.private_instance,
+ local_site.federation_enabled,
+ &data.private_instance,
+ &data.federation_enabled,
+ )?;
+
let slur_regex = local_site_to_slur_regex(&local_site);
check_slurs_opt(&data.name, &slur_regex)?;
}
}
- let enabled_private_instance_with_federation = data.private_instance == Some(true)
- && data
- .federation_enabled
- .unwrap_or(local_site.federation_enabled);
- let enabled_federation_with_private_instance = data.federation_enabled == Some(true)
- && data.private_instance.unwrap_or(local_site.private_instance);
-
- if enabled_private_instance_with_federation || enabled_federation_with_private_instance {
- return Err(LemmyError::from_message(
- "cant_enable_private_instance_and_federation_together",
- ));
- }
-
if let Some(discussion_languages) = data.discussion_languages.clone() {
SiteLanguage::update(context.pool(), discussion_languages.clone(), &site).await?;
}
.map_err(|e| LemmyError::from_error_message(e, "Couldnt generate TOTP"))
}
+pub fn check_site_visibility_valid(
+ current_private_instance: bool,
+ current_federation_enabled: bool,
+ new_private_instance: &Option<bool>,
+ new_federation_enabled: &Option<bool>,
+) -> LemmyResult<()> {
+ let private_instance = new_private_instance.unwrap_or(current_private_instance);
+ let federation_enabled = new_federation_enabled.unwrap_or(current_federation_enabled);
+
+ if private_instance && federation_enabled {
+ return Err(LemmyError::from_message(
+ "cant_enable_private_instance_and_federation_together",
+ ));
+ }
+
+ Ok(())
+}
+
#[cfg(test)]
mod tests {
use super::build_totp_2fa;
use crate::utils::validation::{
+ check_site_visibility_valid,
clean_url_params,
generate_totp_2fa_secret,
is_valid_actor_name,
let totp = build_totp_2fa("lemmy", "my_name", &generated_secret);
assert!(totp.is_ok());
}
+
+ #[test]
+ fn test_check_site_visibility_valid() {
+ assert!(check_site_visibility_valid(true, true, &None, &None).is_err());
+ assert!(check_site_visibility_valid(true, false, &None, &Some(true)).is_err());
+ assert!(check_site_visibility_valid(false, true, &Some(true), &None).is_err());
+ assert!(check_site_visibility_valid(false, false, &Some(true), &Some(true)).is_err());
+ assert!(check_site_visibility_valid(true, false, &None, &None).is_ok());
+ assert!(check_site_visibility_valid(false, true, &None, &None).is_ok());
+ assert!(check_site_visibility_valid(false, false, &Some(true), &None).is_ok());
+ assert!(check_site_visibility_valid(false, false, &None, &Some(true)).is_ok());
+ }
}