]> Untitled Git - lemmy.git/commitdiff
Remove update and read site config. Fixes #2306 (#2329)
authorDessalines <dessalines@users.noreply.github.com>
Wed, 22 Jun 2022 20:24:54 +0000 (16:24 -0400)
committerGitHub <noreply@github.com>
Wed, 22 Jun 2022 20:24:54 +0000 (20:24 +0000)
* Remove update and read site config. Fixes #2306

* Removing lazy_static, removing Settings::get()

43 files changed:
crates/api/src/lib.rs
crates/api/src/local_user/ban_person.rs
crates/api/src/local_user/get_captcha.rs
crates/api/src/local_user/reset_password.rs
crates/api/src/local_user/save_settings.rs
crates/api/src/local_user/verify_email.rs
crates/api/src/site/config/mod.rs [deleted file]
crates/api/src/site/config/read.rs [deleted file]
crates/api/src/site/config/update.rs [deleted file]
crates/api/src/site/leave_admin.rs
crates/api/src/site/mod.rs
crates/api/src/site/purge/community.rs
crates/api/src/site/purge/person.rs
crates/api/src/site/purge/post.rs
crates/api/src/site/registration_applications/approve.rs
crates/api_common/src/request.rs
crates/api_common/src/site.rs
crates/api_crud/src/post/create.rs
crates/api_crud/src/post/update.rs
crates/api_crud/src/private_message/create.rs
crates/api_crud/src/site/create.rs
crates/api_crud/src/site/read.rs
crates/api_crud/src/user/create.rs
crates/api_crud/src/user/delete.rs
crates/apub/src/activities/block/block_user.rs
crates/apub/src/activities/deletion/delete_user.rs
crates/apub/src/fetcher/mod.rs
crates/apub/src/http/site.rs
crates/apub/src/lib.rs
crates/apub/src/objects/comment.rs
crates/apub/src/objects/community.rs
crates/apub/src/objects/instance.rs
crates/apub/src/objects/mod.rs
crates/apub/src/objects/person.rs
crates/apub/src/objects/post.rs
crates/apub/src/objects/private_message.rs
crates/apub/src/protocol/objects/group.rs
crates/utils/src/settings/mod.rs
crates/utils/src/test.rs
crates/websocket/src/lib.rs
crates/websocket/src/send.rs
src/api_routes.rs
src/main.rs

