1use minidom::Element;
2
3use error::Error;
4
5use ns;
6
7#[derive(Debug, Clone)]
8pub struct ExplicitMessageEncryption {
9 pub namespace: String,
10 pub name: Option<String>,
11}
12
13pub fn parse_explicit_message_encryption(root: &Element) -> Result<ExplicitMessageEncryption, Error> {
14 if !root.is("encryption", ns::EME) {
15 return Err(Error::ParseError("This is not an encryption element."));
16 }
17 for _ in root.children() {
18 return Err(Error::ParseError("Unknown child in encryption element."));
19 }
20 let namespace = root.attr("namespace").ok_or(Error::ParseError("Mandatory argument 'namespace' not present in encryption element."))?.to_owned();
21 let name = root.attr("name").and_then(|value| value.parse().ok());
22 Ok(ExplicitMessageEncryption {
23 namespace: namespace,
24 name: name,
25 })
26}
27
28pub fn serialise(eme: &ExplicitMessageEncryption) -> Element {
29 Element::builder("encryption")
30 .ns(ns::EME)
31 .attr("namespace", eme.namespace.clone())
32 .attr("name", eme.name.clone())
33 .build()
34}
35
36#[cfg(test)]
37mod tests {
38 use minidom::Element;
39 use error::Error;
40 use eme;
41
42 #[test]
43 fn test_simple() {
44 let elem: Element = "<encryption xmlns='urn:xmpp:eme:0' namespace='urn:xmpp:otr:0'/>".parse().unwrap();
45 let encryption = eme::parse_explicit_message_encryption(&elem).unwrap();
46 assert_eq!(encryption.namespace, "urn:xmpp:otr:0");
47 assert_eq!(encryption.name, None);
48
49 let elem: Element = "<encryption xmlns='urn:xmpp:eme:0' namespace='some.unknown.mechanism' name='SuperMechanism'/>".parse().unwrap();
50 let encryption = eme::parse_explicit_message_encryption(&elem).unwrap();
51 assert_eq!(encryption.namespace, "some.unknown.mechanism");
52 assert_eq!(encryption.name, Some(String::from("SuperMechanism")));
53 }
54
55 #[test]
56 fn test_unknown() {
57 let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'/>".parse().unwrap();
58 let error = eme::parse_explicit_message_encryption(&elem).unwrap_err();
59 let message = match error {
60 Error::ParseError(string) => string,
61 _ => panic!(),
62 };
63 assert_eq!(message, "This is not an encryption element.");
64 }
65
66 #[test]
67 fn test_invalid_child() {
68 let elem: Element = "<encryption xmlns='urn:xmpp:eme:0'><coucou/></encryption>".parse().unwrap();
69 let error = eme::parse_explicit_message_encryption(&elem).unwrap_err();
70 let message = match error {
71 Error::ParseError(string) => string,
72 _ => panic!(),
73 };
74 assert_eq!(message, "Unknown child in encryption element.");
75 }
76
77 #[test]
78 fn test_serialise() {
79 let elem: Element = "<encryption xmlns='urn:xmpp:eme:0' namespace='coucou'/>".parse().unwrap();
80 let eme = eme::ExplicitMessageEncryption { namespace: String::from("coucou"), name: None };
81 let elem2 = eme::serialise(&eme);
82 assert_eq!(elem, elem2);
83 }
84}