From 980047c4e1ee264e31a85629470148491de42515 Mon Sep 17 00:00:00 2001 From: Lars Noschinski Date: Wed, 5 Mar 2014 00:00:02 +0100 Subject: [PATCH] Create accurate filter for matching on from address (SMACK-71) Smack contains two PacketFilters to filter on the from address. FromContainsFilter simply does a substring match, which is problematic as explained in SMACK-71. FromMatchesFilter partially fixes this weakness, but it still uses String#startsWith to filter on bare addresses. For example, when setup to match all JIDs with bare JID "foo@example.co", it will still match "foo@example.com". This commit changes FromMatchesFilter to test equality with the bare from instead of startsWith with the full from. Moreover, we convert all uses of FromContainsFilter to FromMatchesFilter and remove FromContainsFilter. Additionally, the unused ToContainsFilter (which as the same weaknesses) is removed, too. --- .../org/jivesoftware/smack/ChatManager.java | 6 +-- .../smack/filter/FromContainsFilter.java | 51 ------------------ .../smack/filter/FromMatchesFilter.java | 13 ++--- .../smack/filter/ToContainsFilter.java | 52 ------------------- .../filetransfer/IBBTransferNegotiator.java | 4 +- .../smackx/workgroup/agent/AgentSession.java | 6 +-- .../smackx/workgroup/user/Workgroup.java | 2 +- 7 files changed, 14 insertions(+), 120 deletions(-) delete mode 100644 core/src/main/java/org/jivesoftware/smack/filter/FromContainsFilter.java delete mode 100644 core/src/main/java/org/jivesoftware/smack/filter/ToContainsFilter.java diff --git a/core/src/main/java/org/jivesoftware/smack/ChatManager.java b/core/src/main/java/org/jivesoftware/smack/ChatManager.java index 2b14e2155..ccc489ab0 100644 --- a/core/src/main/java/org/jivesoftware/smack/ChatManager.java +++ b/core/src/main/java/org/jivesoftware/smack/ChatManager.java @@ -26,12 +26,12 @@ import java.util.WeakHashMap; import java.util.concurrent.CopyOnWriteArraySet; import org.jivesoftware.smack.filter.AndFilter; -import org.jivesoftware.smack.filter.FromContainsFilter; +import org.jivesoftware.smack.filter.FromMatchesFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.filter.ThreadFilter; import org.jivesoftware.smack.packet.Message; -import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Message.Type; +import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.collections.ReferenceMap; @@ -313,7 +313,7 @@ public class ChatManager { PacketCollector createPacketCollector(Chat chat) { return connection.createPacketCollector(new AndFilter(new ThreadFilter(chat.getThreadID()), - new FromContainsFilter(chat.getParticipant()))); + new FromMatchesFilter(chat.getParticipant()))); } /** diff --git a/core/src/main/java/org/jivesoftware/smack/filter/FromContainsFilter.java b/core/src/main/java/org/jivesoftware/smack/filter/FromContainsFilter.java deleted file mode 100644 index 24a8804c3..000000000 --- a/core/src/main/java/org/jivesoftware/smack/filter/FromContainsFilter.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * - * Copyright 2003 Jive Software. - * - * 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.Packet; - -/** - * Filters for packets where the "from" field contains a specified value. - * - * @author Matt Tucker - */ -public class FromContainsFilter implements PacketFilter { - - private String from; - - /** - * Creates a "from" contains filter using the "from" field part. - * - * @param from the from field value the packet must contain. - */ - public FromContainsFilter(String from) { - if (from == null) { - throw new IllegalArgumentException("Parameter cannot be null."); - } - this.from = from.toLowerCase(); - } - - public boolean accept(Packet packet) { - if (packet.getFrom() == null) { - return false; - } - else { - return packet.getFrom().toLowerCase().indexOf(from) != -1; - } - } -} diff --git a/core/src/main/java/org/jivesoftware/smack/filter/FromMatchesFilter.java b/core/src/main/java/org/jivesoftware/smack/filter/FromMatchesFilter.java index cdfb3817a..0a27ef26b 100644 --- a/core/src/main/java/org/jivesoftware/smack/filter/FromMatchesFilter.java +++ b/core/src/main/java/org/jivesoftware/smack/filter/FromMatchesFilter.java @@ -53,17 +53,14 @@ public class FromMatchesFilter implements PacketFilter { } public boolean accept(Packet packet) { - if (packet.getFrom() == null) { + String from = packet.getFrom(); + if (from == null) { return false; } - else if (matchBareJID) { - // Check if the bare JID of the sender of the packet matches the specified JID - return packet.getFrom().toLowerCase().startsWith(address); - } - else { - // Check if the full JID of the sender of the packet matches the specified JID - return address.equals(packet.getFrom().toLowerCase()); + if (matchBareJID) { + from = StringUtils.parseBareAddress(from); } + return address.equals(from.toLowerCase()); } public String toString() { diff --git a/core/src/main/java/org/jivesoftware/smack/filter/ToContainsFilter.java b/core/src/main/java/org/jivesoftware/smack/filter/ToContainsFilter.java deleted file mode 100644 index 7694dc080..000000000 --- a/core/src/main/java/org/jivesoftware/smack/filter/ToContainsFilter.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * - * Copyright 2003-2007 Jive Software. - * - * 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.Packet; - -/** - * Filters for packets where the "to" field contains a specified value. For example, - * the filter could be used to listen for all packets sent to a group chat nickname. - * - * @author Matt Tucker - */ -public class ToContainsFilter implements PacketFilter { - - private String to; - - /** - * Creates a "to" contains filter using the "to" field part. - * - * @param to the to field value the packet must contain. - */ - public ToContainsFilter(String to) { - if (to == null) { - throw new IllegalArgumentException("Parameter cannot be null."); - } - this.to = to.toLowerCase(); - } - - public boolean accept(Packet packet) { - if (packet.getTo() == null) { - return false; - } - else { - return packet.getTo().toLowerCase().indexOf(to) != -1; - } - } -} diff --git a/extensions/src/main/java/org/jivesoftware/smackx/filetransfer/IBBTransferNegotiator.java b/extensions/src/main/java/org/jivesoftware/smackx/filetransfer/IBBTransferNegotiator.java index ee92b3caf..53796209d 100644 --- a/extensions/src/main/java/org/jivesoftware/smackx/filetransfer/IBBTransferNegotiator.java +++ b/extensions/src/main/java/org/jivesoftware/smackx/filetransfer/IBBTransferNegotiator.java @@ -22,7 +22,7 @@ import java.io.OutputStream; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.AndFilter; -import org.jivesoftware.smack.filter.FromContainsFilter; +import org.jivesoftware.smack.filter.FromMatchesFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.filter.PacketTypeFilter; import org.jivesoftware.smack.packet.IQ; @@ -86,7 +86,7 @@ public class IBBTransferNegotiator extends StreamNegotiator { */ this.manager.ignoreBytestreamRequestOnce(streamID); - return new AndFilter(new FromContainsFilter(from), new IBBOpenSidFilter(streamID)); + return new AndFilter(new FromMatchesFilter(from), new IBBOpenSidFilter(streamID)); } public String[] getNamespaces() { diff --git a/legacy/src/main/java/org/jivesoftware/smackx/workgroup/agent/AgentSession.java b/legacy/src/main/java/org/jivesoftware/smackx/workgroup/agent/AgentSession.java index c0040d795..9ce90438a 100644 --- a/legacy/src/main/java/org/jivesoftware/smackx/workgroup/agent/AgentSession.java +++ b/legacy/src/main/java/org/jivesoftware/smackx/workgroup/agent/AgentSession.java @@ -262,7 +262,7 @@ public class AgentSession { presence.addExtension(new DefaultPacketExtension(AgentStatus.ELEMENT_NAME, AgentStatus.NAMESPACE)); - PacketCollector collector = this.connection.createPacketCollector(new AndFilter(new PacketTypeFilter(Presence.class), new FromContainsFilter(workgroupJID))); + PacketCollector collector = this.connection.createPacketCollector(new AndFilter(new PacketTypeFilter(Presence.class), new FromMatchesFilter(workgroupJID))); connection.sendPacket(presence); @@ -359,7 +359,7 @@ public class AgentSession { presence.addExtension(agentStatus); presence.addExtension(new MetaData(this.metaData)); - PacketCollector collector = this.connection.createPacketCollector(new AndFilter(new PacketTypeFilter(Presence.class), new FromContainsFilter(workgroupJID))); + PacketCollector collector = this.connection.createPacketCollector(new AndFilter(new PacketTypeFilter(Presence.class), new FromMatchesFilter(workgroupJID))); this.connection.sendPacket(presence); @@ -402,7 +402,7 @@ public class AgentSession { presence.addExtension(new MetaData(this.metaData)); PacketCollector collector = this.connection.createPacketCollector(new AndFilter(new PacketTypeFilter(Presence.class), - new FromContainsFilter(workgroupJID))); + new FromMatchesFilter(workgroupJID))); this.connection.sendPacket(presence); diff --git a/legacy/src/main/java/org/jivesoftware/smackx/workgroup/user/Workgroup.java b/legacy/src/main/java/org/jivesoftware/smackx/workgroup/user/Workgroup.java index bc91e382a..225848f4f 100644 --- a/legacy/src/main/java/org/jivesoftware/smackx/workgroup/user/Workgroup.java +++ b/legacy/src/main/java/org/jivesoftware/smackx/workgroup/user/Workgroup.java @@ -159,7 +159,7 @@ public class Workgroup { Presence directedPresence = new Presence(Presence.Type.available); directedPresence.setTo(workgroupJID); PacketFilter typeFilter = new PacketTypeFilter(Presence.class); - PacketFilter fromFilter = new FromContainsFilter(workgroupJID); + PacketFilter fromFilter = new FromMatchesFilter(workgroupJID); PacketCollector collector = connection.createPacketCollector(new AndFilter(fromFilter, typeFilter));