|
@@ -1,266 +0,0 @@
|
|
|
-/* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
|
|
|
- *
|
|
|
- * 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.
|
|
|
- */
|
|
|
-
|
|
|
-package org.acegisecurity.ldap;
|
|
|
-
|
|
|
-import org.apache.directory.server.core.configuration.Configuration;
|
|
|
-import org.apache.directory.server.core.configuration.MutablePartitionConfiguration;
|
|
|
-import org.apache.directory.server.core.configuration.MutableStartupConfiguration;
|
|
|
-import org.apache.directory.server.core.jndi.CoreContextFactory;
|
|
|
-import org.apache.directory.server.core.partition.DefaultPartitionNexus;
|
|
|
-
|
|
|
-import java.io.File;
|
|
|
-
|
|
|
-import java.util.HashSet;
|
|
|
-import java.util.Properties;
|
|
|
-import java.util.Set;
|
|
|
-
|
|
|
-import javax.naming.Context;
|
|
|
-import javax.naming.NameAlreadyBoundException;
|
|
|
-import javax.naming.NamingException;
|
|
|
-import javax.naming.directory.Attribute;
|
|
|
-import javax.naming.directory.Attributes;
|
|
|
-import javax.naming.directory.BasicAttribute;
|
|
|
-import javax.naming.directory.BasicAttributes;
|
|
|
-import javax.naming.directory.DirContext;
|
|
|
-import javax.naming.directory.InitialDirContext;
|
|
|
-
|
|
|
-
|
|
|
-/**
|
|
|
- * An embedded LDAP test server, complete with test data for running the unit tests against.
|
|
|
- *
|
|
|
- * @author Luke Taylor
|
|
|
- * @version $Id$
|
|
|
- */
|
|
|
-public class LdapTestServer {
|
|
|
- //~ Instance fields ================================================================================================
|
|
|
-
|
|
|
- private DirContext serverContext;
|
|
|
-
|
|
|
- private MutableStartupConfiguration cfg;
|
|
|
-
|
|
|
- //~ Constructors ===================================================================================================
|
|
|
-
|
|
|
- /**
|
|
|
- * Starts up and configures ApacheDS.
|
|
|
- */
|
|
|
- public LdapTestServer() {
|
|
|
- startLdapServer();
|
|
|
- createManagerUser();
|
|
|
- initTestData();
|
|
|
- }
|
|
|
-
|
|
|
- //~ Methods ========================================================================================================
|
|
|
-
|
|
|
- public void createGroup(String cn, String groupContext, String ou, String[] memberDns) {
|
|
|
- Attributes group = new BasicAttributes("cn", cn);
|
|
|
- Attribute members = new BasicAttribute("member");
|
|
|
- Attribute orgUnit = new BasicAttribute("ou", ou);
|
|
|
-
|
|
|
- for (int i = 0; i < memberDns.length; i++) {
|
|
|
- members.add(memberDns[i]);
|
|
|
- }
|
|
|
-
|
|
|
- Attribute objectClass = new BasicAttribute("objectClass");
|
|
|
- objectClass.add("top");
|
|
|
- objectClass.add("groupOfNames");
|
|
|
-
|
|
|
- group.put(objectClass);
|
|
|
- group.put(members);
|
|
|
- group.put(orgUnit);
|
|
|
-
|
|
|
- try {
|
|
|
- DirContext ctx = serverContext.createSubcontext("cn=" + cn + "," + groupContext, group);
|
|
|
- System.out.println("Created group " + ctx.getNameInNamespace());
|
|
|
- } catch (NameAlreadyBoundException ignore) {
|
|
|
-// System.out.println(" group " + cn + " already exists.");
|
|
|
- } catch (NamingException ne) {
|
|
|
- System.err.println("Failed to create group.");
|
|
|
- ne.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void createManagerUser() {
|
|
|
- Attributes user = new BasicAttributes("cn", "manager", true);
|
|
|
- user.put("userPassword", "acegisecurity");
|
|
|
-
|
|
|
- Attribute objectClass = new BasicAttribute("objectClass");
|
|
|
- user.put(objectClass);
|
|
|
- objectClass.add("top");
|
|
|
- objectClass.add("person");
|
|
|
- objectClass.add("organizationalPerson");
|
|
|
- objectClass.add("inetOrgPerson");
|
|
|
- user.put("sn", "Manager");
|
|
|
- user.put("cn", "manager");
|
|
|
-
|
|
|
- try {
|
|
|
- serverContext.createSubcontext("cn=manager", user);
|
|
|
- } catch (NameAlreadyBoundException ignore) {
|
|
|
- // System.out.println("Manager user already exists.");
|
|
|
- } catch (NamingException ne) {
|
|
|
- System.err.println("Failed to create manager user.");
|
|
|
- ne.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void createOu(String name) {
|
|
|
- Attributes ou = new BasicAttributes("ou", name);
|
|
|
- Attribute objectClass = new BasicAttribute("objectClass");
|
|
|
- objectClass.add("top");
|
|
|
- objectClass.add("organizationalUnit");
|
|
|
- ou.put(objectClass);
|
|
|
-
|
|
|
- try {
|
|
|
- serverContext.createSubcontext(name, ou);
|
|
|
- } catch (NameAlreadyBoundException ignore) {
|
|
|
- // System.out.println(" ou " + name + " already exists.");
|
|
|
- } catch (NamingException ne) {
|
|
|
- System.err.println("Failed to create ou.");
|
|
|
- ne.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void createUser(String uid, String cn, String password) {
|
|
|
- Attributes user = new BasicAttributes("uid", uid);
|
|
|
- user.put("cn", cn);
|
|
|
- user.put("userPassword", LdapUtils.getUtf8Bytes(password));
|
|
|
-
|
|
|
- Attribute objectClass = new BasicAttribute("objectClass");
|
|
|
- user.put(objectClass);
|
|
|
- objectClass.add("top");
|
|
|
- objectClass.add("person");
|
|
|
- objectClass.add("organizationalPerson");
|
|
|
- objectClass.add("inetOrgPerson");
|
|
|
- user.put("sn", uid);
|
|
|
-
|
|
|
- try {
|
|
|
- serverContext.createSubcontext("uid=" + uid + ",ou=people", user);
|
|
|
- } catch (NameAlreadyBoundException ignore) {
|
|
|
-// System.out.println(" user " + uid + " already exists.");
|
|
|
- } catch (NamingException ne) {
|
|
|
- System.err.println("Failed to create user.");
|
|
|
- ne.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public Configuration getConfiguration() {
|
|
|
- return cfg;
|
|
|
- }
|
|
|
-
|
|
|
- private void initConfiguration() throws NamingException {
|
|
|
- // Create the partition for the acegi tests
|
|
|
- MutablePartitionConfiguration acegiDit = new MutablePartitionConfiguration();
|
|
|
- acegiDit.setName("acegisecurity");
|
|
|
- acegiDit.setSuffix("dc=acegisecurity,dc=org");
|
|
|
-
|
|
|
- BasicAttributes attributes = new BasicAttributes();
|
|
|
- BasicAttribute objectClass = new BasicAttribute("objectClass");
|
|
|
- objectClass.add("top");
|
|
|
- objectClass.add("domain");
|
|
|
- objectClass.add("extensibleObject");
|
|
|
- attributes.put(objectClass);
|
|
|
- acegiDit.setContextEntry(attributes);
|
|
|
-
|
|
|
- Set indexedAttrs = new HashSet();
|
|
|
- indexedAttrs.add("objectClass");
|
|
|
- indexedAttrs.add("uid");
|
|
|
- indexedAttrs.add("cn");
|
|
|
- indexedAttrs.add("ou");
|
|
|
- indexedAttrs.add("member");
|
|
|
-
|
|
|
- acegiDit.setIndexedAttributes(indexedAttrs);
|
|
|
-
|
|
|
- Set partitions = new HashSet();
|
|
|
- partitions.add(acegiDit);
|
|
|
-
|
|
|
- cfg.setContextPartitionConfigurations(partitions);
|
|
|
- }
|
|
|
-
|
|
|
- private void initTestData() {
|
|
|
- createOu("ou=people");
|
|
|
- createOu("ou=groups");
|
|
|
- createOu("ou=subgroups,ou=groups");
|
|
|
-
|
|
|
- createUser("bob", "Bob Hamilton", "bobspassword");
|
|
|
- createUser("ben", "Ben Alex", "{SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=");
|
|
|
-
|
|
|
- String[] developers = new String[]{
|
|
|
- "uid=ben,ou=people,dc=acegisecurity,dc=org", "uid=bob,ou=people,dc=acegisecurity,dc=org"
|
|
|
- };
|
|
|
- createGroup("developers", "ou=groups", "developer", developers);
|
|
|
- createGroup("managers", "ou=groups", "manager", new String[]{developers[0]});
|
|
|
- createGroup("submanagers", "ou=subgroups,ou=groups", "submanager", new String[]{developers[0]});
|
|
|
- }
|
|
|
-
|
|
|
- public static void main(String[] args) {
|
|
|
- LdapTestServer server = new LdapTestServer();
|
|
|
- }
|
|
|
-
|
|
|
- private void startLdapServer() {
|
|
|
- cfg = new MutableStartupConfiguration();
|
|
|
-
|
|
|
- // Attempt to use the maven target directory for the apache ds store. Property is passed
|
|
|
- // through surefire plugin setup in pom.xml.
|
|
|
-
|
|
|
- String apacheWorkDir = System.getProperty("apacheDSWorkDir");
|
|
|
-
|
|
|
- if (apacheWorkDir == null) {
|
|
|
- apacheWorkDir = System.getProperty("java.io.tmpdir") + File.separator + "apacheds-work";
|
|
|
- }
|
|
|
-
|
|
|
- File workingDir = new File(apacheWorkDir);
|
|
|
-
|
|
|
- // Delete any previous contents (often not compatible between apache-ds versions).
|
|
|
- deleteDir(workingDir);
|
|
|
-
|
|
|
- ((MutableStartupConfiguration) cfg).setWorkingDirectory(workingDir);
|
|
|
-
|
|
|
- System.out.println("Ldap Server Working directory is " + workingDir.getAbsolutePath());
|
|
|
-
|
|
|
- Properties env = new Properties();
|
|
|
-
|
|
|
- env.setProperty(Context.PROVIDER_URL, "dc=acegisecurity,dc=org");
|
|
|
- env.setProperty(Context.INITIAL_CONTEXT_FACTORY, CoreContextFactory.class.getName());
|
|
|
- env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
|
|
|
- env.setProperty(Context.SECURITY_PRINCIPAL, DefaultPartitionNexus.ADMIN_PRINCIPAL);
|
|
|
- env.setProperty(Context.SECURITY_CREDENTIALS, DefaultPartitionNexus.ADMIN_PASSWORD);
|
|
|
-
|
|
|
- try {
|
|
|
- initConfiguration();
|
|
|
- env.putAll(cfg.toJndiEnvironment());
|
|
|
- serverContext = new InitialDirContext(env);
|
|
|
- } catch (NamingException e) {
|
|
|
- System.err.println("Failed to start Apache DS");
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Recursively deletes a directory
|
|
|
- */
|
|
|
- private boolean deleteDir(File dir) {
|
|
|
- if (dir.isDirectory()) {
|
|
|
- String[] children = dir.list();
|
|
|
- for (int i = 0; i < children.length; i++) {
|
|
|
- boolean success = deleteDir(new File(dir, children[i]));
|
|
|
- if (!success) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return dir.delete();
|
|
|
- }
|
|
|
-}
|