package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors;
import java.util.List;
import java.util.Set;
import org.dom4j.Element;
import org.dom4j.Node;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.xmpp.packet.IQ;
import org.xmpp.packet.Packet;
/**
* This class implements the XEP-xxx Remote Roster Management standard
* "2.4 Client sends user update". Part of command pattern used in
* {@link MainInterceptor}
*
* Further information: <a
* href="http://jkaluza.fedorapeople.org/remote-roster.html#sect-id215516"
* >Here</a>
*
* @author Holger Bergunde
*
* Example IQ:
* <iq id="FSwIU-68" type="set" from="user@example/resource">
* <query xmlns="jabber:iq:roster"> <item jid="123456789@subdomain" name="wulschti" subscription="both">
* <group>General</group> </item> </query> </iq>
*/
public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProcessor {
private Set<String> watchedSubdomains;
public ClientToComponentUpdateProcessor(Set<String> activeTransports) {
watchedSubdomains = activeTransports;
Log.info("Created ClientToComponentUpdateProcessor");
}
private String searchJIDforSubdomain(String jid) {
for (String subdomain : watchedSubdomains) {
if (jid.contains(subdomain))
return subdomain;
}
return "";
}
@Override
public void process(Packet packet, String subdomain, String to, String from) throws PacketRejectedException {
Log.debug("Processing packet in ClientToComponentUpdateProcessor: " + packet.toString());
Element query = ((IQ) packet).getChildElement();
List<Node> nodes = findNodesInDocument(query.getDocument(), "//roster:item");
if (nodes.size() > 0) {
// We now know we have to check the JID of the to be added User
// against our valid subdomains.
for (Node n : nodes) {
String jid = n.valueOf("@jid");
// TODO: We ignore remove iq packets for now. There might be
// conflicts
// when we remove our legacy network registration.
String found_subdomain = searchJIDforSubdomain(jid);
if (found_subdomain.length() > 0 && !n.valueOf("@subscription").equals("remove")) {
Log.debug("Mirroring packet from local network to legacy component " + found_subdomain);
IQ forward = (IQ) packet.createCopy();
forward.setTo(found_subdomain);
dispatchPacket(forward);
}
}
}
}
}