Index: topia2/src/test/org/codelutin/topia/TopiaContextTest.java diff -u topia2/src/test/org/codelutin/topia/TopiaContextTest.java:1.7 topia2/src/test/org/codelutin/topia/TopiaContextTest.java:1.8 --- topia2/src/test/org/codelutin/topia/TopiaContextTest.java:1.7 Tue Feb 7 19:57:02 2006 +++ topia2/src/test/org/codelutin/topia/TopiaContextTest.java Fri Feb 24 00:48:35 2006 @@ -23,16 +23,25 @@ * * @author poussin * - * @version $Revision: 1.7 $ + * @version $Revision: 1.8 $ * - * Last update: $Date: 2006/02/07 19:57:02 $ by : $Author: thimel $ + * Last update: $Date: 2006/02/24 00:48:35 $ by : $Author: thimel $ */ package org.codelutin.topia; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.security.Principal; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; +import java.util.HashSet; +import java.util.List; import java.util.Properties; +import java.util.Set; + +import javax.security.auth.Subject; +import javax.security.auth.login.LoginContext; import junit.framework.TestCase; @@ -48,6 +57,13 @@ import org.codelutin.topia.event.TopiaVetoableEntityLoadListener; import org.codelutin.topia.framework.TopiaContextImplementor; import org.codelutin.topia.persistence.TopiaDAO; +import org.codelutin.topia.security.TopiaCallbackHandler; +import org.codelutin.topia.security.entities.TopiaEntityPermission; +import org.codelutin.topia.security.entities.TopiaPermission; +import org.codelutin.topia.security.entities.TopiaPermissionManager; +import org.codelutin.topia.security.entities.TopiaPrincipal; +import org.codelutin.topia.security.entities.TopiaUser; +import org.codelutin.topia.security.entities.TopiaUserManager; /** * @author poussin @@ -58,13 +74,17 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(TopiaContextTest.class); + protected String entitiesList = Person.class.getName() + "," + TopiaUser.class.getName() + "," + TopiaEntityPermission.class.getName(); + protected Properties getPostgreSQLProperties() { Properties config = new Properties(); config.setProperty("hibernate.show_sql", "true"); config.setProperty("hibernate.hbm2ddl.auto", "create"); - config.setProperty("topia.persistence.classes", - "org.codelutin.topia.Person"); + config.setProperty("topia.dao.flatfile.directory", "/tmp/topiadb"); + config.setProperty("topia.dao.flatfile.mapping.key", "firstname"); + + config.setProperty("topia.persistence.classes", entitiesList); config.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); config.setProperty("hibernate.connection.driver_class", @@ -76,7 +96,7 @@ return config; } - + protected Properties getDerbyProperties() { Properties config = new Properties(); config.setProperty("hibernate.show_sql", "true"); @@ -84,9 +104,8 @@ config.setProperty("topia.dao.flatfile.directory", "/tmp/topiadb"); config.setProperty("topia.dao.flatfile.mapping.key", "firstname"); - - config.setProperty("topia.persistence.classes", - "org.codelutin.topia.Person"); + + config.setProperty("topia.persistence.classes", entitiesList); config.setProperty("hibernate.dialect", "org.hibernate.dialect.DerbyDialect"); config.setProperty("hibernate.connection.driver_class", @@ -98,22 +117,20 @@ return config; } - + protected Properties getProperties() { - return getDerbyProperties(); + return getPostgreSQLProperties(); } - + /* * #hibernate.dialect org.hibernate.dialect.DerbyDialect * #hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver * #hibernate.connection.url jdbc:derby:/test;create=true - * #hibernate.connection.username - * #hibernate.connection.password + * #hibernate.connection.username #hibernate.connection.password */ - public void testGetParentContext() throws Exception { Properties config = getProperties(); - + TopiaContextImplementor topiaContext = (TopiaContextImplementor) TopiaContextFactory .getContext(config); @@ -146,7 +163,7 @@ p.setFirstname("benjamin"); persons.update(p); childContext.commitTransaction(); - + String id = p.getTopiaId(); Person p1 = persons.create(); @@ -164,22 +181,22 @@ p.setFirstname("berengere"); persons.update(p); childContext.commitTransaction(); - + p.setFirstname("toto"); persons.update(p); assertEquals("toto", p.getFirstname()); childContext.rollbackTransaction(); - + p = persons.findByTopiaId(id); assertEquals("berengere", p.getFirstname()); - + TopiaContextImplementor childContext2 = (TopiaContextImplementor) context - .beginTransaction(); + .beginTransaction(); TopiaDAO persons2 = childContext2.getDAO(Person.class); - + Person pp = persons2.findByTopiaId(id); assertEquals("berengere", pp.getFirstname()); - + } public void testIsolation() throws Exception { @@ -192,21 +209,21 @@ TopiaContextImplementor c1 = (TopiaContextImplementor) context .beginTransaction(); TopiaContextImplementor c2 = (TopiaContextImplementor) context - .beginTransaction(); + .beginTransaction(); TopiaDAO ps1 = c1.getDAO(Person.class); - TopiaDAO ps2 = c1.getDAO(Person.class); + TopiaDAO ps2 = c2.getDAO(Person.class); Person p = ps1.create(); p.setName("poussin"); p.setFirstname("benjamin"); ps1.update(p); - + c1.rollbackTransaction(); - + assertEquals(0, ps1.findAll().size()); assertEquals(0, ps2.findAll().size()); - + p = ps1.create(); p.setName("poussin"); p.setFirstname("benjamin"); @@ -214,24 +231,24 @@ assertEquals(1, ps1.findAll().size()); assertEquals(0, ps2.findAll().size()); - + c1.commitTransaction(); - + assertEquals(1, ps1.findAll().size()); assertEquals(0, ps2.findAll().size()); - + ps1.delete(p); - + assertEquals(0, ps1.findAll().size()); assertEquals(0, ps2.findAll().size()); - + c1.commitTransaction(); - + assertEquals(0, ps1.findAll().size()); assertEquals(0, ps2.findAll().size()); - + } - + public void testFlatFile() throws Exception { System.out.println("Debut du test FlatFile"); @@ -267,7 +284,6 @@ } - public void testConstructor() throws Exception { System.out.println("Debut du test constructor"); @@ -277,12 +293,12 @@ TopiaContextImplementor childContext = (TopiaContextImplementor) context .beginTransaction(); - + TopiaDAO persons = childContext.getDAO(Person.class); Person p = persons.create("name", "poussin", "firstname", "toto"); assertEquals("poussin", p.getName()); assertEquals("toto", p.getFirstname()); - + persons.update(p); childContext.commitTransaction(); @@ -291,64 +307,74 @@ persons.update(p); childContext.commitTransaction(); - + p.setFirstname("benjamin"); assertEquals("benjamin", p.getFirstname()); persons.update(p); childContext.commitTransaction(); - + persons.delete(p); childContext.commitTransaction(); } - - String state = ""; - + + String state = ""; + public void testEventHibernate() throws Exception { System.out.println("Debut du test Event"); Properties config = getProperties(); - // FIXME voir pourquoi si on a pas un nouveau context ca ne marche pas :( + // FIXME voir pourquoi si on a pas un nouveau context ca ne marche pas + // :( // On met un propriete qui ne sert a rien pour etre sur qu'il // recre bien un Context pour ce test -// config.setProperty("test", "testEventHibernate"); + // config.setProperty("test", "testEventHibernate"); TopiaContext context = TopiaContextFactory.getContext(config); TopiaContextImplementor childContext = (TopiaContextImplementor) context .beginTransaction(); - + TopiaVetoableEntityListener v = new TopiaVetoableEntityListener() { public void createEntity(TopiaVetoableEntityEvent event) { - System.out.println("vetoCreate " + event.getEntityClass() + " id: " + event.getId()); + System.out.println("vetoCreate " + event.getEntityClass() + + " id: " + event.getId()); state = "vetoCreate"; } + public void updateEntity(TopiaVetoableEntityEvent event) { - System.out.println("vetoUpdate " + event.getEntityClass() + " id: " + event.getId()); + System.out.println("vetoUpdate " + event.getEntityClass() + + " id: " + event.getId()); state = "vetoUpdate"; } + public void deleteEntity(TopiaVetoableEntityEvent event) { - System.out.println("vetoDelete " + event.getEntityClass() + " id: " + event.getId()); + System.out.println("vetoDelete " + event.getEntityClass() + + " id: " + event.getId()); state = "vetoDelete"; } }; - + TopiaVetoableEntityLoadListener vl = new TopiaVetoableEntityLoadListener() { - public void loadEntity(TopiaVetoableEntityLoadEvent event) { - System.out.println("vetoLoad " + event.getEntityClass() + " id: " + event.getId()); + public boolean loadEntity(TopiaVetoableEntityLoadEvent event) { + System.out.println("vetoLoad " + event.getEntityClass() + + " id: " + event.getId()); state = "vetoLoad"; + return true; } }; - + TopiaEntityListener l = new TopiaEntityListener() { public void entityCreated(TopiaEntityEvent event) { System.out.println("entityCreated " + event.getTopiaEntities()); state = "entityCreated"; } + public void entityUpdated(TopiaEntityEvent event) { System.out.println("entityUpdated " + event.getTopiaEntities()); state = "entityUpdated"; } + public void entityDeleted(TopiaEntityEvent event) { System.out.println("entityDeleted " + event.getTopiaEntities()); state = "entityDeleted"; @@ -361,12 +387,12 @@ state = "entityLoaded"; } }; - + childContext.addVetoableListener(v); childContext.addVetoableLoadListener(vl); childContext.addTopiaEntityListener(l); childContext.addTopiaEntityLoadListener(ll); - + TopiaDAO persons = childContext.getDAO(Person.class); Person p = persons.create(); assertEquals("entityCreated", state); @@ -380,15 +406,15 @@ persons.update(p); childContext.commitTransaction(); assertEquals("entityUpdated", state); - + TopiaContextImplementor childContext2 = (TopiaContextImplementor) context - .beginTransaction(); + .beginTransaction(); childContext2.addVetoableListener(v); childContext2.addVetoableLoadListener(vl); childContext2.addTopiaEntityListener(l); childContext2.addTopiaEntityLoadListener(ll); TopiaDAO persons2 = childContext2.getDAO(Person.class); - + Person pp = persons2.findByTopiaId(p.getTopiaId()); assertEquals(p.getFirstname(), pp.getFirstname()); assertEquals("entityLoaded", state); @@ -406,12 +432,12 @@ state = "entityUpdated"; } }; - + Properties config = getProperties(); - - TopiaContextImplementor ctx = (TopiaContextImplementor) - TopiaContextFactory.getContext(config).beginTransaction(); - + + TopiaContextImplementor ctx = (TopiaContextImplementor) TopiaContextFactory + .getContext(config).beginTransaction(); + TopiaDAO personDAO = ctx.getDAO(Person.class); Person p = personDAO.create(); p.addPropertyListener("firstName", l); @@ -420,4 +446,152 @@ assertEquals("entityUpdated", state); } -} + public void testSecurityUser() throws Exception { + Properties config = getProperties(); + + config.setProperty("topia.authentication", "topia"); + + TopiaContext context = TopiaContextFactory.getContext(config); + + TopiaContextImplementor childContext = (TopiaContextImplementor) context + .beginTransaction(); + + TopiaUserManager userManager = childContext.getUserManager(); + + { + // Ma naissance + TopiaUser user = userManager.create("thimel", "a.thimel@gmail.com", + "zoubida"); + assertEquals("thimel", user.getLogin()); + assertEquals("a.thimel@gmail.com", user.getEmail()); + assertTrue(user.isCorrectPassord("zoubida")); + + // Mon arrivée à Code Lutin + user.setEmail("thimel@codelutin.com"); + user.setPassword("zoubida", "zou;bi@da"); + userManager.update(user); + + assertEquals("thimel", user.getLogin()); + assertEquals("thimel@codelutin.com", user.getEmail()); + assertFalse(user.isCorrectPassord("zoubida")); + assertTrue(user.isCorrectPassord("zou;bi@da")); + + // Suis-je toujours là ? + user = userManager.findUserByLogin("thimel"); + assertEquals("thimel", user.getLogin()); + assertEquals("thimel@codelutin.com", user.getEmail()); + assertTrue(user.isCorrectPassord("zou;bi@da")); + + List users = userManager + .findUserByEmail("thimel@codelutin.com"); + assertEquals(1, users.size()); + users = userManager.findUserByEmail("a.thimel@gmail.com"); + assertEquals(0, users.size()); + + Set principals = null; + try { + principals = userManager.authenticate("thimel", "zou;bi@da"); + assertNotNull(principals); + assertTrue(principals.size() > 0); + } catch (Exception eee) { + eee.printStackTrace(); + assertTrue(false); + } + + principals = null; + try { + principals = userManager.authenticate("thimel", "zimzoum"); + assertTrue(false); + } catch (Exception eee) { + eee.printStackTrace(); + } + assertNull(principals); + + // The end ? + // userManager.delete(user); + // users = userManager.findUserByEmail("thimel@codelutin.com"); + // assertEquals(0, users.size()); + + childContext.commitTransaction(); + } + + System.gc(); + + List users = userManager + .findUserByEmail("thimel@codelutin.com"); + assertEquals(1, users.size()); + } + + public void testSecurityCreateInitialPerm() throws Exception { + Properties config = getProperties(); + + config.setProperty("topia.authentication", "topia"); + + TopiaContext context = TopiaContextFactory.getContext(config); + + final TopiaContextImplementor childContext = (TopiaContextImplementor)context + .beginTransaction(); + + LoginContext ctx = new LoginContext("topia", new TopiaCallbackHandler( + "thimel", "zou;bi@da")); + ctx.login(); + + Subject me = ctx.getSubject(); + + Subject.doAsPrivileged(me, new PrivilegedExceptionAction() { + public Object run() throws Exception { + TopiaPermissionManager permManager = + childContext.getPermissionManager(); + Set principals = new HashSet(); + principals.add(new TopiaPrincipal("thimel")); + permManager.create("*", 15, principals); + childContext.commitTransaction(); + return null; + } + },null); + } + + public void testSecurityPermissions() throws Exception { + Properties config = getProperties(); + + config.setProperty("topia.authentication", "topia"); + + TopiaContext context = TopiaContextFactory.getContext(config); + + final TopiaContextImplementor childContext = (TopiaContextImplementor) context + .beginTransaction(); + + LoginContext ctx = new LoginContext("topia", new TopiaCallbackHandler( + "thimel", "zou;bi@da")); + ctx.login(); + + Subject me = ctx.getSubject(); + + Subject.doAsPrivileged(me, new PrivilegedExceptionAction() { + + public Object run() throws Exception { + TopiaPermissionManager permManager = childContext + .getPermissionManager(); + + TopiaPermission perm1 = permManager.create("abcd1234", 8, + new HashSet()); + assertEquals(2, permManager.getAllPermissions().size()); + + TopiaPermission perm2 = permManager.create("abcd1s34", 10, + new HashSet()); + assertEquals(3, permManager.getAllPermissions().size()); + + permManager.delete(perm2); + assertEquals(2, permManager.getAllPermissions().size()); + +// assertEquals(perm1, permManager.getAllPermissions() +// .iterator().next()); + childContext.commitTransaction(); + return null; + } + + }, null); + + } + +} //TopiaContextTest