diff --git a/projects/cadcAccessControl-Admin/build.xml b/projects/cadcAccessControl-Admin/build.xml index 69fca321f6832fdd7e56ab423a3c3b0051a8b49b..7d6e61846b6dadf85504be14efa70f0a910642bb 100644 --- a/projects/cadcAccessControl-Admin/build.xml +++ b/projects/cadcAccessControl-Admin/build.xml @@ -144,8 +144,7 @@ - - + diff --git a/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/AbstractCommand.java b/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/AbstractCommand.java index 9cda6f89fa9ab2a05d0e94c3a7bb9a19502620ef..5740a43e15bf4c3ecc81eeb0c19b227241dda2b8 100644 --- a/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/AbstractCommand.java +++ b/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/AbstractCommand.java @@ -136,7 +136,9 @@ public abstract class AbstractCommand implements PrivilegedAction protected UserPersistence getUserPersistence() { + System.setProperty("java.naming.factory.initial", ContextFactoryImpl.class.getName()); + PluginFactory pluginFactory = new PluginFactory(); - return pluginFactory.getUserPersistence(); + return pluginFactory.createUserPersistence(); } } diff --git a/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/ContextFactoryImpl.java b/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/ContextFactoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..bbfb8efa2fd6a4a40ab9525959fd1e3e3b111058 --- /dev/null +++ b/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/ContextFactoryImpl.java @@ -0,0 +1,25 @@ +package ca.nrc.cadc.ac.admin; + +import javax.naming.Context; +import javax.naming.NamingException; +import javax.naming.spi.InitialContextFactory; +import java.util.Hashtable; + +/** + * A Simple ContextFactory. + */ +public class ContextFactoryImpl implements InitialContextFactory +{ + + public ContextFactoryImpl() + { + } + + @Override + public Context getInitialContext(Hashtable environment) + throws NamingException + { + return new ContextImpl(); + } + +} diff --git a/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/ContextImpl.java b/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/ContextImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..e0e09fcda743ef609677efbbdce523641b6bccb9 --- /dev/null +++ b/projects/cadcAccessControl-Admin/src/ca/nrc/cadc/ac/admin/ContextImpl.java @@ -0,0 +1,266 @@ +/* +************************************************************************ +******************* CANADIAN ASTRONOMY DATA CENTRE ******************* +************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES ************** +* +* (c) 2011. (c) 2011. +* Government of Canada Gouvernement du Canada +* National Research Council Conseil national de recherches +* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6 +* All rights reserved Tous droits réservés +* +* NRC disclaims any warranties, Le CNRC dénie toute garantie +* expressed, implied, or énoncée, implicite ou légale, +* statutory, of any kind with de quelque nature que ce +* respect to the software, soit, concernant le logiciel, +* including without limitation y compris sans restriction +* any warranty of merchantability toute garantie de valeur +* or fitness for a particular marchande ou de pertinence +* purpose. NRC shall not be pour un usage particulier. +* liable in any event for any Le CNRC ne pourra en aucun cas +* damages, whether direct or être tenu responsable de tout +* indirect, special or general, dommage, direct ou indirect, +* consequential or incidental, particulier ou général, +* arising from the use of the accessoire ou fortuit, résultant +* software. Neither the name de l'utilisation du logiciel. Ni +* of the National Research le nom du Conseil National de +* Council of Canada nor the Recherches du Canada ni les noms +* names of its contributors may de ses participants ne peuvent +* be used to endorse or promote être utilisés pour approuver ou +* products derived from this promouvoir les produits dérivés +* software without specific prior de ce logiciel sans autorisation +* written permission. préalable et particulière +* par écrit. +* +* This file is part of the Ce fichier fait partie du projet +* OpenCADC project. OpenCADC. +* +* OpenCADC is free software: OpenCADC est un logiciel libre ; +* you can redistribute it and/or vous pouvez le redistribuer ou le +* modify it under the terms of modifier suivant les termes de +* the GNU Affero General Public la “GNU Affero General Public +* License as published by the License” telle que publiée +* Free Software Foundation, par la Free Software Foundation +* either version 3 of the : soit la version 3 de cette +* License, or (at your option) licence, soit (à votre gré) +* any later version. toute version ultérieure. +* +* OpenCADC is distributed in the OpenCADC est distribué +* hope that it will be useful, dans l’espoir qu’il vous +* but WITHOUT ANY WARRANTY; sera utile, mais SANS AUCUNE +* without even the implied GARANTIE : sans même la garantie +* warranty of MERCHANTABILITY implicite de COMMERCIALISABILITÉ +* or FITNESS FOR A PARTICULAR ni d’ADÉQUATION À UN OBJECTIF +* PURPOSE. See the GNU Affero PARTICULIER. Consultez la Licence +* General Public License for Générale Publique GNU Affero +* more details. pour plus de détails. +* +* You should have received Vous devriez avoir reçu une +* a copy of the GNU Affero copie de la Licence Générale +* General Public License along Publique GNU Affero avec +* with OpenCADC. If not, see OpenCADC ; si ce n’est +* . pas le cas, consultez : +* . +* +* $Revision: 5 $ +* +************************************************************************ +*/ + +package ca.nrc.cadc.ac.admin; + +import javax.naming.Binding; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.Name; +import javax.naming.NameClassPair; +import javax.naming.NameParser; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +/** + * A Simple JNDI context. + */ +public class ContextImpl implements Context +{ + Map map = new HashMap(1); + + @Override + public Object lookup(String name) throws NamingException + { + return map.get(name); + } + + @Override + public void bind(String name, Object value) throws NamingException + { + map.put(name, value); + } + + @Override + public Object addToEnvironment(String arg0, Object arg1) + throws NamingException + { + return null; + } + + @Override + public void bind(Name arg0, Object arg1) throws NamingException + { + } + + @Override + public void close() throws NamingException + { + } + + @Override + public Name composeName(Name arg0, Name arg1) throws NamingException + { + return null; + } + + @Override + public String composeName(String arg0, String arg1) + throws NamingException + { + return null; + } + + @Override + public Context createSubcontext(Name arg0) throws NamingException + { + // TODO Auto-generated method stub + return null; + } + + @Override + public Context createSubcontext(String arg0) throws NamingException + { + return null; + } + + @Override + public void destroySubcontext(Name arg0) throws NamingException + { + } + + @Override + public void destroySubcontext(String arg0) throws NamingException + { + // TODO Auto-generated method stub + + } + + @Override + public Hashtable getEnvironment() throws NamingException + { + return null; + } + + @Override + public String getNameInNamespace() throws NamingException + { + return null; + } + + @Override + public NameParser getNameParser(Name arg0) throws NamingException + { + return null; + } + + @Override + public NameParser getNameParser(String arg0) throws NamingException + { + return null; + } + + @Override + public NamingEnumeration list(Name arg0) + throws NamingException + { + return null; + } + + @Override + public NamingEnumeration list(String arg0) + throws NamingException + { + // TODO Auto-generated method stub + return null; + } + + @Override + public NamingEnumeration listBindings(Name arg0) + throws NamingException + { + return null; + } + + @Override + public NamingEnumeration listBindings(String arg0) + throws NamingException + { + return null; + } + + @Override + public Object lookup(Name arg0) throws NamingException + { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object lookupLink(Name arg0) throws NamingException + { + return null; + } + + @Override + public Object lookupLink(String arg0) throws NamingException + { + return null; + } + + @Override + public void rebind(Name arg0, Object arg1) throws NamingException + { + } + + @Override + public void rebind(String arg0, Object arg1) throws NamingException + { + } + + @Override + public Object removeFromEnvironment(String arg0) throws NamingException + { + return null; + } + + @Override + public void rename(Name arg0, Name arg1) throws NamingException + { + } + + @Override + public void rename(String arg0, String arg1) throws NamingException + { + } + + @Override + public void unbind(Name arg0) throws NamingException + { + } + + @Override + public void unbind(String arg0) throws NamingException + { + } + +} \ No newline at end of file diff --git a/projects/cadcAccessControl-Admin/test/LdapConfig.properties b/projects/cadcAccessControl-Admin/test/LdapConfig.properties index 57fdb97105d8df8f1a4fb538f734a7045feadbfb..27f519ac7bb015646dcdabdf763c2a6ebcf8c447 100644 --- a/projects/cadcAccessControl-Admin/test/LdapConfig.properties +++ b/projects/cadcAccessControl-Admin/test/LdapConfig.properties @@ -1,8 +1,48 @@ -# This are the configuration fields required by the unit tests -server = proc5-03.cadc.dao.nrc.ca +############################################################### +# +# LDAP Connection and Pool Configuration +# +# +############################################################### + +# Read-only connection pool +readOnly.servers = proc5-03.cadc.dao.nrc.ca +readOnly.poolInitSize = 1 +readOnly.poolMaxSize = 2 +readOnly.poolPolicy = roundRobin +readOnly.maxWait = 30000 +readOnly.createIfNeeded = false + +# Read-write connection pool +readWrite.servers = proc5-03.cadc.dao.nrc.ca +readWrite.poolInitSize = 1 +readWrite.poolMaxSize = 2 +readWrite.poolPolicy = roundRobin +readWrite.maxWait = 30000 +readWrite.createIfNeeded = false + +# Unbound-Read-only connection pool +unboundReadOnly.servers = proc5-03.cadc.dao.nrc.ca +unboundReadOnly.poolInitSize = 1 +unboundReadOnly.poolMaxSize = 2 +unboundReadOnly.poolPolicy = roundRobin +unboundReadOnly.maxWait = 30000 +unboundReadOnly.createIfNeeded = false + +# server configuration -- applies to all servers +#dbrcHost = devLdap +#port = 636 +#proxyUser = uid=webproxy,ou=SpecialUsers,dc=canfar,dc=net +#usersDN = ou=Users,ou=ds,dc=canfar,dc=net +#userRequestsDN = ou=userRequests,ou=ds,dc=canfar,dc=net +#groupsDN = ou=Groups,ou=ds,dc=canfar,dc=net +#adminGroupsDN = ou=adminGroups,ou=ds,dc=canfar,dc=net + +# tree without aci's +dbrcHost = devLdap port = 389 -proxyUser = testproxy -usersDn = ou=Users,ou=ds,dc=testcanfar +proxyUser = uid=testproxy,ou=SpecialUsers,dc=testcanfar +usersDN = ou=Users,ou=ds,dc=testcanfar userRequestsDN = ou=UserRequests,ou=ds,dc=testcanfar -groupsDn = ou=Groups,ou=ds,dc=testcanfar -adminGroupsDn = ou=adminGroups,ou=ds,dc=testcanfar \ No newline at end of file +groupsDN = ou=Groups,ou=ds,dc=testcanfar +adminGroupsDN = ou=adminGroups,ou=ds,dc=testcanfar \ No newline at end of file diff --git a/projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/CmdLineParserTest.java b/projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/CmdLineParserTest.java index 010dc0f64adbb2836a7bd610b80610210774a64d..c9c28332d14f22d5869334e70c7d035c5314cb50 100644 --- a/projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/CmdLineParserTest.java +++ b/projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/CmdLineParserTest.java @@ -209,7 +209,7 @@ public class CmdLineParserTest } catch (UsageException e) { - String expected = "Missing command or ommand is not supported"; + String expected = "Missing command or command is not supported"; Assert.assertTrue(e.getMessage().contains(expected)); } catch (Exception e) diff --git a/projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/integration/AdminIntTest.java b/projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/UserAdminTest.java similarity index 96% rename from projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/integration/AdminIntTest.java rename to projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/UserAdminTest.java index ff8a4262841842871a8cbc45a1bdc81af9a44ca8..938f8b4a42ed8b44c7f2dd7312829c3d80571994 100644 --- a/projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/integration/AdminIntTest.java +++ b/projects/cadcAccessControl-Admin/test/src/ca/nrc/cadc/ac/admin/UserAdminTest.java @@ -66,7 +66,7 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.admin.integration; +package ca.nrc.cadc.ac.admin; import ca.nrc.cadc.ac.PersonalDetails; import ca.nrc.cadc.ac.User; @@ -79,6 +79,7 @@ import ca.nrc.cadc.auth.DNPrincipal; import ca.nrc.cadc.auth.HttpPrincipal; import ca.nrc.cadc.net.TransientException; import ca.nrc.cadc.util.Log4jInit; +import ca.nrc.cadc.util.PropertiesReader; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.BeforeClass; @@ -99,9 +100,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -public class AdminIntTest +public class UserAdminTest { - private static final Logger log = Logger.getLogger(AdminIntTest.class); + private static final Logger log = Logger.getLogger(UserAdminTest.class); static final String EXEC_CMD = "./test/scripts/userAdminTest"; @@ -117,6 +118,8 @@ public class AdminIntTest testCert = "build/test/class/cadcauthtest1.pem"; config = LdapConfig.getLdapConfig(); + + System.setProperty(PropertiesReader.class.getName() + ".dir", "test"); } @Test @@ -350,15 +353,18 @@ public class AdminIntTest if (isPending) { userDAO.addPendingUser(userRequest); + log.debug("added pending user: " + username); } else { userDAO.addUser(userRequest); + log.debug("added user: " + username); } return null; } catch (Exception e) { + log.error("Exception adding user: " + e.getMessage()); throw new Exception("Problems", e); } } @@ -411,6 +417,7 @@ public class AdminIntTest LdapUserPersistence getUserPersistence() { + System.setProperty("java.naming.factory.initial", ContextFactoryImpl.class.getName()); return new LdapUserPersistence(); }