jingle_message, muc, presence, version: Always use the check_no_attributes macro.

This commit is contained in:
Emmanuel Gil Peyrot 2018-05-12 17:59:04 +02:00
parent f2f8de773b
commit e0438f9b88
5 changed files with 9 additions and 37 deletions

View file

@ -28,11 +28,7 @@ pub enum JingleMI {
} }
fn get_sid(elem: Element) -> Result<SessionId, Error> { fn get_sid(elem: Element) -> Result<SessionId, Error> {
for (attr, _) in elem.attrs() { check_no_unknown_attributes!(elem, "Jingle message", ["id"]);
if attr != "id" {
return Err(Error::ParseError("Unknown attribute in Jingle message element."));
}
}
Ok(SessionId(get_attr!(elem, "id", required))) Ok(SessionId(get_attr!(elem, "id", required)))
} }

View file

@ -25,6 +25,7 @@ impl TryFrom<Element> for Muc {
if !elem.is("x", ns::MUC) { if !elem.is("x", ns::MUC) {
return Err(Error::ParseError("This is not an x element.")); return Err(Error::ParseError("This is not an x element."));
} }
check_no_attributes!(elem, "x");
let mut password = None; let mut password = None;
for child in elem.children() { for child in elem.children() {
@ -35,10 +36,6 @@ impl TryFrom<Element> for Muc {
} }
} }
for _ in elem.attrs() {
return Err(Error::ParseError("Unknown attribute in x element."));
}
Ok(Muc { Ok(Muc {
password: password, password: password,
}) })

View file

@ -96,14 +96,10 @@ impl TryFrom<Element> for Actor {
if !elem.is("actor", ns::MUC_USER) { if !elem.is("actor", ns::MUC_USER) {
return Err(Error::ParseError("This is not a actor element.")); return Err(Error::ParseError("This is not a actor element."));
} }
check_no_unknown_attributes!(elem, "actor", ["jid", "nick"]);
for _ in elem.children() { for _ in elem.children() {
return Err(Error::ParseError("Unknown child in actor element.")); return Err(Error::ParseError("Unknown child in actor element."));
} }
for (attr, _) in elem.attrs() {
if attr != "jid" && attr != "nick" {
return Err(Error::ParseError("Unknown attribute in actor element."));
}
}
let jid: Option<Jid> = get_attr!(elem, "jid", optional); let jid: Option<Jid> = get_attr!(elem, "jid", optional);
let nick = get_attr!(elem, "nick", optional); let nick = get_attr!(elem, "nick", optional);
@ -167,6 +163,7 @@ impl TryFrom<Element> for Item {
if !elem.is("item", ns::MUC_USER) { if !elem.is("item", ns::MUC_USER) {
return Err(Error::ParseError("This is not a item element.")); return Err(Error::ParseError("This is not a item element."));
} }
check_no_unknown_attributes!(elem, "item", ["affiliation", "jid", "nick", "role"]);
let mut actor: Option<Actor> = None; let mut actor: Option<Actor> = None;
let mut continue_: Option<Continue> = None; let mut continue_: Option<Continue> = None;
let mut reason: Option<Reason> = None; let mut reason: Option<Reason> = None;
@ -181,12 +178,6 @@ impl TryFrom<Element> for Item {
return Err(Error::ParseError("Unknown child in item element.")); return Err(Error::ParseError("Unknown child in item element."));
} }
} }
for (attr, _) in elem.attrs() {
if attr != "affiliation" && attr != "jid" &&
attr != "nick" && attr != "role" {
return Err(Error::ParseError("Unknown attribute in item element."));
}
}
let affiliation: Affiliation = get_attr!(elem, "affiliation", required); let affiliation: Affiliation = get_attr!(elem, "affiliation", required);
let jid: Option<Jid> = get_attr!(elem, "jid", optional); let jid: Option<Jid> = get_attr!(elem, "jid", optional);
@ -233,6 +224,7 @@ impl TryFrom<Element> for MucUser {
if !elem.is("x", ns::MUC_USER) { if !elem.is("x", ns::MUC_USER) {
return Err(Error::ParseError("This is not an x element.")); return Err(Error::ParseError("This is not an x element."));
} }
check_no_attributes!(elem, "x");
let mut status = vec!(); let mut status = vec!();
let mut items = vec!(); let mut items = vec!();
for child in elem.children() { for child in elem.children() {
@ -244,9 +236,6 @@ impl TryFrom<Element> for MucUser {
return Err(Error::ParseError("Unknown child in x element.")); return Err(Error::ParseError("Unknown child in x element."));
} }
} }
for _ in elem.attrs() {
return Err(Error::ParseError("Unknown attribute in x element."));
}
Ok(MucUser { Ok(MucUser {
status, status,
items, items,

View file

@ -268,22 +268,16 @@ impl TryFrom<Element> for Presence {
if show.is_some() { if show.is_some() {
return Err(Error::ParseError("More than one show element in a presence.")); return Err(Error::ParseError("More than one show element in a presence."));
} }
check_no_attributes!(elem, "show");
for _ in elem.children() { for _ in elem.children() {
return Err(Error::ParseError("Unknown child in show element.")); return Err(Error::ParseError("Unknown child in show element."));
} }
for _ in elem.attrs() {
return Err(Error::ParseError("Unknown attribute in show element."));
}
show = Some(Show::from_str(elem.text().as_ref())?); show = Some(Show::from_str(elem.text().as_ref())?);
} else if elem.is("status", ns::DEFAULT_NS) { } else if elem.is("status", ns::DEFAULT_NS) {
check_no_unknown_attributes!(elem, "status", ["xml:lang"]);
for _ in elem.children() { for _ in elem.children() {
return Err(Error::ParseError("Unknown child in status element.")); 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 = get_attr!(elem, "xml:lang", default); let lang = get_attr!(elem, "xml:lang", default);
if presence.statuses.insert(lang, elem.text()).is_some() { if presence.statuses.insert(lang, elem.text()).is_some() {
return Err(Error::ParseError("Status element present twice for the same xml:lang.")); return Err(Error::ParseError("Status element present twice for the same xml:lang."));
@ -292,12 +286,10 @@ impl TryFrom<Element> for Presence {
if priority.is_some() { if priority.is_some() {
return Err(Error::ParseError("More than one priority element in a presence.")); return Err(Error::ParseError("More than one priority element in a presence."));
} }
check_no_attributes!(elem, "status");
for _ in elem.children() { for _ in elem.children() {
return Err(Error::ParseError("Unknown child in priority element.")); 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())?); priority = Some(Priority::from_str(elem.text().as_ref())?);
} else { } else {
presence.payloads.push(elem.clone()); presence.payloads.push(elem.clone());

View file

@ -23,9 +23,7 @@ impl TryFrom<Element> for Version {
if !elem.is("query", ns::VERSION) { if !elem.is("query", ns::VERSION) {
return Err(Error::ParseError("This is not a version element.")); return Err(Error::ParseError("This is not a version element."));
} }
for _ in elem.attrs() { check_no_attributes!(elem, "version");
return Err(Error::ParseError("Unknown child in version element."));
}
let mut name = None; let mut name = None;
let mut version = None; let mut version = None;
let mut os = None; let mut os = None;