1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
elrond_wasm::imports!();
const MIN_LENGTH: usize = 3;
const MAX_LENGTH: usize = 32;
const NAME_SUFFIX: &[u8] = b".elrond";
#[allow(clippy::manual_range_contains)]
fn check_name_char(ch: u8) -> bool {
if ch >= b'a' && ch <= b'z' {
return true;
}
if ch >= b'0' && ch <= b'9' {
return true;
}
false
}
pub fn validate_name(name: &[u8]) -> SCResult<()> {
if name.len() <= NAME_SUFFIX.len() {
return sc_error!("name does not contain suffix");
}
if name.len() > MAX_LENGTH {
return sc_error!("name too long");
}
let (name_without_suffix, suffix) = name.split_at(name.len() - NAME_SUFFIX.len());
if suffix != NAME_SUFFIX {
return sc_error!("wrong suffix");
}
if name_without_suffix.len() < MIN_LENGTH {
return sc_error!("name is too short");
}
for ch in name_without_suffix.iter() {
if !check_name_char(*ch) {
return sc_error!("character not allowed");
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_validate_name() {
assert!(validate_name(&*b"aaaaaaaaaa.elrond").is_ok());
assert!(validate_name(&*b"zzzzzzzzzz.elrond").is_ok());
assert!(validate_name(&*b"0000000000.elrond").is_ok());
assert!(validate_name(&*b"9999999999.elrond").is_ok());
assert!(validate_name(&*b"coolname0001.elrond").is_ok());
assert!(!validate_name(&*b".elrond").is_ok());
assert!(!validate_name(&*b"aa.elrond").is_ok());
assert!(!validate_name(&*b"Aaaaaaaaaa.elrond").is_ok());
assert!(!validate_name(&*b"Aaaaa.aaaa.elrond").is_ok());
assert!(!validate_name(&*b"Aaaaa@aaaa.elrond").is_ok());
assert!(!validate_name(&*b"Aaaaa+aaaa.elrond").is_ok());
assert!(!validate_name(&*b"Aaaaa-aaaa.elrond").is_ok());
assert!(!validate_name(&*b"Aaaaa_aaaa.elrond").is_ok());
assert!(!validate_name(&*b"aaaaaaaaaa").is_ok());
assert!(!validate_name(&*b"zzzzzzzzzz").is_ok());
assert!(!validate_name(&*b"0000000000").is_ok());
assert!(!validate_name(&*b"9999999999").is_ok());
assert!(!validate_name(&*b"coolname0001").is_ok());
assert!(!validate_name(&*b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.elrond").is_ok());
}
}