Commit 4eacf951 authored by Axel Brand's avatar Axel Brand Committed by daeva

finetuning of Maininterceptor and processors, earlier testing for namespaces...

finetuning of Maininterceptor and processors, earlier testing for namespaces makes things a lot easier

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/branches/plugins@13547 b35dd754-fafc-0310-a699-88a17e54d16e
parent 1c07320a
package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors; package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors;
import java.util.Set;
import org.dom4j.Element; import org.dom4j.Element;
import org.dom4j.Node; import org.dom4j.Node;
import org.jivesoftware.openfire.interceptor.PacketRejectedException; import org.jivesoftware.openfire.interceptor.PacketRejectedException;
...@@ -15,25 +17,23 @@ import org.xmpp.packet.Packet; ...@@ -15,25 +17,23 @@ import org.xmpp.packet.Packet;
* href="http://jkaluza.fedorapeople.org/remote-roster.html#sect-id215516" * href="http://jkaluza.fedorapeople.org/remote-roster.html#sect-id215516"
* >Here</a> * >Here</a>
* *
* @author Holger Bergunde * @author Holger Bergunde <iq id="FSwIU-68" type="set"
<iq id="FSwIU-68" type="set" from="user@example/resource"> * from="user@example/resource"> // <query xmlns="jabber:iq:roster"> //
// <query xmlns="jabber:iq:roster"> * <item jid="123456789@subdomain" name="wulschti" subscription="both">
// <item jid="123456789@subdomain" name="wulschti" subscription="both"> * // <group>General</group> // </item> // </query> // </iq>
// <group>General</group>
// </item>
// </query>
// </iq>
*/ */
public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProcessor { public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProcessor {
private Set<String> watchedSubdomains;
public ClientToComponentUpdateProcessor() { public ClientToComponentUpdateProcessor(Set<String> activeTransports) {
watchedSubdomains = activeTransports;
Log.debug("Created ClientToComponentUpdateProcessor"); Log.debug("Created ClientToComponentUpdateProcessor");
} }
private String searchJIDforSubdomain(String[] valid_subdomains,String jid){ private String searchJIDforSubdomain(String jid) {
for (String s : valid_subdomains){ for (String subdomain : watchedSubdomains) {
if (jid.contains(s)) if (subdomain.contains(jid))
return s; return subdomain;
} }
return ""; return "";
} }
...@@ -43,17 +43,16 @@ public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProces ...@@ -43,17 +43,16 @@ public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProces
Log.debug("Processing packet in ClientToComponentUpdateProcessor"); Log.debug("Processing packet in ClientToComponentUpdateProcessor");
Element query = ((IQ) packet).getChildElement(); Element query = ((IQ) packet).getChildElement();
if (query != null && query.getNamespaceURI().equals("jabber:iq:roster")) {
if (findNodesInDocument(query.getDocument(), "//roster:item").size() > 0) { if (findNodesInDocument(query.getDocument(), "//roster:item").size() > 0) {
// We now know we have to check the JID of the to be added User against our valid subdomains. // We now know we have to check the JID of the to be added User
String[] valid_subdomains = subdomain.split("[#]"); // against our valid subdomains.
for (Node n : findNodesInDocument(query.getDocument(), "//roster:item")) { for (Node n : findNodesInDocument(query.getDocument(), "//roster:item")) {
String jid = n.valueOf("@jid"); String jid = n.valueOf("@jid");
// TODO: We ignore remove iq packets for now. There might be // TODO: We ignore remove iq packets for now. There might be
// conflicts // conflicts
// when we remove our legacy network registration. // when we remove our legacy network registration.
String found_subdomain = searchJIDforSubdomain(valid_subdomains, jid); String found_subdomain = searchJIDforSubdomain(jid);
if (!found_subdomain.isEmpty() && !n.valueOf("@subscription").equals("remove")) { if (!found_subdomain.isEmpty() && !n.valueOf("@subscription").equals("remove")) {
Log.debug("Mirroring packet from local network to legacy component " + found_subdomain); Log.debug("Mirroring packet from local network to legacy component " + found_subdomain);
...@@ -64,5 +63,4 @@ public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProces ...@@ -64,5 +63,4 @@ public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProces
} }
} }
} }
}
} }
...@@ -29,7 +29,7 @@ public class DiscoIQRegisteredProcessor extends AbstractRemoteRosterProcessor { ...@@ -29,7 +29,7 @@ public class DiscoIQRegisteredProcessor extends AbstractRemoteRosterProcessor {
private boolean _isRegistered = false; private boolean _isRegistered = false;
public DiscoIQRegisteredProcessor() { public DiscoIQRegisteredProcessor() {
Log.debug("Created DiscoIQResigteredProcessor"); Log.debug("Created DiscoIQRegisteredProcessor");
} }
@Override @Override
......
package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors; package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors;
import org.dom4j.Element;
import org.dom4j.tree.DefaultElement; import org.dom4j.tree.DefaultElement;
import org.jivesoftware.openfire.PacketRouter; import org.jivesoftware.openfire.PacketRouter;
import org.jivesoftware.openfire.interceptor.PacketRejectedException; import org.jivesoftware.openfire.interceptor.PacketRejectedException;
...@@ -36,12 +35,8 @@ public class IQLastProcessor extends AbstractRemoteRosterProcessor{ ...@@ -36,12 +35,8 @@ public class IQLastProcessor extends AbstractRemoteRosterProcessor{
throws PacketRejectedException { throws PacketRejectedException {
IQ iqpacket = (IQ) packet; IQ iqpacket = (IQ) packet;
Element root = iqpacket.getChildElement();
if (root == null)
return;
String ns = root.getNamespaceURI(); if (iqpacket.getType().equals(IQ.Type.get)) {
if (ns.equals("jabber:iq:last") && iqpacket.getType().equals(IQ.Type.get)) {
Log.debug("Processing IQLast Packet for " + subdomain); Log.debug("Processing IQLast Packet for " + subdomain);
IQ answer = IQ.createResultIQ(iqpacket); IQ answer = IQ.createResultIQ(iqpacket);
answer.setType(IQ.Type.error); answer.setType(IQ.Type.error);
...@@ -59,8 +54,6 @@ public class IQLastProcessor extends AbstractRemoteRosterProcessor{ ...@@ -59,8 +54,6 @@ public class IQLastProcessor extends AbstractRemoteRosterProcessor{
PacketRouter router = _server.getPacketRouter(); PacketRouter router = _server.getPacketRouter();
router.route(answer); router.route(answer);
//There is no need for the Server to process this Package if S2 doesn't support it.
throw new PacketRejectedException();
} }
} }
......
...@@ -49,24 +49,21 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor { ...@@ -49,24 +49,21 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor {
String username = getUsernameFromJid(to); String username = getUsernameFromJid(to);
if (query != null && query.getNamespaceURI().equals("jabber:iq:roster")) { if (query != null && query.getNamespaceURI().equals("jabber:iq:roster")) {
if (myPacket.getType().equals(IQ.Type.get)) { if (myPacket.getType().equals(IQ.Type.get)) {
handleIQget(myPacket,subdomain,username); handleIQget(myPacket, subdomain, username);
} else if (myPacket.getType().equals(IQ.Type.set)) {
handleIQset(myPacket, subdomain, username);
} }
else if (myPacket.getType().equals(IQ.Type.set)) {
handleIQset(myPacket,subdomain,username);
} }
}
} }
private void handleIQget(IQ myPacket, String subdomain, String username) {
private void handleIQget(IQ myPacket, String subdomain, String username){ if (JiveGlobals.getBooleanProperty("plugin.remoteroster.persistent", false)) {
if(JiveGlobals.getBooleanProperty("plugin.remoteroster.persistent", false)){
Roster roster; Roster roster;
try { try {
roster = _rosterManager.getRoster(username); roster = _rosterManager.getRoster(username);
Collection<RosterItem> items = roster.getRosterItems(); Collection<RosterItem> items = roster.getRosterItems();
Log.debug("Sending contacts with subdomain " + subdomain + " from user " +username + " to external Component"); Log.debug("Sending contacts with subdomain " + subdomain + " from user " + username + " to external Component");
sendRosterToComponent(myPacket, items, subdomain); sendRosterToComponent(myPacket, items, subdomain);
} catch (UserNotFoundException e) { } catch (UserNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
...@@ -84,8 +81,7 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor { ...@@ -84,8 +81,7 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor {
Element query = new DefaultElement("query"); Element query = new DefaultElement("query");
for (RosterItem i : items) { for (RosterItem i : items) {
if (i.getJid().toString().contains(subdomain)) { if (i.getJid().toString().contains(subdomain)) {
Log.debug("Roster exchange for external component " + subdomain + ". Sending user " Log.debug("Roster exchange for external component " + subdomain + ". Sending user " + i.getJid().toString());
+ i.getJid().toString());
Element item = new DefaultElement("item", null); Element item = new DefaultElement("item", null);
item.add(new DefaultAttribute("jid", i.getJid().toString())); item.add(new DefaultAttribute("jid", i.getJid().toString()));
item.add(new DefaultAttribute("name", i.getNickname())); item.add(new DefaultAttribute("name", i.getNickname()));
...@@ -104,7 +100,7 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor { ...@@ -104,7 +100,7 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor {
dispatchPacket(response); dispatchPacket(response);
} }
private void sendEmptyRoster(Packet requestPacket, String subdomain){ private void sendEmptyRoster(Packet requestPacket, String subdomain) {
IQ iq = (IQ) requestPacket; IQ iq = (IQ) requestPacket;
IQ response = IQ.createResultIQ(iq); IQ response = IQ.createResultIQ(iq);
response.setTo(subdomain); response.setTo(subdomain);
...@@ -124,11 +120,11 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor { ...@@ -124,11 +120,11 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor {
String jid = n.valueOf("@jid"); String jid = n.valueOf("@jid");
String name = n.valueOf("@name"); String name = n.valueOf("@name");
String subvalue = n.valueOf("@subscription"); String subvalue = n.valueOf("@subscription");
//We dont want to add or delete the subdomain itself // We dont want to add or delete the subdomain itself
if (jid.equals(subdomain)) if (jid.equals(subdomain))
continue; continue;
if(subvalue.equals("both")){ if (subvalue.equals("both")) {
try { try {
roster = _rosterManager.getRoster(username); roster = _rosterManager.getRoster(username);
List<String> grouplist = new ArrayList<String>(); List<String> grouplist = new ArrayList<String>();
...@@ -143,10 +139,10 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor { ...@@ -143,10 +139,10 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor {
RosterItem item = roster.getRosterItem(new JID(jid)); RosterItem item = roster.getRosterItem(new JID(jid));
item.setGroups(grouplist); item.setGroups(grouplist);
roster.updateRosterItem(item); roster.updateRosterItem(item);
//dont send iq-result if just updating user // dont send iq-result if just updating user
continue; continue;
} catch (UserNotFoundException exc) { } catch (UserNotFoundException exc) {
//Then we should add him! // Then we should add him!
} }
RosterItem item = roster.createRosterItem(new JID(jid), name, grouplist, false, rosterPersistent); RosterItem item = roster.createRosterItem(new JID(jid), name, grouplist, false, rosterPersistent);
item.setSubStatus(RosterItem.SUB_BOTH); item.setSubStatus(RosterItem.SUB_BOTH);
...@@ -155,7 +151,7 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor { ...@@ -155,7 +151,7 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor {
Log.debug("Could not add user to Roster although no entry should exist..." + username, e); Log.debug("Could not add user to Roster although no entry should exist..." + username, e);
e.printStackTrace(); e.printStackTrace();
} }
} else if (subvalue.equals("remove")){ } else if (subvalue.equals("remove")) {
try { try {
roster = _rosterManager.getRoster(username); roster = _rosterManager.getRoster(username);
roster.deleteRosterItem(new JID(jid), false); roster.deleteRosterItem(new JID(jid), false);
......
...@@ -10,9 +10,11 @@ import org.xmpp.packet.Packet; ...@@ -10,9 +10,11 @@ import org.xmpp.packet.Packet;
import org.xmpp.packet.Presence; import org.xmpp.packet.Presence;
/** /**
* When this Processor gets called, it deletes all Contacts of a given User that contain a specific subdomain. * When this Processor gets called, it deletes all Contacts of a given User that
* We use this to clean up all Contacts of a Users Gateway registration as soon as he logs out. In this case * contain a specific subdomain. We use this to clean up all Contacts of a Users
* the Transport sends a Unavailable Presence without subtext "Connecting" to the user. * Gateway registration as soon as he logs out. In this case the Transport sends
* a Unavailable Presence without subtext "Connecting" to the user.
*
* @author Holger Bergunde * @author Holger Bergunde
* @author axel.frederik.brand * @author axel.frederik.brand
* *
...@@ -29,7 +31,8 @@ public class NonPersistantRosterProcessor extends AbstractRemoteRosterProcessor ...@@ -29,7 +31,8 @@ public class NonPersistantRosterProcessor extends AbstractRemoteRosterProcessor
@Override @Override
public void process(Packet packet, String subdomain, String to, String from) throws PacketRejectedException { public void process(Packet packet, String subdomain, String to, String from) throws PacketRejectedException {
Presence myPacket = (Presence) packet; Presence myPacket = (Presence) packet;
if (myPacket.getType() != null && myPacket.getType().equals(Presence.Type.unavailable) && !myPacket.getElement().getStringValue().equals("Connecting")) { if (myPacket.getType() != null && myPacket.getType().equals(Presence.Type.unavailable)
&& !myPacket.getElement().getStringValue().equals("Connecting")) {
String username = getUsernameFromJid(to); String username = getUsernameFromJid(to);
Log.debug("Processing packet in NonPersistantRosterProcessor for " + subdomain + "and user " + username); Log.debug("Processing packet in NonPersistantRosterProcessor for " + subdomain + "and user " + username);
......
package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors; package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors;
import java.util.List; import java.util.List;
import java.util.Set;
import org.dom4j.Element; import org.dom4j.Element;
import org.dom4j.Node; import org.dom4j.Node;
...@@ -20,50 +21,39 @@ import org.xmpp.packet.Packet; ...@@ -20,50 +21,39 @@ import org.xmpp.packet.Packet;
* @author Holger Bergunde * @author Holger Bergunde
* @author axel.frederik.brand * @author axel.frederik.brand
*/ */
public class WhitelistProcessor extends AbstractRemoteRosterProcessor{ public class WhitelistProcessor extends AbstractRemoteRosterProcessor {
private PermissionManager _permissions; private PermissionManager _permissions;
private Set<String> watchedSubdomains;
public WhitelistProcessor() { public WhitelistProcessor(Set<String> activeTransports) {
_permissions = new PermissionManager(); _permissions = new PermissionManager();
watchedSubdomains = activeTransports;
Log.debug("Created WhitelistProcessor"); Log.debug("Created WhitelistProcessor");
} }
/** /**
* At this point we already know: * If this is valid disco#items package for this Use-Case we iterate through
* Package is NOT incoming * the nodes and check if we have to remove nodes, this way they are not
* Package is processed * shown to the user receiving this disco#items.
* From is either Empty (it was null) or equals the serverDomain.
* Package is a IQ
* *
* @param subdomain A String containing several watched subdomains separated by [#] * @param subdomain
* not the actual Subdomain here, as we have to use our set.
*/ */
@Override @Override
public void process (Packet packet, String subdomain, String to, String from) throws PacketRejectedException { public void process(Packet packet, String subdomain, String to, String from) throws PacketRejectedException {
IQ myPacket = (IQ) packet; IQ myPacket = (IQ) packet;
Element root = myPacket.getChildElement(); if (myPacket.getType().equals(IQ.Type.result) && (from.isEmpty() || from.equals(_server.getServerInfo().getXMPPDomain()))) {
if (root == null)
return;
String ns = root.getNamespaceURI();
if (ns.equals("http://jabber.org/protocol/disco#items") && myPacket.getType().equals(IQ.Type.result)) {
Log.debug("Processing packet in Whitelistprocessor for " + to); Log.debug("Processing packet in Whitelistprocessor for " + to);
//As some users can be allowed to use only specific Gateways, we have to do this for every subdomain separately Element root = myPacket.getChildElement();
String[] valid_subdomains = subdomain.split("[#]");
for (String single_subdomain : valid_subdomains) {
if (_permissions.isGatewayLimited(single_subdomain) && !_permissions.allowedForUser(single_subdomain, myPacket.getTo())) {
List<Node> nodes = XpathHelper.findNodesInDocument(root.getDocument(), "//discoitems:item"); List<Node> nodes = XpathHelper.findNodesInDocument(root.getDocument(), "//discoitems:item");
for (Node node : nodes) { for (Node node : nodes) {
if (node.valueOf("@jid").equals(single_subdomain)) { String node_domain = node.valueOf("@jid");
if (watchedSubdomains.contains(node_domain)) {
if (_permissions.isGatewayLimited(node_domain) && !_permissions.allowedForUser(node_domain, myPacket.getTo()))
root.remove(node); root.remove(node);
} }
} }
} }
} }
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment