Commit 3d6245b0 authored by Axel Brand's avatar Axel Brand Committed by daeva

-fixed searchJIDforSubdomain

-fixed autologin on persistant mode
-debugging info

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/branches/plugins@13554 b35dd754-fafc-0310-a699-88a17e54d16e
parent 09cac46a
...@@ -51,8 +51,10 @@ GoJara Plugin Changelog ...@@ -51,8 +51,10 @@ GoJara Plugin Changelog
<li>One-Interceptor structure should allow easier Debugging & control of Features</li> <li>One-Interceptor structure should allow easier Debugging & control of Features</li>
<li>We completely ignore Packets with malformed JIDs now, this should cause less Warnings/Errors</li> <li>We completely ignore Packets with malformed JIDs now, this should cause less Warnings/Errors</li>
<li>Freezing the Interceptor on Destroy of the Plugin should make GoJara properly shutdown and not cause trouble on reload/update</li> <li>Freezing the Interceptor on Destroy of the Plugin should make GoJara properly shutdown and not cause trouble on reload/update</li>
<li>Optimized Processors have better performance</li> <li>Optimized Processors to have better performance</li>
<li>Reject iq:roster packets with item jid=subdomain as they will throw errors on register:remove</li> <li>Reject iq:roster packets with item jid=subdomain as they will throw errors on register:remove</li>
<li>Stopped OF from sending Presence Packets to users of legacy roster, this was leading to OF automatically logging you into S2 if you were registered,
even if you did not check "Autologin" (only when persistant = true).</li>
</ul> </ul>
......
package org.jivesoftware.openfire.plugin.gojara.base; package org.jivesoftware.openfire.plugin.gojara.base;
import java.io.File; import java.io.File;
//import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
//import java.util.Map;
import java.util.Set; import java.util.Set;
import org.dom4j.Document; import org.dom4j.Document;
import org.dom4j.Element; import org.dom4j.Element;
import org.dom4j.Node; import org.dom4j.Node;
//import org.jivesoftware.openfire.SessionManager;
import org.jivesoftware.openfire.component.ComponentEventListener; import org.jivesoftware.openfire.component.ComponentEventListener;
import org.jivesoftware.openfire.component.InternalComponentManager; import org.jivesoftware.openfire.component.InternalComponentManager;
import org.jivesoftware.openfire.container.Plugin; import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager; import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.interceptor.InterceptorManager; import org.jivesoftware.openfire.interceptor.InterceptorManager;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.MainInterceptor; import org.jivesoftware.openfire.plugin.gojara.messagefilter.MainInterceptor;
//import org.jivesoftware.openfire.plugin.gojara.messagefilter.handler.AbstractInterceptorHandler;
//import org.jivesoftware.openfire.plugin.gojara.messagefilter.handler.GatewayInterceptorHandler;
import org.jivesoftware.openfire.plugin.gojara.utils.XpathHelper; import org.jivesoftware.openfire.plugin.gojara.utils.XpathHelper;
//import org.jivesoftware.openfire.session.ComponentSession;
import org.jivesoftware.util.JiveGlobals; import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.PropertyEventDispatcher; import org.jivesoftware.util.PropertyEventDispatcher;
import org.jivesoftware.util.PropertyEventListener; import org.jivesoftware.util.PropertyEventListener;
...@@ -55,12 +49,12 @@ public class RemoteRosterPlugin implements Plugin { ...@@ -55,12 +49,12 @@ public class RemoteRosterPlugin implements Plugin {
public void initializePlugin(PluginManager manager, File pluginDirectory) { public void initializePlugin(PluginManager manager, File pluginDirectory) {
Log.debug("Starting RemoteRoster Plugin"); Log.info("Starting RemoteRoster Plugin");
pluginManager = manager; pluginManager = manager;
iManager.addInterceptor(mainInterceptor); iManager.addInterceptor(mainInterceptor);
manageExternalComponents(); manageExternalComponents();
listenToSettings(); listenToSettings();
Log.debug("Started Gojara successfully. Currently running interceptors: "+iManager.getInterceptors().size()); Log.info("Started Gojara successfully. Currently running interceptors: "+iManager.getInterceptors().size());
} }
/* /*
...@@ -132,11 +126,12 @@ public class RemoteRosterPlugin implements Plugin { ...@@ -132,11 +126,12 @@ public class RemoteRosterPlugin implements Plugin {
} }
public void destroyPlugin() { public void destroyPlugin() {
Log.info("Destroying GoJara");
mainInterceptor.freeze(); mainInterceptor.freeze();
iManager.removeInterceptor(mainInterceptor); iManager.removeInterceptor(mainInterceptor);
PropertyEventDispatcher.removeListener(_settingsObserver); PropertyEventDispatcher.removeListener(_settingsObserver);
pluginManager = null; pluginManager = null;
mainInterceptor = null;
} }
private void updateInterceptors(String componentJID) { private void updateInterceptors(String componentJID) {
......
...@@ -8,15 +8,22 @@ import org.dom4j.Element; ...@@ -8,15 +8,22 @@ import org.dom4j.Element;
import org.jivesoftware.openfire.XMPPServer; import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.interceptor.PacketInterceptor; import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException; import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.*; import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.AbstractRemoteRosterProcessor;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.ClientToComponentUpdateProcessor;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.DiscoIQRegisteredProcessor;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.IQLastProcessor;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.IQRosterPayloadProcessor;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.NonPersistantRosterProcessor;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.StatisticsProcessor;
import org.jivesoftware.openfire.plugin.gojara.messagefilter.processors.WhitelistProcessor;
import org.jivesoftware.openfire.roster.RosterManager; import org.jivesoftware.openfire.roster.RosterManager;
import org.jivesoftware.openfire.session.Session; import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.util.ConcurrentHashSet; import org.jivesoftware.util.ConcurrentHashSet;
import org.jivesoftware.util.JiveGlobals; import org.jivesoftware.util.JiveGlobals;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.xmpp.packet.Packet;
import org.xmpp.packet.IQ; import org.xmpp.packet.IQ;
import org.xmpp.packet.Packet;
import org.xmpp.packet.Presence; import org.xmpp.packet.Presence;
public class MainInterceptor implements PacketInterceptor { public class MainInterceptor implements PacketInterceptor {
...@@ -27,25 +34,25 @@ public class MainInterceptor implements PacketInterceptor { ...@@ -27,25 +34,25 @@ public class MainInterceptor implements PacketInterceptor {
private Boolean frozen; private Boolean frozen;
public MainInterceptor() { public MainInterceptor() {
Log.info("Started MainInterceptor for GoJara Plugin."); Log.info("Created MainInterceptor for GoJara Plugin.");
XMPPServer server = XMPPServer.getInstance(); XMPPServer server = XMPPServer.getInstance();
RosterManager rosterMananger = server.getRosterManager(); RosterManager rosterMananger = server.getRosterManager();
AbstractRemoteRosterProcessor iqRegistered = new DiscoIQRegisteredProcessor(); AbstractRemoteRosterProcessor iqRegisteredProcessor = new DiscoIQRegisteredProcessor();
AbstractRemoteRosterProcessor iqRosterPayload = new IQRosterPayloadProcessor(rosterMananger); AbstractRemoteRosterProcessor iqRosterPayloadProcessor = new IQRosterPayloadProcessor(rosterMananger);
AbstractRemoteRosterProcessor nonPersistant = new NonPersistantRosterProcessor(rosterMananger); AbstractRemoteRosterProcessor nonPersistantProcessor = new NonPersistantRosterProcessor(rosterMananger);
AbstractRemoteRosterProcessor statisticsProcessor = new StatisticsProcessor(); AbstractRemoteRosterProcessor statisticsProcessor = new StatisticsProcessor();
AbstractRemoteRosterProcessor iqLastProcessor = new IQLastProcessor(); AbstractRemoteRosterProcessor iqLastProcessor = new IQLastProcessor();
AbstractRemoteRosterProcessor updateToComponent = new ClientToComponentUpdateProcessor(activeTransports); AbstractRemoteRosterProcessor updateToComponentProcessor = new ClientToComponentUpdateProcessor(activeTransports);
AbstractRemoteRosterProcessor whitelistProcessor = new WhitelistProcessor(activeTransports); AbstractRemoteRosterProcessor whitelistProcessor = new WhitelistProcessor(activeTransports);
// AbstractRemoteRosterProcessor mucblockProcessor = new // AbstractRemoteRosterProcessor mucblockProcessor = new
// MUCBlockProcessor(); // MucBlockProcessor();
packetProcessors.put("sparkIQRegistered", iqRegistered); packetProcessors.put("sparkIQRegistered", iqRegisteredProcessor);
packetProcessors.put("iqRosterPayload", iqRosterPayload); packetProcessors.put("iqRosterPayload", iqRosterPayloadProcessor);
packetProcessors.put("handleNonPersistant", nonPersistant); packetProcessors.put("handleNonPersistant", nonPersistantProcessor);
packetProcessors.put("statisticsProcessor", statisticsProcessor); packetProcessors.put("statisticsProcessor", statisticsProcessor);
packetProcessors.put("iqLastProcessor", iqLastProcessor); packetProcessors.put("iqLastProcessor", iqLastProcessor);
packetProcessors.put("clientToComponentUpdate", updateToComponent); packetProcessors.put("clientToComponentUpdate", updateToComponentProcessor);
packetProcessors.put("whitelistProcessor", whitelistProcessor); packetProcessors.put("whitelistProcessor", whitelistProcessor);
// packetProcessors.put("mucblockProcessor", mucblockProcessor); // packetProcessors.put("mucblockProcessor", mucblockProcessor);
...@@ -82,7 +89,7 @@ public class MainInterceptor implements PacketInterceptor { ...@@ -82,7 +89,7 @@ public class MainInterceptor implements PacketInterceptor {
private String searchJIDforSubdomain(String jid) { private String searchJIDforSubdomain(String jid) {
if (!jid.isEmpty()) { if (!jid.isEmpty()) {
for (String subdomain : activeTransports) { for (String subdomain : activeTransports) {
if (subdomain.contains(jid)) if (jid.contains(subdomain))
return subdomain; return subdomain;
} }
} }
...@@ -134,8 +141,8 @@ public class MainInterceptor implements PacketInterceptor { ...@@ -134,8 +141,8 @@ public class MainInterceptor implements PacketInterceptor {
packetProcessors.get("iqRosterPayload").process(packet, from, to, from); packetProcessors.get("iqRosterPayload").process(packet, from, to, from);
} }
// Disco#Info - check for register processing // Disco#Info - check for register processing
else if (query.getNamespaceURI().equals("http://jabber.org/protocol/disco#info") && !to.isEmpty() && activeTransports.contains(to) else if (query.getNamespaceURI().equals("http://jabber.org/protocol/disco#info") && !to.isEmpty()
&& iqPacket.getType().equals(IQ.Type.get)) { && activeTransports.contains(to) && iqPacket.getType().equals(IQ.Type.get)) {
packetProcessors.get("sparkIQRegistered").process(packet, to, to, from); packetProcessors.get("sparkIQRegistered").process(packet, to, to, from);
} }
...@@ -183,6 +190,13 @@ public class MainInterceptor implements PacketInterceptor { ...@@ -183,6 +190,13 @@ public class MainInterceptor implements PacketInterceptor {
// && !from.isEmpty() && activeTransports.contains(from)) // && !from.isEmpty() && activeTransports.contains(from))
// packetProcessors.get("mucblockProcessor").process(packet, // packetProcessors.get("mucblockProcessor").process(packet,
// from, to, from); // from, to, from);
} else if (packet instanceof Presence) {
// We block Presences to users of a subdomain so OF/S2 wont log you
// in automatically if you have a
// subdomain user in your roster
String to_s = searchJIDforSubdomain(to);
if (!to_s.isEmpty() && !activeTransports.contains(to))
throw new PacketRejectedException();
} }
} }
} }
......
...@@ -40,7 +40,7 @@ public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProces ...@@ -40,7 +40,7 @@ public class ClientToComponentUpdateProcessor extends AbstractRemoteRosterProces
@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 {
Log.debug("Processing packet in ClientToComponentUpdateProcessor"); Log.debug("Processing packet in ClientToComponentUpdateProcessor: " + packet.toString());
Element query = ((IQ) packet).getChildElement(); Element query = ((IQ) packet).getChildElement();
......
...@@ -45,8 +45,7 @@ public class DiscoIQRegisteredProcessor extends AbstractRemoteRosterProcessor { ...@@ -45,8 +45,7 @@ public class DiscoIQRegisteredProcessor extends AbstractRemoteRosterProcessor {
final InterceptorManager interceptorManager = InterceptorManager.getInstance(); final InterceptorManager interceptorManager = InterceptorManager.getInstance();
final PacketInterceptor interceptor = new PacketInterceptor() { final PacketInterceptor interceptor = new PacketInterceptor() {
public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) throws PacketRejectedException {
throws PacketRejectedException {
if (!processed && incoming) { if (!processed && incoming) {
if (packet instanceof IQ) { if (packet instanceof IQ) {
IQ iqPacket = (IQ) packet; IQ iqPacket = (IQ) packet;
...@@ -59,8 +58,7 @@ public class DiscoIQRegisteredProcessor extends AbstractRemoteRosterProcessor { ...@@ -59,8 +58,7 @@ public class DiscoIQRegisteredProcessor extends AbstractRemoteRosterProcessor {
// Check if we are already registered // Check if we are already registered
setRegistered(iqPacket.toString().contains("<registered/>")); setRegistered(iqPacket.toString().contains("<registered/>"));
throw new PacketRejectedException(); throw new PacketRejectedException();
} else if (iqPacket.getType().equals(IQ.Type.result) } else if (iqPacket.getType().equals(IQ.Type.result) && ns.equals("http://jabber.org/protocol/disco#info")
&& ns.equals("http://jabber.org/protocol/disco#info")
&& iqPacket.getFrom().toString().equals(subdomain)) { && iqPacket.getFrom().toString().equals(subdomain)) {
/* /*
......
...@@ -37,7 +37,7 @@ public class IQLastProcessor extends AbstractRemoteRosterProcessor{ ...@@ -37,7 +37,7 @@ public class IQLastProcessor extends AbstractRemoteRosterProcessor{
IQ iqpacket = (IQ) packet; IQ iqpacket = (IQ) packet;
if (iqpacket.getType().equals(IQ.Type.get)) { if (iqpacket.getType().equals(IQ.Type.get)) {
Log.debug("Processing IQLast Packet for " + subdomain); Log.debug("Processing IQLast Packet for " + subdomain + " : " + packet.toString());
IQ answer = IQ.createResultIQ(iqpacket); IQ answer = IQ.createResultIQ(iqpacket);
answer.setType(IQ.Type.error); answer.setType(IQ.Type.error);
......
...@@ -42,11 +42,11 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor { ...@@ -42,11 +42,11 @@ public class IQRosterPayloadProcessor 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 {
Log.debug("Processing packet in SendRosterProcessor for " + subdomain); Log.debug("Processing packet in IQRosterPayloadProcessor for " + subdomain + " : " + packet.toString());
IQ myPacket = (IQ) packet; IQ myPacket = (IQ) packet;
String username = getUsernameFromJid(to); String username = getUsernameFromJid(to);
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)) { } else if (myPacket.getType().equals(IQ.Type.set)) {
...@@ -118,8 +118,10 @@ public class IQRosterPayloadProcessor extends AbstractRemoteRosterProcessor { ...@@ -118,8 +118,10 @@ 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, so we have to reject that packet, it seems openfire itself // We dont want to add or delete the subdomain itself, so we have to
// can interpret the iq:roster remove stanzas in some way, this was causing trouble on register:remove // reject that packet, it seems openfire itself
// can interpret the iq:roster remove stanzas in some way, this was
// causing trouble on register:remove
if (jid.equals(subdomain)) if (jid.equals(subdomain))
throw new PacketRejectedException(); throw new PacketRejectedException();
......
...@@ -12,36 +12,34 @@ import org.xmpp.packet.Packet; ...@@ -12,36 +12,34 @@ import org.xmpp.packet.Packet;
/** /**
* *
* @author axel.frederik.brand * @author axel.frederik.brand
* *
*/ */
public class MUCBlockProcessor extends AbstractRemoteRosterProcessor { public class MUCBlockProcessor extends AbstractRemoteRosterProcessor {
public MUCBlockProcessor() { public MUCBlockProcessor() {
Log.info("Created MUCBlockProcessor"); Log.info("Created MUCBlockProcessor");
} }
/** /**
* At this Point we know: * At this Point we know: MucBlock = true, !incoming, !processed Package is
* MucBlock = true, * IQ with Namespace disco#info, from equals the watched subdomain given
* !incoming, !processed * through subdomain
* Package is IQ with Namespace disco#info,
* from equals the watched subdomain given through subdomain
*/ */
@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 iqPacket = (IQ) packet; IQ iqPacket = (IQ) packet;
if (iqPacket.getType().equals(IQ.Type.result) && !to.isEmpty()) { if (iqPacket.getType().equals(IQ.Type.result) && !to.isEmpty()) {
Element root = iqPacket.getChildElement(); Element root = iqPacket.getChildElement();
List<Node> nodes = XpathHelper.findNodesInDocument(root.getDocument(), "//discoinfo:feature"); List<Node> nodes = XpathHelper.findNodesInDocument(root.getDocument(), "//discoinfo:feature");
for (Node node : nodes) { for (Node node : nodes) {
String var = node.valueOf("@var"); String var = node.valueOf("@var");
if (var.equals("http://jabber.org/protocol/muc")) if (var.equals("http://jabber.org/protocol/muc"))
root.remove(node); root.remove(node);
} }
} }
} }
......
...@@ -34,7 +34,8 @@ public class NonPersistantRosterProcessor extends AbstractRemoteRosterProcessor ...@@ -34,7 +34,8 @@ public class NonPersistantRosterProcessor extends AbstractRemoteRosterProcessor
if (myPacket.getType() != null && myPacket.getType().equals(Presence.Type.unavailable) if (myPacket.getType() != null && myPacket.getType().equals(Presence.Type.unavailable)
&& !myPacket.getElement().getStringValue().equals("Connecting")) { && !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 + " Packet: "
+ packet.toString());
try { try {
Roster roster = _rosterManager.getRoster(username); Roster roster = _rosterManager.getRoster(username);
......
...@@ -43,7 +43,8 @@ public class WhitelistProcessor extends AbstractRemoteRosterProcessor { ...@@ -43,7 +43,8 @@ public class WhitelistProcessor extends AbstractRemoteRosterProcessor {
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;
if (myPacket.getType().equals(IQ.Type.result) && (from.isEmpty() || from.equals(_server.getServerInfo().getXMPPDomain()))) { if (myPacket.getType().equals(IQ.Type.result) && (from.isEmpty() || from.equals(_server.getServerInfo().getXMPPDomain()))) {
Log.debug("Processing packet in Whitelistprocessor for " + to);
Log.debug("Processing packet in Whitelistprocessor for " + to + "Packet: " + packet.toString());
Element root = myPacket.getChildElement(); Element root = myPacket.getChildElement();
List<Node> nodes = XpathHelper.findNodesInDocument(root.getDocument(), "//discoitems:item"); List<Node> nodes = XpathHelper.findNodesInDocument(root.getDocument(), "//discoitems:item");
......
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