Make DiscoverInfoProvider namespace aware

Some servers respond to disco#info requests with

<iq id='npGtO-21' type='result' to='phone@xxx/MAXS' from='xxx'>
<query xmlns='http://jabber.org/protocol/disco#info'>
<identity type='pep' name='Prosody' category='pubsub'/>
<identity type='im' name='Prosody' category='server'/>
<feature var='urn:xmpp:blocking'/>
<feature var='urn:xmpp:carbons:2'/>
<feature var='urn:xmpp:carbons:1'/>
<feature var='vcard-temp'/>
<feature var='http://jabber.org/protocol/commands'/>
<feature var='urn:xmpp:mam:0'/>
<feature var='jabber:iq:private'/>
<feature var='http://jabber.org/protocol/pubsub#publish'/>
<feature var='http://jabber.org/protocol/disco#info'/>
<feature var='http://jabber.org/protocol/disco#items'/>
<feature var='urn:xmpp:ping'/>
<feature var='msgoffline'/>
<feature var='jabber:iq:roster'/>
<feature var='urn:xmpp:archive:auto'/>
<feature var='urn:xmpp:archive:manage'/>
<feature var='urn:xmpp:archive:pref'/>
<feature var='http://jabber.org/protocol/rsm'/>
<feature xmlns='urn:xmpp:archive'><optional><default/></optional></feature>
</query></iq>

Note the

<feature
xmlns='urn:xmpp:archive'><optional><default/></optional></feature>

which will cause the current parser implementation to parse it as
DiscoInfo Feature resulting in an Exception because some attributes are
missing.

This commit prevents this.
This commit is contained in:
Florian Schmaus 2016-06-03 10:54:18 +02:00
parent 3bd35ecb1a
commit 60b07b1d67
1 changed files with 18 additions and 12 deletions

View File

@ -36,7 +36,7 @@ public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> {
boolean done = false;
DiscoverInfo.Identity identity = null;
String category = "";
String name = "";
String identityName = "";
String type = "";
String variable = "";
String lang = "";
@ -44,16 +44,22 @@ public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> {
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("identity")) {
// Initialize the variables from the parsed XML
category = parser.getAttributeValue("", "category");
name = parser.getAttributeValue("", "name");
type = parser.getAttributeValue("", "type");
lang = parser.getAttributeValue(parser.getNamespace("xml"), "lang");
}
else if (parser.getName().equals("feature")) {
// Initialize the variables from the parsed XML
variable = parser.getAttributeValue("", "var");
final String name = parser.getName();
final String namespace = parser.getNamespace();
if (namespace.equals(DiscoverInfo.NAMESPACE)) {
switch (name) {
case "identity":
// Initialize the variables from the parsed XML
category = parser.getAttributeValue("", "category");
identityName = parser.getAttributeValue("", "name");
type = parser.getAttributeValue("", "type");
lang = parser.getAttributeValue(parser.getNamespace("xml"), "lang");
break;
case "feature":
// Initialize the variables from the parsed XML
variable = parser.getAttributeValue("", "var");
break;
}
}
// Otherwise, it must be a packet extension.
else {
@ -62,7 +68,7 @@ public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> {
} else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals("identity")) {
// Create a new identity and add it to the discovered info.
identity = new DiscoverInfo.Identity(category, type, name, lang);
identity = new DiscoverInfo.Identity(category, type, identityName, lang);
discoverInfo.addIdentity(identity);
}
if (parser.getName().equals("feature")) {