Simplify regex for user/community name validation (#5164)
* Add lowercase only check for community names * Lint * Remove redundant check * Lint * Add newline escape tests * Eliminate confounding factor in community name test * Use same check for user names and community names * Use min/max length check --------- Co-authored-by: Dessalines <dessalines@users.noreply.github.com> Co-authored-by: Felix Ableitner <me@nutomic.com>
This commit is contained in:
parent
7d5cb9de49
commit
a8fb55d6c8
1 changed files with 17 additions and 15 deletions
|
@ -85,26 +85,19 @@ fn has_newline(name: &str) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_valid_actor_name(name: &str, actor_name_max_length: usize) -> LemmyResult<()> {
|
pub fn is_valid_actor_name(name: &str, actor_name_max_length: usize) -> LemmyResult<()> {
|
||||||
static VALID_ACTOR_NAME_REGEX_EN: LazyLock<Regex> =
|
|
||||||
LazyLock::new(|| Regex::new(r"^[a-zA-Z0-9_]{3,}$").expect("compile regex"));
|
|
||||||
static VALID_ACTOR_NAME_REGEX_AR: LazyLock<Regex> =
|
|
||||||
LazyLock::new(|| Regex::new(r"^[\p{Arabic}0-9_]{3,}$").expect("compile regex"));
|
|
||||||
static VALID_ACTOR_NAME_REGEX_RU: LazyLock<Regex> =
|
|
||||||
LazyLock::new(|| Regex::new(r"^[\p{Cyrillic}0-9_]{3,}$").expect("compile regex"));
|
|
||||||
|
|
||||||
let check = name.chars().count() <= actor_name_max_length && !has_newline(name);
|
|
||||||
|
|
||||||
// Only allow characters from a single alphabet per username. This avoids problems with lookalike
|
// Only allow characters from a single alphabet per username. This avoids problems with lookalike
|
||||||
// characters like `o` which looks identical in Latin and Cyrillic, and can be used to imitate
|
// characters like `o` which looks identical in Latin and Cyrillic, and can be used to imitate
|
||||||
// other users. Checks for additional alphabets can be added in the same way.
|
// other users. Checks for additional alphabets can be added in the same way.
|
||||||
let lang_check = VALID_ACTOR_NAME_REGEX_EN.is_match(name)
|
static VALID_ACTOR_NAME_REGEX: LazyLock<Regex> = LazyLock::new(|| {
|
||||||
|| VALID_ACTOR_NAME_REGEX_AR.is_match(name)
|
Regex::new(r"^(?:[a-zA-Z0-9_]+|[0-9_\p{Arabic}]+|[0-9_\p{Cyrillic}]+)$").expect("compile regex")
|
||||||
|| VALID_ACTOR_NAME_REGEX_RU.is_match(name);
|
});
|
||||||
|
|
||||||
if !check || !lang_check {
|
min_length_check(name, 3, LemmyErrorType::InvalidName)?;
|
||||||
Err(LemmyErrorType::InvalidName.into())
|
max_length_check(name, actor_name_max_length, LemmyErrorType::InvalidName)?;
|
||||||
} else {
|
if VALID_ACTOR_NAME_REGEX.is_match(name) {
|
||||||
Ok(())
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(LemmyErrorType::InvalidName.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,6 +434,15 @@ mod tests {
|
||||||
assert!(is_valid_actor_name("a", actor_name_max_length).is_err());
|
assert!(is_valid_actor_name("a", actor_name_max_length).is_err());
|
||||||
// empty
|
// empty
|
||||||
assert!(is_valid_actor_name("", actor_name_max_length).is_err());
|
assert!(is_valid_actor_name("", actor_name_max_length).is_err());
|
||||||
|
// newline
|
||||||
|
assert!(is_valid_actor_name(
|
||||||
|
r"Line1
|
||||||
|
|
||||||
|
Line3",
|
||||||
|
actor_name_max_length
|
||||||
|
)
|
||||||
|
.is_err());
|
||||||
|
assert!(is_valid_actor_name("Line1\nLine3", actor_name_max_length).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in a new issue