Index: topia-security/src/test/org/codelutin/topia/security/TopiaSecurityTest.java diff -u /dev/null topia-security/src/test/org/codelutin/topia/security/TopiaSecurityTest.java:1.1 --- /dev/null Wed Oct 18 08:46:39 2006 +++ topia-security/src/test/org/codelutin/topia/security/TopiaSecurityTest.java Wed Oct 18 08:46:34 2006 @@ -0,0 +1,229 @@ +/* *##% +* Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, +* Cédric Pineau, Benjamin Poussin, +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*##%*/ + +package org.codelutin.topia.security; + +import static org.codelutin.topia.security.util.TopiaSecurityUtil.LOAD; +import static org.codelutin.topia.security.util.TopiaSecurityUtil.UPDATE; + +import java.security.PrivilegedExceptionAction; +import java.util.List; +import java.util.Properties; + +import javax.security.auth.Subject; +import javax.security.auth.login.LoginContext; + +import junit.framework.TestCase; + +import org.codelutin.topia.TopiaContext; +import org.codelutin.topia.TopiaContextFactory; +import org.codelutin.topia.TopiaNotFoundException; +import org.codelutin.topia.TopiaServiceDAOHelper; +import org.codelutin.topia.security.jaas.TopiaCallbackHandler; +import org.codelutin.topia.security.util.TopiaSecurityFactoryFilter; +import org.codelutin.topia.test.entities.Person; +import org.codelutin.topia.test.entities.PersonDAO; +import org.codelutin.topia.test.entities.Pet; +import org.codelutin.topia.test.entities.PetDAO; + +/** + * Tests unitaires. + * Ne pas oublier de lancer le script d'initialisation de la base données. + * @author ruchaud + */ +public class TopiaSecurityTest extends TestCase { + + protected TopiaContext context = TopiaContextFactory.getContext(getProperties()); + protected TopiaSecurityService securityManager = TopiaSecurityHelper.get(context); + protected TopiaSecurityFactoryFilter factoryFilter = new TopiaSecurityFactoryFilter(securityManager); + + protected static String entitiesList = + "org.codelutin.topia.test.entities.PersonImpl," + + "org.codelutin.topia.test.entities.PetImpl"; + + + /** + * + */ + public TopiaSecurityTest() throws TopiaNotFoundException { + } + + protected static Properties getProperties() { + Properties config = new Properties(); + //config.setProperty("hibernate.hbm2ddl.auto", "create"); + config.setProperty("hibernate.show_sql", "true"); + + config.setProperty("topia.persistence.classes", entitiesList); + config.setProperty("topia.service.security", "org.codelutin.topia.security.TopiaSecurityServiceImpl"); + + config.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect"); + config.setProperty("hibernate.connection.username", "sa"); + config.setProperty("hibernate.connection.password", ""); + config.setProperty("hibernate.connection.driver_class", "org.h2.Driver"); + + config.setProperty("hibernate.connection.url", "jdbc:h2:data/topia-security;LOCK_METHOD=NO"); + + return config; + } + + public void testLoginThimel() throws Exception { + /* Authentification de l'utilisateur Thimel */ + LoginContext loginContext = new LoginContext("topia", new TopiaCallbackHandler( + "thimel", "zou;bi@da")); + loginContext.login(); + Subject subject = loginContext.getSubject(); + + /* Test */ + assertEquals(subject.getPrincipals().size(), 1); + + loginContext.logout(); + } + + public void testLoginRuchaud() throws Exception { + /* Authentification de l'utilisateur Ruchaud */ + LoginContext loginContext = new LoginContext("topia", new TopiaCallbackHandler( + "ruchaud", "mdp")); + loginContext.login(); + Subject subject = loginContext.getSubject(); + + /* Test */ + assertEquals(subject.getPrincipals().size(), 2); + + loginContext.logout(); + } + + public void testAuthorizationThimel() throws Exception { + /* Authentification de l'utilisateur Thimel */ + LoginContext loginContext = new LoginContext("topia", new TopiaCallbackHandler( + "thimel", "zou;bi@da")); + loginContext.login(); + Subject subject = loginContext.getSubject(); + + /* Tests */ + Subject.doAsPrivileged(subject, new PrivilegedExceptionAction() { + public Object run() throws Exception { + TopiaContext childContext = context.beginTransaction(); + + /* Personnes */ + PersonDAO personDAO = TopiaServiceDAOHelper.getPersonDAO(childContext); + List findAllPerson = personDAO.findAll(); + + List personsLOAD = factoryFilter.filter(findAllPerson, LOAD); + assertEquals(2, personsLOAD.size()); + + List personsUPDATE = factoryFilter.filter(findAllPerson, UPDATE); + assertEquals(0, personsUPDATE.size()); + + /* Annimaux */ + PetDAO petDAO = TopiaServiceDAOHelper.getPetDAO(childContext); + List findAllPet = petDAO.findAll(); + + List petLOAD = factoryFilter.filter(findAllPet, LOAD); + assertEquals(0, petLOAD.size()); + + List petUPDATE = factoryFilter.filter(findAllPet, UPDATE); + assertEquals(0, petUPDATE.size()); + + return null; + } + }, null); + + loginContext.logout(); + } + + public void testAuthorizationRuchaud() throws Exception { + /* Authentification de l'utilisateur Admin */ + LoginContext loginContext = new LoginContext("topia", new TopiaCallbackHandler( + "ruchaud", "mdp")); + loginContext.login(); + Subject subject = loginContext.getSubject(); + + /* Tests */ + Subject.doAsPrivileged(subject, new PrivilegedExceptionAction() { + public Object run() throws Exception { + TopiaContext childContext = context.beginTransaction(); + + /* Personnes */ + PersonDAO personDAO = TopiaServiceDAOHelper.getPersonDAO(childContext); + List findAllPerson = personDAO.findAll(); + + List personsLOAD = factoryFilter.filter(findAllPerson, LOAD); + assertEquals(3, personsLOAD.size()); + + List personsUPDATE = factoryFilter.filter(findAllPerson, UPDATE); + assertEquals(0, personsUPDATE.size()); + + /* Annimaux */ + PetDAO petDAO = TopiaServiceDAOHelper.getPetDAO(childContext); + List findAllPet = petDAO.findAll(); + + List petLOAD = factoryFilter.filter(findAllPet, LOAD); + assertEquals(2, petLOAD.size()); + + List petUPDATE = factoryFilter.filter(findAllPet, UPDATE); + assertEquals(1, petUPDATE.size()); + + return null; + } + }, null); + + loginContext.logout(); + } + + public void testAuthorizationAdmin() throws Exception { + /* Authentification de l'utilisateur Ruchaud */ + LoginContext loginContext = new LoginContext("topia", new TopiaCallbackHandler( + "admin", "azerty")); + loginContext.login(); + Subject subject = loginContext.getSubject(); + + /* Tests */ + Subject.doAsPrivileged(subject, new PrivilegedExceptionAction() { + public Object run() throws Exception { + TopiaContext childContext = context.beginTransaction(); + + /* Personnes */ + PersonDAO personDAO = TopiaServiceDAOHelper.getPersonDAO(childContext); + List findAllPerson = personDAO.findAll(); + + List personsLOAD = factoryFilter.filter(findAllPerson, LOAD); + assertEquals(3, personsLOAD.size()); + + List personsUPDATE = factoryFilter.filter(findAllPerson, UPDATE); + assertEquals(3, personsUPDATE.size()); + + /* Annimaux */ + PetDAO petDAO = TopiaServiceDAOHelper.getPetDAO(childContext); + List findAllPet = petDAO.findAll(); + + List petLOAD = factoryFilter.filter(findAllPet, LOAD); + assertEquals(3, petLOAD.size()); + + List petUPDATE = factoryFilter.filter(findAllPet, UPDATE); + assertEquals(3, petUPDATE.size()); + + return null; + } + }, null); + + loginContext.logout(); + } + +} Index: topia-security/src/test/org/codelutin/topia/security/ScriptInitialisationDataBase.java diff -u /dev/null topia-security/src/test/org/codelutin/topia/security/ScriptInitialisationDataBase.java:1.1 --- /dev/null Wed Oct 18 08:46:39 2006 +++ topia-security/src/test/org/codelutin/topia/security/ScriptInitialisationDataBase.java Wed Oct 18 08:46:34 2006 @@ -0,0 +1,210 @@ +/* *##% +* Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, +* Cédric Pineau, Benjamin Poussin, +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*##%*/ + +package org.codelutin.topia.security; + +import static org.codelutin.topia.security.util.TopiaSecurityUtil.LOAD; +import static org.codelutin.topia.security.util.TopiaSecurityUtil.TOPIA_SECURITY_PERSISTENCE_CLASSES; +import static org.codelutin.topia.security.util.TopiaSecurityUtil.UPDATE; + +import java.util.ArrayList; +import java.util.Properties; + +import org.codelutin.topia.TopiaContext; +import org.codelutin.topia.TopiaContextFactory; +import org.codelutin.topia.TopiaException; +import org.codelutin.topia.TopiaServiceDAOHelper; +import org.codelutin.topia.security.entities.authorization.TopiaAssociationAuthorization; +import org.codelutin.topia.security.entities.authorization.TopiaAssociationAuthorizationDAO; +import org.codelutin.topia.security.entities.authorization.TopiaEntityAuthorization; +import org.codelutin.topia.security.entities.authorization.TopiaEntityAuthorizationDAO; +import org.codelutin.topia.security.entities.authorization.TopiaIdLink; +import org.codelutin.topia.security.entities.authorization.TopiaIdLinkDAO; +import org.codelutin.topia.security.entities.user.TopiaGroup; +import org.codelutin.topia.security.entities.user.TopiaGroupDAO; +import org.codelutin.topia.security.entities.user.TopiaUser; +import org.codelutin.topia.security.entities.user.TopiaUserDAO; +import org.codelutin.topia.test.entities.Person; +import org.codelutin.topia.test.entities.PersonDAO; +import org.codelutin.topia.test.entities.Pet; +import org.codelutin.topia.test.entities.PetDAO; + +/** + * Script pour l'initialisation de la base de données pour pouvoir exécuter les + * tests unitaires. + * @author ruchaud + */ +public class ScriptInitialisationDataBase { + + protected static String entitiesList = TOPIA_SECURITY_PERSISTENCE_CLASSES + "," + + "org.codelutin.topia.test.entities.PersonImpl," + + "org.codelutin.topia.test.entities.PetImpl"; + + protected static Properties getProperties() { + Properties config = new Properties(); + config.setProperty("hibernate.hbm2ddl.auto", "create"); + config.setProperty("hibernate.show_sql", "true"); + + config.setProperty("topia.persistence.classes", entitiesList); + //config.setProperty("topia.security.manager", "org.codelutin.topia.security.TopiaSecurityManagerImpl"); + + config.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect"); + config.setProperty("hibernate.connection.username", "sa"); + config.setProperty("hibernate.connection.password", ""); + config.setProperty("hibernate.connection.driver_class", "org.h2.Driver"); + + config.setProperty("hibernate.connection.url", "jdbc:h2:data/topia-security;LOCK_METHOD=NO"); + + return config; + } + + public static void main(String[] args) throws TopiaException { + + /* Transaction */ + TopiaContext context = TopiaContextFactory.getContext(getProperties()); + TopiaContext childContext = context.beginTransaction(); + + /* DAOs */ + PersonDAO personDAO = TopiaServiceDAOHelper.getPersonDAO(childContext); + PetDAO petDAO = TopiaServiceDAOHelper.getPetDAO(childContext); + + TopiaUserDAO topiaUserDAO = TopiaServiceDAOHelper.getTopiaUserDAO(childContext); + TopiaGroupDAO topiaGroupDAO = TopiaServiceDAOHelper.getTopiaGroupDAO(childContext); + TopiaEntityAuthorizationDAO topiaEntityAuthorizationDAO = TopiaServiceDAOHelper.getTopiaEntityAuthorizationDAO(childContext); + TopiaIdLinkDAO linkDAO = TopiaServiceDAOHelper.getTopiaIdLinkDAO(childContext); + TopiaAssociationAuthorizationDAO topiaAssociationAuthorizationDAO = TopiaServiceDAOHelper.getTopiaAssociationAuthorizationDAO(childContext); + + /* Création d'un admin */ + TopiaUser admin = topiaUserDAO.create(); + admin.setLogin("admin"); + admin.setPassword("azerty"); + admin.update(); + childContext.commitTransaction(); + + /* Création d'un utilisateur */ + TopiaUser thimel = topiaUserDAO.create(); + thimel.setLogin("thimel"); + thimel.setPassword("zou;bi@da"); + thimel.update(); + childContext.commitTransaction(); + + /* Création d'un groupe avec un utilisateur */ + TopiaUser ruchaud = topiaUserDAO.create(); + ruchaud.setLogin("ruchaud"); + ruchaud.setPassword("mdp"); + TopiaGroup groupRuchaud = topiaGroupDAO.create(); + groupRuchaud.setName("essai"); + + groupRuchaud.setTopiaUser(new ArrayList()); + ruchaud.addTopiaGroup(groupRuchaud); + + groupRuchaud.update(); + ruchaud.update(); + childContext.commitTransaction(); + + /* Création des personnes */ + Person benjamin = personDAO.create(); + benjamin.setName("poussin"); + benjamin.setFirstname("benjamin"); + personDAO.update(benjamin); + childContext.commitTransaction(); + + Person jacques = personDAO.create(); + jacques.setName("poussin"); + jacques.setFirstname("jacques"); + personDAO.update(jacques); + childContext.commitTransaction(); + + Person mylene = personDAO.create(); + mylene.setName("poussin"); + mylene.setFirstname("mylene"); + personDAO.update(mylene); + childContext.commitTransaction(); + + /* Création des annimaux */ + Pet debux = petDAO.create(); + debux.setName("debux"); + debux.setType("chat"); + debux.setPerson(jacques); + debux.update(); + childContext.commitTransaction(); + + Pet pluto = petDAO.create(); + pluto.setName("pluto"); + pluto.setType("chien"); + pluto.setPerson(jacques); + pluto.update(); + childContext.commitTransaction(); + + Pet fliper = petDAO.create(); + fliper.setName("fliper"); + fliper.setType("dauphin"); + fliper.setPerson(mylene); + fliper.update(); + childContext.commitTransaction(); + + /* Création des autorisations Entity */ + TopiaEntityAuthorization authorizationForAdmin = topiaEntityAuthorizationDAO.create(); + authorizationForAdmin.setId("*"); + authorizationForAdmin.setActions(15); + authorizationForAdmin.setPrincipals(admin.getTopiaId()); + authorizationForAdmin.update(); + childContext.commitTransaction(); + + TopiaEntityAuthorization authorizationForRuchaud = topiaEntityAuthorizationDAO.create(); + authorizationForRuchaud.setId(Person.class.getName() + "#*"); + authorizationForRuchaud.setActions(LOAD); + authorizationForRuchaud.setPrincipals(groupRuchaud.getTopiaId()); + authorizationForRuchaud.update(); + childContext.commitTransaction(); + + TopiaEntityAuthorization authorizationForThimel = topiaEntityAuthorizationDAO.create(); + authorizationForThimel.setId(jacques.getTopiaId()); + authorizationForThimel.setActions(LOAD); + authorizationForThimel.setPrincipals(thimel.getTopiaId()); + authorizationForThimel.update(); + childContext.commitTransaction(); + + /* Création d'une autorisation Link */ + TopiaIdLink link = linkDAO.create(); + link.setReplace(mylene.getTopiaId()); + link.setBy(jacques.getTopiaId()); + link.update(); + childContext.commitTransaction(); + + /* Création d'une authorisation association */ + TopiaAssociationAuthorization associationAuthorization = topiaAssociationAuthorizationDAO.create(); + associationAuthorization.setIdBeginAssociation(jacques.getTopiaId()); + associationAuthorization.setNameAssociation("pet"); + associationAuthorization.setActions(LOAD); + associationAuthorization.setPrincipals(ruchaud.getTopiaId()); + associationAuthorization.update(); + childContext.commitTransaction(); + + associationAuthorization = topiaAssociationAuthorizationDAO.create(); + associationAuthorization.setIdBeginAssociation(mylene.getTopiaId()); + associationAuthorization.setNameAssociation("pet"); + associationAuthorization.setActions(UPDATE); + associationAuthorization.setPrincipals(ruchaud.getTopiaId()); + associationAuthorization.update(); + childContext.commitTransaction(); + } + +}