diff --git a/src/key_name.rs b/src/key_name.rs index 6ba81387..bdfc356c 100644 --- a/src/key_name.rs +++ b/src/key_name.rs @@ -1,7 +1,6 @@ use super::*; -static NAME_RE: LazyLock = - LazyLock::new(|| Regex::new("^[A-Za-z0-9][A-Za-z0-9._-]*$").unwrap()); +static NAME_RE: LazyLock = LazyLock::new(|| Regex::new("^[a-z0-9]+(-[a-z0-9]+)*$").unwrap()); #[derive(Clone, Debug, PartialEq)] pub struct KeyName(String); @@ -20,7 +19,7 @@ impl FromStr for KeyName { type Err = PublicKeyError; fn from_str(name: &str) -> Result { - if !NAME_RE.is_match(name) { + if !NAME_RE.is_match(name) || name.len() > 128 { return Err(public_key_error::NameError { name }.build()); } @@ -33,3 +32,45 @@ impl Display for KeyName { write!(f, "{}", self.0) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn validity() { + #[track_caller] + fn valid(s: &str) { + assert!(s.parse::().is_ok()); + } + + #[track_caller] + fn invalid(s: &str) { + assert!(s.parse::().is_err()); + } + + valid("0"); + valid("0-0"); + valid("foo"); + valid("foo-bar"); + valid("foo-bar-baz"); + valid(&"a".repeat(128)); + + invalid(""); + invalid("-"); + invalid("--"); + invalid("."); + invalid(".."); + invalid("/"); + invalid("FOO"); + invalid("\\"); + invalid("_"); + invalid("foo--bar"); + invalid("foo--bar"); + invalid("foo-bar-"); + invalid("foo."); + invalid("foo.bar"); + invalid("foo_bar"); + invalid(&"a".repeat(129)); + } +}