/* * (C) Copyright 2010-2014 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Arnaud Kervern */ package org.nuxeo.ecm.platform.shibboleth.computedgroups; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.junit.Test; import org.junit.runner.RunWith; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.test.CoreFeature; import org.nuxeo.ecm.core.test.DefaultRepositoryInit; import org.nuxeo.ecm.core.test.annotations.Granularity; import org.nuxeo.ecm.core.test.annotations.RepositoryConfig; import org.nuxeo.ecm.directory.Directory; import org.nuxeo.ecm.directory.Reference; import org.nuxeo.ecm.directory.api.DirectoryService; import org.nuxeo.ecm.directory.sql.SQLSession; import org.nuxeo.ecm.platform.shibboleth.ShibbolethGroupHelper; import org.nuxeo.ecm.platform.usermanager.UserManager; import org.nuxeo.runtime.test.runner.Deploy; import org.nuxeo.runtime.test.runner.Features; import org.nuxeo.runtime.test.runner.FeaturesRunner; import org.nuxeo.runtime.test.runner.LocalDeploy; @RunWith(FeaturesRunner.class) @Features(CoreFeature.class) @RepositoryConfig(init = DefaultRepositoryInit.class, cleanup = Granularity.METHOD) @Deploy({ "org.nuxeo.ecm.platform.content.template", "org.nuxeo.ecm.platform.dublincore", "org.nuxeo.ecm.directory.api", "org.nuxeo.ecm.directory.types.contrib", "org.nuxeo.ecm.directory", "org.nuxeo.ecm.directory.sql", "org.nuxeo.ecm.platform.usermanager", "org.nuxeo.ecm.platform.login.shibboleth" }) @LocalDeploy("org.nuxeo.ecm.platform.login.shibboleth:OSGI-INF/test-sql-directory.xml") public class TestShibbolethGroupHelper { protected static final String CORRECT_EL = "empty currentUser"; @Inject protected CoreSession session; @Inject protected UserManager userManager; @Inject protected DirectoryService directoryService; @Test public void testCreateGroup() throws Exception { assertEquals(0, ShibbolethGroupHelper.getGroups().size()); DocumentModel group = ShibbolethGroupHelper.getBareGroupModel(session); group.setPropertyValue("shibbolethGroup:groupName", "group1"); group.setPropertyValue("shibbolethGroup:expressionLanguage", CORRECT_EL); ShibbolethGroupHelper.createGroup(group); assertEquals(1, ShibbolethGroupHelper.getGroups().size()); deleteShibbGroups(); assertEquals(0, ShibbolethGroupHelper.getGroups().size()); } @Test public void testSearchGroup() throws Exception { createShibbGroup("group2"); createShibbGroup("group3"); createShibbGroup("group4"); createShibbGroup("test"); createShibbGroup("group6"); assertEquals(1, ShibbolethGroupHelper.searchGroup("test").size()); assertEquals(5, ShibbolethGroupHelper.searchGroup("").size()); assertEquals(4, ShibbolethGroupHelper.searchGroup("group%").size()); assertEquals(4, ShibbolethGroupHelper.searchGroup("group").size()); deleteShibbGroups(); } @Test public void testGetReference() throws Exception { DocumentModel group = userManager.getBareGroupModel(); group.setPropertyValue("group:groupname", "testRef"); group = userManager.createGroup(group); assertEquals("testRef", group.getId()); DocumentModel shibbGroup = createShibbGroup("refShib"); List<String> ref = new ArrayList<>(); assertEquals("refShib", shibbGroup.getId()); ref.add(shibbGroup.getId()); group.setProperty(userManager.getGroupSchemaName(), userManager.getGroupSubGroupsField(), ref); userManager.updateGroup(group); session.save(); Directory dir = directoryService.getDirectory(userManager.getGroupDirectoryName()); assertNotNull(dir.getReference(userManager.getGroupSubGroupsField())); SQLSession ses = (SQLSession) directoryService.open(userManager.getGroupDirectoryName()); DocumentModel tmp = ses.getEntry("testRef"); @SuppressWarnings("unchecked") List<String> subs = (List<String>) tmp.getProperty(userManager.getGroupSchemaName(), userManager.getGroupSubGroupsField()); assertNotNull(subs); assertEquals(1, subs.size()); Reference dirRef = dir.getReference(userManager.getGroupSubGroupsField()); assertTrue(dirRef.getTargetIdsForSource("testRef").size() > 0); assertTrue(dirRef.getSourceIdsForTarget("refShib").size() > 0); assertEquals("testRef", dirRef.getSourceIdsForTarget("refShib").get(0)); deleteShibbGroups(); } @Test public void testSubGroups() throws Exception { DocumentModel group = userManager.getBareGroupModel(); group.setPropertyValue("group:groupname", "trueGroup1"); group = userManager.createGroup(group); assertEquals("trueGroup1", group.getId()); DocumentModel group2 = userManager.getBareGroupModel(); group2.setPropertyValue("group:groupname", "trueGroup2"); group2 = userManager.createGroup(group2); DocumentModel group3 = userManager.getBareGroupModel(); group3.setPropertyValue("group:groupname", "trueGroup3"); group3 = userManager.createGroup(group3); List<String> subGroup = new ArrayList<>(); List<String> subGroup2 = new ArrayList<>(); DocumentModel shibGroup = createShibbGroup("members"); subGroup.add(shibGroup.getId()); subGroup2.add(shibGroup.getId()); assertNotNull(shibGroup.getId()); shibGroup = createShibbGroup("shibbou"); subGroup.add(shibGroup.getId()); shibGroup = createShibbGroup("group7"); subGroup.add(shibGroup.getId()); subGroup2.add(shibGroup.getId()); shibGroup = createShibbGroup("group73"); subGroup.add(shibGroup.getId()); shibGroup = createShibbGroup("participant"); subGroup.add(shibGroup.getId()); subGroup2.add(shibGroup.getId()); group.setProperty(userManager.getGroupSchemaName(), userManager.getGroupSubGroupsField(), subGroup); group2.setProperty(userManager.getGroupSchemaName(), userManager.getGroupSubGroupsField(), subGroup2); userManager.updateGroup(group); userManager.updateGroup(group2); session.save(); List<String> parent = ShibbolethGroupHelper.getParentsGroups("shibbou"); assertNotNull(parent); assertEquals(1, parent.size()); assertEquals("trueGroup1", parent.get(0)); parent = ShibbolethGroupHelper.getParentsGroups("group7"); assertNotNull(parent); assertEquals(2, parent.size()); deleteShibbGroups(); } protected DocumentModel createShibbGroup(String name) throws Exception { DocumentModel group = ShibbolethGroupHelper.getBareGroupModel(session); group.setPropertyValue("shibbolethGroup:groupName", name); group.setPropertyValue("shibbolethGroup:expressionLanguage", CORRECT_EL); group = ShibbolethGroupHelper.createGroup(group); session.save(); return group; } protected void deleteShibbGroups() throws Exception { for (DocumentModel group : ShibbolethGroupHelper.getGroups()) { ShibbolethGroupHelper.deleteGroup(group); } session.save(); } }