1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2024-11-26 16:22:06 +01:00

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

View file

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