Commit 2926ff84 authored by Tom Evans's avatar Tom Evans Committed by tevans

OF-205: Simplify pubsub roster access model to match XEP-0060 specs

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/trunk@13359 b35dd754-fafc-0310-a699-88a17e54d16e
parent 27694d60
...@@ -20,8 +20,7 @@ ...@@ -20,8 +20,7 @@
package org.jivesoftware.openfire.pubsub.models; package org.jivesoftware.openfire.pubsub.models;
import java.util.ArrayList; import java.util.Collection;
import java.util.List;
import org.dom4j.DocumentHelper; import org.dom4j.DocumentHelper;
import org.dom4j.Element; import org.dom4j.Element;
...@@ -29,9 +28,6 @@ import org.dom4j.QName; ...@@ -29,9 +28,6 @@ import org.dom4j.QName;
import org.jivesoftware.openfire.XMPPServer; import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.group.Group; import org.jivesoftware.openfire.group.Group;
import org.jivesoftware.openfire.pubsub.Node; import org.jivesoftware.openfire.pubsub.Node;
import org.jivesoftware.openfire.roster.Roster;
import org.jivesoftware.openfire.roster.RosterItem;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.xmpp.packet.JID; import org.xmpp.packet.JID;
...@@ -50,48 +46,34 @@ public class RosterAccess extends AccessModel { ...@@ -50,48 +46,34 @@ public class RosterAccess extends AccessModel {
} }
@Override @Override
public boolean canSubscribe(Node node, JID owner, JID subscriber) { public boolean canSubscribe(Node node, JID subscriber, JID subJID) {
// Let node owners and sysadmins always subcribe to the node // Let node owners and sysadmins always subscribe to the node
if (node.isAdmin(owner)) { if (node.isAdmin(subscriber)) {
return true; return true;
} }
XMPPServer server = XMPPServer.getInstance();
for (JID nodeOwner : node.getOwners()) { for (JID nodeOwner : node.getOwners()) {
// Give access to the owner of the roster :) if (nodeOwner.equals(subscriber)) {
if (nodeOwner.equals(owner.toBareJID())) {
return true; return true;
} }
// Check that the node owner is a local user }
if (server.isLocal(nodeOwner)) { // Check that the subscriber is a local user
try { XMPPServer server = XMPPServer.getInstance();
Roster roster = server.getRosterManager().getRoster(nodeOwner.getNode()); if (server.isLocal(subscriber)) {
RosterItem item = roster.getRosterItem(owner); Collection<String> nodeGroups = node.getRosterGroupsAllowed();
// Check that the subscriber is subscribed to the node owner's presence for (Group group : server.getRosterManager().getSharedGroups(subscriber.getNode())) {
boolean isSubscribed = item != null && ( if (nodeGroups.contains(group.getName())) {
RosterItem.SUB_BOTH == item.getSubStatus() || if (Log.isDebugEnabled()) {
RosterItem.SUB_FROM == item.getSubStatus()); Log.debug("Subscriber (" + subscriber +
if (isSubscribed) { ") is a member of node group " + group.getName());
// Get list of groups where the contact belongs }
List<String> contactGroups = new ArrayList<String>(item.getGroups()); return true;
for (Group group : item.getSharedGroups()) { }
contactGroups.add(group.getName()); }
} }
for (Group group : item.getInvisibleSharedGroups()) { else {
contactGroups.add(group.getName()); // Subscriber is a remote user. This should never happen.
} Log.warn("Node with access model Roster has a remote user as subscriber: " +
// Check if subscriber is present in the allowed groups of the node node.getNodeID());
return contactGroups.removeAll(node.getRosterGroupsAllowed());
}
}
catch (UserNotFoundException e) {
// Do nothing
}
}
else {
// Owner of the node is a remote user. This should never happen.
Log.warn("Node with access model Roster has a remote user as owner: " +
node.getNodeID());
}
} }
return false; return false;
} }
......
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