use stricter namespace matching in stream parser

This commit is contained in:
Daniel Gultsch 2023-11-21 15:25:21 +01:00
parent 5bb8f3f9aa
commit 3dac9ef3f4
No known key found for this signature in database
GPG key ID: F43D18AD2A0982C2
4 changed files with 21 additions and 9 deletions

View file

@ -29,7 +29,7 @@ public class LocalizedContent {
final String childLanguage = child.getAttribute("xml:lang"); final String childLanguage = child.getAttribute("xml:lang");
final String lang = childLanguage == null ? parentLanguage : childLanguage; final String lang = childLanguage == null ? parentLanguage : childLanguage;
final String content = child.getContent(); final String content = child.getContent();
if (content != null && (namespace == null || "jabber:client".equals(namespace))) { if (content != null && (namespace == null || Namespace.JABBER_CLIENT.equals(namespace))) {
if (contents.put(lang, content) != null) { if (contents.put(lang, content) != null) {
//anything that has multiple contents for the same language is invalid //anything that has multiple contents for the same language is invalid
return null; return null;

View file

@ -2,6 +2,7 @@ package eu.siacs.conversations.xml;
public final class Namespace { public final class Namespace {
public static final String STREAMS = "http://etherx.jabber.org/streams"; public static final String STREAMS = "http://etherx.jabber.org/streams";
public static final String JABBER_CLIENT = "jabber:client";
public static final String DISCO_ITEMS = "http://jabber.org/protocol/disco#items"; public static final String DISCO_ITEMS = "http://jabber.org/protocol/disco#items";
public static final String DISCO_INFO = "http://jabber.org/protocol/disco#info"; public static final String DISCO_INFO = "http://jabber.org/protocol/disco#info";
public static final String EXTERNAL_SERVICE_DISCOVERY = "urn:xmpp:extdisco:2"; public static final String EXTERNAL_SERVICE_DISCOVERY = "urn:xmpp:extdisco:2";

View file

@ -43,6 +43,10 @@ public class Tag {
return name; return name;
} }
public String identifier() {
return String.format("%s#%s", name, this.attributes.get("xmlns"));
}
public String getAttribute(final String attrName) { public String getAttribute(final String attrName) {
return this.attributes.get(attrName); return this.attributes.get(attrName);
} }

View file

@ -604,10 +604,10 @@ public class XmppConnection implements Runnable {
} else if (nextTag.isStart("enabled", Namespace.STREAM_MANAGEMENT)) { } else if (nextTag.isStart("enabled", Namespace.STREAM_MANAGEMENT)) {
final Element enabled = tagReader.readElement(nextTag); final Element enabled = tagReader.readElement(nextTag);
processEnabled(enabled); processEnabled(enabled);
} else if (nextTag.isStart("resumed")) { } else if (nextTag.isStart("resumed", Namespace.STREAM_MANAGEMENT)) {
final Element resumed = tagReader.readElement(nextTag); final Element resumed = tagReader.readElement(nextTag);
processResumed(resumed); processResumed(resumed);
} else if (nextTag.isStart("r")) { } else if (nextTag.isStart("r", Namespace.STREAM_MANAGEMENT)) {
tagReader.readElement(nextTag); tagReader.readElement(nextTag);
if (Config.EXTENDED_SM_LOGGING) { if (Config.EXTENDED_SM_LOGGING) {
Log.d( Log.d(
@ -618,7 +618,7 @@ public class XmppConnection implements Runnable {
} }
final AckPacket ack = new AckPacket(this.stanzasReceived); final AckPacket ack = new AckPacket(this.stanzasReceived);
tagWriter.writeStanzaAsync(ack); tagWriter.writeStanzaAsync(ack);
} else if (nextTag.isStart("a")) { } else if (nextTag.isStart("a", Namespace.STREAM_MANAGEMENT)) {
boolean accountUiNeedsRefresh = false; boolean accountUiNeedsRefresh = false;
synchronized (NotificationService.CATCHUP_LOCK) { synchronized (NotificationService.CATCHUP_LOCK) {
if (mWaitingForSmCatchup.compareAndSet(true, false)) { if (mWaitingForSmCatchup.compareAndSet(true, false)) {
@ -661,15 +661,22 @@ public class XmppConnection implements Runnable {
if (acknowledgedMessages) { if (acknowledgedMessages) {
mXmppConnectionService.updateConversationUi(); mXmppConnectionService.updateConversationUi();
} }
} else if (nextTag.isStart("failed")) { } else if (nextTag.isStart("failed", Namespace.STREAM_MANAGEMENT)) {
final Element failed = tagReader.readElement(nextTag); final Element failed = tagReader.readElement(nextTag);
processFailed(failed, true); processFailed(failed, true);
} else if (nextTag.isStart("iq")) { } else if (nextTag.isStart("iq", Namespace.JABBER_CLIENT)) {
processIq(nextTag); processIq(nextTag);
} else if (nextTag.isStart("message")) { } else if (nextTag.isStart("message", Namespace.JABBER_CLIENT)) {
processMessage(nextTag); processMessage(nextTag);
} else if (nextTag.isStart("presence")) { } else if (nextTag.isStart("presence", Namespace.JABBER_CLIENT)) {
processPresence(nextTag); processPresence(nextTag);
} else {
Log.e(
Config.LOGTAG,
account.getJid().asBareJid()
+ ": Encountered unknown stream element"
+ nextTag.identifier());
throw new StateChangingException(Account.State.INCOMPATIBLE_SERVER);
} }
nextTag = tagReader.readTag(); nextTag = tagReader.readTag();
} }
@ -2263,7 +2270,7 @@ public class XmppConnection implements Runnable {
} }
stream.setAttribute("version", "1.0"); stream.setAttribute("version", "1.0");
stream.setAttribute("xml:lang", LocalizedContent.STREAM_LANGUAGE); stream.setAttribute("xml:lang", LocalizedContent.STREAM_LANGUAGE);
stream.setAttribute("xmlns", "jabber:client"); stream.setAttribute("xmlns", Namespace.JABBER_CLIENT);
stream.setAttribute("xmlns:stream", Namespace.STREAMS); stream.setAttribute("xmlns:stream", Namespace.STREAMS);
tagWriter.writeTag(stream, flush); tagWriter.writeTag(stream, flush);
} }