diff --git a/config/alfresco/web-publishing-context.xml b/config/alfresco/web-publishing-context.xml
index 71a4d0e90f..daa5a314b6 100644
--- a/config/alfresco/web-publishing-context.xml
+++ b/config/alfresco/web-publishing-context.xml
@@ -55,6 +55,7 @@
+
diff --git a/config/test/alfresco/test-web-publishing-context.xml b/config/test/alfresco/test-web-publishing-context.xml
index 2d74757cb3..1e5cd4f5e5 100644
--- a/config/test/alfresco/test-web-publishing-context.xml
+++ b/config/test/alfresco/test-web-publishing-context.xml
@@ -95,6 +95,11 @@
+
+
+
+
+
diff --git a/source/java/org/alfresco/repo/publishing/AbstractPublishingIntegrationTest.java b/source/java/org/alfresco/repo/publishing/AbstractPublishingIntegrationTest.java
index 7daaf08b37..e1b18ebd26 100644
--- a/source/java/org/alfresco/repo/publishing/AbstractPublishingIntegrationTest.java
+++ b/source/java/org/alfresco/repo/publishing/AbstractPublishingIntegrationTest.java
@@ -94,6 +94,7 @@ public abstract class AbstractPublishingIntegrationTest extends BaseSpringTest
@After
public void onTearDown() throws Exception
{
+ AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
siteService.deleteSite(siteId);
try
{
diff --git a/source/java/org/alfresco/repo/publishing/ChannelHelper.java b/source/java/org/alfresco/repo/publishing/ChannelHelper.java
index 8a3f97c827..5f73b554b0 100644
--- a/source/java/org/alfresco/repo/publishing/ChannelHelper.java
+++ b/source/java/org/alfresco/repo/publishing/ChannelHelper.java
@@ -50,6 +50,8 @@ import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.security.AccessStatus;
+import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
@@ -69,6 +71,7 @@ public class ChannelHelper
private NodeService nodeService;
private DictionaryService dictionaryService;
private FileFolderService fileFolderService;
+ private PermissionService permissionService;
public ChannelHelper()
{
@@ -89,12 +92,16 @@ public class ChannelHelper
ChildAssociationRef channelAssoc =
nodeService.createNode(parent, ASSOC_CONTAINS, channelQName, channelNodeType, props);
NodeRef channelNode = channelAssoc.getChildRef();
+ // Allow any user to read Channel permissions.
+ permissionService.setPermission(channelNode, PermissionService.ALL_AUTHORITIES, PermissionService.READ_PERMISSIONS, true);
return channelNode;
}
public Channel buildChannelObject(NodeRef nodeRef, ChannelService channelService)
{
- if(nodeRef == null || nodeService.exists(nodeRef)==false)
+ if(nodeRef == null ||
+ nodeService.exists(nodeRef)==false ||
+ permissionService.hasPermission(nodeRef, PermissionService.ADD_CHILDREN)!= AccessStatus.ALLOWED)
{
return null;
}
@@ -339,6 +346,16 @@ public class ChannelHelper
};
}
+ public boolean isChannelAuthorised(NodeRef channelNode)
+ {
+ Boolean isAuthorised = Boolean.FALSE;
+ if (nodeService.exists(channelNode))
+ {
+ isAuthorised = (Boolean)nodeService.getProperty(channelNode, PublishingModel.PROP_AUTHORISATION_COMPLETE);
+ }
+ return isAuthorised;
+ }
+
/**
* @param nodeService the nodeService to set
*/
@@ -363,13 +380,12 @@ public class ChannelHelper
this.fileFolderService = fileFolderService;
}
- public boolean isChannelAuthorised(NodeRef channelNode)
+ /**
+ * @param permissionService the permissionService to set
+ */
+ public void setPermissionService(PermissionService permissionService)
{
- Boolean isAuthorised = Boolean.FALSE;
- if (nodeService.exists(channelNode))
- {
- isAuthorised = (Boolean)nodeService.getProperty(channelNode, PublishingModel.PROP_AUTHORISATION_COMPLETE);
- }
- return isAuthorised;
+ this.permissionService = permissionService;
}
+
}
diff --git a/source/java/org/alfresco/repo/publishing/ChannelServiceImplIntegratedTest.java b/source/java/org/alfresco/repo/publishing/ChannelServiceImplIntegratedTest.java
index e7e86142b1..e3e16b0847 100644
--- a/source/java/org/alfresco/repo/publishing/ChannelServiceImplIntegratedTest.java
+++ b/source/java/org/alfresco/repo/publishing/ChannelServiceImplIntegratedTest.java
@@ -31,10 +31,19 @@ import java.util.Set;
import javax.annotation.Resource;
import org.alfresco.model.ContentModel;
+import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.repo.security.person.TestPersonManager;
+import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.publishing.channels.Channel;
import org.alfresco.service.cmr.publishing.channels.ChannelType;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.security.MutableAuthenticationService;
+import org.alfresco.service.cmr.security.PermissionService;
+import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.GUID;
+import org.alfresco.util.collections.CollectionUtils;
+import org.alfresco.util.collections.Filter;
import org.junit.Before;
import org.junit.Test;
@@ -44,32 +53,17 @@ import org.junit.Test;
*/
public class ChannelServiceImplIntegratedTest extends AbstractPublishingIntegrationTest
{
- private static final String channelName = "Test Channel - Name";
+ private static final String channelName = GUID.generate();
private static final String channelTypeName = "MockedChannelType";
private static boolean channelTypeRegistered = false;
@Resource(name="channelService")
private ChannelServiceImpl channelService;
-
+ private PermissionService permissionService;
+ private TestPersonManager personManager;
+
private ChannelType mockedChannelType = mock(ChannelType.class);
- @Before
- @Override
- public void onSetUp() throws Exception
- {
- super.onSetUp();
- channelService = (ChannelServiceImpl) getApplicationContext().getBean("channelService");
- when(mockedChannelType.getId()).thenReturn(channelTypeName);
- when(mockedChannelType.getChannelNodeType()).thenReturn(PublishingModel.TYPE_DELIVERY_CHANNEL);
-
- if (!channelTypeRegistered)
- {
- channelService.register(mockedChannelType);
- channelTypeRegistered = true;
- }
-
- }
-
@Test
public void testCreateChannel() throws Exception
{
@@ -143,6 +137,51 @@ public class ChannelServiceImplIntegratedTest extends AbstractPublishingIntegrat
}
}
+ @Test
+ public void testGetChannelsPermissions() throws Exception
+ {
+ // Create Channel as Admin user.
+ Channel channel = createChannel();
+ NodeRef channelNode = new NodeRef(channel.getId());
+
+ // Create User1 and set as FullyAuthenticatedUser.
+ String user1 = GUID.generate();
+ personManager.createPerson(user1);
+ personManager.setUser(user1);
+
+ // User1 should not have access to Channel.
+ Channel channelById = channelService.getChannelById(channel.getId());
+ assertNull("User1 should not have access to the channel!", channelById);
+ List channels = channelService.getChannels();
+ assertFalse("Result of getChannels() should not contain the channel!", checkContainsChannel(channel.getId(), channels));
+
+ // Set authentication to Admin
+ AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
+ //Add Read permissions to User1.
+ permissionService.setPermission(channelNode, user1, PermissionService.READ, true);
+ // Set authentication to User1
+ personManager.setUser(user1);
+
+ // Read permissions should not allow access to the Channel.
+ channelById = channelService.getChannelById(channel.getId());
+ assertNull("User1 should not have access to the channel!", channelById);
+ channels = channelService.getChannels();
+ assertFalse("Result of getChannels() should not contain the channel!", checkContainsChannel(channel.getId(), channels));
+
+ // Set authentication to Admin
+ AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
+ //Add ADD_CHILD permissions to User1.
+ permissionService.setPermission(channelNode, user1, PermissionService.ADD_CHILDREN, true);
+ // Set authentication to User1
+ personManager.setUser(user1);
+
+ // Add Child permissions should allow access to the Channel.
+ channelById = channelService.getChannelById(channel.getId());
+ assertNotNull("User1 should have access to the channel!", channelById);
+ channels = channelService.getChannels();
+ assertTrue("Result of getChannels() should contain the channel!", checkContainsChannel(channel.getId(), channels));
+ }
+
@Test
public void testGetChannel() throws Exception
{
@@ -166,11 +205,66 @@ public class ChannelServiceImplIntegratedTest extends AbstractPublishingIntegrat
assertEquals(createdChannel.getNodeRef(), channel.getNodeRef());
}
- /**
- * @return
- */
+ private boolean checkContainsChannel(final String id, List channels)
+ {
+ Filter acceptor = new Filter()
+ {
+ public Boolean apply(Channel value)
+ {
+ return id.equals(value.getId());
+ }
+ };
+ Channel result = CollectionUtils.findFirst(channels, acceptor);
+ return result != null;
+ }
+
private Channel createChannel()
{
return channelService.createChannel(channelTypeName, channelName, null);
}
+
+
+ @Before
+ @Override
+ public void onSetUp() throws Exception
+ {
+ super.onSetUp();
+ this.channelService = (ChannelServiceImpl) getApplicationContext().getBean("channelService");
+ this.permissionService = (PermissionService) getApplicationContext().getBean(ServiceRegistry.PERMISSIONS_SERVICE.getLocalName());
+ MutableAuthenticationService authenticationService= (MutableAuthenticationService) getApplicationContext().getBean(ServiceRegistry.AUTHENTICATION_SERVICE.getLocalName());
+ PersonService personService= (PersonService) getApplicationContext().getBean(ServiceRegistry.PERSON_SERVICE.getLocalName());
+
+ this.personManager = new TestPersonManager(authenticationService, personService, nodeService);
+
+ when(mockedChannelType.getId()).thenReturn(channelTypeName);
+ when(mockedChannelType.getChannelNodeType()).thenReturn(PublishingModel.TYPE_DELIVERY_CHANNEL);
+
+ if (!channelTypeRegistered)
+ {
+ channelService.register(mockedChannelType);
+ channelTypeRegistered = true;
+ }
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onTearDown() throws Exception
+ {
+ AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
+ try
+ {
+ Channel channel = channelService.getChannelByName(channelName);
+ if (channel != null)
+ {
+ channelService.deleteChannel(channel);
+ }
+ }
+ finally
+ {
+ super.onTearDown();
+ }
+ }
}