disco: Check for children ordering in disco#info.

This commit is contained in:
Emmanuel Gil Peyrot 2017-10-29 00:36:36 +01:00
parent a8cfc8e62e
commit 1892e1ca04

View file

@ -164,15 +164,26 @@ impl TryFrom<Element> for DiscoInfoResult {
features: vec!(),
extensions: vec!(),
};
let mut parsing_identities_done = false;
let mut parsing_features_done = false;
for child in elem.children() {
if child.is("feature", ns::DISCO_INFO) {
let feature = Feature::try_from(child.clone())?;
result.features.push(feature);
} else if child.is("identity", ns::DISCO_INFO) {
if child.is("identity", ns::DISCO_INFO) {
if parsing_identities_done {
return Err(Error::ParseError("Identity found after features or data forms in disco#info."));
}
let identity = Identity::try_from(child.clone())?;
result.identities.push(identity);
} else if child.is("feature", ns::DISCO_INFO) {
parsing_identities_done = true;
if parsing_features_done {
return Err(Error::ParseError("Feature found after data forms in disco#info."));
}
let feature = Feature::try_from(child.clone())?;
result.features.push(feature);
} else if child.is("x", ns::DATA_FORMS) {
parsing_identities_done = true;
parsing_features_done = true;
let data_form = DataForm::try_from(child.clone())?;
if data_form.type_ != DataFormType::Result_ {
return Err(Error::ParseError("Data form must have a 'result' type in disco#info."));
@ -441,6 +452,22 @@ mod tests {
_ => panic!(),
};
assert_eq!(message, "disco#info feature not present in disco#info.");
let elem: Element = "<query xmlns='http://jabber.org/protocol/disco#info'><feature var='http://jabber.org/protocol/disco#info'/><identity category='client' type='pc'/></query>".parse().unwrap();
let error = DiscoInfoResult::try_from(elem).unwrap_err();
let message = match error {
Error::ParseError(string) => string,
_ => panic!(),
};
assert_eq!(message, "Identity found after features or data forms in disco#info.");
let elem: Element = "<query xmlns='http://jabber.org/protocol/disco#info'><identity category='client' type='pc'/><x xmlns='jabber:x:data' type='result'><field var='FORM_TYPE' type='hidden'><value>coucou</value></field></x><feature var='http://jabber.org/protocol/disco#info'/></query>".parse().unwrap();
let error = DiscoInfoResult::try_from(elem).unwrap_err();
let message = match error {
Error::ParseError(string) => string,
_ => panic!(),
};
assert_eq!(message, "Feature found after data forms in disco#info.");
}
#[test]