tls_enabled: true
# Address where pictrs is available (for image hosting)
pictrs_url: "http:#localhost:8080"
- # Regex for slurs which are prohibited. Example: `(\bThis\b)|(\bis\b)|(\bsample\b)`
- additional_slurs: "string"
+ slur_filter: "(\bThis\b)|(\bis\b)|(\bsample\b)"
# Maximum length of local community and user names
actor_name_max_length: 20
}
WEBFINGER_USER_REGEX.to_owned()
}
- pub fn slur_regex(&self) -> 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) = &self.additional_slurs {
- slurs.push('|');
- slurs.push_str(additional_slurs);
- };
- RegexBuilder::new(&slurs)
- .case_insensitive(true)
- .build()
- .expect("compile regex")
+ pub fn slur_regex(&self) -> Option<Regex> {
+ self.slur_filter.as_ref().map(|slurs| {
+ RegexBuilder::new(slurs)
+ .case_insensitive(true)
+ .build()
+ .expect("compile regex")
+ })
}
}
#[default(None)]
#[doku(example = "http://localhost:8080")]
pub pictrs_url: Option<String>,
- /// Regex for slurs which are prohibited. Example: `(\bThis\b)|(\bis\b)|(\bsample\b)`
#[default(None)]
- pub additional_slurs: Option<String>,
+ #[doku(example = "(\\bThis\\b)|(\\bis\\b)|(\\bsample\\b)")]
+ pub slur_filter: Option<String>,
/// Maximum length of local community and user names
#[default(20)]
pub actor_name_max_length: usize,
DateTime::<FixedOffset>::from_utc(datetime, FixedOffset::east(0))
}
-pub fn remove_slurs(test: &str, slur_regex: &Regex) -> String {
- slur_regex.replace_all(test, "*removed*").to_string()
+pub fn remove_slurs(test: &str, slur_regex: &Option<Regex>) -> String {
+ if let Some(slur_regex) = slur_regex {
+ slur_regex.replace_all(test, "*removed*").to_string()
+ } else {
+ test.to_string()
+ }
}
-pub(crate) fn slur_check<'a>(test: &'a str, slur_regex: &'a Regex) -> Result<(), Vec<&'a str>> {
- let mut matches: Vec<&str> = slur_regex.find_iter(test).map(|mat| mat.as_str()).collect();
+pub(crate) fn slur_check<'a>(
+ test: &'a str,
+ slur_regex: &'a Option<Regex>,
+) -> Result<(), Vec<&'a str>> {
+ if let Some(slur_regex) = slur_regex {
+ let mut matches: Vec<&str> = slur_regex.find_iter(test).map(|mat| mat.as_str()).collect();
- // Unique
- matches.sort_unstable();
- matches.dedup();
+ // Unique
+ matches.sort_unstable();
+ matches.dedup();
- if matches.is_empty() {
- Ok(())
+ if matches.is_empty() {
+ Ok(())
+ } else {
+ Err(matches)
+ }
} else {
- Err(matches)
+ Ok(())
}
}
-pub fn check_slurs(text: &str, slur_regex: &Regex) -> Result<(), ApiError> {
- slur_check(text, slur_regex)
- .map_err(|slurs| ApiError::err_plain(&slurs_vec_to_str(slurs.clone())))
+pub fn check_slurs(text: &str, slur_regex: &Option<Regex>) -> Result<(), ApiError> {
+ if let Err(slurs) = slur_check(text, slur_regex) {
+ Err(ApiError::err_plain(&slurs_vec_to_str(slurs)))
+ } else {
+ Ok(())
+ }
}
-pub fn check_slurs_opt(text: &Option<String>, slur_regex: &Regex) -> Result<(), ApiError> {
+pub fn check_slurs_opt(text: &Option<String>, slur_regex: &Option<Regex>) -> Result<(), ApiError> {
match text {
Some(t) => check_slurs(t, slur_regex),
None => Ok(()),