liminal_server/server/connection/
declared_holder.rs1pub const PREFIX: &str = "open:";
13
14pub const ANONYMOUS: &str = "anonymous";
16
17#[derive(Debug, Clone, PartialEq, Eq)]
19pub enum DeclaredHolder {
20 Open(String),
22}
23
24impl DeclaredHolder {
25 #[must_use]
29 pub fn from_record(record: &[u8]) -> Self {
30 let name = std::str::from_utf8(record)
31 .ok()
32 .and_then(|text| text.strip_prefix(PREFIX))
33 .filter(|name| is_name(name));
34 Self::Open(name.unwrap_or(ANONYMOUS).to_owned())
35 }
36
37 #[must_use]
39 pub fn record(&self) -> String {
40 match self {
41 Self::Open(name) => format!("{PREFIX}{name}"),
42 }
43 }
44}
45
46#[must_use]
48pub fn is_name(name: &str) -> bool {
49 (1..=64).contains(&name.len())
50 && name.bytes().all(|b| {
51 b.is_ascii_lowercase() || b.is_ascii_digit() || matches!(b, b'.' | b'_' | b'-')
52 })
53}
54
55#[cfg(test)]
56mod tests {
57 use super::{DeclaredHolder, is_name};
58
59 #[test]
60 fn a_record_names_its_holder_or_is_anonymous() {
61 assert_eq!(
62 DeclaredHolder::from_record(b"open:hermes").record(),
63 "open:hermes"
64 );
65 for record in [
66 &b""[..],
67 b"open:",
68 b"open:Hermes",
69 b"hermes",
70 b"\xff",
71 b"open:a b",
72 ] {
73 assert_eq!(
74 DeclaredHolder::from_record(record).record(),
75 "open:anonymous",
76 "{record:?}"
77 );
78 }
79 }
80
81 #[test]
82 fn a_name_is_one_to_sixty_four_of_the_allowed_bytes() {
83 assert!(is_name("hermes") && is_name("a.b_c-d9") && is_name(&"x".repeat(64)));
84 assert!(!is_name("") && !is_name("Hermes") && !is_name("a/b") && !is_name(&"x".repeat(65)));
85 }
86}