1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2024-06-13 07:04:52 +02:00
Smack/core/src/main/java/org/jivesoftware/smack/filter/FromMatchesFilter.java
Lars Noschinski 6c7296a37b Add and use IQReplyFilter (SMACK-533)
In the absence of checks on the from address, it is possible for other
clients to fake an answer to an IQ request.

This commit adds an IQReplyFilter, which drops all packets which are not
a valid reply to an IQ request. In particular, it checks for packet id,
from address and packet type.

Most(?) places waiting for a reply to an IQ request are converted to use
the IQReplyFilter.

For a discussion of the issues, see the thread "Spoofing of iq ids and
misbehaving servers" from 2014-01 on the jdev@jabber.org mailing list
and following discussion in February and March.
2014-03-07 16:13:07 +01:00

112 lines
3.9 KiB
Java

/**
*
* 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;
import org.jivesoftware.smack.util.StringUtils;
/**
* Filter for packets where the "from" field exactly matches a specified JID. If the specified
* address is a bare JID then the filter will match any address whose bare JID matches the
* specified JID. But if the specified address is a full JID then the filter will only match
* if the sender of the packet matches the specified resource.
*
* @author Gaston Dombiak
*/
public class FromMatchesFilter implements PacketFilter {
private String address;
/**
* Flag that indicates if the checking will be done against bare JID addresses or full JIDs.
*/
private boolean matchBareJID = false;
/**
* @see FromMatchesFilter#create(String)
*/
@Deprecated
public FromMatchesFilter(String address) {
this(address, "".equals(StringUtils.parseResource(address)));
}
/**
* Creates a filter matching on the "from" field. The from address must be the same as the
* filter address. The second parameter specifies whether the full or the bare addresses are
* compared.
*
* @param address The address to filter for. If <code>null</code> is given, the packet must not
* have a from address.
* @param matchBare
*/
public FromMatchesFilter(String address, boolean matchBare) {
this.address = (address == null) ? null : address.toLowerCase();
matchBareJID = matchBare;
}
/**
* Creates a filter matching on the "from" field. If the filter address is bare, compares
* the filter address with the bare from address. Otherwise, compares the filter address
* with the full from address.
*
* @param address The address to filter for. If <code>null</code> is given, the packet must not
* have a from address.
*/
public static FromMatchesFilter create(String address) {
return new FromMatchesFilter(address, "".equals(StringUtils.parseResource(address))) ;
}
/**
* Creates a filter matching on the "from" field. Compares the bare version of from and filter
* address.
*
* @param address The address to filter for. If <code>null</code> is given, the packet must not
* have a from address.
*/
public static FromMatchesFilter createBare(String address) {
address = (address == null) ? null : StringUtils.parseBareAddress(address);
return new FromMatchesFilter(address, true);
}
/**
* Creates a filter matching on the "from" field. Compares the full version of from and filter
* address.
*
* @param address The address to filter for. If <code>null</code> is given, the packet must not
* have a from address.
*/
public static FromMatchesFilter createFull(String address) {
return new FromMatchesFilter(address, false);
}
public boolean accept(Packet packet) {
String from = packet.getFrom();
if (from == null) {
return address == null;
}
if (matchBareJID) {
from = StringUtils.parseBareAddress(from).toLowerCase();
}
return address.equals(from);
}
public String toString() {
return "FromMatchesFilter: " + address;
}
}