1use base64;
2use md5;
3
4pub struct SecureLink<'a> {
5 key: &'a str,
6}
7
8impl SecureLink<'_> {
9 pub fn new(key: &str) -> SecureLink {
10 return SecureLink { key };
11 }
12
13 pub fn generate(self, url: &str) -> String {
14 let digest = md5::compute(format!("{} {}", url, self.key));
15 return base64::encode_config(digest.as_slice(), base64::URL_SAFE_NO_PAD);
16 }
17
18 pub fn verify(self, url: &str, key: &str) -> bool {
19 return key == self.generate(url);
20 }
21}
22
23#[cfg(test)]
24mod tests {
25 use super::SecureLink;
26
27 #[test]
28 fn test_key_generation() {
29 let slink = SecureLink::new("testkey");
30 let key = slink.generate("https://www.google.com/");
31 assert_eq!(key, "HY4On4h_ZipVaOa0uOHtOg");
32 }
33
34 #[test]
35 fn test_key_verification() {
36 let slink = SecureLink::new("testkey");
37 assert_eq!(
38 slink.verify("https://www.google.com/", "HY4On4h_ZipVaOa0uOHtOg"),
39 true
40 );
41 }
42
43 #[test]
44 fn test_bad_key_verification() {
45 let slink = SecureLink::new("testkey");
46 assert_eq!(slink.verify("https://www.google.com/", "invalidKey"), false);
47 }
48}