From 80695edb7257c8d1ff75568b43c3285075c8018b Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 21 May 2017 16:44:35 +0100 Subject: [PATCH] chatstates, ping, presence: Check for extraneous attributes. --- Cargo.toml | 2 +- src/chatstates.rs | 4 +++- src/ping.rs | 4 +++- src/presence.rs | 17 +++++++++++++---- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 85e089c..59cafb2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ categories = ["parsing", "network-programming"] license = "MPL-2.0" [dependencies] -minidom = "0.3.0" +minidom = "0.3.1" jid = "0.2.0" base64 = "0.5.0" digest = "0.5.0" diff --git a/src/chatstates.rs b/src/chatstates.rs index 9ed2b10..f9fdb4f 100644 --- a/src/chatstates.rs +++ b/src/chatstates.rs @@ -28,6 +28,9 @@ impl<'a> TryFrom<&'a Element> for ChatState { for _ in elem.children() { return Err(Error::ParseError("Unknown child in chatstate element.")); } + for _ in elem.attrs() { + return Err(Error::ParseError("Unknown attribute in chatstate element.")); + } if elem.is("active", ns::CHATSTATES) { Ok(ChatState::Active) } else if elem.is("composing", ns::CHATSTATES) { @@ -90,7 +93,6 @@ mod tests { } #[test] - #[ignore] fn test_invalid_attribute() { let elem: Element = "".parse().unwrap(); let error = ChatState::try_from(&elem).unwrap_err(); diff --git a/src/ping.rs b/src/ping.rs index 4fe2fd8..baebf68 100644 --- a/src/ping.rs +++ b/src/ping.rs @@ -26,6 +26,9 @@ impl<'a> TryFrom<&'a Element> for Ping { for _ in elem.children() { return Err(Error::ParseError("Unknown child in ping element.")); } + for _ in elem.attrs() { + return Err(Error::ParseError("Unknown attribute in ping element.")); + } Ok(Ping) } } @@ -60,7 +63,6 @@ mod tests { } #[test] - #[ignore] fn test_invalid_attribute() { let elem: Element = "".parse().unwrap(); let error = Ping::try_from(&elem).unwrap_err(); diff --git a/src/presence.rs b/src/presence.rs index 7eb53b4..d780d00 100644 --- a/src/presence.rs +++ b/src/presence.rs @@ -180,6 +180,9 @@ impl<'a> TryFrom<&'a Element> for Presence { for _ in elem.children() { return Err(Error::ParseError("Unknown child in show element.")); } + for _ in elem.attrs() { + return Err(Error::ParseError("Unknown attribute in show element.")); + } show = Some(match elem.text().as_ref() { "away" => Show::Away, "chat" => Show::Chat, @@ -192,6 +195,11 @@ impl<'a> TryFrom<&'a Element> for Presence { for _ in elem.children() { return Err(Error::ParseError("Unknown child in status element.")); } + for (attr, _) in elem.attrs() { + if attr != "xml:lang" { + return Err(Error::ParseError("Unknown attribute in status element.")); + } + } let lang = elem.attr("xml:lang").unwrap_or("").to_owned(); if statuses.insert(lang, elem.text()).is_some() { return Err(Error::ParseError("Status element present twice for the same xml:lang.")); @@ -203,6 +211,9 @@ impl<'a> TryFrom<&'a Element> for Presence { for _ in elem.children() { return Err(Error::ParseError("Unknown child in priority element.")); } + for _ in elem.attrs() { + return Err(Error::ParseError("Unknown attribute in priority element.")); + } priority = Some(Priority::from_str(elem.text().as_ref())?); } else { payloads.push(elem.clone()); @@ -379,9 +390,8 @@ mod tests { } #[test] - #[ignore] fn test_invalid_status_child() { - let elem: Element = "".parse().unwrap(); + let elem: Element = "".parse().unwrap(); let error = Presence::try_from(&elem).unwrap_err(); let message = match error { Error::ParseError(string) => string, @@ -391,9 +401,8 @@ mod tests { } #[test] - #[ignore] fn test_invalid_attribute() { - let elem: Element = "".parse().unwrap(); + let elem: Element = "".parse().unwrap(); let error = Presence::try_from(&elem).unwrap_err(); let message = match error { Error::ParseError(string) => string,