index 5083b2867afd67bee14284ef42ed3bcb1a5a3b74..2974103e209def3f0c33b9394664b6027c73cbf4 100644 (file)
@@ -98,12 +98,6 @@ pub async fn match_websocket_operation(
 
     // Site ops
     UserOperation::GetModlog => do_websocket_operation::<GetModlog>(context, id, op, data).await,
-    UserOperation::GetSiteConfig => {
-      do_websocket_operation::<GetSiteConfig>(context, id, op, data).await
-    }
-    UserOperation::SaveSiteConfig => {
-      do_websocket_operation::<SaveSiteConfig>(context, id, op, data).await
-    }
     UserOperation::PurgePerson => {
       do_websocket_operation::<PurgePerson>(context, id, op, data).await
     }
@@ -226,13 +220,13 @@ mod tests {
     traits::Crud,
     utils::establish_unpooled_connection,
   };
-  use lemmy_utils::{claims::Claims, settings::structs::Settings};
+  use lemmy_utils::{claims::Claims, settings::SETTINGS};
 
   #[test]
   fn test_should_not_validate_user_token_after_password_change() {
     let conn = establish_unpooled_connection();
     let secret = Secret::init(&conn).unwrap();
-    let settings = Settings::init().unwrap();
+    let settings = &SETTINGS.to_owned();
 
     let new_person = PersonForm {
       name: "Gerry9812".into(),
index e9900985db8b7a196b72d5e3b92f3e76dae72dc0..cc239cac18b69fe96347da02d5ffd44c341d0981 100644 (file)
@@ -52,7 +52,7 @@ impl Perform for BanPerson {
       remove_user_data(
         person.id,
         context.pool(),
-        &context.settings(),
+        context.settings(),
         context.client(),
       )
       .await?;
index 2740036c7ae660b556e495c9b789edf83a68247d..b63550362a6b58461f18d5adbfbcf9a24a279dab 100644 (file)
@@ -17,7 +17,7 @@ impl Perform for GetCaptcha {
     context: &Data<LemmyContext>,
     _websocket_id: Option<ConnectionId>,
   ) -> Result<Self::Response, LemmyError> {
-    let captcha_settings = context.settings().captcha;
+    let captcha_settings = &context.settings().captcha;
 
     if !captcha_settings.enabled {
       return Ok(GetCaptchaResponse { ok: None });
index 98112b70be137f684d2a26f8c0c9d0e960da1b4b..14071cb6b222d921344fde0a4b3083a0b2631c34 100644 (file)
@@ -29,7 +29,7 @@ impl Perform for PasswordReset {
     .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_that_username_or_email"))?;
 
     // Email the pure token to the user.
-    send_password_reset_email(&local_user_view, context.pool(), &context.settings()).await?;
+    send_password_reset_email(&local_user_view, context.pool(), context.settings()).await?;
     Ok(PasswordResetResponse {})
   }
 }
index eba76907e2627ffb6180a9f78f180e9fe6e8d0d1..ec34321469b985725030ddf7ac856cf562e7ce69 100644 (file)
@@ -48,7 +48,7 @@ impl Perform for SaveUserSettings {
       let previous_email = local_user_view.local_user.email.clone().unwrap_or_default();
       // Only send the verification email if there was an email change
       if previous_email.ne(email) {
-        send_verification_email(&local_user_view, email, context.pool(), &context.settings())
+        send_verification_email(&local_user_view, email, context.pool(), context.settings())
           .await?;
       }
     }
index 7f1797262eec2d6835cdb62b8e6a6e9f7f149f80..63a998915555be0b713b9f197da74afbf107444d 100644 (file)
@@ -49,7 +49,7 @@ impl Perform for VerifyEmail {
     })
     .await??;
 
-    send_email_verification_success(&local_user_view, &context.settings())?;
+    send_email_verification_success(&local_user_view, context.settings())?;
 
     blocking(context.pool(), move |conn| {
       EmailVerification::delete_old_tokens_for_local_user(conn, local_user_id)
diff --git a/crates/api/src/site/config/mod.rs b/crates/api/src/site/config/mod.rs
deleted file mode 100644 (file)
index d538ff2..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-mod read;
-mod update;
diff --git a/crates/api/src/site/config/read.rs b/crates/api/src/site/config/read.rs
deleted file mode 100644 (file)
index 4f82e12..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-use crate::Perform;
-use actix_web::web::Data;
-use lemmy_api_common::{
-  site::{GetSiteConfig, GetSiteConfigResponse},
-  utils::{get_local_user_view_from_jwt, is_admin},
-};
-use lemmy_utils::{error::LemmyError, settings::structs::Settings, ConnectionId};
-use lemmy_websocket::LemmyContext;
-
-#[async_trait::async_trait(?Send)]
-impl Perform for GetSiteConfig {
-  type Response = GetSiteConfigResponse;
-
-  #[tracing::instrument(skip(context, _websocket_id))]
-  async fn perform(
-    &self,
-    context: &Data<LemmyContext>,
-    _websocket_id: Option<ConnectionId>,
-  ) -> Result<GetSiteConfigResponse, LemmyError> {
-    let data: &GetSiteConfig = self;
-    let local_user_view =
-      get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
-
-    // Only let admins read this
-    is_admin(&local_user_view)?;
-
-    let config_hjson = Settings::read_config_file()?;
-
-    Ok(GetSiteConfigResponse { config_hjson })
-  }
-}
diff --git a/crates/api/src/site/config/update.rs b/crates/api/src/site/config/update.rs
deleted file mode 100644 (file)
index 4d4f064..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-use crate::Perform;
-use actix_web::web::Data;
-use lemmy_api_common::{
-  site::{GetSiteConfigResponse, SaveSiteConfig},
-  utils::{get_local_user_view_from_jwt, is_admin},
-};
-use lemmy_utils::{error::LemmyError, settings::structs::Settings, ConnectionId};
-use lemmy_websocket::LemmyContext;
-
-#[async_trait::async_trait(?Send)]
-impl Perform for SaveSiteConfig {
-  type Response = GetSiteConfigResponse;
-
-  #[tracing::instrument(skip(context, _websocket_id))]
-  async fn perform(
-    &self,
-    context: &Data<LemmyContext>,
-    _websocket_id: Option<ConnectionId>,
-  ) -> Result<GetSiteConfigResponse, LemmyError> {
-    let data: &SaveSiteConfig = self;
-    let local_user_view =
-      get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
-
-    // Only let admins read this
-    is_admin(&local_user_view)?;
-
-    // Make sure docker doesn't have :ro at the end of the volume, so its not a read-only filesystem
-    let config_hjson = Settings::save_config_file(&data.config_hjson)
-      .map_err(|e| e.with_message("couldnt_update_site"))?;
-
-    Ok(GetSiteConfigResponse { config_hjson })
-  }
-}
index 55b49fc7d0754f2b897f944b9ee2336a4445665e..19cca5ccc60a5abad351c6e33a6eab53ef090e50 100644 (file)
@@ -57,8 +57,7 @@ impl Perform for LeaveAdmin {
     let site_view = blocking(context.pool(), SiteView::read_local).await??;
     let admins = blocking(context.pool(), PersonViewSafe::admins).await??;
 
-    let federated_instances =
-      build_federated_instances(context.pool(), &context.settings()).await?;
+    let federated_instances = build_federated_instances(context.pool(), context.settings()).await?;
 
     Ok(GetSiteResponse {
       site_view: Some(site_view),
index 1c860cb4a7bfbd6caff5b756f816d6b0cecd8f69..531c0508590d4f3ca7c20c1a374c4b82dda527a1 100644 (file)
@@ -1,4 +1,3 @@
-mod config;
 mod leave_admin;
 mod mod_log;
 mod purge;
index 9acb2a824fad79dbb113e882c8b5acc918c4fb10..5f1e38881784b40dc884162d12638f1c2a543cde 100644 (file)
@@ -41,13 +41,13 @@ impl Perform for PurgeCommunity {
     .await??;
 
     if let Some(banner) = community.banner {
-      purge_image_from_pictrs(context.client(), &context.settings(), &banner)
+      purge_image_from_pictrs(context.client(), context.settings(), &banner)
         .await
         .ok();
     }
 
     if let Some(icon) = community.icon {
-      purge_image_from_pictrs(context.client(), &context.settings(), &icon)
+      purge_image_from_pictrs(context.client(), context.settings(), &icon)
         .await
         .ok();
     }
@@ -55,7 +55,7 @@ impl Perform for PurgeCommunity {
     purge_image_posts_for_community(
       community_id,
       context.pool(),
-      &context.settings(),
+      context.settings(),
       context.client(),
     )
     .await?;
index fe8758582b5ea34d746529e2352def815bd7c8f2..350b9a478072c16ff253b37a2c22a9770bd91ec2 100644 (file)
@@ -37,13 +37,13 @@ impl Perform for PurgePerson {
     let person = blocking(context.pool(), move |conn| Person::read(conn, person_id)).await??;
 
     if let Some(banner) = person.banner {
-      purge_image_from_pictrs(context.client(), &context.settings(), &banner)
+      purge_image_from_pictrs(context.client(), context.settings(), &banner)
         .await
         .ok();
     }
 
     if let Some(avatar) = person.avatar {
-      purge_image_from_pictrs(context.client(), &context.settings(), &avatar)
+      purge_image_from_pictrs(context.client(), context.settings(), &avatar)
         .await
         .ok();
     }
@@ -51,7 +51,7 @@ impl Perform for PurgePerson {
     purge_image_posts_for_person(
       person_id,
       context.pool(),
-      &context.settings(),
+      context.settings(),
       context.client(),
     )
     .await?;
index 990800838eadffbf8eee0269b42f96de5679ceb5..b7e13ade358ca035395347e35fd1a79109cef658 100644 (file)
@@ -39,13 +39,13 @@ impl Perform for PurgePost {
 
     // Purge image
     if let Some(url) = post.url {
-      purge_image_from_pictrs(context.client(), &context.settings(), &url)
+      purge_image_from_pictrs(context.client(), context.settings(), &url)
         .await
         .ok();
     }
     // Purge thumbnail
     if let Some(thumbnail_url) = post.thumbnail_url {
-      purge_image_from_pictrs(context.client(), &context.settings(), &thumbnail_url)
+      purge_image_from_pictrs(context.client(), context.settings(), &thumbnail_url)
         .await
         .ok();
     }
index 04000b63ad2066a4c5e32ba70409dc05bbc2ef8a..5ebf812d98a33cd78ee399029dee24b261280c16 100644 (file)
@@ -66,7 +66,7 @@ impl Perform for ApproveRegistrationApplication {
       .await??;
 
       if approved_local_user_view.local_user.email.is_some() {
-        send_application_approved_email(&approved_local_user_view, &context.settings())?;
+        send_application_approved_email(&approved_local_user_view, context.settings())?;
       }
     }
 
index 37bb39a0c0c41815c9029bbc548b2a5939821440..1bc81861e1538d63563a2746a723378356742bfe 100644 (file)
@@ -262,15 +262,15 @@ pub fn build_user_agent(settings: &Settings) -> String {
 #[cfg(test)]
 mod tests {
   use crate::request::{build_user_agent, fetch_site_metadata, SiteMetadata};
-  use lemmy_utils::settings::structs::Settings;
+  use lemmy_utils::settings::SETTINGS;
   use url::Url;
 
   // These helped with testing
   #[actix_rt::test]
   async fn test_site_metadata() {
-    let settings = Settings::init().unwrap();
+    let settings = &SETTINGS.to_owned();
     let client = reqwest::Client::builder()
-      .user_agent(build_user_agent(&settings))
+      .user_agent(build_user_agent(settings))
       .build()
       .unwrap()
       .into();
index f61d34055570584a941844ae7f77d82805116a2d..8a0e16a941a9e184c4b9e89174e70889c6868496 100644 (file)
@@ -179,22 +179,6 @@ pub struct LeaveAdmin {
   pub auth: Sensitive<String>,
 }
 
-#[derive(Debug, Serialize, Deserialize, Clone)]
-pub struct GetSiteConfig {
-  pub auth: Sensitive<String>,
-}
-
-#[derive(Debug, Serialize, Deserialize, Clone)]
-pub struct GetSiteConfigResponse {
-  pub config_hjson: String,
-}
-
-#[derive(Debug, Serialize, Deserialize, Clone)]
-pub struct SaveSiteConfig {
-  pub config_hjson: String,
-  pub auth: Sensitive<String>,
-}
-
 #[derive(Debug, Serialize, Deserialize, Clone)]
 pub struct FederatedInstances {
   pub linked: Vec<String>,
index 9151e3ba1c636fd4fc87e903288b40100028b0c1..191951ed26ae3be013b78e197c0920aa7e3f335f 100644 (file)
@@ -87,7 +87,7 @@ impl PerformCrud for CreatePost {
     // Fetch post links and pictrs cached image
     let data_url = data.url.as_ref();
     let (metadata_res, thumbnail_url) =
-      fetch_site_data(context.client(), &context.settings(), data_url).await;
+      fetch_site_data(context.client(), context.settings(), data_url).await;
     let (embed_title, embed_description, embed_video_url) = metadata_res
       .map(|u| (u.title, u.description, u.embed_video_url))
       .unwrap_or_default();
index 3f3e0c2a0537fe97a60ec95c4a65c043bbbf977e..ac4910cd81adaad50ab4f7ca75ff326c74e0ccc2 100644 (file)
@@ -70,7 +70,7 @@ impl PerformCrud for EditPost {
     // Fetch post links and Pictrs cached image
     let data_url = data.url.as_ref();
     let (metadata_res, thumbnail_url) =
-      fetch_site_data(context.client(), &context.settings(), data_url).await;
+      fetch_site_data(context.client(), context.settings(), data_url).await;
     let (embed_title, embed_description, embed_video_url) = metadata_res
       .map(|u| (u.title, u.description, u.embed_video_url))
       .unwrap_or_default();
index a368e3a5387a35a4168cf61d84fc2966a9d2f12b..979c575ded9f0b09cb15e1a0071ee24c7db73d90 100644 (file)
@@ -119,7 +119,7 @@ impl PerformCrud for CreatePrivateMessage {
           &content_slurs_removed,
           &local_recipient.person.name,
         ),
-        &context.settings(),
+        context.settings(),
       );
     }
 
index 57301e1081beb2699edcb00f0243da8d2619da5e..05a8c202e75b1aff480d93e0fcc61c1663c6bd41 100644 (file)
@@ -15,7 +15,6 @@ use lemmy_db_schema::{
 use lemmy_db_views::structs::SiteView;
 use lemmy_utils::{
   error::LemmyError,
-  settings::structs::Settings,
   utils::{check_slurs, check_slurs_opt},
   ConnectionId,
 };
@@ -57,7 +56,7 @@ impl PerformCrud for CreateSite {
       site_description_length_check(desc)?;
     }
 
-    let actor_id: DbUrl = Url::parse(&Settings::get().get_protocol_and_hostname())?.into();
+    let actor_id: DbUrl = Url::parse(&context.settings().get_protocol_and_hostname())?.into();
     let inbox_url = Some(generate_site_inbox_url(&actor_id)?);
     let keypair = generate_actor_keypair()?;
     let site_form = SiteForm {
index 1ef84a91f898ace88861031beac206b62379fb94..d34be2cad17e2a2bc8d36239a771057ab489b7da 100644 (file)
@@ -120,8 +120,7 @@ impl PerformCrud for GetSite {
       None
     };
 
-    let federated_instances =
-      build_federated_instances(context.pool(), &context.settings()).await?;
+    let federated_instances = build_federated_instances(context.pool(), context.settings()).await?;
 
     Ok(GetSiteResponse {
       site_view,
index ee26509b1a3506c349ff8611aaa0d18fa08efb40..edb048928f5ea80ed13d8529943e183a33097780 100644 (file)
@@ -211,13 +211,8 @@ impl PerformCrud for Register {
           .email
           .clone()
           .expect("email was provided");
-        send_verification_email(
-          &local_user_view,
-          &email,
-          context.pool(),
-          &context.settings(),
-        )
-        .await?;
+        send_verification_email(&local_user_view, &email, context.pool(), context.settings())
+          .await?;
         login_response.verify_email_sent = true;
       }
 
index 7273d990a3708e3812e9e635f67b114e483fb845..5947476737f23739f0da9728c9c003c23433ba26 100644 (file)
@@ -36,7 +36,7 @@ impl PerformCrud for DeleteAccount {
     delete_user_account(
       local_user_view.person.id,
       context.pool(),
-      &context.settings(),
+      context.settings(),
       context.client(),
     )
     .await?;
index 32feea60417cfc12accf2887d2a77fc056576959..a18002f1fe4c6e849b06bffacba2e263341428bf 100644 (file)
@@ -37,7 +37,7 @@ use lemmy_db_schema::{
   },
   traits::{Bannable, Crud, Followable},
 };
-use lemmy_utils::{error::LemmyError, settings::structs::Settings, utils::convert_datetime};
+use lemmy_utils::{error::LemmyError, utils::convert_datetime};
 use lemmy_websocket::LemmyContext;
 use url::Url;
 
@@ -131,7 +131,7 @@ impl ActivityHandler for BlockUser {
     {
       SiteOrCommunity::Site(site) => {
         let domain = self.object.inner().domain().expect("url needs domain");
-        if Settings::get().hostname == domain {
+        if context.settings().hostname == domain {
           return Err(
             anyhow!("Site bans from remote instance can't affect user's home instance").into(),
           );
@@ -184,7 +184,7 @@ impl ActivityHandler for BlockUser {
           remove_user_data(
             blocked_person.id,
             context.pool(),
-            &context.settings(),
+            context.settings(),
             context.client(),
           )
           .await?;
index 0e342bd17de174e594ff61c639ff56fbbac052d6..9570d85d2199e36d495ece4f0fd53f390553fba7 100644 (file)
@@ -54,7 +54,7 @@ impl ActivityHandler for DeleteUser {
     delete_user_account(
       actor.id,
       context.pool(),
-      &context.settings(),
+      context.settings(),
       context.client(),
     )
     .await?;
index 274c31d4453447d2951700e1480dcacbdbcb4dfc..072cf7dc7ea370c3dbbc3b183a069bc2401be2b2 100644 (file)
@@ -3,7 +3,7 @@ use activitypub_federation::traits::ApubObject;
 use itertools::Itertools;
 use lemmy_api_common::utils::blocking;
 use lemmy_db_schema::traits::ApubActor;
-use lemmy_utils::{error::LemmyError, settings::structs::Settings};
+use lemmy_utils::error::LemmyError;
 use lemmy_websocket::LemmyContext;
 
 pub mod post_or_comment;
@@ -35,7 +35,7 @@ where
       .collect_tuple()
       .expect("invalid query");
     let name = name.to_string();
-    let domain = format!("{}://{}", Settings::get().get_protocol_string(), domain);
+    let domain = format!("{}://{}", context.settings().get_protocol_string(), domain);
     let actor = blocking(context.pool(), move |conn| {
       DbActor::read_from_name_and_domain(conn, &name, &domain)
     })
index 3d8327387830bd7cb0a9679d8c0a281cd6a149f5..1fa66215229d029b45f579f5633f30f8012a3bad 100644 (file)
@@ -8,7 +8,7 @@ use activitypub_federation::{deser::context::WithContext, traits::ApubObject};
 use actix_web::{web, HttpRequest, HttpResponse};
 use lemmy_api_common::utils::blocking;
 use lemmy_db_schema::source::site::Site;
-use lemmy_utils::{error::LemmyError, settings::structs::Settings};
+use lemmy_utils::error::LemmyError;
 use lemmy_websocket::LemmyContext;
 use url::Url;
 
@@ -24,10 +24,12 @@ pub(crate) async fn get_apub_site_http(
 }
 
 #[tracing::instrument(skip_all)]
-pub(crate) async fn get_apub_site_outbox() -> Result<HttpResponse, LemmyError> {
+pub(crate) async fn get_apub_site_outbox(
+  context: web::Data<LemmyContext>,
+) -> Result<HttpResponse, LemmyError> {
   let outbox_id = format!(
     "{}/site_outbox",
-    Settings::get().get_protocol_and_hostname()
+    context.settings().get_protocol_and_hostname()
   );
   let outbox = EmptyOutbox::new(Url::parse(&outbox_id)?).await?;
   Ok(create_apub_response(&outbox))
index 2f014e0dd1730dfa180a68a2a685f823aaca2e3a..64cfa0f831def669b2b8764bc913fa83ca17d301 100644 (file)
@@ -8,7 +8,11 @@ use activitypub_federation::{
 use anyhow::Context;
 use lemmy_api_common::utils::blocking;
 use lemmy_db_schema::{newtypes::DbUrl, source::activity::Activity, utils::DbPool};
-use lemmy_utils::{error::LemmyError, location_info, settings::structs::Settings};
+use lemmy_utils::{
+  error::LemmyError,
+  location_info,
+  settings::{structs::Settings, SETTINGS},
+};
 use lemmy_websocket::LemmyContext;
 use once_cell::sync::{Lazy, OnceCell};
 use url::{ParseError, Url};
@@ -34,11 +38,13 @@ fn local_instance(context: &LemmyContext) -> &'static LocalInstance {
       .http_fetch_retry_limit(context.settings().federation.http_fetch_retry_limit)
       .worker_count(context.settings().federation.worker_count)
       .debug(context.settings().federation.debug)
-      .verify_url_function(|url| check_apub_id_valid(url, &Settings::get()))
+      // TODO No idea why, but you can't pass context.settings() to the verify_url_function closure
+      // without the value getting captured.
+      .verify_url_function(|url| check_apub_id_valid(url, &SETTINGS.to_owned()))
       .build()
       .expect("configure federation");
     LocalInstance::new(
-      context.settings().hostname,
+      context.settings().hostname.to_owned(),
       context.client().clone(),
       settings,
     )
index f898c3657bd435b937c21487245cc23fb68c16cd..8885fe3bbc71ce4607881dcce8a2f0d4c06f91f6 100644 (file)
@@ -142,8 +142,8 @@ impl ApubObject for ApubComment {
       Community::read(conn, community_id)
     })
     .await??;
-    check_apub_id_valid_with_strictness(note.id.inner(), community.local, &context.settings())?;
-    verify_is_remote_object(note.id.inner())?;
+    check_apub_id_valid_with_strictness(note.id.inner(), community.local, context.settings())?;
+    verify_is_remote_object(note.id.inner(), context.settings())?;
     verify_person_in_community(
       &note.attributed_to,
       &community.into(),
index ad75d37c5a49224b375fa7c37327be20bba6c09a..6e2f409a6b839e347136b7be715858462e1b7ae1 100644 (file)
@@ -206,9 +206,7 @@ impl ApubCommunity {
       .unique()
       .filter(|inbox: &Url| inbox.host_str() != Some(&context.settings().hostname))
       // Don't send to blocked instances
-      .filter(|inbox| {
-        check_apub_id_valid_with_strictness(inbox, false, &context.settings()).is_ok()
-      })
+      .filter(|inbox| check_apub_id_valid_with_strictness(inbox, false, context.settings()).is_ok())
       .collect();
 
     Ok(inboxes)
index 1ae5e735c774cd2af1ae946cc334dd6a06bd24b2..5e80422193c862edffa92dbcb683e5b86fa963c3 100644 (file)
@@ -103,7 +103,7 @@ impl ApubObject for ApubSite {
     data: &Self::DataType,
     _request_counter: &mut i32,
   ) -> Result<(), LemmyError> {
-    check_apub_id_valid_with_strictness(apub.id.inner(), true, &data.settings())?;
+    check_apub_id_valid_with_strictness(apub.id.inner(), true, data.settings())?;
     verify_domains_match(expected_domain, apub.id.inner())?;
 
     let slur_regex = &data.settings().slur_regex();
index 3b7aab2cb635bae9e25877cecf98924986f4e0b8..7293fc3645121865a60b432e338d73fe49ee3885 100644 (file)
@@ -43,8 +43,8 @@ pub(crate) fn read_from_string_or_source_opt(
 /// wrapped in Announce. If we simply receive this like any other federated object, overwrite the
 /// existing, local Post. In particular, it will set the field local = false, so that the object
 /// can't be fetched from the Activitypub HTTP endpoint anymore (which only serves local objects).
-pub(crate) fn verify_is_remote_object(id: &Url) -> Result<(), LemmyError> {
-  let local_domain = Settings::get().get_hostname_without_port()?;
+pub(crate) fn verify_is_remote_object(id: &Url, settings: &Settings) -> Result<(), LemmyError> {
+  let local_domain = settings.get_hostname_without_port()?;
   if id.domain() == Some(&local_domain) {
     Err(anyhow!("cant accept local object from remote instance").into())
   } else {
@@ -68,7 +68,7 @@ pub(crate) mod tests {
   use lemmy_utils::{
     error::LemmyError,
     rate_limit::{rate_limiter::RateLimiter, RateLimit},
-    settings::structs::Settings,
+    settings::SETTINGS,
   };
   use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
   use parking_lot::Mutex;
@@ -96,7 +96,7 @@ pub(crate) mod tests {
   pub(crate) fn init_context() -> LemmyContext {
     // call this to run migrations
     establish_unpooled_connection();
-    let settings = Settings::init().unwrap();
+    let settings = SETTINGS.to_owned();
     let rate_limiter = RateLimit {
       rate_limiter: Arc::new(Mutex::new(RateLimiter::default())),
       rate_limit_config: settings.rate_limit.to_owned().unwrap_or_default(),
index d7e346aa54ffc944f8245e270cf0a3ea5764dcf6..5d47fbc04e0bf19ef982a0d37d105f26385bdd7f 100644 (file)
@@ -120,7 +120,7 @@ impl ApubObject for ApubPerson {
     _request_counter: &mut i32,
   ) -> Result<(), LemmyError> {
     verify_domains_match(person.id.inner(), expected_domain)?;
-    check_apub_id_valid_with_strictness(person.id.inner(), false, &context.settings())?;
+    check_apub_id_valid_with_strictness(person.id.inner(), false, context.settings())?;
 
     let slur_regex = &context.settings().slur_regex();
     check_slurs(&person.preferred_username, slur_regex)?;
index 24424b9fefceca5ede5a6392c54ebccbb87cc0b6..08219872551903134960622acf0157db6ec2007f 100644 (file)
@@ -19,6 +19,7 @@ use activitystreams_kinds::public;
 use chrono::NaiveDateTime;
 use lemmy_api_common::{request::fetch_site_data, utils::blocking};
 use lemmy_db_schema::{
+  self,
   source::{
     community::Community,
     moderator::{ModLockPost, ModLockPostForm, ModStickyPost, ModStickyPostForm},
@@ -26,7 +27,6 @@ use lemmy_db_schema::{
     post::{Post, PostForm},
   },
   traits::Crud,
-  {self},
 };
 use lemmy_utils::{
   error::LemmyError,
@@ -132,11 +132,11 @@ impl ApubObject for ApubPost {
     // instance from the post author.
     if !page.is_mod_action(context).await? {
       verify_domains_match(page.id.inner(), expected_domain)?;
-      verify_is_remote_object(page.id.inner())?;
+      verify_is_remote_object(page.id.inner(), context.settings())?;
     };
 
     let community = page.extract_community(context, request_counter).await?;
-    check_apub_id_valid_with_strictness(page.id.inner(), community.local, &context.settings())?;
+    check_apub_id_valid_with_strictness(page.id.inner(), community.local, context.settings())?;
     verify_person_in_community(&page.creator()?, &community, context, request_counter).await?;
     check_slurs(&page.name, &context.settings().slur_regex())?;
     verify_domains_match(page.creator()?.inner(), page.id.inner())?;
@@ -168,7 +168,7 @@ impl ApubObject for ApubPost {
         page.url
       };
       let (metadata_res, thumbnail_url) = if let Some(url) = &url {
-        fetch_site_data(context.client(), &context.settings(), Some(url)).await
+        fetch_site_data(context.client(), context.settings(), Some(url)).await
       } else {
         (None, page.image.map(|i| i.url.into()))
       };
index aab069e8b869563baa54d4c0d311eb79e336ec21..fd3f5135cd17cfc2892366b37a4b17662acb9962 100644 (file)
@@ -24,7 +24,6 @@ use lemmy_db_schema::{
 };
 use lemmy_utils::{
   error::LemmyError,
-  settings::structs::Settings,
   utils::{convert_datetime, markdown_to_html},
 };
 use lemmy_websocket::LemmyContext;
@@ -109,7 +108,7 @@ impl ApubObject for ApubPrivateMessage {
   ) -> Result<(), LemmyError> {
     verify_domains_match(note.id.inner(), expected_domain)?;
     verify_domains_match(note.attributed_to.inner(), note.id.inner())?;
-    check_apub_id_valid_with_strictness(note.id.inner(), false, &Settings::get())?;
+    check_apub_id_valid_with_strictness(note.id.inner(), false, context.settings())?;
     let person = note
       .attributed_to
       .dereference(context, local_instance(context), request_counter)
index ba01e12d56946f55e10d6831a642bee25c24fcd6..40409f641cb0cf22ac3ccdadb5c50cdc6502bffb 100644 (file)
@@ -63,7 +63,7 @@ impl Group {
     expected_domain: &Url,
     context: &LemmyContext,
   ) -> Result<(), LemmyError> {
-    check_apub_id_valid_with_strictness(self.id.inner(), true, &context.settings())?;
+    check_apub_id_valid_with_strictness(self.id.inner(), true, context.settings())?;
     verify_domains_match(expected_domain, self.id.inner())?;
 
     let slur_regex = &context.settings().slur_regex();
index 513f7dedaab7828f2d89a9e50b658f436b92b677..f095baf12740aff111795ed1f03c9817d48712a1 100644 (file)
@@ -7,18 +7,18 @@ use anyhow::{anyhow, Context};
 use deser_hjson::from_str;
 use once_cell::sync::Lazy;
 use regex::{Regex, RegexBuilder};
-use std::{env, fs, io::Error, sync::RwLock};
+use std::{env, fs, io::Error};
 
 pub mod structs;
 
 static DEFAULT_CONFIG_FILE: &str = "config/config.hjson";
 
-static SETTINGS: Lazy<RwLock<Settings>> =
-  Lazy::new(|| RwLock::new(Settings::init().expect("Failed to load settings file")));
+pub static SETTINGS: Lazy<Settings> =
+  Lazy::new(|| Settings::init().expect("Failed to load settings file"));
 static WEBFINGER_REGEX: Lazy<Regex> = Lazy::new(|| {
   Regex::new(&format!(
     "^acct:([a-zA-Z0-9_]{{3,}})@{}$",
-    Settings::get().hostname
+    SETTINGS.hostname
   ))
   .expect("compile webfinger regex")
 });
@@ -29,7 +29,7 @@ impl Settings {
   /// Note: The env var `LEMMY_DATABASE_URL` is parsed in
   /// `lemmy_db_schema/src/lib.rs::get_database_url_from_env()`
   /// Warning: Only call this once.
-  pub fn init() -> Result<Self, LemmyError> {
+  pub(crate) fn init() -> Result<Self, LemmyError> {
     // Read the config file
     let config = from_str::<Settings>(&Self::read_config_file()?)?;
 
@@ -40,11 +40,6 @@ impl Settings {
     Ok(config)
   }
 
-  /// Returns the config as a struct.
-  pub fn get() -> Self {
-    SETTINGS.read().expect("read config").to_owned()
-  }
-
   pub fn get_database_url(&self) -> String {
     let conf = &self.database;
     format!(
@@ -91,23 +86,6 @@ impl Settings {
     )
   }
 
-  pub fn save_config_file(data: &str) -> Result<String, LemmyError> {
-    // check that the config is valid
-    from_str::<Settings>(data)?;
-
-    fs::write(Settings::get_config_location(), data)?;
-
-    // Reload the new settings
-    // From https://stackoverflow.com/questions/29654927/how-do-i-assign-a-string-to-a-mutable-static-variable/47181804#47181804
-    let mut new_settings = SETTINGS.write().expect("write config");
-    *new_settings = match Settings::init() {
-      Ok(c) => c,
-      Err(e) => panic!("{}", e),
-    };
-
-    Ok(Self::read_config_file()?)
-  }
-
   pub fn webfinger_regex(&self) -> Regex {
     WEBFINGER_REGEX.to_owned()
   }
index a59d04129fbea89ca2e590123b9060069ee08300..e887bae4f4c3d4ff78252985877fef2a10875ed3 100644 (file)
@@ -1,5 +1,5 @@
 use crate::{
-  settings::structs::Settings,
+  settings::SETTINGS,
   utils::{
     is_valid_actor_name,
     is_valid_display_name,
@@ -24,7 +24,7 @@ fn test_mentions_regex() {
 
 #[test]
 fn test_valid_actor_name() {
-  let actor_name_max_length = Settings::init().unwrap().actor_name_max_length;
+  let actor_name_max_length = SETTINGS.actor_name_max_length;
   assert!(is_valid_actor_name("Hello_98", actor_name_max_length));
   assert!(is_valid_actor_name("ten", actor_name_max_length));
   assert!(!is_valid_actor_name("Hello-98", actor_name_max_length));
@@ -34,7 +34,7 @@ fn test_valid_actor_name() {
 
 #[test]
 fn test_valid_display_name() {
-  let actor_name_max_length = Settings::init().unwrap().actor_name_max_length;
+  let actor_name_max_length = SETTINGS.actor_name_max_length;
   assert!(is_valid_display_name("hello @there", actor_name_max_length));
   assert!(!is_valid_display_name(
     "@hello there",
@@ -65,7 +65,7 @@ fn test_valid_matrix_id() {
 
 #[test]
 fn test_slur_filter() {
-  let slur_regex = Settings::init().unwrap().slur_regex();
+  let slur_regex = SETTINGS.slur_regex();
   let test =
       "faggot test kike tranny cocksucker retardeds. Capitalized Niggerz. This is a bunch of other safe text.";
   let slur_free = "No slurs here";
index bac223b627a440561bb4d867f884a26e22163ce5..9aff6b7f48396f9e5a7e198fa7d9594c50a089e7 100644 (file)
@@ -4,7 +4,10 @@ extern crate strum_macros;
 use crate::chat_server::ChatServer;
 use actix::Addr;
 use lemmy_db_schema::{source::secret::Secret, utils::DbPool};
-use lemmy_utils::{error::LemmyError, settings::structs::Settings};
+use lemmy_utils::{
+  error::LemmyError,
+  settings::{structs::Settings, SETTINGS},
+};
 use reqwest_middleware::ClientWithMiddleware;
 use serde::Serialize;
 
@@ -47,9 +50,8 @@ impl LemmyContext {
   pub fn client(&self) -> &ClientWithMiddleware {
     &self.client
   }
-  pub fn settings(&self) -> Settings {
-    // TODO hacky solution to be able to hotload the settings.
-    Settings::get()
+  pub fn settings(&self) -> &'static Settings {
+    &SETTINGS
   }
   pub fn secret(&self) -> &Secret {
     &self.secret
@@ -133,8 +135,6 @@ pub enum UserOperation {
   PasswordChange,
   MarkPrivateMessageAsRead,
   UserJoin,
-  GetSiteConfig,
-  SaveSiteConfig,
   PostJoin,
   CommunityJoin,
   ModJoin,
index 7c6820c9a4109699b4eba4d640a0c9de116bc364..fbc88962aa16c1d1cbb8695e76e4411c987e817b 100644 (file)
@@ -217,7 +217,7 @@ pub async fn send_local_notifs(
           &mention_user_view,
           &lang.notification_mentioned_by_subject(&person.name),
           &lang.notification_mentioned_by_body(&comment.content, &inbox_link, &person.name),
-          &context.settings(),
+          context.settings(),
         )
       }
     }
@@ -252,7 +252,7 @@ pub async fn send_local_notifs(
                 &parent_user_view,
                 &lang.notification_comment_reply_subject(&person.name),
                 &lang.notification_comment_reply_body(&comment.content, &inbox_link, &person.name),
-                &context.settings(),
+                context.settings(),
               )
             }
           }
@@ -282,7 +282,7 @@ pub async fn send_local_notifs(
               &parent_user_view,
               &lang.notification_post_reply_subject(&person.name),
               &lang.notification_post_reply_body(&comment.content, &inbox_link, &person.name),
-              &context.settings(),
+              context.settings(),
             )
           }
         }
index c9ff8803c7c7a19aa40e390846b5c217ec901d4f..36562c88c2daaf8cf07b89b0ea271386f536eddf 100644 (file)
@@ -18,9 +18,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
           .route("", web::get().to(route_get_crud::<GetSite>))
           // Admin Actions
           .route("", web::post().to(route_post_crud::<CreateSite>))
-          .route("", web::put().to(route_post_crud::<EditSite>))
-          .route("/config", web::get().to(route_get::<GetSiteConfig>))
-          .route("/config", web::put().to(route_post::<SaveSiteConfig>)),
+          .route("", web::put().to(route_post_crud::<EditSite>)),
       )
       .service(
         web::resource("/modlog")
index 3fbd0c6564d5f2adda40fb1bf16d108b05121f8e..3fc3bbc455f383e50e4927ee8dc029b77f393064 100644 (file)
@@ -26,7 +26,7 @@ use lemmy_server::{
 use lemmy_utils::{
   error::LemmyError,
   rate_limit::{rate_limiter::RateLimiter, RateLimit},
-  settings::structs::Settings,
+  settings::{structs::Settings, SETTINGS},
 };
 use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
 use parking_lot::Mutex;
@@ -54,7 +54,7 @@ async fn main() -> Result<(), LemmyError> {
     return Ok(());
   }
 
-  let settings = Settings::init().expect("Couldn't initialize settings.");
+  let settings = SETTINGS.to_owned();
 
   init_logging(settings.opentelemetry_url.as_deref())?;