From 7008848f9ca9dc2f1c7a235649d298b1b9b462d8 Mon Sep 17 00:00:00 2001
From: Pavel Balashov <ba1ashpash@gmail.com>
Date: Wed, 26 May 2021 16:39:38 +0300
Subject: [PATCH] Add additional slurs configuration option. Closes #1464.
 (#1612)

* Actualize a comment about config initialization

* Add additional slurs functionality.

It is possible to additional regex for slurs filtering.
It can be done through `additional_slurs` option in config file.
---
 config/config.hjson                   |  4 ++++
 crates/utils/src/settings/defaults.rs |  1 +
 crates/utils/src/settings/mod.rs      |  8 ++++----
 crates/utils/src/settings/structs.rs  |  1 +
 crates/utils/src/utils.rs             | 11 ++++++++++-
 5 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/config/config.hjson b/config/config.hjson
index c532428c..3054b7cb 100644
--- a/config/config.hjson
+++ b/config/config.hjson
@@ -90,4 +90,8 @@
 #    # whether or not smtp connections should use tls
 #    use_tls: true
 #  }
+  # additional_slurs:
+  #  '''
+  #  (\bThis\b)|(\bis\b)|(\bsample\b)
+  #  '''
 }
diff --git a/crates/utils/src/settings/defaults.rs b/crates/utils/src/settings/defaults.rs
index 2883536a..2dddd3f3 100644
--- a/crates/utils/src/settings/defaults.rs
+++ b/crates/utils/src/settings/defaults.rs
@@ -17,6 +17,7 @@ impl Default for Settings {
       jwt_secret: Some("changeme".into()),
       pictrs_url: Some("http://pictrs:8080".into()),
       iframely_url: Some("http://iframely".into()),
+      additional_slurs: None,
     }
   }
 }
diff --git a/crates/utils/src/settings/mod.rs b/crates/utils/src/settings/mod.rs
index 406bf7de..8c9f82cc 100644
--- a/crates/utils/src/settings/mod.rs
+++ b/crates/utils/src/settings/mod.rs
@@ -27,10 +27,10 @@ lazy_static! {
 }
 
 impl Settings {
-  /// Reads config from the files and environment.
-  /// First, defaults are loaded from CONFIG_FILE_DEFAULTS, then these values can be overwritten
-  /// from CONFIG_FILE (optional). Finally, values from the environment (with prefix LEMMY) are
-  /// added to the config.
+  /// Reads config from configuration file.
+  /// Then values from the environment (with prefix LEMMY) are added to the config.
+  /// And then default values are merged into config.
+  /// Defaults are controlled by Default trait implemntation for Settings structs.
   ///
   /// Note: The env var `LEMMY_DATABASE_URL` is parsed in
   /// `lemmy_db_queries/src/lib.rs::get_database_url_from_env()`
diff --git a/crates/utils/src/settings/structs.rs b/crates/utils/src/settings/structs.rs
index 7aad404b..1a7a7434 100644
--- a/crates/utils/src/settings/structs.rs
+++ b/crates/utils/src/settings/structs.rs
@@ -17,6 +17,7 @@ pub struct Settings {
   pub(crate) captcha: Option<CaptchaConfig>,
   pub(crate) email: Option<EmailConfig>,
   pub(crate) setup: Option<SetupConfig>,
+  pub(crate) additional_slurs: Option<String>,
 }
 
 #[derive(Debug, Deserialize, Clone)]
diff --git a/crates/utils/src/utils.rs b/crates/utils/src/utils.rs
index aec545cd..31936788 100644
--- a/crates/utils/src/utils.rs
+++ b/crates/utils/src/utils.rs
@@ -7,7 +7,16 @@ use regex::{Regex, RegexBuilder};
 
 lazy_static! {
   static ref EMAIL_REGEX: Regex = Regex::new(r"^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$").expect("compile regex");
-  static ref SLUR_REGEX: Regex = RegexBuilder::new(r"(fag(g|got|tard)?\b|cock\s?sucker(s|ing)?|ni((g{2,}|q)+|[gq]{2,})[e3r]+(s|z)?|mudslime?s?|kikes?|\bspi(c|k)s?\b|\bchinks?|gooks?|bitch(es|ing|y)?|whor(es?|ing)|\btr(a|@)nn?(y|ies?)|\b(b|re|r)tard(ed)?s?)").case_insensitive(true).build().expect("compile regex");
+  static ref SLUR_REGEX: Regex = {
+    let mut slurs = r"(fag(g|got|tard)?\b|cock\s?sucker(s|ing)?|ni((g{2,}|q)+|[gq]{2,})[e3r]+(s|z)?|mudslime?s?|kikes?|\bspi(c|k)s?\b|\bchinks?|gooks?|bitch(es|ing|y)?|whor(es?|ing)|\btr(a|@)nn?(y|ies?)|\b(b|re|r)tard(ed)?s?)".to_string();
+    if let Some(additional_slurs) = Settings::get().additional_slurs {
+        slurs.push('|');
+        slurs.push_str(&additional_slurs);
+    };
+    RegexBuilder::new(&&slurs).case_insensitive(true).build().expect("compile regex")
+  };
+
+
   static ref USERNAME_MATCHES_REGEX: Regex = Regex::new(r"/u/[a-zA-Z][0-9a-zA-Z_]*").expect("compile regex");
   // TODO keep this old one, it didn't work with port well tho
   // static ref MENTIONS_REGEX: Regex = Regex::new(r"@(?P<name>[\w.]+)@(?P<domain>[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)").expect("compile regex");
-- 
2.44.1