Revision: 3928 http://openutils.svn.sourceforge.net/openutils/?rev=3928&view=rev Author: diego_schivo Date: 2012-04-06 15:16:10 +0000 (Fri, 06 Apr 2012) Log Message: ----------- AclSearchIndexTest Modified Paths: -------------- magnoliamodules/trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/lucene/AclSearchIndexTest.java Modified: magnoliamodules/trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/lucene/AclSearchIndexTest.java =================================================================== --- magnoliamodules/trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/lucene/AclSearchIndexTest.java 2012-04-06 14:28:43 UTC (rev 3927) +++ magnoliamodules/trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/lucene/AclSearchIndexTest.java 2012-04-06 15:16:10 UTC (rev 3928) @@ -21,26 +21,35 @@ import info.magnolia.cms.core.HierarchyManager; import info.magnolia.cms.security.AccessManager; -import info.magnolia.cms.security.AccessManagerImpl; +import info.magnolia.cms.security.MgnlRoleManager; import info.magnolia.cms.security.Permission; import info.magnolia.cms.security.PermissionImpl; +import info.magnolia.cms.security.Realm; +import info.magnolia.cms.security.SecuritySupport; +import info.magnolia.cms.security.SecuritySupportImpl; +import info.magnolia.cms.security.SystemUserManager; import info.magnolia.cms.util.SimpleUrlPattern; -import info.magnolia.context.AbstractRepositoryStrategy; +import info.magnolia.context.Context; +import info.magnolia.context.ContextDecorator; import info.magnolia.context.DefaultRepositoryStrategy; import info.magnolia.context.MgnlContext; +import info.magnolia.jcr.util.NodeUtil; +import info.magnolia.jcr.util.PropertyUtil; import info.magnolia.objectfactory.Components; import info.magnolia.repository.RepositoryConstants; import info.magnolia.repository.RepositoryManager; +import info.magnolia.test.ComponentsTestUtil; import info.magnolia.test.mock.MockWebContext; import it.openutils.mgnlutils.test.RepositoryTestConfiguration; import it.openutils.mgnlutils.test.TestNgRepositoryTestcase; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Calendar; import java.util.List; -import java.util.Map; +import javax.jcr.Node; +import javax.jcr.Session; + import net.sourceforge.openutils.mgnlcriteria.jcr.query.AdvancedResult; import net.sourceforge.openutils.mgnlcriteria.jcr.query.AdvancedResultItem; import net.sourceforge.openutils.mgnlcriteria.jcr.query.Criteria; @@ -49,6 +58,7 @@ import net.sourceforge.openutils.mgnlcriteria.jcr.query.criterion.Order; import net.sourceforge.openutils.mgnlcriteria.jcr.query.criterion.Restrictions; +import org.apache.commons.lang.StringUtils; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -58,7 +68,10 @@ * Tests that this custom search index modifies the lucene query according to ACL rules. * @author dschivo */ -@RepositoryTestConfiguration(jackrabbitRepositoryConfig = "/crit-repository/jackrabbit-acl-search-index-test-configuration.xml", repositoryConfig = "/crit-repository/test-repositories.xml", bootstrapFiles = "/crit-bootstrap/website.pets.xml") +@RepositoryTestConfiguration(jackrabbitRepositoryConfig = "/crit-repository/jackrabbit-acl-search-index-test-configuration.xml", repositoryConfig = "/crit-repository/test-repositories.xml", bootstrapFiles = { + "/crit-bootstrap/website.pets.xml", + "/crit-bootstrap/userroles.anonymous.xml", + "/crit-bootstrap/users.system.anonymous.xml" }) public class AclSearchIndexTest extends TestNgRepositoryTestcase { @@ -95,152 +108,205 @@ HierarchyManager hm = MgnlContext.getHierarchyManager(RepositoryConstants.WEBSITE); hm.save(); + + // info.magnolia.cms.security.SecurityTest.setUp() + final SecuritySupportImpl sec = new SecuritySupportImpl(); + sec.addUserManager(Realm.REALM_SYSTEM.getName(), new SystemUserManager()); + sec.setRoleManager(new MgnlRoleManager()); + ComponentsTestUtil.setInstance(SecuritySupport.class, sec); } /** - * {@inheritDoc} + * Tests that the execution of a query on all pets returns dogs only, because of an ACL rule. + * @throws Exception */ - @SuppressWarnings("unchecked") - @Override - protected void modifyContextesToUseRealRepository() + @Test + public void testDogsOnly() throws Exception { - super.modifyContextesToUseRealRepository(); + final AccessManager wrappedAM = MgnlContext.getAccessManager(RepositoryConstants.WEBSITE); + final AccessManager wrapperAM = new AccessManager() + { - MockWebContext mwc = (MockWebContext) MgnlContext.getInstance(); - RepositoryManager repositoryManager = Components.getComponent(RepositoryManager.class); - DefaultRepositoryStrategy drs = new DefaultRepositoryStrategy(repositoryManager, mwc); - try + public boolean isGranted(String path, long permissions) + { + // ACL rule: deny permission on pets subtree + if (StringUtils.startsWith(path, "/pets/")) + { + // ACL rule: read permission on dogs subtree + return StringUtils.startsWith(path, "/pets/dogs/"); + } + return wrappedAM.isGranted(path, permissions); + } + + public void setPermissionList(List<Permission> permissions) + { + wrappedAM.setPermissionList(permissions); + } + + public List<Permission> getPermissionList() + { + return wrappedAM.getPermissionList(); + } + + public long getPermissions(String path) + { + return wrappedAM.getPermissions(path); + } + }; + MgnlContext.setInstance(new ContextDecorator(MgnlContext.getInstance()) { - Field hmsField = AbstractRepositoryStrategy.class.getDeclaredField("hierarchyManagers"); - hmsField.setAccessible(true); - Map hms = (Map) hmsField.get(drs); - hms.put("website_website", MgnlContext.getHierarchyManager(RepositoryConstants.WEBSITE)); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - AccessManager am = new AccessManagerImpl(); + /** + * {@inheritDoc} + */ + @Override + public AccessManager getAccessManager(String name) + { + if (RepositoryConstants.WEBSITE.equals(name)) + { + return wrapperAM; + } + return super.getAccessManager(name); + } + }); try { - Field amsField = DefaultRepositoryStrategy.class.getDeclaredField("accessManagers"); - amsField.setAccessible(true); - Map ams = (Map) amsField.get(drs); - ams.put("website_website", am); + Calendar begin = Calendar.getInstance(); + begin.set(1999, Calendar.JANUARY, 1); + Calendar end = Calendar.getInstance(); + end.set(2001, Calendar.DECEMBER, 31); + + Criteria criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(RepositoryConstants.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.between("@birthDate", begin, end)) + .addOrder(Order.asc("@birthDate")); + + // Query results: + // --- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) + // --- 6 (title=George, petType=snake, birthDate=2000-01-20) + // --- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) + // --- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) + // --- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) + // --- 1 (title=Leo, petType=cat, birthDate=2000-09-07) + // --- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) + // --- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) + AdvancedResult result = criteria.execute(); + + // Accessible results (dogs only): + // --- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) + // --- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) + // --- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) + ResultIterator<AdvancedResultItem> iterator = result.getItems(); + + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getName(), "4"); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getName(), "12"); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getName(), "3"); + Assert.assertFalse(iterator.hasNext()); } - catch (Exception e) + finally { - throw new RuntimeException(e); + MgnlContext.setInstance(((ContextDecorator) MgnlContext.getInstance()).getWrappedContext()); } - mwc.setRepositoryStrategy(drs); } /** - * Tests that the execution of a query on all pets returns dogs only, because of an ACL rule. + * Tests that the execution of a query on all pets does not return any dog, because of an ACL rule. * @throws Exception */ @Test - public void testDogsOnly() throws Exception + public void testDogsExcluded() throws Exception { - List<Permission> pList = new ArrayList<Permission>(); - // ACL rule: deny permission on pets subtree - Permission p; - p = new PermissionImpl(); - p.setPattern(new SimpleUrlPattern("/pets/*")); - p.setPermissions(Permission.NONE); - pList.add(p); - // ACL rule: read permission on dogs subtree - p = new PermissionImpl(); - p.setPattern(new SimpleUrlPattern("/pets/dogs/*")); - p.setPermissions(Permission.READ); - pList.add(p); - MgnlContext.getAccessManager(RepositoryConstants.WEBSITE).setPermissionList(pList); + final AccessManager wrappedAM = MgnlContext.getAccessManager(RepositoryConstants.WEBSITE); + final AccessManager wrapperAM = new AccessManager() + { - Calendar begin = Calendar.getInstance(); - begin.set(1999, Calendar.JANUARY, 1); - Calendar end = Calendar.getInstance(); - end.set(2001, Calendar.DECEMBER, 31); + public boolean isGranted(String path, long permissions) + { + // ACL rule: read permission on pets subtree + if (StringUtils.startsWith(path, "/pets/")) + { + // ACL rule: deny permission on dogs subtree + return !StringUtils.startsWith(path, "/pets/dogs/"); + } + return wrappedAM.isGranted(path, permissions); + } - Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace(RepositoryConstants.WEBSITE).setBasePath( - "/pets").add(Restrictions.between("@birthDate", begin, end)).addOrder(Order.asc("@birthDate")); + public void setPermissionList(List<Permission> permissions) + { + wrappedAM.setPermissionList(permissions); + } - // Query results: - // --- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) - // --- 6 (title=George, petType=snake, birthDate=2000-01-20) - // --- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) - // --- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) - // --- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) - // --- 1 (title=Leo, petType=cat, birthDate=2000-09-07) - // --- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) - // --- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) - AdvancedResult result = criteria.execute(); + public List<Permission> getPermissionList() + { + return wrappedAM.getPermissionList(); + } - // Accessible results (dogs only): - // --- 4 (title=Jewel, petType=dog, birthDate=2000-03-07) - // --- 12 (title=Lucky, petType=dog, birthDate=2000-06-24) - // --- 3 (title=Rosy, petType=dog, birthDate=2001-04-17) - ResultIterator<AdvancedResultItem> iterator = result.getItems(); + public long getPermissions(String path) + { + return wrappedAM.getPermissions(path); + } + }; + MgnlContext.setInstance(new ContextDecorator(MgnlContext.getInstance()) + { - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getName(), "4"); - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getName(), "12"); - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getName(), "3"); - Assert.assertFalse(iterator.hasNext()); - } + /** + * {@inheritDoc} + */ + @Override + public AccessManager getAccessManager(String name) + { + if (RepositoryConstants.WEBSITE.equals(name)) + { + return wrapperAM; + } + return super.getAccessManager(name); + } + }); + try + { + Calendar begin = Calendar.getInstance(); + begin.set(1999, Calendar.JANUARY, 1); + Calendar end = Calendar.getInstance(); + end.set(2001, Calendar.DECEMBER, 31); - /** - * Tests that the execution of a query on all pets does not return any dog, because of an ACL rule. - * @throws Exception - */ - @Test - public void testDogsExcluded() throws Exception - { - List<Permission> pList = new ArrayList<Permission>(); - Permission p; - // ACL rule: read permission on pets subtree - p = new PermissionImpl(); - p.setPattern(new SimpleUrlPattern("/pets/*")); - p.setPermissions(Permission.READ); - pList.add(p); - // ACL rule: deny permission on dogs subtree - p = new PermissionImpl(); - p.setPattern(new SimpleUrlPattern("/pets/dogs/*")); - p.setPermissions(Permission.NONE); - pList.add(p); - MgnlContext.getAccessManager(RepositoryConstants.WEBSITE).setPermissionList(pList); + Criteria criteria = JCRCriteriaFactory + .createCriteria() + .setWorkspace(RepositoryConstants.WEBSITE) + .setBasePath("/pets") + .add(Restrictions.between("@birthDate", begin, end)) + .addOrder(Order.asc("@birthDate")); - Calendar begin = Calendar.getInstance(); - begin.set(1999, Calendar.JANUARY, 1); - Calendar end = Calendar.getInstance(); - end.set(2001, Calendar.DECEMBER, 31); + AdvancedResult result = criteria.execute(); - Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace(RepositoryConstants.WEBSITE).setBasePath( - "/pets").add(Restrictions.between("@birthDate", begin, end)).addOrder(Order.asc("@birthDate")); + // Accessible results (dogs excluded): + // --- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) + // --- 6 (title=George, petType=snake, birthDate=2000-01-20) + // --- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) + // --- 1 (title=Leo, petType=cat, birthDate=2000-09-07) + // --- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) + ResultIterator<AdvancedResultItem> iterator = result.getItems(); - AdvancedResult result = criteria.execute(); - - // Accessible results (dogs excluded): - // --- 9 (title=Lucky, petType=bird, birthDate=1999-08-06) - // --- 6 (title=George, petType=snake, birthDate=2000-01-20) - // --- 11 (title=Freddy, petType=bird, birthDate=2000-03-09) - // --- 1 (title=Leo, petType=cat, birthDate=2000-09-07) - // --- 5 (title=Iggy, petType=lizard, birthDate=2000-11-30) - ResultIterator<AdvancedResultItem> iterator = result.getItems(); - - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getName(), "9"); - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getName(), "6"); - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getName(), "11"); - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getName(), "1"); - Assert.assertTrue(iterator.hasNext()); - Assert.assertEquals(iterator.next().getName(), "5"); - Assert.assertFalse(iterator.hasNext()); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getName(), "9"); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getName(), "6"); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getName(), "11"); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getName(), "1"); + Assert.assertTrue(iterator.hasNext()); + Assert.assertEquals(iterator.next().getName(), "5"); + Assert.assertFalse(iterator.hasNext()); + } + finally + { + MgnlContext.setInstance(((ContextDecorator) MgnlContext.getInstance()).getWrappedContext()); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |