Skip to content

Commit

Permalink
OF-874 disco#items request SHOULD return connected or available resou…
Browse files Browse the repository at this point in the history
…rces
  • Loading branch information
sco0ter committed Feb 3, 2015
1 parent 9c69db3 commit 9c904ce
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 2 deletions.
55 changes: 54 additions & 1 deletion src/java/org/jivesoftware/openfire/SessionManager.java
Expand Up @@ -22,6 +22,7 @@

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
Expand All @@ -32,13 +33,19 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;

import org.dom4j.Element;
import org.jivesoftware.openfire.audit.AuditStreamIDFactory;
import org.jivesoftware.openfire.auth.AuthToken;
import org.jivesoftware.openfire.auth.UnauthorizedException;
import org.jivesoftware.openfire.cluster.ClusterEventListener;
import org.jivesoftware.openfire.cluster.ClusterManager;
import org.jivesoftware.openfire.component.InternalComponentManager;
import org.jivesoftware.openfire.container.BasicModule;
import org.jivesoftware.openfire.disco.DiscoInfoProvider;
import org.jivesoftware.openfire.disco.DiscoItem;
import org.jivesoftware.openfire.disco.DiscoItemsProvider;
import org.jivesoftware.openfire.disco.DiscoServerItem;
import org.jivesoftware.openfire.disco.ServerItemsProvider;
import org.jivesoftware.openfire.event.SessionEventDispatcher;
import org.jivesoftware.openfire.http.HttpConnection;
import org.jivesoftware.openfire.http.HttpSession;
Expand All @@ -60,12 +67,15 @@
import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.openfire.spi.BasicStreamIDFactory;
import org.jivesoftware.openfire.user.UserManager;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.Log;
import org.jivesoftware.util.cache.Cache;
import org.jivesoftware.util.cache.CacheFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.forms.DataForm;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
Expand All @@ -78,7 +88,7 @@
*
* @author Derek DeMoro
*/
public class SessionManager extends BasicModule implements ClusterEventListener {
public class SessionManager extends BasicModule implements ClusterEventListener, ServerItemsProvider, DiscoInfoProvider, DiscoItemsProvider {

private static final Logger Log = LoggerFactory.getLogger(SessionManager.class);

Expand Down Expand Up @@ -1162,6 +1172,48 @@ public void setConflictKickLimit(int limit) {
JiveGlobals.setProperty("xmpp.session.conflict-limit", Integer.toString(conflictLimit));
}

@Override
public Iterator<DiscoServerItem> getItems() {
return Arrays.asList(new DiscoServerItem(serverAddress, null, null, null, this, this)).iterator();
}

@Override
public Iterator<Element> getIdentities(String name, String node, JID senderJID) {
return Collections.emptyIterator();
}

@Override
public Iterator<String> getFeatures(String name, String node, JID senderJID) {
return Collections.emptyIterator();
}

@Override
public DataForm getExtendedInfo(String name, String node, JID senderJID) {
return null;
}

@Override
public boolean hasInfo(String name, String node, JID senderJID) {
return false;
}

@Override
public Iterator<DiscoItem> getItems(String name, String node, JID senderJID) {
try {
// If the requesting entity is the user itself or the sender or the requesting entity can probe the presence of the user.
if (server.getUserManager().isRegisteredUser(senderJID) && name.equals(senderJID.getNode()) || server.getPresenceManager().canProbePresence(senderJID, name)) {
Collection<DiscoItem> discoItems = new ArrayList<DiscoItem>();
for (ClientSession clientSession : getSessions(name)) {
discoItems.add(new DiscoItem(clientSession.getAddress(), null, null, null));
}
return discoItems.iterator();
}
return Collections.emptyIterator();
} catch (UserNotFoundException e) {
return Collections.emptyIterator();
}
}

private class ClientSessionListener implements ConnectionCloseListener {
/**
* Handle a session that just closed.
Expand Down Expand Up @@ -1320,6 +1372,7 @@ public void initialize(XMPPServer server) {
sessionInfoCache = CacheFactory.createCache(C2S_INFO_CACHE_NAME);
// Listen to cluster events
ClusterManager.addListener(this);
server.getIQDiscoItemsHandler().addServerItemsProvider(this);
}


Expand Down
3 changes: 2 additions & 1 deletion src/java/org/jivesoftware/openfire/XMPPServer.java
Expand Up @@ -540,7 +540,6 @@ private void loadModules() {
loadModule(PrivateStorage.class.getName());
// Load core modules
loadModule(PresenceManagerImpl.class.getName());
loadModule(SessionManager.class.getName());
loadModule(PacketRouterImpl.class.getName());
loadModule(IQRouter.class.getName());
loadModule(MessageRouter.class.getName());
Expand Down Expand Up @@ -580,6 +579,8 @@ private void loadModules() {
loadModule(PubSubModule.class.getName());
loadModule(IQDiscoInfoHandler.class.getName());
loadModule(IQDiscoItemsHandler.class.getName());
// SessionManager registers to IQDiscoItemsHandler, therefore load it after it.
loadModule(SessionManager.class.getName());
loadModule(UpdateManager.class.getName());
loadModule(FlashCrossDomainHandler.class.getName());
loadModule(InternalComponentManager.class.getName());
Expand Down

0 comments on commit 9c904ce

Please sign in to comment.