From ecf1ed7f6b808a3b73fba331dd55564b6065f338 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Fri, 23 Dec 2016 23:35:52 +0100 Subject: [PATCH] Fix EntityCapsManager presenceSend capturing all outoing presences of type 'available' would also capture presences not used for presence broadcast, e.g., MUC presences. This caused the EntityCaps integration test (localEntityCaps) to fail if the MUC integration test was run before. --- .../smack/filter/EmptyToMatcher.java | 42 +++++++++++++++++++ .../smack/filter/PresenceTypeFilter.java | 2 + .../smackx/caps/EntityCapsManager.java | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 smack-core/src/main/java/org/jivesoftware/smack/filter/EmptyToMatcher.java diff --git a/smack-core/src/main/java/org/jivesoftware/smack/filter/EmptyToMatcher.java b/smack-core/src/main/java/org/jivesoftware/smack/filter/EmptyToMatcher.java new file mode 100644 index 000000000..0ac3b9b1b --- /dev/null +++ b/smack-core/src/main/java/org/jivesoftware/smack/filter/EmptyToMatcher.java @@ -0,0 +1,42 @@ +/** + * + * Copyright © 2016 Florian Schmaus + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smack.filter; + +import org.jivesoftware.smack.packet.Stanza; +import org.jxmpp.jid.Jid; + +public final class EmptyToMatcher implements StanzaFilter { + + public static final EmptyToMatcher INSTANCE = new EmptyToMatcher(); + + private EmptyToMatcher() { + } + + @Override + public boolean accept(Stanza packet) { + Jid packetTo = packet.getTo(); + if (packetTo == null) { + return true; + } + return false; + } + + @Override + public String toString() { + return getClass().getSimpleName(); + } +} diff --git a/smack-core/src/main/java/org/jivesoftware/smack/filter/PresenceTypeFilter.java b/smack-core/src/main/java/org/jivesoftware/smack/filter/PresenceTypeFilter.java index a737091e6..95a2d3013 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/filter/PresenceTypeFilter.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/filter/PresenceTypeFilter.java @@ -35,6 +35,8 @@ public final class PresenceTypeFilter extends FlexibleStanzaTypeFilter public static final PresenceTypeFilter ERROR = new PresenceTypeFilter(Type.error); public static final PresenceTypeFilter PROBE = new PresenceTypeFilter(Type.probe); + public static final StanzaFilter OUTGOING_PRESENCE_BROADCAST = new AndFilter(AVAILABLE, EmptyToMatcher.INSTANCE); + private final Presence.Type type; private PresenceTypeFilter(Presence.Type type) { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java index 730ad5ec5..e1d2fbb40 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java @@ -340,7 +340,7 @@ public final class EntityCapsManager extends Manager { public void processPacket(Stanza packet) { presenceSend = (Presence) packet; } - }, PresenceTypeFilter.AVAILABLE); + }, PresenceTypeFilter.OUTGOING_PRESENCE_BROADCAST); // Intercept presence packages and add caps data when intended. // XEP-0115 specifies that a client SHOULD include entity capabilities