You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by km...@apache.org on 2016/01/14 18:16:29 UTC
[1/4] knox git commit: [KNOX-647] Rename LDAP artifacts from test to
demo
Repository: knox
Updated Branches:
refs/heads/master 0bcc6594e -> 3158bc842
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/src/main/resources/log4j.properties b/gateway-test-ldap/src/main/resources/log4j.properties
deleted file mode 100644
index 40b5546..0000000
--- a/gateway-test-ldap/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-
-log4j.rootLogger=ERROR,stdout
-log4j.threshhold=ALL
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p %m%n
-
-#log4j.logger.org.apache.directory=INFO
-#log4j.logger.org.apache.hadoop.gateway=INFO
-#log4j.logger.org.apache.hadoop.gateway=DEBUG
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/src/main/resources/users.ldif
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/src/main/resources/users.ldif b/gateway-test-ldap/src/main/resources/users.ldif
deleted file mode 100644
index f75edb8..0000000
--- a/gateway-test-ldap/src/main/resources/users.ldif
+++ /dev/null
@@ -1,44 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you 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.
-
-version: 1
-
-dn: dc=hadoop,dc=apache,dc=org
-objectclass: organization
-objectclass: dcObject
-o: Hadoop at Apache.org
-dc: hadoop
-description: Makers of Hadoop
-
-# entry for a sample people container
-# please replace with site specific values
-dn: ou=people,dc=hadoop,dc=apache,dc=org
-objectclass:top
-objectclass:organizationalUnit
-ou: people
-
-# entry for a sample end user
-# please replace with site specific values
-dn: uid=guest,ou=people,dc=hadoop,dc=apache,dc=org
-objectclass:top
-objectclass:person
-objectclass:organizationalPerson
-objectclass:inetOrgPerson
-cn: Guest
-sn: User
-uid: guest
-userPassword:guest-password
-
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/src/test/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapServerTest.java
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/src/test/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapServerTest.java b/gateway-test-ldap/src/test/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapServerTest.java
deleted file mode 100644
index 75f439e..0000000
--- a/gateway-test-ldap/src/test/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapServerTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.apache.hadoop.gateway.security.ldap;
-
-import org.apache.directory.api.ldap.model.exception.LdapAuthenticationException;
-import org.apache.directory.api.ldap.model.exception.LdapException;
-import org.apache.directory.ldap.client.api.LdapConnection;
-import org.apache.directory.ldap.client.api.LdapNetworkConnection;
-import org.apache.directory.server.protocol.shared.transport.TcpTransport;
-import org.apache.directory.server.protocol.shared.transport.Transport;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.ServerSocket;
-
-import static org.junit.Assert.fail;
-
-public class SimpleLdapServerTest {
-
- private static int port;
- private static File ldifFile;
- private static SimpleLdapDirectoryServer ldap;
-
- @BeforeClass
- public static void setup() throws Exception {
- port = findFreePort();
- ldifFile = new File( ClassLoader.getSystemResource( "users.ldif" ).toURI() );
- ldap = new SimpleLdapDirectoryServer( "dc=hadoop,dc=apache,dc=org", ldifFile, new Transport[]{ new TcpTransport( port ) } );
- ldap.start();
- }
-
- @AfterClass
- public static void cleanup() throws Exception {
- if( ldap != null ) {
- ldap.stop( true );
- }
- }
-
- private static int findFreePort() throws IOException {
- ServerSocket socket = new ServerSocket(0);
- int port = socket.getLocalPort();
- socket.close();
- return port;
- }
-
- @Test
- public void testBind() throws LdapException, IOException {
- LdapConnection connection;
-
- connection = new LdapNetworkConnection( "localhost", port );
- try {
- connection.bind( "uid=guest,ou=people,dc=hadoop,dc=apache,dc=org", "guest-password" );
- } finally {
- connection.close();
- }
-
- connection = new LdapNetworkConnection( "localhost", port );
- try {
- connection.bind( "uid=nobody,ou=people,dc=hadoop,dc=apache,dc=org", "guest-password" );
- fail( "Expected LdapAuthenticationException" );
- } catch ( LdapAuthenticationException e ) {
- // Expected
- } finally {
- connection.close();
- }
-
- connection = new LdapNetworkConnection( "localhost", port );
- try {
- connection.bind( "uid=guest,ou=people,dc=hadoop,dc=apache,dc=org", "wrong-password" );
- fail( "Expected LdapAuthenticationException" );
- } catch ( LdapAuthenticationException e ) {
- // Expected
- } finally {
- connection.close();
- }
-
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test/pom.xml
----------------------------------------------------------------------
diff --git a/gateway-test/pom.xml b/gateway-test/pom.xml
index 9d60ef7..b0016e0 100644
--- a/gateway-test/pom.xml
+++ b/gateway-test/pom.xml
@@ -48,7 +48,7 @@
<dependency>
<groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-ldap</artifactId>
+ <artifactId>gateway-demo-ldap</artifactId>
<scope>test</scope>
</dependency>
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/hsso-release/pom.xml
----------------------------------------------------------------------
diff --git a/hsso-release/pom.xml b/hsso-release/pom.xml
index 117f669..7f93201 100644
--- a/hsso-release/pom.xml
+++ b/hsso-release/pom.xml
@@ -169,11 +169,11 @@
<dependency>
<groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-ldap</artifactId>
+ <artifactId>gateway-demo-ldap</artifactId>
</dependency>
<dependency>
<groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-ldap-launcher</artifactId>
+ <artifactId>gateway-demo-ldap-launcher</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/hsso-release/src/assembly.xml
----------------------------------------------------------------------
diff --git a/hsso-release/src/assembly.xml b/hsso-release/src/assembly.xml
index 59f7aa1..54ed892 100644
--- a/hsso-release/src/assembly.xml
+++ b/hsso-release/src/assembly.xml
@@ -70,7 +70,7 @@
<exclude>${gateway-group}:gateway-util-launcher</exclude>
<exclude>${gateway-group}:gateway-server-launcher</exclude>
<exclude>${gateway-group}:gateway-shell-launcher</exclude>
- <exclude>${gateway-group}:gateway-test-ldap-launcher</exclude>
+ <exclude>${gateway-group}:gateway-demo-ldap-launcher</exclude>
</excludes>
</dependencySet>
<dependencySet>
@@ -91,7 +91,7 @@
<outputDirectory>bin</outputDirectory>
<outputFileNameMapping>ldap.jar</outputFileNameMapping>
<includes>
- <include>${gateway-group}:gateway-test-ldap-launcher</include>
+ <include>${gateway-group}:gateway-demo-ldap-launcher</include>
</includes>
</dependencySet>
</dependencySets>
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f47ebb3..c0ee6f9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,8 +39,8 @@
<module>gateway-util-configinjector</module>
<module>gateway-util-launcher</module>
<module>gateway-util-urltemplate</module>
- <module>gateway-test-ldap</module>
- <module>gateway-test-ldap-launcher</module>
+ <module>gateway-demo-ldap</module>
+ <module>gateway-demo-ldap-launcher</module>
<module>gateway-i18n</module>
<module>gateway-i18n-logging-log4j</module>
<module>gateway-i18n-logging-sl4j</module>
@@ -986,12 +986,12 @@
<dependency>
<groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-ldap</artifactId>
+ <artifactId>gateway-demo-ldap</artifactId>
<version>${gateway-version}</version>
</dependency>
<dependency>
<groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-ldap-launcher</artifactId>
+ <artifactId>gateway-demo-ldap-launcher</artifactId>
<version>${gateway-version}</version>
</dependency>
[4/4] knox git commit: [KNOX-647] Rename LDAP artifacts from test to
demo
Posted by km...@apache.org.
[KNOX-647] Rename LDAP artifacts from test to demo
Project: http://git-wip-us.apache.org/repos/asf/knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/3158bc84
Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/3158bc84
Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/3158bc84
Branch: refs/heads/master
Commit: 3158bc842c910bcbc485f16a1fafcc0b6e530093
Parents: 0bcc659
Author: Kevin Minder <ke...@hortonworks.com>
Authored: Wed Jan 13 15:00:17 2016 -0500
Committer: Kevin Minder <ke...@hortonworks.com>
Committed: Thu Jan 14 11:54:32 2016 -0500
----------------------------------------------------------------------
gateway-demo-ldap-launcher/pom.xml | 72 +
.../src/main/resources/META-INF/launcher.cfg | 17 +
gateway-demo-ldap/pom.xml | 179 ++
.../security/ldap/BaseDirectoryService.java | 2323 ++++++++++++++++++
.../ldap/BaseDirectoryServiceFactory.java | 290 +++
.../security/ldap/SimpleDirectoryService.java | 29 +
.../ldap/SimpleDirectoryServiceFactory.java | 34 +
.../ldap/SimpleLdapDirectoryServer.java | 110 +
.../src/main/resources/log4j.properties | 25 +
gateway-demo-ldap/src/main/resources/users.ldif | 44 +
.../security/ldap/SimpleLdapServerTest.java | 98 +
gateway-release/pom.xml | 4 +-
gateway-release/src/assembly.xml | 4 +-
gateway-server/pom.xml | 2 +-
gateway-test-ldap-launcher/pom.xml | 72 -
.../src/main/resources/META-INF/launcher.cfg | 17 -
gateway-test-ldap/pom.xml | 179 --
.../security/ldap/BaseDirectoryService.java | 2323 ------------------
.../ldap/BaseDirectoryServiceFactory.java | 290 ---
.../security/ldap/SimpleDirectoryService.java | 29 -
.../ldap/SimpleDirectoryServiceFactory.java | 34 -
.../ldap/SimpleLdapDirectoryServer.java | 110 -
.../src/main/resources/log4j.properties | 25 -
gateway-test-ldap/src/main/resources/users.ldif | 44 -
.../security/ldap/SimpleLdapServerTest.java | 98 -
gateway-test/pom.xml | 2 +-
hsso-release/pom.xml | 4 +-
hsso-release/src/assembly.xml | 4 +-
pom.xml | 8 +-
29 files changed, 3235 insertions(+), 3235 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap-launcher/pom.xml
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap-launcher/pom.xml b/gateway-demo-ldap-launcher/pom.xml
new file mode 100644
index 0000000..6dabc01
--- /dev/null
+++ b/gateway-demo-ldap-launcher/pom.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>gateway</artifactId>
+ <groupId>org.apache.knox</groupId>
+ <version>0.8.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>gateway-demo-ldap-launcher</artifactId>
+ <name>gateway-demo-ldap-launcher</name>
+ <description>Launcher for the demo LDAP server.</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>${gateway-group}</groupId>
+ <artifactId>gateway-util-launcher</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <inherited>false</inherited>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.4</version>
+ <executions>
+ <execution>
+ <id>server-launcher</id>
+ <phase>package</phase>
+ <goals><goal>single</goal></goals>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ <archive>
+ <manifest>
+ <mainClass>org.apache.hadoop.gateway.launcher.Launcher</mainClass>
+ </manifest>
+ </archive>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap-launcher/src/main/resources/META-INF/launcher.cfg
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap-launcher/src/main/resources/META-INF/launcher.cfg b/gateway-demo-ldap-launcher/src/main/resources/META-INF/launcher.cfg
new file mode 100644
index 0000000..3a06075
--- /dev/null
+++ b/gateway-demo-ldap-launcher/src/main/resources/META-INF/launcher.cfg
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+main.class = org.apache.hadoop.gateway.security.ldap.SimpleLdapDirectoryServer
+class.path = ../lib/*.jar;../dep/*.jar;../ext;../ext/*.jar
+log4j.configuration=${launcher.dir}/../conf/${launcher.name}-log4j.properties
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/pom.xml
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/pom.xml b/gateway-demo-ldap/pom.xml
new file mode 100644
index 0000000..d6f3c90
--- /dev/null
+++ b/gateway-demo-ldap/pom.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.knox</groupId>
+ <artifactId>gateway</artifactId>
+ <version>0.8.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>gateway-demo-ldap</artifactId>
+
+ <name>gateway-demo-ldap</name>
+ <description>A LDAP server based on ApacheDS used for demos.</description>
+
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+
+ <!--
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.2.1</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>java</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <mainClass>org.apache.hadoop.gateway.security.EmbeddedApacheDirectoryServer</mainClass>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ -->
+
+ <!--
+ <profiles>
+ <profile>
+ <id>release</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>2.0</version>
+ <configuration>
+ <transformers>
+ <transformer
+ implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+ <manifestEntries>
+ <Main-Class>org.apache.hadoop.gateway.security.EmbeddedApacheDirectoryServer
+ </Main-Class>
+ </manifestEntries>
+ </transformer>
+ </transformers>
+ <filters>
+ <filter>
+ <artifact>*:*</artifact>
+ <excludes>
+ <exclude>META-INF/*.SF</exclude>
+ <exclude>META-INF/*.DSA</exclude>
+ <exclude>META-INF/*.RSA</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+ -->
+
+ <dependencies>
+
+ <!--
+ <dependency>
+ <groupId>org.apache.directory.server</groupId>
+ <artifactId>apacheds-server-integ</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.directory.server</groupId>
+ <artifactId>apacheds-core-entry</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.directory.shared</groupId>
+ <artifactId>shared-ldap</artifactId>
+ </dependency>
+ -->
+ <!--
+ <dependency>
+ <groupId>org.apache.directory.server</groupId>
+ <artifactId>apacheds-jdbm</artifactId>
+ </dependency>
+ -->
+ <dependency>
+ <groupId>org.apache.directory.server</groupId>
+ <artifactId>apacheds-all</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>ldapsdk</groupId>
+ <artifactId>ldapsdk</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </dependency>
+
+ <!--
+ <dependency>
+ <groupId>org.apache.directory.server</groupId>
+ <artifactId>apacheds-all</artifactId>
+ <version>1.5.5</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.directory.shared</groupId>
+ <artifactId>shared-ldap-schema</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ -->
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>${gateway-group}</groupId>
+ <artifactId>gateway-test-utils</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryService.java
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryService.java b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryService.java
new file mode 100644
index 0000000..d18cef4
--- /dev/null
+++ b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryService.java
@@ -0,0 +1,2323 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.hadoop.gateway.security.ldap;
+
+
+import org.apache.directory.api.ldap.codec.api.LdapApiService;
+import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory;
+import org.apache.directory.api.ldap.model.constants.AuthenticationLevel;
+import org.apache.directory.api.ldap.model.constants.SchemaConstants;
+import org.apache.directory.api.ldap.model.csn.Csn;
+import org.apache.directory.api.ldap.model.csn.CsnFactory;
+import org.apache.directory.api.ldap.model.cursor.Cursor;
+import org.apache.directory.api.ldap.model.entry.Attribute;
+import org.apache.directory.api.ldap.model.entry.DefaultEntry;
+import org.apache.directory.api.ldap.model.entry.Entry;
+import org.apache.directory.api.ldap.model.entry.Modification;
+import org.apache.directory.api.ldap.model.entry.Value;
+import org.apache.directory.api.ldap.model.exception.LdapException;
+import org.apache.directory.api.ldap.model.exception.LdapNoPermissionException;
+import org.apache.directory.api.ldap.model.exception.LdapOperationException;
+import org.apache.directory.api.ldap.model.ldif.ChangeType;
+import org.apache.directory.api.ldap.model.ldif.LdifEntry;
+import org.apache.directory.api.ldap.model.ldif.LdifReader;
+import org.apache.directory.api.ldap.model.name.Dn;
+import org.apache.directory.api.ldap.model.name.DnUtils;
+import org.apache.directory.api.ldap.model.name.Rdn;
+import org.apache.directory.api.ldap.model.schema.SchemaManager;
+import org.apache.directory.api.ldap.util.tree.DnNode;
+import org.apache.directory.api.util.DateUtils;
+import org.apache.directory.api.util.Strings;
+import org.apache.directory.api.util.exception.NotImplementedException;
+import org.apache.directory.server.constants.ServerDNConstants;
+import org.apache.directory.server.core.DefaultOperationManager;
+import org.apache.directory.server.core.admin.AdministrativePointInterceptor;
+import org.apache.directory.server.core.api.*;
+import org.apache.directory.server.core.api.administrative.AccessControlAdministrativePoint;
+import org.apache.directory.server.core.api.administrative.CollectiveAttributeAdministrativePoint;
+import org.apache.directory.server.core.api.administrative.SubschemaAdministrativePoint;
+import org.apache.directory.server.core.api.administrative.TriggerExecutionAdministrativePoint;
+import org.apache.directory.server.core.api.changelog.ChangeLog;
+import org.apache.directory.server.core.api.changelog.ChangeLogEvent;
+import org.apache.directory.server.core.api.changelog.Tag;
+import org.apache.directory.server.core.api.changelog.TaggableSearchableChangeLogStore;
+import org.apache.directory.server.core.api.event.EventService;
+import org.apache.directory.server.core.api.interceptor.BaseInterceptor;
+import org.apache.directory.server.core.api.interceptor.Interceptor;
+import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
+import org.apache.directory.server.core.api.interceptor.context.BindOperationContext;
+import org.apache.directory.server.core.api.interceptor.context.HasEntryOperationContext;
+import org.apache.directory.server.core.api.interceptor.context.LookupOperationContext;
+import org.apache.directory.server.core.api.interceptor.context.OperationContext;
+import org.apache.directory.server.core.api.journal.Journal;
+import org.apache.directory.server.core.api.partition.Partition;
+import org.apache.directory.server.core.api.partition.PartitionNexus;
+import org.apache.directory.server.core.api.schema.SchemaPartition;
+import org.apache.directory.server.core.api.subtree.SubentryCache;
+import org.apache.directory.server.core.api.subtree.SubtreeEvaluator;
+import org.apache.directory.server.core.authn.AuthenticationInterceptor;
+import org.apache.directory.server.core.authn.ppolicy.PpolicyConfigContainer;
+import org.apache.directory.server.core.authz.AciAuthorizationInterceptor;
+import org.apache.directory.server.core.authz.DefaultAuthorizationInterceptor;
+import org.apache.directory.server.core.changelog.ChangeLogInterceptor;
+import org.apache.directory.server.core.changelog.DefaultChangeLog;
+import org.apache.directory.server.core.collective.CollectiveAttributeInterceptor;
+import org.apache.directory.server.core.event.EventInterceptor;
+import org.apache.directory.server.core.exception.ExceptionInterceptor;
+import org.apache.directory.server.core.journal.DefaultJournal;
+import org.apache.directory.server.core.journal.JournalInterceptor;
+import org.apache.directory.server.core.normalization.NormalizationInterceptor;
+import org.apache.directory.server.core.operational.OperationalAttributeInterceptor;
+import org.apache.directory.server.core.referral.ReferralInterceptor;
+import org.apache.directory.server.core.schema.SchemaInterceptor;
+import org.apache.directory.server.core.security.TlsKeyGenerator;
+import org.apache.directory.server.core.shared.DefaultCoreSession;
+import org.apache.directory.server.core.shared.DefaultDnFactory;
+import org.apache.directory.server.core.shared.partition.DefaultPartitionNexus;
+import org.apache.directory.server.core.subtree.SubentryInterceptor;
+import org.apache.directory.server.core.trigger.TriggerInterceptor;
+import org.apache.directory.server.i18n.I18n;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.io.StringReader;
+import java.lang.reflect.Method;
+import java.nio.channels.FileLock;
+import java.nio.channels.OverlappingFileLockException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+
+/**
+ * Base implementation of {@link DirectoryService}.
+ * This is a copy of org.apache.directory.server.core.DefaultDirectoryService
+ * created to make showSecurityWarnings protected. This can be removed
+ * when http://svn.apache.org/r1546144 in ApacheDS 2.0.0-M16 is available.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class BaseDirectoryService implements DirectoryService
+{
+ /** The logger */
+ private static final Logger LOG = LoggerFactory.getLogger( BaseDirectoryService.class );
+
+ private SchemaPartition schemaPartition;
+
+ /** A reference on the SchemaManager */
+ private SchemaManager schemaManager;
+
+ /** The LDAP Codec Service */
+ private LdapApiService ldapCodecService = LdapApiServiceFactory.getSingleton();
+
+ /** the root nexus */
+ private DefaultPartitionNexus partitionNexus;
+
+ /** whether or not server is started for the first time */
+ private boolean firstStart;
+
+ /** whether or not this instance has been shutdown */
+ private boolean started;
+
+ /** the change log service */
+ private ChangeLog changeLog;
+
+ /** the journal service */
+ private Journal journal;
+
+ /**
+ * the interface used to perform various operations on this
+ * DirectoryService
+ */
+ private OperationManager operationManager = new DefaultOperationManager( this );
+
+ /** the distinguished name of the administrative user */
+ private Dn adminDn;
+
+ /** session used as admin for internal operations */
+ private CoreSession adminSession;
+
+ /** The referral manager */
+ private ReferralManager referralManager;
+
+ /** A flag to tell if the userPassword attribute's value must be hidden */
+ private boolean passwordHidden = false;
+
+ /** The service's CSN factory */
+ private CsnFactory csnFactory;
+
+ /** The directory instance replication ID */
+ private int replicaId;
+
+ /** remove me after implementation is completed */
+ private static final String PARTIAL_IMPL_WARNING =
+ "WARNING: the changelog is only partially operational and will revert\n" +
+ "state without consideration of who made the original change. All reverting " +
+ "changes are made by the admin user.\n Furthermore the used controls are not at " +
+ "all taken into account";
+
+ /** The delay to wait between each sync on disk */
+ private long syncPeriodMillis;
+
+ /** The default delay to wait between sync on disk : 15 seconds */
+ private static final long DEFAULT_SYNC_PERIOD = 15000;
+
+ /** */
+ private Thread workerThread;
+
+ /** The default timeLimit : 100 entries */
+ public static final int MAX_SIZE_LIMIT_DEFAULT = 100;
+
+ /** The default timeLimit : 10 seconds */
+ public static final int MAX_TIME_LIMIT_DEFAULT = 10000;
+
+ /** The instance Id */
+ private String instanceId;
+
+ /** The server directory layout*/
+ private InstanceLayout instanceLayout;
+
+ /**
+ * A flag used to shutdown the VM when stopping the server. Useful
+ * when the server is standalone. If the server is embedded, we don't
+ * want to shutdown the VM
+ */
+ private boolean exitVmOnShutdown = true; // allow by default
+
+ /** A flag used to indicate that a shutdown hook has been installed */
+ private boolean shutdownHookEnabled = true; // allow by default
+
+ /** Manage anonymous access to entries other than the RootDSE */
+ private boolean allowAnonymousAccess = false; // forbid by default
+
+ /** Manage the basic access control checks */
+ private boolean accessControlEnabled; // off by default
+
+ /** Manage the operational attributes denormalization */
+ private boolean denormalizeOpAttrsEnabled; // off by default
+
+ /** The list of declared interceptors */
+ private List<Interceptor> interceptors;
+ private Map<String, Interceptor> interceptorNames;
+
+ /** A lock to protect the interceptors List */
+ private ReadWriteLock interceptorsLock = new ReentrantReadWriteLock();
+
+ /** The read and write locks */
+ private Lock readLock = interceptorsLock.readLock();
+ private Lock writeLock = interceptorsLock.writeLock();
+
+ /** A map associating a list of interceptor to each operation */
+ private Map<OperationEnum, List<String>> operationInterceptors;
+
+ /** The System partition */
+ private Partition systemPartition;
+
+ /** The set of all declared partitions */
+ private Set<Partition> partitions = new HashSet<Partition>();
+
+ /** A list of LDIF entries to inject at startup */
+ private List<? extends LdifEntry> testEntries = new ArrayList<LdifEntry>(); // List<Attributes>
+
+ /** The event service */
+ private EventService eventService;
+
+ /** The maximum size for an incoming PDU */
+ private int maxPDUSize = Integer.MAX_VALUE;
+
+ /** the value of last successful add/update operation's CSN */
+ private String contextCsn;
+
+ /** lock file for directory service's working directory */
+ private RandomAccessFile lockFile = null;
+
+ private static final String LOCK_FILE_NAME = ".dirservice.lock";
+
+ /** the ehcache based cache service */
+ private CacheService cacheService;
+
+ /** The AccessControl AdministrativePoint cache */
+ private DnNode<AccessControlAdministrativePoint> accessControlAPCache;
+
+ /** The CollectiveAttribute AdministrativePoint cache */
+ private DnNode<CollectiveAttributeAdministrativePoint> collectiveAttributeAPCache;
+
+ /** The Subschema AdministrativePoint cache */
+ private DnNode<SubschemaAdministrativePoint> subschemaAPCache;
+
+ /** The TriggerExecution AdministrativePoint cache */
+ private DnNode<TriggerExecutionAdministrativePoint> triggerExecutionAPCache;
+
+ /** The Dn factory */
+ private DnFactory dnFactory;
+
+ /** The Subentry cache */
+ SubentryCache subentryCache = new SubentryCache();
+
+ /** The Subtree evaluator instance */
+ private SubtreeEvaluator evaluator;
+
+
+ // ------------------------------------------------------------------------
+ // Constructor
+ // ------------------------------------------------------------------------
+
+ /**
+ * Creates a new instance of the directory service.
+ */
+ public BaseDirectoryService() throws Exception
+ {
+ changeLog = new DefaultChangeLog();
+ journal = new DefaultJournal();
+ syncPeriodMillis = DEFAULT_SYNC_PERIOD;
+ csnFactory = new CsnFactory( replicaId );
+ evaluator = new SubtreeEvaluator( schemaManager );
+ setDefaultInterceptorConfigurations();
+ }
+
+
+ // ------------------------------------------------------------------------
+ // C O N F I G U R A T I O N M E T H O D S
+ // ------------------------------------------------------------------------
+
+ public void setInstanceId( String instanceId )
+ {
+ this.instanceId = instanceId;
+ }
+
+
+ public String getInstanceId()
+ {
+ return instanceId;
+ }
+
+
+ /**
+ * Gets the {@link Partition}s used by this DirectoryService.
+ *
+ * @return the set of partitions used
+ */
+ public Set<? extends Partition> getPartitions()
+ {
+ Set<Partition> cloned = new HashSet<Partition>();
+ cloned.addAll( partitions );
+ return cloned;
+ }
+
+
+ /**
+ * Sets {@link Partition}s used by this DirectoryService.
+ *
+ * @param partitions the partitions to used
+ */
+ public void setPartitions( Set<? extends Partition> partitions )
+ {
+ Set<Partition> cloned = new HashSet<Partition>();
+ cloned.addAll( partitions );
+ Set<String> names = new HashSet<String>();
+
+ for ( Partition partition : cloned )
+ {
+ String id = partition.getId();
+
+ if ( names.contains( id ) )
+ {
+ LOG.warn( "Encountered duplicate partition {} identifier.", id );
+ }
+
+ names.add( id );
+ }
+
+ this.partitions = cloned;
+ }
+
+
+ /**
+ * Returns <tt>true</tt> if access control checks are enabled.
+ *
+ * @return true if access control checks are enabled, false otherwise
+ */
+ public boolean isAccessControlEnabled()
+ {
+ return accessControlEnabled;
+ }
+
+
+ /**
+ * Sets whether to enable basic access control checks or not.
+ *
+ * @param accessControlEnabled true to enable access control checks, false otherwise
+ */
+ public void setAccessControlEnabled( boolean accessControlEnabled )
+ {
+ this.accessControlEnabled = accessControlEnabled;
+ }
+
+
+ /**
+ * Returns <tt>true</tt> if anonymous access is allowed on entries besides the RootDSE.
+ * If the access control subsystem is enabled then access to some entries may not be
+ * allowed even when full anonymous access is enabled.
+ *
+ * @return true if anonymous access is allowed on entries besides the RootDSE, false
+ * if anonymous access is allowed to all entries.
+ */
+ public boolean isAllowAnonymousAccess()
+ {
+ return allowAnonymousAccess;
+ }
+
+
+ /**
+ * Sets whether to allow anonymous access to entries other than the RootDSE. If the
+ * access control subsystem is enabled then access to some entries may not be allowed
+ * even when full anonymous access is enabled.
+ *
+ * @param enableAnonymousAccess true to enable anonymous access, false to disable it
+ */
+ public void setAllowAnonymousAccess( boolean enableAnonymousAccess )
+ {
+ this.allowAnonymousAccess = enableAnonymousAccess;
+ }
+
+
+ /**
+ * Returns interceptors in the server.
+ *
+ * @return the interceptors in the server.
+ */
+ public List<Interceptor> getInterceptors()
+ {
+ List<Interceptor> cloned = new ArrayList<Interceptor>();
+
+ readLock.lock();
+
+ try
+ {
+ cloned.addAll( interceptors );
+
+ return cloned;
+ }
+ finally
+ {
+ readLock.unlock();
+ }
+ }
+
+
+ /**
+ * Returns interceptors in the server for a given operation.
+ *
+ * @return the interceptors in the server for the given operation.
+ */
+ public List<String> getInterceptors( OperationEnum operation )
+ {
+ List<String> cloned = new ArrayList<String>();
+
+ readLock.lock();
+
+ try
+ {
+ cloned.addAll( operationInterceptors.get( operation ) );
+
+ return cloned;
+ }
+ finally
+ {
+ readLock.unlock();
+ }
+
+ }
+
+
+ /**
+ * Compute the list of to call for each operation
+ */
+ private void initOperationsList()
+ {
+ writeLock.lock();
+
+ try
+ {
+ operationInterceptors = new ConcurrentHashMap<OperationEnum, List<String>>();
+
+ for ( OperationEnum operation : OperationEnum.getOperations() )
+ {
+ List<String> operationList = new ArrayList<String>();
+
+ for ( Interceptor interceptor : interceptors )
+ {
+ gatherInterceptors( interceptor, interceptor.getClass(), operation, operationList );
+ }
+
+ operationInterceptors.put( operation, operationList );
+ }
+ }
+ finally
+ {
+ writeLock.unlock();
+ }
+ }
+
+
+ /**
+ * Recursively checks if the given interceptor can be added to the list of interceptors for a given
+ * operation and adds to the list of interceptors if it implements the respective operation
+ *
+ * @param interceptor the instance of the interceptor
+ * @param interceptorClz the class of the interceptor
+ * @param operation type of operation
+ * @param selectedInterceptorList the list of selected interceptors
+ */
+ private void gatherInterceptors( Interceptor interceptor, Class<?> interceptorClz, OperationEnum operation,
+ List<String> selectedInterceptorList )
+ {
+ // We stop recursing when we reach the Base class
+ if ( ( interceptorClz == null ) || ( interceptorClz == BaseInterceptor.class ) )
+ {
+ return;
+ }
+
+ // We don't call getMethods() because it would get back the default methods
+ // from the BaseInterceptor, something we don't want.
+ Method[] methods = interceptorClz.getDeclaredMethods();
+
+ for ( Method method : methods )
+ {
+ Class<?>[] param = method.getParameterTypes();
+ boolean hasCorrestSig = false;
+
+ // check for the correct signature
+ if ( ( param == null ) || ( param.length > 1 ) || ( param.length == 0 ) )
+ {
+ continue;
+ }
+
+ if ( OperationContext.class.isAssignableFrom( param[0] ) )
+ {
+ hasCorrestSig = true;
+ }
+ else
+ {
+ continue;
+ }
+
+ if ( hasCorrestSig && method.getName().equals( operation.getMethodName() ) )
+ {
+ if ( !selectedInterceptorList.contains( interceptor.getName() ) )
+ {
+ selectedInterceptorList.add( interceptor.getName() );
+ }
+
+ break;
+ }
+ }
+
+ // Recurse on extended classes, as we have used getDeclaredMethods() instead of getmethods()
+ gatherInterceptors( interceptor, interceptorClz.getSuperclass(), operation, selectedInterceptorList );
+ }
+
+
+ /**
+ * Add an interceptor to the list of interceptors to call for each operation
+ * @throws LdapException
+ */
+ private void addInterceptor( Interceptor interceptor, int position ) throws LdapException
+ {
+ // First, init the interceptor
+ interceptor.init( this );
+
+ writeLock.lock();
+
+ try
+ {
+ for ( OperationEnum operation : OperationEnum.getOperations() )
+ {
+ List<String> operationList = operationInterceptors.get( operation );
+
+ Method[] methods = interceptor.getClass().getDeclaredMethods();
+
+ for ( Method method : methods )
+ {
+ if ( method.getName().equals( operation.getMethodName() ) )
+ {
+ if ( position == -1 )
+ {
+ operationList.add( interceptor.getName() );
+ }
+ else
+ {
+ operationList.add( position, interceptor.getName() );
+ }
+
+ break;
+ }
+ }
+ }
+
+ interceptorNames.put( interceptor.getName(), interceptor );
+
+ if ( position == -1 )
+ {
+ interceptors.add( interceptor );
+ }
+ else
+ {
+ interceptors.add( position, interceptor );
+ }
+ }
+ finally
+ {
+ writeLock.unlock();
+ }
+ }
+
+
+ /**
+ * Remove an interceptor to the list of interceptors to call for each operation
+ */
+ private void removeOperationsList( String interceptorName )
+ {
+ Interceptor interceptor = interceptorNames.get( interceptorName );
+
+ writeLock.lock();
+
+ try
+ {
+ for ( OperationEnum operation : OperationEnum.getOperations() )
+ {
+ List<String> operationList = operationInterceptors.get( operation );
+
+ Method[] methods = interceptor.getClass().getDeclaredMethods();
+
+ for ( Method method : methods )
+ {
+ if ( method.getName().equals( operation.getMethodName() ) )
+ {
+ operationList.remove( interceptor.getName() );
+
+ break;
+ }
+ }
+ }
+
+ interceptorNames.remove( interceptorName );
+ interceptors.remove( interceptor );
+ }
+ finally
+ {
+ writeLock.unlock();
+ }
+ }
+
+
+ /**
+ * Sets the interceptors in the server.
+ *
+ * @param interceptors the interceptors to be used in the server.
+ */
+ public void setInterceptors( List<Interceptor> interceptors )
+ {
+ Map<String, Interceptor> interceptorNames = new HashMap<String, Interceptor>();
+
+ // Check if we don't have duplicate names in the interceptors list
+ for ( Interceptor interceptor : interceptors )
+ {
+ if ( interceptorNames.containsKey( interceptor.getName() ) )
+ {
+ LOG.warn( "Encountered duplicate definitions for {} interceptor", interceptor.getName() );
+ continue;
+ }
+
+ interceptorNames.put( interceptor.getName(), interceptor );
+ }
+
+ this.interceptors = interceptors;
+ this.interceptorNames = interceptorNames;
+
+ // Now update the Map that connect each operation with the list of interceptors.
+ initOperationsList();
+ }
+
+
+ /**
+ * Initialize the interceptors
+ */
+ private void initInterceptors() throws LdapException
+ {
+ for ( Interceptor interceptor : interceptors )
+ {
+ interceptor.init( this );
+ }
+ }
+
+
+ /**
+ * Returns test directory entries({@link LdifEntry}) to be loaded while
+ * bootstrapping.
+ *
+ * @return test entries to load during bootstrapping
+ */
+ public List<LdifEntry> getTestEntries()
+ {
+ List<LdifEntry> cloned = new ArrayList<LdifEntry>();
+ cloned.addAll( testEntries );
+
+ return cloned;
+ }
+
+
+ /**
+ * Sets test directory entries({@link javax.naming.directory.Attributes}) to be loaded while
+ * bootstrapping.
+ *
+ * @param testEntries the test entries to load while bootstrapping
+ */
+ public void setTestEntries( List<? extends LdifEntry> testEntries )
+ {
+ //noinspection MismatchedQueryAndUpdateOfCollection
+ List<LdifEntry> cloned = new ArrayList<LdifEntry>();
+ cloned.addAll( testEntries );
+ this.testEntries = testEntries;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public InstanceLayout getInstanceLayout()
+ {
+ return instanceLayout;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setInstanceLayout( InstanceLayout instanceLayout ) throws IOException
+ {
+ this.instanceLayout = instanceLayout;
+
+ // Create the directories if they are missing
+ if ( !instanceLayout.getInstanceDirectory().exists() )
+ {
+ if ( !instanceLayout.getInstanceDirectory().mkdirs() )
+ {
+ throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
+ instanceLayout.getInstanceDirectory() ) );
+ }
+ }
+
+ if ( !instanceLayout.getLogDirectory().exists() )
+ {
+ if ( !instanceLayout.getLogDirectory().mkdirs() )
+ {
+ throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
+ instanceLayout.getLogDirectory() ) );
+ }
+ }
+
+ if ( !instanceLayout.getRunDirectory().exists() )
+ {
+ if ( !instanceLayout.getRunDirectory().mkdirs() )
+ {
+ throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
+ instanceLayout.getRunDirectory() ) );
+ }
+ }
+
+ if ( !instanceLayout.getPartitionsDirectory().exists() )
+ {
+ if ( !instanceLayout.getPartitionsDirectory().mkdirs() )
+ {
+ throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
+ instanceLayout.getPartitionsDirectory() ) );
+ }
+ }
+
+ if ( !instanceLayout.getConfDirectory().exists() )
+ {
+ if ( !instanceLayout.getConfDirectory().mkdirs() )
+ {
+ throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
+ instanceLayout.getConfDirectory() ) );
+ }
+ }
+ }
+
+
+ public void setShutdownHookEnabled( boolean shutdownHookEnabled )
+ {
+ this.shutdownHookEnabled = shutdownHookEnabled;
+ }
+
+
+ public boolean isShutdownHookEnabled()
+ {
+ return shutdownHookEnabled;
+ }
+
+
+ public void setExitVmOnShutdown( boolean exitVmOnShutdown )
+ {
+ this.exitVmOnShutdown = exitVmOnShutdown;
+ }
+
+
+ public boolean isExitVmOnShutdown()
+ {
+ return exitVmOnShutdown;
+ }
+
+
+ public void setSystemPartition( Partition systemPartition )
+ {
+ this.systemPartition = systemPartition;
+ }
+
+
+ public Partition getSystemPartition()
+ {
+ return systemPartition;
+ }
+
+
+ /**
+ * return true if the operational attributes must be normalized when returned
+ */
+ public boolean isDenormalizeOpAttrsEnabled()
+ {
+ return denormalizeOpAttrsEnabled;
+ }
+
+
+ /**
+ * Sets whether the operational attributes are denormalized when returned
+ * @param denormalizeOpAttrsEnabled The flag value
+ */
+ public void setDenormalizeOpAttrsEnabled( boolean denormalizeOpAttrsEnabled )
+ {
+ this.denormalizeOpAttrsEnabled = denormalizeOpAttrsEnabled;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public ChangeLog getChangeLog()
+ {
+ return changeLog;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Journal getJournal()
+ {
+ return journal;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setChangeLog( ChangeLog changeLog )
+ {
+ this.changeLog = changeLog;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setJournal( Journal journal )
+ {
+ this.journal = journal;
+ }
+
+
+ public void addPartition( Partition partition ) throws Exception
+ {
+ partition.setSchemaManager( schemaManager );
+
+ try
+ {
+ // can be null when called before starting up
+ if ( partitionNexus != null )
+ {
+ partitionNexus.addContextPartition( partition );
+ }
+ }
+ catch ( LdapException le )
+ {
+ // We've got an exception, we cannot add the partition to the partitions
+ throw le;
+ }
+
+ // Now, add the partition to the set of managed partitions
+ partitions.add( partition );
+ }
+
+
+ public void removePartition( Partition partition ) throws Exception
+ {
+ // Do the backend cleanup first
+ try
+ {
+ // can be null when called before starting up
+ if ( partitionNexus != null )
+ {
+ partitionNexus.removeContextPartition( partition.getSuffixDn() );
+ }
+ }
+ catch ( LdapException le )
+ {
+ // Bad ! We can't go any further
+ throw le;
+ }
+
+ // And update the set of managed partitions
+ partitions.remove( partition );
+ }
+
+
+ // ------------------------------------------------------------------------
+ // BackendSubsystem Interface Method Implementations
+ // ------------------------------------------------------------------------
+ /**
+ * Define a default list of interceptors that has to be used if no other
+ * configuration is defined.
+ */
+ private void setDefaultInterceptorConfigurations()
+ {
+ // Set default interceptor chains
+ List<Interceptor> list = new ArrayList<Interceptor>();
+
+ list.add( new NormalizationInterceptor() );
+ list.add( new AuthenticationInterceptor() );
+ list.add( new ReferralInterceptor() );
+ list.add( new AciAuthorizationInterceptor() );
+ list.add( new DefaultAuthorizationInterceptor() );
+ list.add( new AdministrativePointInterceptor() );
+ list.add( new ExceptionInterceptor() );
+ list.add( new SchemaInterceptor() );
+ list.add( new OperationalAttributeInterceptor() );
+ list.add( new CollectiveAttributeInterceptor() );
+ list.add( new SubentryInterceptor() );
+ list.add( new EventInterceptor() );
+ list.add( new TriggerInterceptor() );
+ list.add( new ChangeLogInterceptor() );
+ list.add( new JournalInterceptor() );
+
+ setInterceptors( list );
+ }
+
+
+ public CoreSession getAdminSession()
+ {
+ return adminSession;
+ }
+
+
+ /**
+ * Get back an anonymous session
+ */
+ public CoreSession getSession()
+ {
+ return new DefaultCoreSession( new LdapPrincipal( schemaManager ), this );
+ }
+
+
+ /**
+ * Get back a session for a given principal
+ */
+ public CoreSession getSession( LdapPrincipal principal )
+ {
+ return new DefaultCoreSession( principal, this );
+ }
+
+
+ /**
+ * Get back a session for the give user and credentials bound with Simple Bind
+ */
+ public CoreSession getSession( Dn principalDn, byte[] credentials ) throws LdapException
+ {
+ synchronized ( this )
+ {
+ if ( !started )
+ {
+ throw new IllegalStateException( "Service has not started." );
+ }
+ }
+
+ BindOperationContext bindContext = new BindOperationContext( null );
+ bindContext.setCredentials( credentials );
+ bindContext.setDn( principalDn.apply( schemaManager ) );
+ bindContext.setInterceptors( getInterceptors( OperationEnum.BIND ) );
+
+ operationManager.bind( bindContext );
+
+ return bindContext.getSession();
+ }
+
+
+ /**
+ * Get back a session for a given user bound with SASL Bind
+ */
+ public CoreSession getSession( Dn principalDn, byte[] credentials, String saslMechanism, String saslAuthId )
+ throws Exception
+ {
+ synchronized ( this )
+ {
+ if ( !started )
+ {
+ throw new IllegalStateException( "Service has not started." );
+
+ }
+ }
+
+ BindOperationContext bindContext = new BindOperationContext( null );
+ bindContext.setCredentials( credentials );
+ bindContext.setDn( principalDn.apply( schemaManager ) );
+ bindContext.setSaslMechanism( saslMechanism );
+ bindContext.setInterceptors( getInterceptors( OperationEnum.BIND ) );
+
+ operationManager.bind( bindContext );
+
+ return bindContext.getSession();
+ }
+
+
+ public long revert() throws LdapException
+ {
+ if ( changeLog == null || !changeLog.isEnabled() )
+ {
+ throw new IllegalStateException( I18n.err( I18n.ERR_310 ) );
+ }
+
+ Tag latest = changeLog.getLatest();
+
+ if ( null != latest )
+ {
+ if ( latest.getRevision() < changeLog.getCurrentRevision() )
+ {
+ return revert( latest.getRevision() );
+ }
+ else
+ {
+ LOG.info( "Ignoring request to revert without changes since the latest tag." );
+ return changeLog.getCurrentRevision();
+ }
+ }
+
+ throw new IllegalStateException( I18n.err( I18n.ERR_311 ) );
+ }
+
+
+ /**
+ * We handle the ModDN/ModRDN operation for the revert here.
+ */
+ private void moddn( Dn oldDn, Dn newDn, boolean delOldRdn ) throws LdapException
+ {
+ if ( oldDn.size() == 0 )
+ {
+ throw new LdapNoPermissionException( I18n.err( I18n.ERR_312 ) );
+ }
+
+ // calculate parents
+ Dn oldBase = oldDn.getParent();
+ Dn newBase = newDn.getParent();
+
+ // Compute the Rdn for each of the Dn
+ Rdn newRdn = newDn.getRdn();
+ Rdn oldRdn = oldDn.getRdn();
+
+ /*
+ * We need to determine if this rename operation corresponds to a simple
+ * Rdn name change or a move operation. If the two names are the same
+ * except for the Rdn then it is a simple modifyRdn operation. If the
+ * names differ in size or have a different baseDN then the operation is
+ * a move operation. Furthermore if the Rdn in the move operation
+ * changes it is both an Rdn change and a move operation.
+ */
+ if ( ( oldDn.size() == newDn.size() ) && oldBase.equals( newBase ) )
+ {
+ adminSession.rename( oldDn, newRdn, delOldRdn );
+ }
+ else
+ {
+ Dn target = newDn.getParent();
+
+ if ( newRdn.equals( oldRdn ) )
+ {
+ adminSession.move( oldDn, target );
+ }
+ else
+ {
+ adminSession.moveAndRename( oldDn, target, new Rdn( newRdn ), delOldRdn );
+ }
+ }
+ }
+
+
+ public long revert( long revision ) throws LdapException
+ {
+ if ( changeLog == null || !changeLog.isEnabled() )
+ {
+ throw new IllegalStateException( I18n.err( I18n.ERR_310 ) );
+ }
+
+ if ( revision < 0 )
+ {
+ throw new IllegalArgumentException( I18n.err( I18n.ERR_239 ) );
+ }
+
+ if ( revision >= changeLog.getChangeLogStore().getCurrentRevision() )
+ {
+ throw new IllegalArgumentException( I18n.err( I18n.ERR_314 ) );
+ }
+
+ Cursor<ChangeLogEvent> cursor = changeLog.getChangeLogStore().findAfter( revision );
+
+ /*
+ * BAD, BAD, BAD!!!
+ *
+ * No synchronization no nothing. Just getting this to work for now
+ * so we can revert tests. Any production grade use of this feature
+ * needs to synchronize on all changes while the revert is in progress.
+ *
+ * How about making this operation transactional?
+ *
+ * First of all just stop using JNDI and construct the operations to
+ * feed into the interceptor pipeline.
+ *
+ * TODO review this code.
+ */
+
+ try
+ {
+ LOG.warn( PARTIAL_IMPL_WARNING );
+ cursor.afterLast();
+
+ while ( cursor.previous() ) // apply ldifs in reverse order
+ {
+ ChangeLogEvent event = cursor.get();
+ List<LdifEntry> reverses = event.getReverseLdifs();
+
+ for ( LdifEntry reverse : reverses )
+ {
+ switch ( reverse.getChangeType().getChangeType() )
+ {
+ case ChangeType.ADD_ORDINAL:
+ adminSession.add(
+ new DefaultEntry( schemaManager, reverse.getEntry() ), true );
+ break;
+
+ case ChangeType.DELETE_ORDINAL:
+ adminSession.delete( reverse.getDn(), true );
+ break;
+
+ case ChangeType.MODIFY_ORDINAL:
+ List<Modification> mods = reverse.getModifications();
+
+ adminSession.modify( reverse.getDn(), mods, true );
+ break;
+
+ case ChangeType.MODDN_ORDINAL:
+ // NO BREAK - both ModDN and ModRDN handling is the same
+
+ case ChangeType.MODRDN_ORDINAL:
+ Dn forwardDn = event.getForwardLdif().getDn();
+ Dn reverseDn = reverse.getDn();
+
+ moddn( reverseDn, forwardDn, reverse.isDeleteOldRdn() );
+
+ break;
+
+ default:
+ LOG.error( I18n.err( I18n.ERR_75 ) );
+ throw new NotImplementedException( I18n.err( I18n.ERR_76, reverse.getChangeType() ) );
+ }
+ }
+ }
+ }
+ catch ( Exception e )
+ {
+ throw new LdapOperationException( e.getMessage(), e );
+ }
+ finally
+ {
+ try
+ {
+ cursor.close();
+ }
+ catch ( Exception e )
+ {
+ throw new LdapOperationException( e.getMessage(), e );
+ }
+ }
+
+ return changeLog.getCurrentRevision();
+ }
+
+
+ public OperationManager getOperationManager()
+ {
+ return operationManager;
+ }
+
+
+ /**
+ * @throws Exception if the LDAP server cannot be started
+ */
+ public synchronized void startup() throws Exception
+ {
+ if ( started )
+ {
+ return;
+ }
+
+ lockWorkDir();
+
+ if ( shutdownHookEnabled )
+ {
+ Runtime.getRuntime().addShutdownHook( new Thread( new Runnable()
+ {
+ public void run()
+ {
+ try
+ {
+ shutdown();
+ }
+ catch ( Exception e )
+ {
+ LOG.warn( "Failed to shut down the directory service: "
+ + BaseDirectoryService.this.instanceId, e );
+ }
+ }
+ }, "ApacheDS Shutdown Hook (" + instanceId + ')' ) );
+
+ LOG.info( "ApacheDS shutdown hook has been registered with the runtime." );
+ }
+ else if ( LOG.isWarnEnabled() )
+ {
+ LOG.warn( "ApacheDS shutdown hook has NOT been registered with the runtime."
+ + " This default setting for standalone operation has been overriden." );
+ }
+
+ initialize();
+ showSecurityWarnings();
+
+ // load the last stored valid CSN value
+ LookupOperationContext loc = new LookupOperationContext( getAdminSession(), systemPartition.getSuffixDn(),
+ SchemaConstants.ALL_ATTRIBUTES_ARRAY );
+
+ Entry entry = systemPartition.lookup( loc );
+
+ Attribute cntextCsnAt = entry.get( SchemaConstants.CONTEXT_CSN_AT );
+
+ if ( cntextCsnAt != null )
+ {
+ // this is a multivalued attribute but current syncrepl provider implementation stores only ONE value at ou=system
+ contextCsn = cntextCsnAt.getString();
+ }
+
+ started = true;
+
+ if ( !testEntries.isEmpty() )
+ {
+ createTestEntries();
+ }
+ }
+
+
+ public synchronized void sync() throws Exception
+ {
+ if ( !started )
+ {
+ return;
+ }
+
+ this.changeLog.sync();
+ this.partitionNexus.sync();
+ }
+
+
+ public synchronized void shutdown() throws Exception
+ {
+ LOG.debug( "+++ DirectoryService Shutdown required" );
+
+ if ( !started )
+ {
+ return;
+ }
+
+ // --------------------------------------------------------------------
+ // Shutdown the sync thread
+ // --------------------------------------------------------------------
+ LOG.debug( "--- Syncing the nexus " );
+ partitionNexus.sync();
+
+ // --------------------------------------------------------------------
+ // Shutdown the changelog
+ // --------------------------------------------------------------------
+ LOG.debug( "--- Syncing the changeLog " );
+ changeLog.sync();
+ changeLog.destroy();
+
+ // --------------------------------------------------------------------
+ // Shutdown the journal if enabled
+ // --------------------------------------------------------------------
+ if ( journal.isEnabled() )
+ {
+ LOG.debug( "--- Destroying the journal " );
+ journal.destroy();
+ }
+
+ // --------------------------------------------------------------------
+ // Shutdown the partition
+ // --------------------------------------------------------------------
+
+ LOG.debug( "--- Destroying the nexus" );
+ partitionNexus.destroy();
+
+ // Last flush...
+ LOG.debug( "--- Flushing everything before quitting" );
+ getOperationManager().lockWrite();
+ partitionNexus.sync();
+ getOperationManager().unlockWrite();
+
+ // --------------------------------------------------------------------
+ // And shutdown the server
+ // --------------------------------------------------------------------
+ LOG.debug( "--- Deleting the cache service" );
+ cacheService.destroy();
+
+ LOG.debug( "---Deleting the DnCache" );
+ dnFactory = null;
+
+ if ( lockFile != null )
+ {
+ try
+ {
+ lockFile.close();
+ // no need to delete the lock file
+ }
+ catch ( IOException e )
+ {
+ LOG.warn( "couldn't delete the lock file {}", LOCK_FILE_NAME );
+ }
+ }
+
+ LOG.debug( "+++ DirectoryService stopped" );
+ started = false;
+ }
+
+
+ /**
+ * @return The referral manager
+ */
+ public ReferralManager getReferralManager()
+ {
+ return referralManager;
+ }
+
+
+ /**
+ * Set the referralManager
+ * @param referralManager The initialized referralManager
+ */
+ public void setReferralManager( ReferralManager referralManager )
+ {
+ this.referralManager = referralManager;
+ }
+
+
+ /**
+ * @return the SchemaManager
+ */
+ public SchemaManager getSchemaManager()
+ {
+ return schemaManager;
+ }
+
+
+ /**
+ * Set the SchemaManager instance.
+ *
+ * @param schemaManager The server schemaManager
+ */
+ public void setSchemaManager( SchemaManager schemaManager )
+ {
+ this.schemaManager = schemaManager;
+ }
+
+
+ public LdapApiService getLdapCodecService()
+ {
+ return ldapCodecService;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public SchemaPartition getSchemaPartition()
+ {
+ return schemaPartition;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setSchemaPartition( SchemaPartition schemaPartition )
+ {
+ this.schemaPartition = schemaPartition;
+ }
+
+
+ public DefaultPartitionNexus getPartitionNexus()
+ {
+ return partitionNexus;
+ }
+
+
+ public boolean isFirstStart()
+ {
+ return firstStart;
+ }
+
+
+ public synchronized boolean isStarted()
+ {
+ return started;
+ }
+
+
+ public Entry newEntry( Dn dn )
+ {
+ return new DefaultEntry( schemaManager, dn );
+ }
+
+
+ /**
+ * Returns true if we had to create the bootstrap entries on the first
+ * start of the server. Otherwise if all entries exist, meaning none
+ * had to be created, then we are not starting for the first time.
+ *
+ * @return true if the bootstrap entries had to be created, false otherwise
+ * @throws Exception if entries cannot be created
+ */
+ private boolean createBootstrapEntries() throws Exception
+ {
+ boolean firstStart = false;
+
+ // -------------------------------------------------------------------
+ // create admin entry
+ // -------------------------------------------------------------------
+
+ /*
+ * If the admin entry is there, then the database was already created
+ */
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, adminDn ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, adminDn );
+
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
+ SchemaConstants.TOP_OC,
+ SchemaConstants.PERSON_OC,
+ SchemaConstants.ORGANIZATIONAL_PERSON_OC,
+ SchemaConstants.INET_ORG_PERSON_OC );
+
+ serverEntry.put( SchemaConstants.UID_AT, PartitionNexus.ADMIN_UID );
+ serverEntry.put( SchemaConstants.USER_PASSWORD_AT, PartitionNexus.ADMIN_PASSWORD_BYTES );
+ serverEntry.put( SchemaConstants.DISPLAY_NAME_AT, "Directory Superuser" );
+ serverEntry.put( SchemaConstants.CN_AT, "system administrator" );
+ serverEntry.put( SchemaConstants.SN_AT, "administrator" );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.put( SchemaConstants.DISPLAY_NAME_AT, "Directory Superuser" );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ TlsKeyGenerator.addKeyPair( serverEntry );
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ // -------------------------------------------------------------------
+ // create system users area
+ // -------------------------------------------------------------------
+
+ Dn userDn = getDnFactory().create( ServerDNConstants.USERS_SYSTEM_DN );
+
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, userDn ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, userDn );
+
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
+ SchemaConstants.TOP_OC,
+ SchemaConstants.ORGANIZATIONAL_UNIT_OC );
+
+ serverEntry.put( SchemaConstants.OU_AT, "users" );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ // -------------------------------------------------------------------
+ // create system groups area
+ // -------------------------------------------------------------------
+
+ Dn groupDn = getDnFactory().create( ServerDNConstants.GROUPS_SYSTEM_DN );
+
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, groupDn ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, groupDn );
+
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
+ SchemaConstants.TOP_OC,
+ SchemaConstants.ORGANIZATIONAL_UNIT_OC );
+
+ serverEntry.put( SchemaConstants.OU_AT, "groups" );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ // -------------------------------------------------------------------
+ // create administrator group
+ // -------------------------------------------------------------------
+
+ Dn name = getDnFactory().create( ServerDNConstants.ADMINISTRATORS_GROUP_DN );
+
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, name ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, name );
+
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
+ SchemaConstants.TOP_OC,
+ SchemaConstants.GROUP_OF_UNIQUE_NAMES_OC );
+
+ serverEntry.put( SchemaConstants.CN_AT, "Administrators" );
+ serverEntry.put( SchemaConstants.UNIQUE_MEMBER_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ // -------------------------------------------------------------------
+ // create system configuration area
+ // -------------------------------------------------------------------
+
+ Dn configurationDn = getDnFactory().create( "ou=configuration,ou=system" );
+
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, configurationDn ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, configurationDn );
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
+ SchemaConstants.ORGANIZATIONAL_UNIT_OC );
+
+ serverEntry.put( SchemaConstants.OU_AT, "configuration" );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ // -------------------------------------------------------------------
+ // create system configuration area for partition information
+ // -------------------------------------------------------------------
+
+ Dn partitionsDn = getDnFactory().create( "ou=partitions,ou=configuration,ou=system" );
+
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, partitionsDn ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, partitionsDn );
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
+ SchemaConstants.ORGANIZATIONAL_UNIT_OC );
+ serverEntry.put( SchemaConstants.OU_AT, "partitions" );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ // -------------------------------------------------------------------
+ // create system configuration area for services
+ // -------------------------------------------------------------------
+
+ Dn servicesDn = getDnFactory().create( "ou=services,ou=configuration,ou=system" );
+
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, servicesDn ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, servicesDn );
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
+ SchemaConstants.ORGANIZATIONAL_UNIT_OC );
+
+ serverEntry.put( SchemaConstants.OU_AT, "services" );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ // -------------------------------------------------------------------
+ // create system configuration area for interceptors
+ // -------------------------------------------------------------------
+
+ Dn interceptorsDn = getDnFactory().create( "ou=interceptors,ou=configuration,ou=system" );
+
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, interceptorsDn ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, interceptorsDn );
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
+ SchemaConstants.ORGANIZATIONAL_UNIT_OC );
+
+ serverEntry.put( SchemaConstants.OU_AT, "interceptors" );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ // -------------------------------------------------------------------
+ // create system preferences area
+ // -------------------------------------------------------------------
+
+ Dn sysPrefRootDn = getDnFactory().create( ServerDNConstants.SYSPREFROOT_SYSTEM_DN );
+
+ if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, sysPrefRootDn ) ) )
+ {
+ firstStart = true;
+
+ Entry serverEntry = new DefaultEntry( schemaManager, sysPrefRootDn );
+ serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
+ SchemaConstants.TOP_OC,
+ SchemaConstants.ORGANIZATIONAL_UNIT_OC,
+ SchemaConstants.EXTENSIBLE_OBJECT_OC );
+
+ serverEntry.put( "prefNodeName", "sysPrefRoot" );
+ serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
+ serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+
+ partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
+ }
+
+ return firstStart;
+ }
+
+
+ /**
+ * Displays security warning messages if any possible secutiry issue is found.
+ * @throws Exception if there are failures parsing and accessing internal structures
+ */
+ protected void showSecurityWarnings() throws Exception
+ {
+ // Warn if the default password is not changed.
+ boolean needToChangeAdminPassword = false;
+
+ Dn adminDn = getDnFactory().create( ServerDNConstants.ADMIN_SYSTEM_DN );
+
+ Entry adminEntry = partitionNexus.lookup( new LookupOperationContext( adminSession, adminDn ) );
+ Value<?> userPassword = adminEntry.get( SchemaConstants.USER_PASSWORD_AT ).get();
+ needToChangeAdminPassword = Arrays.equals( PartitionNexus.ADMIN_PASSWORD_BYTES, userPassword.getBytes() );
+
+ if ( needToChangeAdminPassword )
+ {
+ LOG.warn( "You didn't change the admin password of directory service " + "instance '" + instanceId + "'. "
+ + "Please update the admin password as soon as possible " + "to prevent a possible security breach." );
+ }
+ }
+
+
+ /**
+ * Adds test entries into the core.
+ *
+ * @todo this may no longer be needed when JNDI is not used for bootstrapping
+ *
+ * @throws Exception if the creation of test entries fails.
+ */
+ private void createTestEntries() throws Exception
+ {
+ for ( LdifEntry testEntry : testEntries )
+ {
+ try
+ {
+ LdifEntry ldifEntry = testEntry.clone();
+ Entry entry = ldifEntry.getEntry();
+ String dn = ldifEntry.getDn().getName();
+
+ try
+ {
+ getAdminSession().add( new DefaultEntry( schemaManager, entry ) );
+ }
+ catch ( Exception e )
+ {
+ LOG.warn( dn + " test entry already exists.", e );
+ }
+ }
+ catch ( CloneNotSupportedException cnse )
+ {
+ LOG.warn( "Cannot clone the entry ", cnse );
+ }
+ }
+ }
+
+
+ private void initializeSystemPartition() throws Exception
+ {
+ Partition system = getSystemPartition();
+
+ // Add root context entry for system partition
+ Dn systemSuffixDn = getDnFactory().create( ServerDNConstants.SYSTEM_DN );
+ CoreSession adminSession = getAdminSession();
+
+ if ( !system.hasEntry( new HasEntryOperationContext( adminSession, systemSuffixDn ) ) )
+ {
+ Entry systemEntry = new DefaultEntry( schemaManager, systemSuffixDn );
+
+ // Add the ObjectClasses
+ systemEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
+ SchemaConstants.ORGANIZATIONAL_UNIT_OC, SchemaConstants.EXTENSIBLE_OBJECT_OC );
+
+ // Add some operational attributes
+ systemEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN );
+ systemEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+ systemEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
+ systemEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
+ systemEntry.put( DnUtils.getRdnAttributeType( ServerDNConstants.SYSTEM_DN ), DnUtils
+ .getRdnValue( ServerDNConstants.SYSTEM_DN ) );
+
+ AddOperationContext addOperationContext = new AddOperationContext( adminSession, systemEntry );
+ system.add( addOperationContext );
+ }
+ }
+
+
+ /**
+ * Kicks off the initialization of the entire system.
+ *
+ * @throws Exception if there are problems along the way
+ */
+ private void initialize() throws Exception
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "---> Initializing the DefaultDirectoryService " );
+ }
+
+ csnFactory.setReplicaId( replicaId );
+
+ // If no interceptor list is defined, setup a default list
+ if ( interceptors == null )
+ {
+ setDefaultInterceptorConfigurations();
+ }
+
+ if ( cacheService == null )
+ {
+ // Initialize a default cache service
+ cacheService = new CacheService();
+ }
+
+ cacheService.initialize( instanceLayout );
+
+ // Initialize the AP caches
+ accessControlAPCache = new DnNode<AccessControlAdministrativePoint>();
+ collectiveAttributeAPCache = new DnNode<CollectiveAttributeAdministrativePoint>();
+ subschemaAPCache = new DnNode<SubschemaAdministrativePoint>();
+ triggerExecutionAPCache = new DnNode<TriggerExecutionAdministrativePoint>();
+
+ if ( dnFactory == null )
+ {
+ dnFactory = new DefaultDnFactory( schemaManager, cacheService.getCache( "dnCache" ) );
+ }
+
+ // triggers partition to load schema fully from schema partition
+ schemaPartition.setCacheService( cacheService );
+ schemaPartition.initialize();
+ partitions.add( schemaPartition );
+ systemPartition.setCacheService( cacheService );
+ systemPartition.getSuffixDn().apply( schemaManager );
+
+ adminDn = getDnFactory().create( ServerDNConstants.ADMIN_SYSTEM_DN );
+ adminSession = new DefaultCoreSession( new LdapPrincipal( schemaManager, adminDn, AuthenticationLevel.STRONG ),
+ this );
+
+ // @TODO - NOTE: Need to find a way to instantiate without dependency on DPN
+ partitionNexus = new DefaultPartitionNexus( new DefaultEntry( schemaManager, Dn.ROOT_DSE ) );
+ partitionNexus.setDirectoryService( this );
+ partitionNexus.initialize();
+
+ initializeSystemPartition();
+
+ // --------------------------------------------------------------------
+ // Create all the bootstrap entries before initializing chain
+ // --------------------------------------------------------------------
+
+ firstStart = createBootstrapEntries();
+
+ // Initialize the interceptors
+ initInterceptors();
+
+ // --------------------------------------------------------------------
+ // Initialize the changeLog if it's enabled
+ // --------------------------------------------------------------------
+
+ if ( changeLog.isEnabled() )
+ {
+ changeLog.init( this );
+
+ if ( changeLog.isExposed() && changeLog.isTagSearchSupported() )
+ {
+ String clSuffix = ( ( TaggableSearchableChangeLogStore ) changeLog.getChangeLogStore() ).getPartition()
+ .getSuffixDn().getName();
+ partitionNexus.getRootDse( null ).add( SchemaConstants.CHANGELOG_CONTEXT_AT, clSuffix );
+ }
+ }
+
+ // --------------------------------------------------------------------
+ // Initialize the journal if it's enabled
+ // --------------------------------------------------------------------
+ if ( journal.isEnabled() )
+ {
+ journal.init( this );
+ }
+
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "<--- DefaultDirectoryService initialized" );
+ }
+ }
+
+
+ /**
+ * Read an entry (without Dn)
+ *
+ * @param text The ldif format file
+ * @return An entry.
+ */
+ // This will suppress PMD.EmptyCatchBlock warnings in this method
+ @SuppressWarnings("PMD.EmptyCatchBlock")
+ private Entry readEntry( String text )
+ {
+ StringReader strIn = new StringReader( text );
+ BufferedReader in = new BufferedReader( strIn );
+
+ String line = null;
+ Entry entry = new DefaultEntry();
+
+ try
+ {
+ while ( ( line = in.readLine() ) != null )
+ {
+ if ( line.length() == 0 )
+ {
+ continue;
+ }
+
+ String addedLine = line.trim();
+
+ if ( Strings.isEmpty( addedLine ) )
+ {
+ continue;
+ }
+
+ Attribute attribute = LdifReader.parseAttributeValue( addedLine );
+ Attribute oldAttribute = entry.get( attribute.getId() );
+
+ if ( oldAttribute != null )
+ {
+ try
+ {
+ oldAttribute.add( attribute.get() );
+ entry.put( oldAttribute );
+ }
+ catch ( LdapException ne )
+ {
+ // Do nothing
+ }
+ }
+ else
+ {
+ try
+ {
+ entry.put( attribute );
+ }
+ catch ( LdapException ne )
+ {
+ // TODO do nothing ...
+ }
+ }
+ }
+ }
+ catch ( IOException ioe )
+ {
+ // Do nothing : we can't reach this point !
+ }
+
+ return entry;
+ }
+
+
+ /**
+ * Create a new Entry
+ *
+ * @param ldif The String representing the attributes, as a LDIF file
+ * @param dn The Dn for this new entry
+ */
+ public Entry newEntry( String ldif, String dn )
+ {
+ try
+ {
+ Entry entry = readEntry( ldif );
+ Dn newDn = getDnFactory().create( dn );
+
+ entry.setDn( newDn );
+
+ // TODO Let's get rid of this Attributes crap
+ Entry serverEntry = new DefaultEntry( schemaManager, entry );
+ return serverEntry;
+ }
+ catch ( Exception e )
+ {
+ LOG.error( I18n.err( I18n.ERR_78, ldif, dn ) );
+ // do nothing
+ return null;
+ }
+ }
+
+
+ public EventService getEventService()
+ {
+ return eventService;
+ }
+
+
+ public void setEventService( EventService eventService )
+ {
+ this.eventService = eventService;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isPasswordHidden()
+ {
+ return passwordHidden;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setPasswordHidden( boolean passwordHidden )
+ {
+ this.passwordHidden = passwordHidden;
+ }
+
+
+ /**
+ * @return The maximum allowed size for an incoming PDU
+ */
+ public int getMaxPDUSize()
+ {
+ return maxPDUSize;
+ }
+
+
+ /**
+ * Set the maximum allowed size for an incoming PDU
+ * @param maxPDUSize A positive number of bytes for the PDU. A negative or
+ * null value will be transformed to {@link Integer#MAX_VALUE}
+ */
+ public void setMaxPDUSize( int maxPDUSize )
+ {
+ if ( maxPDUSize <= 0 )
+ {
+ maxPDUSize = Integer.MAX_VALUE;
+ }
+
+ this.maxPDUSize = maxPDUSize;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public Interceptor getInterceptor( String interceptorName )
+ {
+ readLock.lock();
+
+ try
+ {
+ return interceptorNames.get( interceptorName );
+ }
+ finally
+ {
+ readLock.unlock();
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ * @throws LdapException
+ */
+ public void addFirst( Interceptor interceptor ) throws LdapException
+ {
+ addInterceptor( interceptor, 0 );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ * @throws LdapException
+ */
+ public void addLast( Interceptor interceptor ) throws LdapException
+ {
+ addInterceptor( interceptor, -1 );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addAfter( String interceptorName, Interceptor interceptor )
+ {
+ writeLock.lock();
+
+ try
+ {
+ int position = 0;
+
+ // Find the position
+ for ( Interceptor inter : interceptors )
+ {
+ if ( interceptorName.equals( inter.getName() ) )
+ {
+ break;
+ }
+
+ position++;
+ }
+
+ if ( position == interceptors.size() )
+ {
+ interceptors.add( interceptor );
+ }
+ else
+ {
+ interceptors.add( position, interceptor );
+ }
+ }
+ finally
+ {
+ writeLock.unlock();
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void remove( String interceptorName )
+ {
+ removeOperationsList( interceptorName );
+ }
+
+
+ /**
+ * Get a new CSN
+ * @return The CSN generated for this directory service
+ */
+ public Csn getCSN()
+ {
+ return csnFactory.newInstance();
+ }
+
+
+ /**
+ * @return the replicaId
+ */
+ public int getReplicaId()
+ {
+ return replicaId;
+ }
+
+
+ /**
+ * @param replicaId the replicaId to set
+ */
+ public void setReplicaId( int replicaId )
+ {
+ if ( ( replicaId < 0 ) || ( replicaId > 999 ) )
+ {
+ LOG.error( I18n.err( I18n.ERR_79 ) );
+ this.replicaId = 0;
+ }
+ else
+ {
+ this.replicaId = replicaId;
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getSyncPeriodMillis()
+ {
+ return syncPeriodMillis;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setSyncPeriodMillis( long syncPeriodMillis )
+ {
+ this.syncPeriodMillis = syncPeriodMillis;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getContextCsn()
+ {
+ return contextCsn;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setContextCsn( String lastKnownCsn )
+ {
+ this.contextCsn = lastKnownCsn;
+ }
+
+
+ /**
+ * checks if the working directory is already in use by some other directory service, if yes
+ * then throws a runtime exception else will obtain the lock on the working directory
+ */
+ private void lockWorkDir()
+ {
+ FileLock fileLock = null;
+
+ try
+ {
+ lockFile = new RandomAccessFile( new File( instanceLayout.getInstanceDirectory(), LOCK_FILE_NAME ), "rw" );
+ try
+ {
+ fileLock = lockFile.getChannel().tryLock( 0, 1, false );
+ }
+ catch ( IOException e )
+ {
+ // shoudn't happen, but log
+ LOG.error( "failed to lock the work directory", e );
+ }
+ catch ( OverlappingFileLockException e ) // thrown if we can't get a lock
+ {
+ fileLock = null;
+ }
+ }
+ catch ( FileNotFoundException e )
+ {
+ // shouldn't happen, but log anyway
+ LOG.error( "failed to lock the work directory", e );
+ }
+
+ if ( ( fileLock == null ) || ( !fileLock.isValid() ) )
+ {
+ String message = "the working directory " + instanceLayout.getRunDirectory()
+ + " has been locked by another directory service.";
+ LOG.error( message );
+ throw new RuntimeException( message );
+ }
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public CacheService getCacheService()
+ {
+ return cacheService;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public DnNode<AccessControlAdministrativePoint> getAccessControlAPCache()
+ {
+ return accessControlAPCache;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public DnNode<CollectiveAttributeAdministrativePoint> getCollectiveAttributeAPCache()
+ {
+ return collectiveAttributeAPCache;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public DnNode<SubschemaAdministrativePoint> getSubschemaAPCache()
+ {
+ return subschemaAPCache;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public DnNode<TriggerExecutionAdministrativePoint> getTriggerExecutionAPCache()
+ {
+ return triggerExecutionAPCache;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isPwdPolicyEnabled()
+ {
+ AuthenticationInterceptor authenticationInterceptor = (AuthenticationInterceptor) getInterceptor( InterceptorEnum.AUTHENTICATION_INTERCEPTOR
+ .getName() );
+
+ if ( authenticationInterceptor == null )
+ {
+ return false;
+ }
+
+ PpolicyConfigContainer pwdPolicyContainer = authenticationInterceptor.getPwdPolicyContainer();
+
+ return ( ( pwdPolicyContainer != null )
+ && ( ( pwdPolicyContainer.getDefaultPolicy() != null )
+ || ( pwdPolicyContainer.hasCustomConfigs() ) ) );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public DnFactory getDnFactory()
+ {
+ return dnFactory;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setDnFactory( DnFactory dnFactory )
+ {
+ this.dnFactory = dnFactory;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public SubentryCache getSubentryCache()
+ {
+ return subentryCache;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public SubtreeEvaluator getEvaluator()
+ {
+ return evaluator;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setCacheService( CacheService cacheService )
+ {
+ this.cacheService = cacheService;
+ }
+
+}
\ No newline at end of file
[3/4] knox git commit: [KNOX-647] Rename LDAP artifacts from test to
demo
Posted by km...@apache.org.
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryServiceFactory.java
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryServiceFactory.java b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryServiceFactory.java
new file mode 100644
index 0000000..dc3468d
--- /dev/null
+++ b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryServiceFactory.java
@@ -0,0 +1,290 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.hadoop.gateway.security.ldap;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.directory.api.ldap.model.constants.SchemaConstants;
+import org.apache.directory.api.ldap.model.schema.LdapComparator;
+import org.apache.directory.api.ldap.model.schema.SchemaManager;
+import org.apache.directory.api.ldap.model.schema.comparators.NormalizingComparator;
+import org.apache.directory.api.ldap.model.schema.registries.ComparatorRegistry;
+import org.apache.directory.api.ldap.model.schema.registries.SchemaLoader;
+import org.apache.directory.api.ldap.schemaextractor.SchemaLdifExtractor;
+import org.apache.directory.api.ldap.schemaextractor.impl.DefaultSchemaLdifExtractor;
+import org.apache.directory.api.ldap.schemaloader.LdifSchemaLoader;
+import org.apache.directory.api.ldap.schemamanager.impl.DefaultSchemaManager;
+import org.apache.directory.api.util.exception.Exceptions;
+import org.apache.directory.server.constants.ServerDNConstants;
+import org.apache.directory.server.core.DefaultDirectoryService;
+import org.apache.directory.server.core.api.CacheService;
+import org.apache.directory.server.core.api.DirectoryService;
+import org.apache.directory.server.core.api.InstanceLayout;
+import org.apache.directory.server.core.api.partition.Partition;
+import org.apache.directory.server.core.api.schema.SchemaPartition;
+import org.apache.directory.server.core.factory.DefaultDirectoryServiceFactory;
+import org.apache.directory.server.core.factory.DirectoryServiceFactory;
+import org.apache.directory.server.core.factory.JdbmPartitionFactory;
+import org.apache.directory.server.core.factory.PartitionFactory;
+import org.apache.directory.server.core.partition.ldif.LdifPartition;
+import org.apache.directory.server.i18n.I18n;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+
+/**
+ * A Default factory for DirectoryService.
+ * This is a copy of org.apache.directory.server.core.factory.DefaultDirectoryServiceFactory
+ * created to control how the DirectoryService is created. This can be removed
+ * when http://svn.apache.org/r1546144 in ApacheDS 2.0.0-M16 is available.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class BaseDirectoryServiceFactory implements DirectoryServiceFactory
+{
+ /** A logger for this class */
+ private static final Logger LOG = LoggerFactory.getLogger( DefaultDirectoryServiceFactory.class );
+
+ /** The directory service. */
+ private DirectoryService directoryService;
+
+ /** The partition factory. */
+ private PartitionFactory partitionFactory;
+
+
+ public BaseDirectoryServiceFactory()
+ {
+ directoryService = createDirectoryService();
+ partitionFactory = createPartitionFactory();
+ }
+
+ protected DirectoryService createDirectoryService() {
+ DirectoryService result;
+ try
+ {
+ // Creating the instance here so that
+ // we we can set some properties like accesscontrol, anon access
+ // before starting up the service
+ result = new DefaultDirectoryService();
+
+ // No need to register a shutdown hook during tests because this
+ // starts a lot of threads and slows down test execution
+ result.setShutdownHookEnabled( false );
+ }
+ catch ( Exception e )
+ {
+ throw new RuntimeException( e );
+ }
+ return result;
+ }
+
+ protected PartitionFactory createPartitionFactory() {
+ PartitionFactory result;
+ try
+ {
+ String typeName = System.getProperty( "apacheds.partition.factory" );
+ if ( typeName != null )
+ {
+ Class<? extends PartitionFactory> type = ( Class<? extends PartitionFactory> ) Class.forName( typeName );
+ result = type.newInstance();
+ }
+ else
+ {
+ result = new JdbmPartitionFactory();
+ }
+ }
+ catch ( Exception e )
+ {
+ LOG.error( "Error instantiating custom partition factory", e );
+ throw new RuntimeException( e );
+ }
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void init( String name ) throws Exception
+ {
+ if ( ( directoryService != null ) && directoryService.isStarted() )
+ {
+ return;
+ }
+
+ build( name );
+ }
+
+
+ /**
+ * Build the working directory
+ */
+ private void buildInstanceDirectory( String name ) throws IOException
+ {
+ String instanceDirectory = System.getProperty( "workingDirectory" );
+
+ if ( instanceDirectory == null )
+ {
+ instanceDirectory = System.getProperty( "java.io.tmpdir" ) + "/server-work-" + name;
+ }
+
+ InstanceLayout instanceLayout = new InstanceLayout( instanceDirectory );
+
+ if ( instanceLayout.getInstanceDirectory().exists() )
+ {
+ try
+ {
+ FileUtils.deleteDirectory( instanceLayout.getInstanceDirectory() );
+ }
+ catch ( IOException e )
+ {
+ LOG.warn( "couldn't delete the instance directory before initializing the DirectoryService", e );
+ }
+ }
+
+ directoryService.setInstanceLayout( instanceLayout );
+ }
+
+
+ /**
+ * Inits the schema and schema partition.
+ */
+ private void initSchema() throws Exception
+ {
+ File workingDirectory = directoryService.getInstanceLayout().getPartitionsDirectory();
+
+ // Extract the schema on disk (a brand new one) and load the registries
+ File schemaRepository = new File( workingDirectory, "schema" );
+ SchemaLdifExtractor extractor = new DefaultSchemaLdifExtractor( workingDirectory );
+
+ try
+ {
+ extractor.extractOrCopy();
+ }
+ catch ( IOException ioe )
+ {
+ // The schema has already been extracted, bypass
+ }
+
+ SchemaLoader loader = new LdifSchemaLoader( schemaRepository );
+ SchemaManager schemaManager = new DefaultSchemaManager( loader );
+
+ // We have to load the schema now, otherwise we won't be able
+ // to initialize the Partitions, as we won't be able to parse
+ // and normalize their suffix Dn
+ schemaManager.loadAllEnabled();
+
+ // Tell all the normalizer comparators that they should not normalize anything
+ ComparatorRegistry comparatorRegistry = schemaManager.getComparatorRegistry();
+
+ for ( LdapComparator<?> comparator : comparatorRegistry )
+ {
+ if ( comparator instanceof NormalizingComparator )
+ {
+ ( ( NormalizingComparator ) comparator ).setOnServer();
+ }
+ }
+
+ directoryService.setSchemaManager( schemaManager );
+
+ // Init the LdifPartition
+ LdifPartition ldifPartition = new LdifPartition( schemaManager /*, directoryService.getDnFactory()*/ );
+ ldifPartition.setPartitionPath( new File( workingDirectory, "schema" ).toURI() );
+ SchemaPartition schemaPartition = new SchemaPartition( schemaManager );
+ schemaPartition.setWrappedPartition( ldifPartition );
+ directoryService.setSchemaPartition( schemaPartition );
+
+ List<Throwable> errors = schemaManager.getErrors();
+
+ if ( errors.size() != 0 )
+ {
+ throw new Exception( I18n.err( I18n.ERR_317, Exceptions.printErrors( errors ) ) );
+ }
+ }
+
+
+ /**
+ * Inits the system partition.
+ *
+ * @throws Exception the exception
+ */
+ private void initSystemPartition() throws Exception
+ {
+ // change the working directory to something that is unique
+ // on the system and somewhere either under target directory
+ // or somewhere in a temp area of the machine.
+
+ // Inject the System Partition
+ Partition systemPartition = partitionFactory.createPartition(
+ directoryService.getSchemaManager(),
+ //directoryService.getDnFactory(),
+ "system",
+ ServerDNConstants.SYSTEM_DN,
+ 500,
+ new File( directoryService.getInstanceLayout().getPartitionsDirectory(), "system" ) );
+ systemPartition.setSchemaManager( directoryService.getSchemaManager() );
+
+ partitionFactory.addIndex( systemPartition, SchemaConstants.OBJECT_CLASS_AT, 100 );
+
+ directoryService.setSystemPartition( systemPartition );
+ }
+
+
+ /**
+ * Builds the directory server instance.
+ *
+ * @param name the instance name
+ */
+ private void build( String name ) throws Exception
+ {
+ directoryService.setInstanceId( name );
+ buildInstanceDirectory( name );
+
+ CacheService cacheService = new CacheService();
+ cacheService.initialize( directoryService.getInstanceLayout() );
+
+ directoryService.setCacheService( cacheService );
+
+ // Init the service now
+ initSchema();
+ initSystemPartition();
+
+ directoryService.startup();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public DirectoryService getDirectoryService() throws Exception
+ {
+ return directoryService;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public PartitionFactory getPartitionFactory() throws Exception
+ {
+ return partitionFactory;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryService.java
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryService.java b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryService.java
new file mode 100644
index 0000000..68fa1da
--- /dev/null
+++ b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryService.java
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.hadoop.gateway.security.ldap;
+
+public class SimpleDirectoryService extends BaseDirectoryService {
+
+ public SimpleDirectoryService() throws Exception {
+ }
+
+ protected void showSecurityWarnings() throws Exception {
+ // NoOp - This prevents confusing warnings from being output.
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryServiceFactory.java
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryServiceFactory.java b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryServiceFactory.java
new file mode 100644
index 0000000..72a05ff
--- /dev/null
+++ b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryServiceFactory.java
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.hadoop.gateway.security.ldap;
+
+import org.apache.directory.server.core.api.DirectoryService;
+
+public class SimpleDirectoryServiceFactory extends BaseDirectoryServiceFactory {
+
+ protected DirectoryService createDirectoryService() {
+ DirectoryService result;
+ try {
+ result = new SimpleDirectoryService();
+ } catch( Exception e ) {
+ throw new RuntimeException( e );
+ }
+ return result;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapDirectoryServer.java
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapDirectoryServer.java b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapDirectoryServer.java
new file mode 100644
index 0000000..139b83b
--- /dev/null
+++ b/gateway-demo-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapDirectoryServer.java
@@ -0,0 +1,110 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.hadoop.gateway.security.ldap;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.directory.server.core.api.CoreSession;
+import org.apache.directory.server.core.api.DirectoryService;
+import org.apache.directory.server.core.api.partition.Partition;
+import org.apache.directory.server.core.factory.DirectoryServiceFactory;
+import org.apache.directory.server.ldap.LdapServer;
+import org.apache.directory.server.protocol.shared.store.LdifFileLoader;
+import org.apache.directory.server.protocol.shared.transport.TcpTransport;
+import org.apache.directory.server.protocol.shared.transport.Transport;
+import org.apache.log4j.PropertyConfigurator;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.net.ServerSocket;
+import java.util.UUID;
+
+public class SimpleLdapDirectoryServer {
+
+ private DirectoryServiceFactory factory;
+
+ private DirectoryService service;
+
+ private LdapServer server;
+
+ public SimpleLdapDirectoryServer( String rootDn, File usersLdif, Transport... transports ) throws Exception {
+ if( !usersLdif.exists() ) {
+ throw new FileNotFoundException( usersLdif.getAbsolutePath() );
+ }
+
+ factory = new SimpleDirectoryServiceFactory();
+ factory.init( UUID.randomUUID().toString() );
+ service = factory.getDirectoryService();
+
+ Partition partition = factory.getPartitionFactory().createPartition(
+ service.getSchemaManager(), "users", rootDn, 500, service.getInstanceLayout().getInstanceDirectory() );
+ service.addPartition( partition );
+
+ CoreSession session = service.getAdminSession();
+ LdifFileLoader lfl = new LdifFileLoader( session, usersLdif, null );
+ lfl.execute();
+
+ server = new LdapServer();
+ server.setTransports( transports );
+ server.setDirectoryService( service );
+ }
+
+ public void start() throws Exception {
+ service.startup();
+ server.start();
+ }
+
+ public void stop( boolean clean ) throws Exception {
+ server.stop();
+ service.shutdown();
+ if( clean ) {
+ FileUtils.deleteDirectory( service.getInstanceLayout().getInstanceDirectory() );
+ }
+ }
+
+ public static void main( String[] args ) throws Exception {
+ PropertyConfigurator.configure( System.getProperty( "log4j.configuration" ) );
+
+ SimpleLdapDirectoryServer ldap;
+
+ File file;
+ if ( args.length < 1 ) {
+ file = new File( "conf/users.ldif" );
+ } else {
+ File dir = new File( args[0] );
+ if( !dir.exists() || !dir.isDirectory() ) {
+ throw new FileNotFoundException( dir.getAbsolutePath() );
+ }
+ file = new File( dir, "users.ldif" );
+ }
+
+ if( !file.exists() || !file.canRead() ) {
+ throw new FileNotFoundException( file.getAbsolutePath() );
+ }
+
+ int port = 33389;
+
+ // Make sure the port is free.
+ ServerSocket socket = new ServerSocket( port );
+ socket.close();
+
+ TcpTransport transport = new TcpTransport( port );
+ ldap = new SimpleLdapDirectoryServer( "dc=hadoop,dc=apache,dc=org", file, transport );
+ ldap.start();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/src/main/resources/log4j.properties b/gateway-demo-ldap/src/main/resources/log4j.properties
new file mode 100644
index 0000000..40b5546
--- /dev/null
+++ b/gateway-demo-ldap/src/main/resources/log4j.properties
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+log4j.rootLogger=ERROR,stdout
+log4j.threshhold=ALL
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p %m%n
+
+#log4j.logger.org.apache.directory=INFO
+#log4j.logger.org.apache.hadoop.gateway=INFO
+#log4j.logger.org.apache.hadoop.gateway=DEBUG
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/src/main/resources/users.ldif
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/src/main/resources/users.ldif b/gateway-demo-ldap/src/main/resources/users.ldif
new file mode 100644
index 0000000..f75edb8
--- /dev/null
+++ b/gateway-demo-ldap/src/main/resources/users.ldif
@@ -0,0 +1,44 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+version: 1
+
+dn: dc=hadoop,dc=apache,dc=org
+objectclass: organization
+objectclass: dcObject
+o: Hadoop at Apache.org
+dc: hadoop
+description: Makers of Hadoop
+
+# entry for a sample people container
+# please replace with site specific values
+dn: ou=people,dc=hadoop,dc=apache,dc=org
+objectclass:top
+objectclass:organizationalUnit
+ou: people
+
+# entry for a sample end user
+# please replace with site specific values
+dn: uid=guest,ou=people,dc=hadoop,dc=apache,dc=org
+objectclass:top
+objectclass:person
+objectclass:organizationalPerson
+objectclass:inetOrgPerson
+cn: Guest
+sn: User
+uid: guest
+userPassword:guest-password
+
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-demo-ldap/src/test/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapServerTest.java
----------------------------------------------------------------------
diff --git a/gateway-demo-ldap/src/test/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapServerTest.java b/gateway-demo-ldap/src/test/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapServerTest.java
new file mode 100644
index 0000000..75f439e
--- /dev/null
+++ b/gateway-demo-ldap/src/test/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapServerTest.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.hadoop.gateway.security.ldap;
+
+import org.apache.directory.api.ldap.model.exception.LdapAuthenticationException;
+import org.apache.directory.api.ldap.model.exception.LdapException;
+import org.apache.directory.ldap.client.api.LdapConnection;
+import org.apache.directory.ldap.client.api.LdapNetworkConnection;
+import org.apache.directory.server.protocol.shared.transport.TcpTransport;
+import org.apache.directory.server.protocol.shared.transport.Transport;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.ServerSocket;
+
+import static org.junit.Assert.fail;
+
+public class SimpleLdapServerTest {
+
+ private static int port;
+ private static File ldifFile;
+ private static SimpleLdapDirectoryServer ldap;
+
+ @BeforeClass
+ public static void setup() throws Exception {
+ port = findFreePort();
+ ldifFile = new File( ClassLoader.getSystemResource( "users.ldif" ).toURI() );
+ ldap = new SimpleLdapDirectoryServer( "dc=hadoop,dc=apache,dc=org", ldifFile, new Transport[]{ new TcpTransport( port ) } );
+ ldap.start();
+ }
+
+ @AfterClass
+ public static void cleanup() throws Exception {
+ if( ldap != null ) {
+ ldap.stop( true );
+ }
+ }
+
+ private static int findFreePort() throws IOException {
+ ServerSocket socket = new ServerSocket(0);
+ int port = socket.getLocalPort();
+ socket.close();
+ return port;
+ }
+
+ @Test
+ public void testBind() throws LdapException, IOException {
+ LdapConnection connection;
+
+ connection = new LdapNetworkConnection( "localhost", port );
+ try {
+ connection.bind( "uid=guest,ou=people,dc=hadoop,dc=apache,dc=org", "guest-password" );
+ } finally {
+ connection.close();
+ }
+
+ connection = new LdapNetworkConnection( "localhost", port );
+ try {
+ connection.bind( "uid=nobody,ou=people,dc=hadoop,dc=apache,dc=org", "guest-password" );
+ fail( "Expected LdapAuthenticationException" );
+ } catch ( LdapAuthenticationException e ) {
+ // Expected
+ } finally {
+ connection.close();
+ }
+
+ connection = new LdapNetworkConnection( "localhost", port );
+ try {
+ connection.bind( "uid=guest,ou=people,dc=hadoop,dc=apache,dc=org", "wrong-password" );
+ fail( "Expected LdapAuthenticationException" );
+ } catch ( LdapAuthenticationException e ) {
+ // Expected
+ } finally {
+ connection.close();
+ }
+
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-release/pom.xml
----------------------------------------------------------------------
diff --git a/gateway-release/pom.xml b/gateway-release/pom.xml
index 9f810c8..1d2a60e 100644
--- a/gateway-release/pom.xml
+++ b/gateway-release/pom.xml
@@ -267,11 +267,11 @@
<dependency>
<groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-ldap</artifactId>
+ <artifactId>gateway-demo-ldap</artifactId>
</dependency>
<dependency>
<groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-ldap-launcher</artifactId>
+ <artifactId>gateway-demo-ldap-launcher</artifactId>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-release/src/assembly.xml
----------------------------------------------------------------------
diff --git a/gateway-release/src/assembly.xml b/gateway-release/src/assembly.xml
index 709d1f3..a1fafa3 100644
--- a/gateway-release/src/assembly.xml
+++ b/gateway-release/src/assembly.xml
@@ -90,7 +90,7 @@
<exclude>${gateway-group}:gateway-util-launcher</exclude>
<exclude>${gateway-group}:gateway-server-launcher</exclude>
<exclude>${gateway-group}:gateway-shell-launcher</exclude>
- <exclude>${gateway-group}:gateway-test-ldap-launcher</exclude>
+ <exclude>${gateway-group}:gateway-demo-ldap-launcher</exclude>
</excludes>
</dependencySet>
<dependencySet>
@@ -118,7 +118,7 @@
<outputDirectory>bin</outputDirectory>
<outputFileNameMapping>ldap.jar</outputFileNameMapping>
<includes>
- <include>${gateway-group}:gateway-test-ldap-launcher</include>
+ <include>${gateway-group}:gateway-demo-ldap-launcher</include>
</includes>
</dependencySet>
<dependencySet>
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-server/pom.xml
----------------------------------------------------------------------
diff --git a/gateway-server/pom.xml b/gateway-server/pom.xml
index a6db1d4..4289e87 100644
--- a/gateway-server/pom.xml
+++ b/gateway-server/pom.xml
@@ -203,7 +203,7 @@
<dependency>
<groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-ldap</artifactId>
+ <artifactId>gateway-demo-ldap</artifactId>
<scope>test</scope>
</dependency>
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap-launcher/pom.xml
----------------------------------------------------------------------
diff --git a/gateway-test-ldap-launcher/pom.xml b/gateway-test-ldap-launcher/pom.xml
deleted file mode 100644
index 86d3378..0000000
--- a/gateway-test-ldap-launcher/pom.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You 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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <artifactId>gateway</artifactId>
- <groupId>org.apache.knox</groupId>
- <version>0.8.0-SNAPSHOT</version>
- </parent>
- <artifactId>gateway-test-ldap-launcher</artifactId>
- <name>gateway-test-ldap-launcher</name>
- <description>Launcher for the test/demo LDAP server.</description>
-
- <dependencies>
- <dependency>
- <groupId>${gateway-group}</groupId>
- <artifactId>gateway-util-launcher</artifactId>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <inherited>false</inherited>
- <artifactId>maven-assembly-plugin</artifactId>
- <version>2.4</version>
- <executions>
- <execution>
- <id>server-launcher</id>
- <phase>package</phase>
- <goals><goal>single</goal></goals>
- <configuration>
- <appendAssemblyId>false</appendAssemblyId>
- <descriptorRefs>
- <descriptorRef>jar-with-dependencies</descriptorRef>
- </descriptorRefs>
- <archive>
- <manifest>
- <mainClass>org.apache.hadoop.gateway.launcher.Launcher</mainClass>
- </manifest>
- </archive>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
-</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap-launcher/src/main/resources/META-INF/launcher.cfg
----------------------------------------------------------------------
diff --git a/gateway-test-ldap-launcher/src/main/resources/META-INF/launcher.cfg b/gateway-test-ldap-launcher/src/main/resources/META-INF/launcher.cfg
deleted file mode 100644
index dda1a25..0000000
--- a/gateway-test-ldap-launcher/src/main/resources/META-INF/launcher.cfg
+++ /dev/null
@@ -1,17 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You 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.
-main.class = org.apache.hadoop.gateway.security.ldap.SimpleLdapDirectoryServer
-class.path = ../lib/*.jar;../dep/*.jar
-log4j.configuration=${launcher.dir}/../conf/${launcher.name}-log4j.properties
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/pom.xml
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/pom.xml b/gateway-test-ldap/pom.xml
deleted file mode 100644
index dd58b51..0000000
--- a/gateway-test-ldap/pom.xml
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You 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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.apache.knox</groupId>
- <artifactId>gateway</artifactId>
- <version>0.8.0-SNAPSHOT</version>
- </parent>
- <artifactId>gateway-test-ldap</artifactId>
-
- <name>gateway-test-ldap</name>
- <description>A LDAP server based on ApacheDS used for demos and testing.</description>
-
- <licenses>
- <license>
- <name>The Apache Software License, Version 2.0</name>
- <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
- <distribution>repo</distribution>
- </license>
- </licenses>
-
- <!--
- <build>
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>exec-maven-plugin</artifactId>
- <version>1.2.1</version>
- <executions>
- <execution>
- <goals>
- <goal>java</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <mainClass>org.apache.hadoop.gateway.security.EmbeddedApacheDirectoryServer</mainClass>
- </configuration>
- </plugin>
- </plugins>
- </build>
- -->
-
- <!--
- <profiles>
- <profile>
- <id>release</id>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>2.0</version>
- <configuration>
- <transformers>
- <transformer
- implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
- <manifestEntries>
- <Main-Class>org.apache.hadoop.gateway.security.EmbeddedApacheDirectoryServer
- </Main-Class>
- </manifestEntries>
- </transformer>
- </transformers>
- <filters>
- <filter>
- <artifact>*:*</artifact>
- <excludes>
- <exclude>META-INF/*.SF</exclude>
- <exclude>META-INF/*.DSA</exclude>
- <exclude>META-INF/*.RSA</exclude>
- </excludes>
- </filter>
- </filters>
- </configuration>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
- -->
-
- <dependencies>
-
- <!--
- <dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-server-integ</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-core-entry</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.directory.shared</groupId>
- <artifactId>shared-ldap</artifactId>
- </dependency>
- -->
- <!--
- <dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-jdbm</artifactId>
- </dependency>
- -->
- <dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-all</artifactId>
- <exclusions>
- <exclusion>
- <groupId>ldapsdk</groupId>
- <artifactId>ldapsdk</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </dependency>
-
- <!--
- <dependency>
- <groupId>org.apache.directory.server</groupId>
- <artifactId>apacheds-all</artifactId>
- <version>1.5.5</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.directory.shared</groupId>
- <artifactId>shared-ldap-schema</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- -->
-
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>${gateway-group}</groupId>
- <artifactId>gateway-test-utils</artifactId>
- <scope>test</scope>
- </dependency>
-
- </dependencies>
-
-</project>
\ No newline at end of file
[2/4] knox git commit: [KNOX-647] Rename LDAP artifacts from test to
demo
Posted by km...@apache.org.
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryService.java
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryService.java b/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryService.java
deleted file mode 100644
index d18cef4..0000000
--- a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryService.java
+++ /dev/null
@@ -1,2323 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.apache.hadoop.gateway.security.ldap;
-
-
-import org.apache.directory.api.ldap.codec.api.LdapApiService;
-import org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory;
-import org.apache.directory.api.ldap.model.constants.AuthenticationLevel;
-import org.apache.directory.api.ldap.model.constants.SchemaConstants;
-import org.apache.directory.api.ldap.model.csn.Csn;
-import org.apache.directory.api.ldap.model.csn.CsnFactory;
-import org.apache.directory.api.ldap.model.cursor.Cursor;
-import org.apache.directory.api.ldap.model.entry.Attribute;
-import org.apache.directory.api.ldap.model.entry.DefaultEntry;
-import org.apache.directory.api.ldap.model.entry.Entry;
-import org.apache.directory.api.ldap.model.entry.Modification;
-import org.apache.directory.api.ldap.model.entry.Value;
-import org.apache.directory.api.ldap.model.exception.LdapException;
-import org.apache.directory.api.ldap.model.exception.LdapNoPermissionException;
-import org.apache.directory.api.ldap.model.exception.LdapOperationException;
-import org.apache.directory.api.ldap.model.ldif.ChangeType;
-import org.apache.directory.api.ldap.model.ldif.LdifEntry;
-import org.apache.directory.api.ldap.model.ldif.LdifReader;
-import org.apache.directory.api.ldap.model.name.Dn;
-import org.apache.directory.api.ldap.model.name.DnUtils;
-import org.apache.directory.api.ldap.model.name.Rdn;
-import org.apache.directory.api.ldap.model.schema.SchemaManager;
-import org.apache.directory.api.ldap.util.tree.DnNode;
-import org.apache.directory.api.util.DateUtils;
-import org.apache.directory.api.util.Strings;
-import org.apache.directory.api.util.exception.NotImplementedException;
-import org.apache.directory.server.constants.ServerDNConstants;
-import org.apache.directory.server.core.DefaultOperationManager;
-import org.apache.directory.server.core.admin.AdministrativePointInterceptor;
-import org.apache.directory.server.core.api.*;
-import org.apache.directory.server.core.api.administrative.AccessControlAdministrativePoint;
-import org.apache.directory.server.core.api.administrative.CollectiveAttributeAdministrativePoint;
-import org.apache.directory.server.core.api.administrative.SubschemaAdministrativePoint;
-import org.apache.directory.server.core.api.administrative.TriggerExecutionAdministrativePoint;
-import org.apache.directory.server.core.api.changelog.ChangeLog;
-import org.apache.directory.server.core.api.changelog.ChangeLogEvent;
-import org.apache.directory.server.core.api.changelog.Tag;
-import org.apache.directory.server.core.api.changelog.TaggableSearchableChangeLogStore;
-import org.apache.directory.server.core.api.event.EventService;
-import org.apache.directory.server.core.api.interceptor.BaseInterceptor;
-import org.apache.directory.server.core.api.interceptor.Interceptor;
-import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
-import org.apache.directory.server.core.api.interceptor.context.BindOperationContext;
-import org.apache.directory.server.core.api.interceptor.context.HasEntryOperationContext;
-import org.apache.directory.server.core.api.interceptor.context.LookupOperationContext;
-import org.apache.directory.server.core.api.interceptor.context.OperationContext;
-import org.apache.directory.server.core.api.journal.Journal;
-import org.apache.directory.server.core.api.partition.Partition;
-import org.apache.directory.server.core.api.partition.PartitionNexus;
-import org.apache.directory.server.core.api.schema.SchemaPartition;
-import org.apache.directory.server.core.api.subtree.SubentryCache;
-import org.apache.directory.server.core.api.subtree.SubtreeEvaluator;
-import org.apache.directory.server.core.authn.AuthenticationInterceptor;
-import org.apache.directory.server.core.authn.ppolicy.PpolicyConfigContainer;
-import org.apache.directory.server.core.authz.AciAuthorizationInterceptor;
-import org.apache.directory.server.core.authz.DefaultAuthorizationInterceptor;
-import org.apache.directory.server.core.changelog.ChangeLogInterceptor;
-import org.apache.directory.server.core.changelog.DefaultChangeLog;
-import org.apache.directory.server.core.collective.CollectiveAttributeInterceptor;
-import org.apache.directory.server.core.event.EventInterceptor;
-import org.apache.directory.server.core.exception.ExceptionInterceptor;
-import org.apache.directory.server.core.journal.DefaultJournal;
-import org.apache.directory.server.core.journal.JournalInterceptor;
-import org.apache.directory.server.core.normalization.NormalizationInterceptor;
-import org.apache.directory.server.core.operational.OperationalAttributeInterceptor;
-import org.apache.directory.server.core.referral.ReferralInterceptor;
-import org.apache.directory.server.core.schema.SchemaInterceptor;
-import org.apache.directory.server.core.security.TlsKeyGenerator;
-import org.apache.directory.server.core.shared.DefaultCoreSession;
-import org.apache.directory.server.core.shared.DefaultDnFactory;
-import org.apache.directory.server.core.shared.partition.DefaultPartitionNexus;
-import org.apache.directory.server.core.subtree.SubentryInterceptor;
-import org.apache.directory.server.core.trigger.TriggerInterceptor;
-import org.apache.directory.server.i18n.I18n;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.io.StringReader;
-import java.lang.reflect.Method;
-import java.nio.channels.FileLock;
-import java.nio.channels.OverlappingFileLockException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-
-/**
- * Base implementation of {@link DirectoryService}.
- * This is a copy of org.apache.directory.server.core.DefaultDirectoryService
- * created to make showSecurityWarnings protected. This can be removed
- * when http://svn.apache.org/r1546144 in ApacheDS 2.0.0-M16 is available.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public class BaseDirectoryService implements DirectoryService
-{
- /** The logger */
- private static final Logger LOG = LoggerFactory.getLogger( BaseDirectoryService.class );
-
- private SchemaPartition schemaPartition;
-
- /** A reference on the SchemaManager */
- private SchemaManager schemaManager;
-
- /** The LDAP Codec Service */
- private LdapApiService ldapCodecService = LdapApiServiceFactory.getSingleton();
-
- /** the root nexus */
- private DefaultPartitionNexus partitionNexus;
-
- /** whether or not server is started for the first time */
- private boolean firstStart;
-
- /** whether or not this instance has been shutdown */
- private boolean started;
-
- /** the change log service */
- private ChangeLog changeLog;
-
- /** the journal service */
- private Journal journal;
-
- /**
- * the interface used to perform various operations on this
- * DirectoryService
- */
- private OperationManager operationManager = new DefaultOperationManager( this );
-
- /** the distinguished name of the administrative user */
- private Dn adminDn;
-
- /** session used as admin for internal operations */
- private CoreSession adminSession;
-
- /** The referral manager */
- private ReferralManager referralManager;
-
- /** A flag to tell if the userPassword attribute's value must be hidden */
- private boolean passwordHidden = false;
-
- /** The service's CSN factory */
- private CsnFactory csnFactory;
-
- /** The directory instance replication ID */
- private int replicaId;
-
- /** remove me after implementation is completed */
- private static final String PARTIAL_IMPL_WARNING =
- "WARNING: the changelog is only partially operational and will revert\n" +
- "state without consideration of who made the original change. All reverting " +
- "changes are made by the admin user.\n Furthermore the used controls are not at " +
- "all taken into account";
-
- /** The delay to wait between each sync on disk */
- private long syncPeriodMillis;
-
- /** The default delay to wait between sync on disk : 15 seconds */
- private static final long DEFAULT_SYNC_PERIOD = 15000;
-
- /** */
- private Thread workerThread;
-
- /** The default timeLimit : 100 entries */
- public static final int MAX_SIZE_LIMIT_DEFAULT = 100;
-
- /** The default timeLimit : 10 seconds */
- public static final int MAX_TIME_LIMIT_DEFAULT = 10000;
-
- /** The instance Id */
- private String instanceId;
-
- /** The server directory layout*/
- private InstanceLayout instanceLayout;
-
- /**
- * A flag used to shutdown the VM when stopping the server. Useful
- * when the server is standalone. If the server is embedded, we don't
- * want to shutdown the VM
- */
- private boolean exitVmOnShutdown = true; // allow by default
-
- /** A flag used to indicate that a shutdown hook has been installed */
- private boolean shutdownHookEnabled = true; // allow by default
-
- /** Manage anonymous access to entries other than the RootDSE */
- private boolean allowAnonymousAccess = false; // forbid by default
-
- /** Manage the basic access control checks */
- private boolean accessControlEnabled; // off by default
-
- /** Manage the operational attributes denormalization */
- private boolean denormalizeOpAttrsEnabled; // off by default
-
- /** The list of declared interceptors */
- private List<Interceptor> interceptors;
- private Map<String, Interceptor> interceptorNames;
-
- /** A lock to protect the interceptors List */
- private ReadWriteLock interceptorsLock = new ReentrantReadWriteLock();
-
- /** The read and write locks */
- private Lock readLock = interceptorsLock.readLock();
- private Lock writeLock = interceptorsLock.writeLock();
-
- /** A map associating a list of interceptor to each operation */
- private Map<OperationEnum, List<String>> operationInterceptors;
-
- /** The System partition */
- private Partition systemPartition;
-
- /** The set of all declared partitions */
- private Set<Partition> partitions = new HashSet<Partition>();
-
- /** A list of LDIF entries to inject at startup */
- private List<? extends LdifEntry> testEntries = new ArrayList<LdifEntry>(); // List<Attributes>
-
- /** The event service */
- private EventService eventService;
-
- /** The maximum size for an incoming PDU */
- private int maxPDUSize = Integer.MAX_VALUE;
-
- /** the value of last successful add/update operation's CSN */
- private String contextCsn;
-
- /** lock file for directory service's working directory */
- private RandomAccessFile lockFile = null;
-
- private static final String LOCK_FILE_NAME = ".dirservice.lock";
-
- /** the ehcache based cache service */
- private CacheService cacheService;
-
- /** The AccessControl AdministrativePoint cache */
- private DnNode<AccessControlAdministrativePoint> accessControlAPCache;
-
- /** The CollectiveAttribute AdministrativePoint cache */
- private DnNode<CollectiveAttributeAdministrativePoint> collectiveAttributeAPCache;
-
- /** The Subschema AdministrativePoint cache */
- private DnNode<SubschemaAdministrativePoint> subschemaAPCache;
-
- /** The TriggerExecution AdministrativePoint cache */
- private DnNode<TriggerExecutionAdministrativePoint> triggerExecutionAPCache;
-
- /** The Dn factory */
- private DnFactory dnFactory;
-
- /** The Subentry cache */
- SubentryCache subentryCache = new SubentryCache();
-
- /** The Subtree evaluator instance */
- private SubtreeEvaluator evaluator;
-
-
- // ------------------------------------------------------------------------
- // Constructor
- // ------------------------------------------------------------------------
-
- /**
- * Creates a new instance of the directory service.
- */
- public BaseDirectoryService() throws Exception
- {
- changeLog = new DefaultChangeLog();
- journal = new DefaultJournal();
- syncPeriodMillis = DEFAULT_SYNC_PERIOD;
- csnFactory = new CsnFactory( replicaId );
- evaluator = new SubtreeEvaluator( schemaManager );
- setDefaultInterceptorConfigurations();
- }
-
-
- // ------------------------------------------------------------------------
- // C O N F I G U R A T I O N M E T H O D S
- // ------------------------------------------------------------------------
-
- public void setInstanceId( String instanceId )
- {
- this.instanceId = instanceId;
- }
-
-
- public String getInstanceId()
- {
- return instanceId;
- }
-
-
- /**
- * Gets the {@link Partition}s used by this DirectoryService.
- *
- * @return the set of partitions used
- */
- public Set<? extends Partition> getPartitions()
- {
- Set<Partition> cloned = new HashSet<Partition>();
- cloned.addAll( partitions );
- return cloned;
- }
-
-
- /**
- * Sets {@link Partition}s used by this DirectoryService.
- *
- * @param partitions the partitions to used
- */
- public void setPartitions( Set<? extends Partition> partitions )
- {
- Set<Partition> cloned = new HashSet<Partition>();
- cloned.addAll( partitions );
- Set<String> names = new HashSet<String>();
-
- for ( Partition partition : cloned )
- {
- String id = partition.getId();
-
- if ( names.contains( id ) )
- {
- LOG.warn( "Encountered duplicate partition {} identifier.", id );
- }
-
- names.add( id );
- }
-
- this.partitions = cloned;
- }
-
-
- /**
- * Returns <tt>true</tt> if access control checks are enabled.
- *
- * @return true if access control checks are enabled, false otherwise
- */
- public boolean isAccessControlEnabled()
- {
- return accessControlEnabled;
- }
-
-
- /**
- * Sets whether to enable basic access control checks or not.
- *
- * @param accessControlEnabled true to enable access control checks, false otherwise
- */
- public void setAccessControlEnabled( boolean accessControlEnabled )
- {
- this.accessControlEnabled = accessControlEnabled;
- }
-
-
- /**
- * Returns <tt>true</tt> if anonymous access is allowed on entries besides the RootDSE.
- * If the access control subsystem is enabled then access to some entries may not be
- * allowed even when full anonymous access is enabled.
- *
- * @return true if anonymous access is allowed on entries besides the RootDSE, false
- * if anonymous access is allowed to all entries.
- */
- public boolean isAllowAnonymousAccess()
- {
- return allowAnonymousAccess;
- }
-
-
- /**
- * Sets whether to allow anonymous access to entries other than the RootDSE. If the
- * access control subsystem is enabled then access to some entries may not be allowed
- * even when full anonymous access is enabled.
- *
- * @param enableAnonymousAccess true to enable anonymous access, false to disable it
- */
- public void setAllowAnonymousAccess( boolean enableAnonymousAccess )
- {
- this.allowAnonymousAccess = enableAnonymousAccess;
- }
-
-
- /**
- * Returns interceptors in the server.
- *
- * @return the interceptors in the server.
- */
- public List<Interceptor> getInterceptors()
- {
- List<Interceptor> cloned = new ArrayList<Interceptor>();
-
- readLock.lock();
-
- try
- {
- cloned.addAll( interceptors );
-
- return cloned;
- }
- finally
- {
- readLock.unlock();
- }
- }
-
-
- /**
- * Returns interceptors in the server for a given operation.
- *
- * @return the interceptors in the server for the given operation.
- */
- public List<String> getInterceptors( OperationEnum operation )
- {
- List<String> cloned = new ArrayList<String>();
-
- readLock.lock();
-
- try
- {
- cloned.addAll( operationInterceptors.get( operation ) );
-
- return cloned;
- }
- finally
- {
- readLock.unlock();
- }
-
- }
-
-
- /**
- * Compute the list of to call for each operation
- */
- private void initOperationsList()
- {
- writeLock.lock();
-
- try
- {
- operationInterceptors = new ConcurrentHashMap<OperationEnum, List<String>>();
-
- for ( OperationEnum operation : OperationEnum.getOperations() )
- {
- List<String> operationList = new ArrayList<String>();
-
- for ( Interceptor interceptor : interceptors )
- {
- gatherInterceptors( interceptor, interceptor.getClass(), operation, operationList );
- }
-
- operationInterceptors.put( operation, operationList );
- }
- }
- finally
- {
- writeLock.unlock();
- }
- }
-
-
- /**
- * Recursively checks if the given interceptor can be added to the list of interceptors for a given
- * operation and adds to the list of interceptors if it implements the respective operation
- *
- * @param interceptor the instance of the interceptor
- * @param interceptorClz the class of the interceptor
- * @param operation type of operation
- * @param selectedInterceptorList the list of selected interceptors
- */
- private void gatherInterceptors( Interceptor interceptor, Class<?> interceptorClz, OperationEnum operation,
- List<String> selectedInterceptorList )
- {
- // We stop recursing when we reach the Base class
- if ( ( interceptorClz == null ) || ( interceptorClz == BaseInterceptor.class ) )
- {
- return;
- }
-
- // We don't call getMethods() because it would get back the default methods
- // from the BaseInterceptor, something we don't want.
- Method[] methods = interceptorClz.getDeclaredMethods();
-
- for ( Method method : methods )
- {
- Class<?>[] param = method.getParameterTypes();
- boolean hasCorrestSig = false;
-
- // check for the correct signature
- if ( ( param == null ) || ( param.length > 1 ) || ( param.length == 0 ) )
- {
- continue;
- }
-
- if ( OperationContext.class.isAssignableFrom( param[0] ) )
- {
- hasCorrestSig = true;
- }
- else
- {
- continue;
- }
-
- if ( hasCorrestSig && method.getName().equals( operation.getMethodName() ) )
- {
- if ( !selectedInterceptorList.contains( interceptor.getName() ) )
- {
- selectedInterceptorList.add( interceptor.getName() );
- }
-
- break;
- }
- }
-
- // Recurse on extended classes, as we have used getDeclaredMethods() instead of getmethods()
- gatherInterceptors( interceptor, interceptorClz.getSuperclass(), operation, selectedInterceptorList );
- }
-
-
- /**
- * Add an interceptor to the list of interceptors to call for each operation
- * @throws LdapException
- */
- private void addInterceptor( Interceptor interceptor, int position ) throws LdapException
- {
- // First, init the interceptor
- interceptor.init( this );
-
- writeLock.lock();
-
- try
- {
- for ( OperationEnum operation : OperationEnum.getOperations() )
- {
- List<String> operationList = operationInterceptors.get( operation );
-
- Method[] methods = interceptor.getClass().getDeclaredMethods();
-
- for ( Method method : methods )
- {
- if ( method.getName().equals( operation.getMethodName() ) )
- {
- if ( position == -1 )
- {
- operationList.add( interceptor.getName() );
- }
- else
- {
- operationList.add( position, interceptor.getName() );
- }
-
- break;
- }
- }
- }
-
- interceptorNames.put( interceptor.getName(), interceptor );
-
- if ( position == -1 )
- {
- interceptors.add( interceptor );
- }
- else
- {
- interceptors.add( position, interceptor );
- }
- }
- finally
- {
- writeLock.unlock();
- }
- }
-
-
- /**
- * Remove an interceptor to the list of interceptors to call for each operation
- */
- private void removeOperationsList( String interceptorName )
- {
- Interceptor interceptor = interceptorNames.get( interceptorName );
-
- writeLock.lock();
-
- try
- {
- for ( OperationEnum operation : OperationEnum.getOperations() )
- {
- List<String> operationList = operationInterceptors.get( operation );
-
- Method[] methods = interceptor.getClass().getDeclaredMethods();
-
- for ( Method method : methods )
- {
- if ( method.getName().equals( operation.getMethodName() ) )
- {
- operationList.remove( interceptor.getName() );
-
- break;
- }
- }
- }
-
- interceptorNames.remove( interceptorName );
- interceptors.remove( interceptor );
- }
- finally
- {
- writeLock.unlock();
- }
- }
-
-
- /**
- * Sets the interceptors in the server.
- *
- * @param interceptors the interceptors to be used in the server.
- */
- public void setInterceptors( List<Interceptor> interceptors )
- {
- Map<String, Interceptor> interceptorNames = new HashMap<String, Interceptor>();
-
- // Check if we don't have duplicate names in the interceptors list
- for ( Interceptor interceptor : interceptors )
- {
- if ( interceptorNames.containsKey( interceptor.getName() ) )
- {
- LOG.warn( "Encountered duplicate definitions for {} interceptor", interceptor.getName() );
- continue;
- }
-
- interceptorNames.put( interceptor.getName(), interceptor );
- }
-
- this.interceptors = interceptors;
- this.interceptorNames = interceptorNames;
-
- // Now update the Map that connect each operation with the list of interceptors.
- initOperationsList();
- }
-
-
- /**
- * Initialize the interceptors
- */
- private void initInterceptors() throws LdapException
- {
- for ( Interceptor interceptor : interceptors )
- {
- interceptor.init( this );
- }
- }
-
-
- /**
- * Returns test directory entries({@link LdifEntry}) to be loaded while
- * bootstrapping.
- *
- * @return test entries to load during bootstrapping
- */
- public List<LdifEntry> getTestEntries()
- {
- List<LdifEntry> cloned = new ArrayList<LdifEntry>();
- cloned.addAll( testEntries );
-
- return cloned;
- }
-
-
- /**
- * Sets test directory entries({@link javax.naming.directory.Attributes}) to be loaded while
- * bootstrapping.
- *
- * @param testEntries the test entries to load while bootstrapping
- */
- public void setTestEntries( List<? extends LdifEntry> testEntries )
- {
- //noinspection MismatchedQueryAndUpdateOfCollection
- List<LdifEntry> cloned = new ArrayList<LdifEntry>();
- cloned.addAll( testEntries );
- this.testEntries = testEntries;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public InstanceLayout getInstanceLayout()
- {
- return instanceLayout;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setInstanceLayout( InstanceLayout instanceLayout ) throws IOException
- {
- this.instanceLayout = instanceLayout;
-
- // Create the directories if they are missing
- if ( !instanceLayout.getInstanceDirectory().exists() )
- {
- if ( !instanceLayout.getInstanceDirectory().mkdirs() )
- {
- throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
- instanceLayout.getInstanceDirectory() ) );
- }
- }
-
- if ( !instanceLayout.getLogDirectory().exists() )
- {
- if ( !instanceLayout.getLogDirectory().mkdirs() )
- {
- throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
- instanceLayout.getLogDirectory() ) );
- }
- }
-
- if ( !instanceLayout.getRunDirectory().exists() )
- {
- if ( !instanceLayout.getRunDirectory().mkdirs() )
- {
- throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
- instanceLayout.getRunDirectory() ) );
- }
- }
-
- if ( !instanceLayout.getPartitionsDirectory().exists() )
- {
- if ( !instanceLayout.getPartitionsDirectory().mkdirs() )
- {
- throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
- instanceLayout.getPartitionsDirectory() ) );
- }
- }
-
- if ( !instanceLayout.getConfDirectory().exists() )
- {
- if ( !instanceLayout.getConfDirectory().mkdirs() )
- {
- throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECORY,
- instanceLayout.getConfDirectory() ) );
- }
- }
- }
-
-
- public void setShutdownHookEnabled( boolean shutdownHookEnabled )
- {
- this.shutdownHookEnabled = shutdownHookEnabled;
- }
-
-
- public boolean isShutdownHookEnabled()
- {
- return shutdownHookEnabled;
- }
-
-
- public void setExitVmOnShutdown( boolean exitVmOnShutdown )
- {
- this.exitVmOnShutdown = exitVmOnShutdown;
- }
-
-
- public boolean isExitVmOnShutdown()
- {
- return exitVmOnShutdown;
- }
-
-
- public void setSystemPartition( Partition systemPartition )
- {
- this.systemPartition = systemPartition;
- }
-
-
- public Partition getSystemPartition()
- {
- return systemPartition;
- }
-
-
- /**
- * return true if the operational attributes must be normalized when returned
- */
- public boolean isDenormalizeOpAttrsEnabled()
- {
- return denormalizeOpAttrsEnabled;
- }
-
-
- /**
- * Sets whether the operational attributes are denormalized when returned
- * @param denormalizeOpAttrsEnabled The flag value
- */
- public void setDenormalizeOpAttrsEnabled( boolean denormalizeOpAttrsEnabled )
- {
- this.denormalizeOpAttrsEnabled = denormalizeOpAttrsEnabled;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public ChangeLog getChangeLog()
- {
- return changeLog;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public Journal getJournal()
- {
- return journal;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setChangeLog( ChangeLog changeLog )
- {
- this.changeLog = changeLog;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setJournal( Journal journal )
- {
- this.journal = journal;
- }
-
-
- public void addPartition( Partition partition ) throws Exception
- {
- partition.setSchemaManager( schemaManager );
-
- try
- {
- // can be null when called before starting up
- if ( partitionNexus != null )
- {
- partitionNexus.addContextPartition( partition );
- }
- }
- catch ( LdapException le )
- {
- // We've got an exception, we cannot add the partition to the partitions
- throw le;
- }
-
- // Now, add the partition to the set of managed partitions
- partitions.add( partition );
- }
-
-
- public void removePartition( Partition partition ) throws Exception
- {
- // Do the backend cleanup first
- try
- {
- // can be null when called before starting up
- if ( partitionNexus != null )
- {
- partitionNexus.removeContextPartition( partition.getSuffixDn() );
- }
- }
- catch ( LdapException le )
- {
- // Bad ! We can't go any further
- throw le;
- }
-
- // And update the set of managed partitions
- partitions.remove( partition );
- }
-
-
- // ------------------------------------------------------------------------
- // BackendSubsystem Interface Method Implementations
- // ------------------------------------------------------------------------
- /**
- * Define a default list of interceptors that has to be used if no other
- * configuration is defined.
- */
- private void setDefaultInterceptorConfigurations()
- {
- // Set default interceptor chains
- List<Interceptor> list = new ArrayList<Interceptor>();
-
- list.add( new NormalizationInterceptor() );
- list.add( new AuthenticationInterceptor() );
- list.add( new ReferralInterceptor() );
- list.add( new AciAuthorizationInterceptor() );
- list.add( new DefaultAuthorizationInterceptor() );
- list.add( new AdministrativePointInterceptor() );
- list.add( new ExceptionInterceptor() );
- list.add( new SchemaInterceptor() );
- list.add( new OperationalAttributeInterceptor() );
- list.add( new CollectiveAttributeInterceptor() );
- list.add( new SubentryInterceptor() );
- list.add( new EventInterceptor() );
- list.add( new TriggerInterceptor() );
- list.add( new ChangeLogInterceptor() );
- list.add( new JournalInterceptor() );
-
- setInterceptors( list );
- }
-
-
- public CoreSession getAdminSession()
- {
- return adminSession;
- }
-
-
- /**
- * Get back an anonymous session
- */
- public CoreSession getSession()
- {
- return new DefaultCoreSession( new LdapPrincipal( schemaManager ), this );
- }
-
-
- /**
- * Get back a session for a given principal
- */
- public CoreSession getSession( LdapPrincipal principal )
- {
- return new DefaultCoreSession( principal, this );
- }
-
-
- /**
- * Get back a session for the give user and credentials bound with Simple Bind
- */
- public CoreSession getSession( Dn principalDn, byte[] credentials ) throws LdapException
- {
- synchronized ( this )
- {
- if ( !started )
- {
- throw new IllegalStateException( "Service has not started." );
- }
- }
-
- BindOperationContext bindContext = new BindOperationContext( null );
- bindContext.setCredentials( credentials );
- bindContext.setDn( principalDn.apply( schemaManager ) );
- bindContext.setInterceptors( getInterceptors( OperationEnum.BIND ) );
-
- operationManager.bind( bindContext );
-
- return bindContext.getSession();
- }
-
-
- /**
- * Get back a session for a given user bound with SASL Bind
- */
- public CoreSession getSession( Dn principalDn, byte[] credentials, String saslMechanism, String saslAuthId )
- throws Exception
- {
- synchronized ( this )
- {
- if ( !started )
- {
- throw new IllegalStateException( "Service has not started." );
-
- }
- }
-
- BindOperationContext bindContext = new BindOperationContext( null );
- bindContext.setCredentials( credentials );
- bindContext.setDn( principalDn.apply( schemaManager ) );
- bindContext.setSaslMechanism( saslMechanism );
- bindContext.setInterceptors( getInterceptors( OperationEnum.BIND ) );
-
- operationManager.bind( bindContext );
-
- return bindContext.getSession();
- }
-
-
- public long revert() throws LdapException
- {
- if ( changeLog == null || !changeLog.isEnabled() )
- {
- throw new IllegalStateException( I18n.err( I18n.ERR_310 ) );
- }
-
- Tag latest = changeLog.getLatest();
-
- if ( null != latest )
- {
- if ( latest.getRevision() < changeLog.getCurrentRevision() )
- {
- return revert( latest.getRevision() );
- }
- else
- {
- LOG.info( "Ignoring request to revert without changes since the latest tag." );
- return changeLog.getCurrentRevision();
- }
- }
-
- throw new IllegalStateException( I18n.err( I18n.ERR_311 ) );
- }
-
-
- /**
- * We handle the ModDN/ModRDN operation for the revert here.
- */
- private void moddn( Dn oldDn, Dn newDn, boolean delOldRdn ) throws LdapException
- {
- if ( oldDn.size() == 0 )
- {
- throw new LdapNoPermissionException( I18n.err( I18n.ERR_312 ) );
- }
-
- // calculate parents
- Dn oldBase = oldDn.getParent();
- Dn newBase = newDn.getParent();
-
- // Compute the Rdn for each of the Dn
- Rdn newRdn = newDn.getRdn();
- Rdn oldRdn = oldDn.getRdn();
-
- /*
- * We need to determine if this rename operation corresponds to a simple
- * Rdn name change or a move operation. If the two names are the same
- * except for the Rdn then it is a simple modifyRdn operation. If the
- * names differ in size or have a different baseDN then the operation is
- * a move operation. Furthermore if the Rdn in the move operation
- * changes it is both an Rdn change and a move operation.
- */
- if ( ( oldDn.size() == newDn.size() ) && oldBase.equals( newBase ) )
- {
- adminSession.rename( oldDn, newRdn, delOldRdn );
- }
- else
- {
- Dn target = newDn.getParent();
-
- if ( newRdn.equals( oldRdn ) )
- {
- adminSession.move( oldDn, target );
- }
- else
- {
- adminSession.moveAndRename( oldDn, target, new Rdn( newRdn ), delOldRdn );
- }
- }
- }
-
-
- public long revert( long revision ) throws LdapException
- {
- if ( changeLog == null || !changeLog.isEnabled() )
- {
- throw new IllegalStateException( I18n.err( I18n.ERR_310 ) );
- }
-
- if ( revision < 0 )
- {
- throw new IllegalArgumentException( I18n.err( I18n.ERR_239 ) );
- }
-
- if ( revision >= changeLog.getChangeLogStore().getCurrentRevision() )
- {
- throw new IllegalArgumentException( I18n.err( I18n.ERR_314 ) );
- }
-
- Cursor<ChangeLogEvent> cursor = changeLog.getChangeLogStore().findAfter( revision );
-
- /*
- * BAD, BAD, BAD!!!
- *
- * No synchronization no nothing. Just getting this to work for now
- * so we can revert tests. Any production grade use of this feature
- * needs to synchronize on all changes while the revert is in progress.
- *
- * How about making this operation transactional?
- *
- * First of all just stop using JNDI and construct the operations to
- * feed into the interceptor pipeline.
- *
- * TODO review this code.
- */
-
- try
- {
- LOG.warn( PARTIAL_IMPL_WARNING );
- cursor.afterLast();
-
- while ( cursor.previous() ) // apply ldifs in reverse order
- {
- ChangeLogEvent event = cursor.get();
- List<LdifEntry> reverses = event.getReverseLdifs();
-
- for ( LdifEntry reverse : reverses )
- {
- switch ( reverse.getChangeType().getChangeType() )
- {
- case ChangeType.ADD_ORDINAL:
- adminSession.add(
- new DefaultEntry( schemaManager, reverse.getEntry() ), true );
- break;
-
- case ChangeType.DELETE_ORDINAL:
- adminSession.delete( reverse.getDn(), true );
- break;
-
- case ChangeType.MODIFY_ORDINAL:
- List<Modification> mods = reverse.getModifications();
-
- adminSession.modify( reverse.getDn(), mods, true );
- break;
-
- case ChangeType.MODDN_ORDINAL:
- // NO BREAK - both ModDN and ModRDN handling is the same
-
- case ChangeType.MODRDN_ORDINAL:
- Dn forwardDn = event.getForwardLdif().getDn();
- Dn reverseDn = reverse.getDn();
-
- moddn( reverseDn, forwardDn, reverse.isDeleteOldRdn() );
-
- break;
-
- default:
- LOG.error( I18n.err( I18n.ERR_75 ) );
- throw new NotImplementedException( I18n.err( I18n.ERR_76, reverse.getChangeType() ) );
- }
- }
- }
- }
- catch ( Exception e )
- {
- throw new LdapOperationException( e.getMessage(), e );
- }
- finally
- {
- try
- {
- cursor.close();
- }
- catch ( Exception e )
- {
- throw new LdapOperationException( e.getMessage(), e );
- }
- }
-
- return changeLog.getCurrentRevision();
- }
-
-
- public OperationManager getOperationManager()
- {
- return operationManager;
- }
-
-
- /**
- * @throws Exception if the LDAP server cannot be started
- */
- public synchronized void startup() throws Exception
- {
- if ( started )
- {
- return;
- }
-
- lockWorkDir();
-
- if ( shutdownHookEnabled )
- {
- Runtime.getRuntime().addShutdownHook( new Thread( new Runnable()
- {
- public void run()
- {
- try
- {
- shutdown();
- }
- catch ( Exception e )
- {
- LOG.warn( "Failed to shut down the directory service: "
- + BaseDirectoryService.this.instanceId, e );
- }
- }
- }, "ApacheDS Shutdown Hook (" + instanceId + ')' ) );
-
- LOG.info( "ApacheDS shutdown hook has been registered with the runtime." );
- }
- else if ( LOG.isWarnEnabled() )
- {
- LOG.warn( "ApacheDS shutdown hook has NOT been registered with the runtime."
- + " This default setting for standalone operation has been overriden." );
- }
-
- initialize();
- showSecurityWarnings();
-
- // load the last stored valid CSN value
- LookupOperationContext loc = new LookupOperationContext( getAdminSession(), systemPartition.getSuffixDn(),
- SchemaConstants.ALL_ATTRIBUTES_ARRAY );
-
- Entry entry = systemPartition.lookup( loc );
-
- Attribute cntextCsnAt = entry.get( SchemaConstants.CONTEXT_CSN_AT );
-
- if ( cntextCsnAt != null )
- {
- // this is a multivalued attribute but current syncrepl provider implementation stores only ONE value at ou=system
- contextCsn = cntextCsnAt.getString();
- }
-
- started = true;
-
- if ( !testEntries.isEmpty() )
- {
- createTestEntries();
- }
- }
-
-
- public synchronized void sync() throws Exception
- {
- if ( !started )
- {
- return;
- }
-
- this.changeLog.sync();
- this.partitionNexus.sync();
- }
-
-
- public synchronized void shutdown() throws Exception
- {
- LOG.debug( "+++ DirectoryService Shutdown required" );
-
- if ( !started )
- {
- return;
- }
-
- // --------------------------------------------------------------------
- // Shutdown the sync thread
- // --------------------------------------------------------------------
- LOG.debug( "--- Syncing the nexus " );
- partitionNexus.sync();
-
- // --------------------------------------------------------------------
- // Shutdown the changelog
- // --------------------------------------------------------------------
- LOG.debug( "--- Syncing the changeLog " );
- changeLog.sync();
- changeLog.destroy();
-
- // --------------------------------------------------------------------
- // Shutdown the journal if enabled
- // --------------------------------------------------------------------
- if ( journal.isEnabled() )
- {
- LOG.debug( "--- Destroying the journal " );
- journal.destroy();
- }
-
- // --------------------------------------------------------------------
- // Shutdown the partition
- // --------------------------------------------------------------------
-
- LOG.debug( "--- Destroying the nexus" );
- partitionNexus.destroy();
-
- // Last flush...
- LOG.debug( "--- Flushing everything before quitting" );
- getOperationManager().lockWrite();
- partitionNexus.sync();
- getOperationManager().unlockWrite();
-
- // --------------------------------------------------------------------
- // And shutdown the server
- // --------------------------------------------------------------------
- LOG.debug( "--- Deleting the cache service" );
- cacheService.destroy();
-
- LOG.debug( "---Deleting the DnCache" );
- dnFactory = null;
-
- if ( lockFile != null )
- {
- try
- {
- lockFile.close();
- // no need to delete the lock file
- }
- catch ( IOException e )
- {
- LOG.warn( "couldn't delete the lock file {}", LOCK_FILE_NAME );
- }
- }
-
- LOG.debug( "+++ DirectoryService stopped" );
- started = false;
- }
-
-
- /**
- * @return The referral manager
- */
- public ReferralManager getReferralManager()
- {
- return referralManager;
- }
-
-
- /**
- * Set the referralManager
- * @param referralManager The initialized referralManager
- */
- public void setReferralManager( ReferralManager referralManager )
- {
- this.referralManager = referralManager;
- }
-
-
- /**
- * @return the SchemaManager
- */
- public SchemaManager getSchemaManager()
- {
- return schemaManager;
- }
-
-
- /**
- * Set the SchemaManager instance.
- *
- * @param schemaManager The server schemaManager
- */
- public void setSchemaManager( SchemaManager schemaManager )
- {
- this.schemaManager = schemaManager;
- }
-
-
- public LdapApiService getLdapCodecService()
- {
- return ldapCodecService;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public SchemaPartition getSchemaPartition()
- {
- return schemaPartition;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setSchemaPartition( SchemaPartition schemaPartition )
- {
- this.schemaPartition = schemaPartition;
- }
-
-
- public DefaultPartitionNexus getPartitionNexus()
- {
- return partitionNexus;
- }
-
-
- public boolean isFirstStart()
- {
- return firstStart;
- }
-
-
- public synchronized boolean isStarted()
- {
- return started;
- }
-
-
- public Entry newEntry( Dn dn )
- {
- return new DefaultEntry( schemaManager, dn );
- }
-
-
- /**
- * Returns true if we had to create the bootstrap entries on the first
- * start of the server. Otherwise if all entries exist, meaning none
- * had to be created, then we are not starting for the first time.
- *
- * @return true if the bootstrap entries had to be created, false otherwise
- * @throws Exception if entries cannot be created
- */
- private boolean createBootstrapEntries() throws Exception
- {
- boolean firstStart = false;
-
- // -------------------------------------------------------------------
- // create admin entry
- // -------------------------------------------------------------------
-
- /*
- * If the admin entry is there, then the database was already created
- */
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, adminDn ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, adminDn );
-
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
- SchemaConstants.TOP_OC,
- SchemaConstants.PERSON_OC,
- SchemaConstants.ORGANIZATIONAL_PERSON_OC,
- SchemaConstants.INET_ORG_PERSON_OC );
-
- serverEntry.put( SchemaConstants.UID_AT, PartitionNexus.ADMIN_UID );
- serverEntry.put( SchemaConstants.USER_PASSWORD_AT, PartitionNexus.ADMIN_PASSWORD_BYTES );
- serverEntry.put( SchemaConstants.DISPLAY_NAME_AT, "Directory Superuser" );
- serverEntry.put( SchemaConstants.CN_AT, "system administrator" );
- serverEntry.put( SchemaConstants.SN_AT, "administrator" );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.put( SchemaConstants.DISPLAY_NAME_AT, "Directory Superuser" );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- TlsKeyGenerator.addKeyPair( serverEntry );
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- // -------------------------------------------------------------------
- // create system users area
- // -------------------------------------------------------------------
-
- Dn userDn = getDnFactory().create( ServerDNConstants.USERS_SYSTEM_DN );
-
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, userDn ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, userDn );
-
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
- SchemaConstants.TOP_OC,
- SchemaConstants.ORGANIZATIONAL_UNIT_OC );
-
- serverEntry.put( SchemaConstants.OU_AT, "users" );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- // -------------------------------------------------------------------
- // create system groups area
- // -------------------------------------------------------------------
-
- Dn groupDn = getDnFactory().create( ServerDNConstants.GROUPS_SYSTEM_DN );
-
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, groupDn ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, groupDn );
-
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
- SchemaConstants.TOP_OC,
- SchemaConstants.ORGANIZATIONAL_UNIT_OC );
-
- serverEntry.put( SchemaConstants.OU_AT, "groups" );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- // -------------------------------------------------------------------
- // create administrator group
- // -------------------------------------------------------------------
-
- Dn name = getDnFactory().create( ServerDNConstants.ADMINISTRATORS_GROUP_DN );
-
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, name ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, name );
-
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
- SchemaConstants.TOP_OC,
- SchemaConstants.GROUP_OF_UNIQUE_NAMES_OC );
-
- serverEntry.put( SchemaConstants.CN_AT, "Administrators" );
- serverEntry.put( SchemaConstants.UNIQUE_MEMBER_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- // -------------------------------------------------------------------
- // create system configuration area
- // -------------------------------------------------------------------
-
- Dn configurationDn = getDnFactory().create( "ou=configuration,ou=system" );
-
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, configurationDn ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, configurationDn );
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
- SchemaConstants.ORGANIZATIONAL_UNIT_OC );
-
- serverEntry.put( SchemaConstants.OU_AT, "configuration" );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- // -------------------------------------------------------------------
- // create system configuration area for partition information
- // -------------------------------------------------------------------
-
- Dn partitionsDn = getDnFactory().create( "ou=partitions,ou=configuration,ou=system" );
-
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, partitionsDn ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, partitionsDn );
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
- SchemaConstants.ORGANIZATIONAL_UNIT_OC );
- serverEntry.put( SchemaConstants.OU_AT, "partitions" );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- // -------------------------------------------------------------------
- // create system configuration area for services
- // -------------------------------------------------------------------
-
- Dn servicesDn = getDnFactory().create( "ou=services,ou=configuration,ou=system" );
-
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, servicesDn ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, servicesDn );
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
- SchemaConstants.ORGANIZATIONAL_UNIT_OC );
-
- serverEntry.put( SchemaConstants.OU_AT, "services" );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- // -------------------------------------------------------------------
- // create system configuration area for interceptors
- // -------------------------------------------------------------------
-
- Dn interceptorsDn = getDnFactory().create( "ou=interceptors,ou=configuration,ou=system" );
-
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, interceptorsDn ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, interceptorsDn );
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
- SchemaConstants.ORGANIZATIONAL_UNIT_OC );
-
- serverEntry.put( SchemaConstants.OU_AT, "interceptors" );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- // -------------------------------------------------------------------
- // create system preferences area
- // -------------------------------------------------------------------
-
- Dn sysPrefRootDn = getDnFactory().create( ServerDNConstants.SYSPREFROOT_SYSTEM_DN );
-
- if ( !partitionNexus.hasEntry( new HasEntryOperationContext( adminSession, sysPrefRootDn ) ) )
- {
- firstStart = true;
-
- Entry serverEntry = new DefaultEntry( schemaManager, sysPrefRootDn );
- serverEntry.put( SchemaConstants.OBJECT_CLASS_AT,
- SchemaConstants.TOP_OC,
- SchemaConstants.ORGANIZATIONAL_UNIT_OC,
- SchemaConstants.EXTENSIBLE_OBJECT_OC );
-
- serverEntry.put( "prefNodeName", "sysPrefRoot" );
- serverEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED );
- serverEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- serverEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- serverEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
-
- partitionNexus.add( new AddOperationContext( adminSession, serverEntry ) );
- }
-
- return firstStart;
- }
-
-
- /**
- * Displays security warning messages if any possible secutiry issue is found.
- * @throws Exception if there are failures parsing and accessing internal structures
- */
- protected void showSecurityWarnings() throws Exception
- {
- // Warn if the default password is not changed.
- boolean needToChangeAdminPassword = false;
-
- Dn adminDn = getDnFactory().create( ServerDNConstants.ADMIN_SYSTEM_DN );
-
- Entry adminEntry = partitionNexus.lookup( new LookupOperationContext( adminSession, adminDn ) );
- Value<?> userPassword = adminEntry.get( SchemaConstants.USER_PASSWORD_AT ).get();
- needToChangeAdminPassword = Arrays.equals( PartitionNexus.ADMIN_PASSWORD_BYTES, userPassword.getBytes() );
-
- if ( needToChangeAdminPassword )
- {
- LOG.warn( "You didn't change the admin password of directory service " + "instance '" + instanceId + "'. "
- + "Please update the admin password as soon as possible " + "to prevent a possible security breach." );
- }
- }
-
-
- /**
- * Adds test entries into the core.
- *
- * @todo this may no longer be needed when JNDI is not used for bootstrapping
- *
- * @throws Exception if the creation of test entries fails.
- */
- private void createTestEntries() throws Exception
- {
- for ( LdifEntry testEntry : testEntries )
- {
- try
- {
- LdifEntry ldifEntry = testEntry.clone();
- Entry entry = ldifEntry.getEntry();
- String dn = ldifEntry.getDn().getName();
-
- try
- {
- getAdminSession().add( new DefaultEntry( schemaManager, entry ) );
- }
- catch ( Exception e )
- {
- LOG.warn( dn + " test entry already exists.", e );
- }
- }
- catch ( CloneNotSupportedException cnse )
- {
- LOG.warn( "Cannot clone the entry ", cnse );
- }
- }
- }
-
-
- private void initializeSystemPartition() throws Exception
- {
- Partition system = getSystemPartition();
-
- // Add root context entry for system partition
- Dn systemSuffixDn = getDnFactory().create( ServerDNConstants.SYSTEM_DN );
- CoreSession adminSession = getAdminSession();
-
- if ( !system.hasEntry( new HasEntryOperationContext( adminSession, systemSuffixDn ) ) )
- {
- Entry systemEntry = new DefaultEntry( schemaManager, systemSuffixDn );
-
- // Add the ObjectClasses
- systemEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC,
- SchemaConstants.ORGANIZATIONAL_UNIT_OC, SchemaConstants.EXTENSIBLE_OBJECT_OC );
-
- // Add some operational attributes
- systemEntry.put( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN );
- systemEntry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
- systemEntry.add( SchemaConstants.ENTRY_CSN_AT, getCSN().toString() );
- systemEntry.add( SchemaConstants.ENTRY_UUID_AT, UUID.randomUUID().toString() );
- systemEntry.put( DnUtils.getRdnAttributeType( ServerDNConstants.SYSTEM_DN ), DnUtils
- .getRdnValue( ServerDNConstants.SYSTEM_DN ) );
-
- AddOperationContext addOperationContext = new AddOperationContext( adminSession, systemEntry );
- system.add( addOperationContext );
- }
- }
-
-
- /**
- * Kicks off the initialization of the entire system.
- *
- * @throws Exception if there are problems along the way
- */
- private void initialize() throws Exception
- {
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "---> Initializing the DefaultDirectoryService " );
- }
-
- csnFactory.setReplicaId( replicaId );
-
- // If no interceptor list is defined, setup a default list
- if ( interceptors == null )
- {
- setDefaultInterceptorConfigurations();
- }
-
- if ( cacheService == null )
- {
- // Initialize a default cache service
- cacheService = new CacheService();
- }
-
- cacheService.initialize( instanceLayout );
-
- // Initialize the AP caches
- accessControlAPCache = new DnNode<AccessControlAdministrativePoint>();
- collectiveAttributeAPCache = new DnNode<CollectiveAttributeAdministrativePoint>();
- subschemaAPCache = new DnNode<SubschemaAdministrativePoint>();
- triggerExecutionAPCache = new DnNode<TriggerExecutionAdministrativePoint>();
-
- if ( dnFactory == null )
- {
- dnFactory = new DefaultDnFactory( schemaManager, cacheService.getCache( "dnCache" ) );
- }
-
- // triggers partition to load schema fully from schema partition
- schemaPartition.setCacheService( cacheService );
- schemaPartition.initialize();
- partitions.add( schemaPartition );
- systemPartition.setCacheService( cacheService );
- systemPartition.getSuffixDn().apply( schemaManager );
-
- adminDn = getDnFactory().create( ServerDNConstants.ADMIN_SYSTEM_DN );
- adminSession = new DefaultCoreSession( new LdapPrincipal( schemaManager, adminDn, AuthenticationLevel.STRONG ),
- this );
-
- // @TODO - NOTE: Need to find a way to instantiate without dependency on DPN
- partitionNexus = new DefaultPartitionNexus( new DefaultEntry( schemaManager, Dn.ROOT_DSE ) );
- partitionNexus.setDirectoryService( this );
- partitionNexus.initialize();
-
- initializeSystemPartition();
-
- // --------------------------------------------------------------------
- // Create all the bootstrap entries before initializing chain
- // --------------------------------------------------------------------
-
- firstStart = createBootstrapEntries();
-
- // Initialize the interceptors
- initInterceptors();
-
- // --------------------------------------------------------------------
- // Initialize the changeLog if it's enabled
- // --------------------------------------------------------------------
-
- if ( changeLog.isEnabled() )
- {
- changeLog.init( this );
-
- if ( changeLog.isExposed() && changeLog.isTagSearchSupported() )
- {
- String clSuffix = ( ( TaggableSearchableChangeLogStore ) changeLog.getChangeLogStore() ).getPartition()
- .getSuffixDn().getName();
- partitionNexus.getRootDse( null ).add( SchemaConstants.CHANGELOG_CONTEXT_AT, clSuffix );
- }
- }
-
- // --------------------------------------------------------------------
- // Initialize the journal if it's enabled
- // --------------------------------------------------------------------
- if ( journal.isEnabled() )
- {
- journal.init( this );
- }
-
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "<--- DefaultDirectoryService initialized" );
- }
- }
-
-
- /**
- * Read an entry (without Dn)
- *
- * @param text The ldif format file
- * @return An entry.
- */
- // This will suppress PMD.EmptyCatchBlock warnings in this method
- @SuppressWarnings("PMD.EmptyCatchBlock")
- private Entry readEntry( String text )
- {
- StringReader strIn = new StringReader( text );
- BufferedReader in = new BufferedReader( strIn );
-
- String line = null;
- Entry entry = new DefaultEntry();
-
- try
- {
- while ( ( line = in.readLine() ) != null )
- {
- if ( line.length() == 0 )
- {
- continue;
- }
-
- String addedLine = line.trim();
-
- if ( Strings.isEmpty( addedLine ) )
- {
- continue;
- }
-
- Attribute attribute = LdifReader.parseAttributeValue( addedLine );
- Attribute oldAttribute = entry.get( attribute.getId() );
-
- if ( oldAttribute != null )
- {
- try
- {
- oldAttribute.add( attribute.get() );
- entry.put( oldAttribute );
- }
- catch ( LdapException ne )
- {
- // Do nothing
- }
- }
- else
- {
- try
- {
- entry.put( attribute );
- }
- catch ( LdapException ne )
- {
- // TODO do nothing ...
- }
- }
- }
- }
- catch ( IOException ioe )
- {
- // Do nothing : we can't reach this point !
- }
-
- return entry;
- }
-
-
- /**
- * Create a new Entry
- *
- * @param ldif The String representing the attributes, as a LDIF file
- * @param dn The Dn for this new entry
- */
- public Entry newEntry( String ldif, String dn )
- {
- try
- {
- Entry entry = readEntry( ldif );
- Dn newDn = getDnFactory().create( dn );
-
- entry.setDn( newDn );
-
- // TODO Let's get rid of this Attributes crap
- Entry serverEntry = new DefaultEntry( schemaManager, entry );
- return serverEntry;
- }
- catch ( Exception e )
- {
- LOG.error( I18n.err( I18n.ERR_78, ldif, dn ) );
- // do nothing
- return null;
- }
- }
-
-
- public EventService getEventService()
- {
- return eventService;
- }
-
-
- public void setEventService( EventService eventService )
- {
- this.eventService = eventService;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public boolean isPasswordHidden()
- {
- return passwordHidden;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setPasswordHidden( boolean passwordHidden )
- {
- this.passwordHidden = passwordHidden;
- }
-
-
- /**
- * @return The maximum allowed size for an incoming PDU
- */
- public int getMaxPDUSize()
- {
- return maxPDUSize;
- }
-
-
- /**
- * Set the maximum allowed size for an incoming PDU
- * @param maxPDUSize A positive number of bytes for the PDU. A negative or
- * null value will be transformed to {@link Integer#MAX_VALUE}
- */
- public void setMaxPDUSize( int maxPDUSize )
- {
- if ( maxPDUSize <= 0 )
- {
- maxPDUSize = Integer.MAX_VALUE;
- }
-
- this.maxPDUSize = maxPDUSize;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public Interceptor getInterceptor( String interceptorName )
- {
- readLock.lock();
-
- try
- {
- return interceptorNames.get( interceptorName );
- }
- finally
- {
- readLock.unlock();
- }
- }
-
-
- /**
- * {@inheritDoc}
- * @throws LdapException
- */
- public void addFirst( Interceptor interceptor ) throws LdapException
- {
- addInterceptor( interceptor, 0 );
- }
-
-
- /**
- * {@inheritDoc}
- * @throws LdapException
- */
- public void addLast( Interceptor interceptor ) throws LdapException
- {
- addInterceptor( interceptor, -1 );
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void addAfter( String interceptorName, Interceptor interceptor )
- {
- writeLock.lock();
-
- try
- {
- int position = 0;
-
- // Find the position
- for ( Interceptor inter : interceptors )
- {
- if ( interceptorName.equals( inter.getName() ) )
- {
- break;
- }
-
- position++;
- }
-
- if ( position == interceptors.size() )
- {
- interceptors.add( interceptor );
- }
- else
- {
- interceptors.add( position, interceptor );
- }
- }
- finally
- {
- writeLock.unlock();
- }
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void remove( String interceptorName )
- {
- removeOperationsList( interceptorName );
- }
-
-
- /**
- * Get a new CSN
- * @return The CSN generated for this directory service
- */
- public Csn getCSN()
- {
- return csnFactory.newInstance();
- }
-
-
- /**
- * @return the replicaId
- */
- public int getReplicaId()
- {
- return replicaId;
- }
-
-
- /**
- * @param replicaId the replicaId to set
- */
- public void setReplicaId( int replicaId )
- {
- if ( ( replicaId < 0 ) || ( replicaId > 999 ) )
- {
- LOG.error( I18n.err( I18n.ERR_79 ) );
- this.replicaId = 0;
- }
- else
- {
- this.replicaId = replicaId;
- }
- }
-
-
- /**
- * {@inheritDoc}
- */
- public long getSyncPeriodMillis()
- {
- return syncPeriodMillis;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setSyncPeriodMillis( long syncPeriodMillis )
- {
- this.syncPeriodMillis = syncPeriodMillis;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public String getContextCsn()
- {
- return contextCsn;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setContextCsn( String lastKnownCsn )
- {
- this.contextCsn = lastKnownCsn;
- }
-
-
- /**
- * checks if the working directory is already in use by some other directory service, if yes
- * then throws a runtime exception else will obtain the lock on the working directory
- */
- private void lockWorkDir()
- {
- FileLock fileLock = null;
-
- try
- {
- lockFile = new RandomAccessFile( new File( instanceLayout.getInstanceDirectory(), LOCK_FILE_NAME ), "rw" );
- try
- {
- fileLock = lockFile.getChannel().tryLock( 0, 1, false );
- }
- catch ( IOException e )
- {
- // shoudn't happen, but log
- LOG.error( "failed to lock the work directory", e );
- }
- catch ( OverlappingFileLockException e ) // thrown if we can't get a lock
- {
- fileLock = null;
- }
- }
- catch ( FileNotFoundException e )
- {
- // shouldn't happen, but log anyway
- LOG.error( "failed to lock the work directory", e );
- }
-
- if ( ( fileLock == null ) || ( !fileLock.isValid() ) )
- {
- String message = "the working directory " + instanceLayout.getRunDirectory()
- + " has been locked by another directory service.";
- LOG.error( message );
- throw new RuntimeException( message );
- }
-
- }
-
-
- /**
- * {@inheritDoc}
- */
- public CacheService getCacheService()
- {
- return cacheService;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public DnNode<AccessControlAdministrativePoint> getAccessControlAPCache()
- {
- return accessControlAPCache;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public DnNode<CollectiveAttributeAdministrativePoint> getCollectiveAttributeAPCache()
- {
- return collectiveAttributeAPCache;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public DnNode<SubschemaAdministrativePoint> getSubschemaAPCache()
- {
- return subschemaAPCache;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public DnNode<TriggerExecutionAdministrativePoint> getTriggerExecutionAPCache()
- {
- return triggerExecutionAPCache;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public boolean isPwdPolicyEnabled()
- {
- AuthenticationInterceptor authenticationInterceptor = (AuthenticationInterceptor) getInterceptor( InterceptorEnum.AUTHENTICATION_INTERCEPTOR
- .getName() );
-
- if ( authenticationInterceptor == null )
- {
- return false;
- }
-
- PpolicyConfigContainer pwdPolicyContainer = authenticationInterceptor.getPwdPolicyContainer();
-
- return ( ( pwdPolicyContainer != null )
- && ( ( pwdPolicyContainer.getDefaultPolicy() != null )
- || ( pwdPolicyContainer.hasCustomConfigs() ) ) );
- }
-
-
- /**
- * {@inheritDoc}
- */
- public DnFactory getDnFactory()
- {
- return dnFactory;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setDnFactory( DnFactory dnFactory )
- {
- this.dnFactory = dnFactory;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public SubentryCache getSubentryCache()
- {
- return subentryCache;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public SubtreeEvaluator getEvaluator()
- {
- return evaluator;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public void setCacheService( CacheService cacheService )
- {
- this.cacheService = cacheService;
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryServiceFactory.java
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryServiceFactory.java b/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryServiceFactory.java
deleted file mode 100644
index dc3468d..0000000
--- a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/BaseDirectoryServiceFactory.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.apache.hadoop.gateway.security.ldap;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.directory.api.ldap.model.constants.SchemaConstants;
-import org.apache.directory.api.ldap.model.schema.LdapComparator;
-import org.apache.directory.api.ldap.model.schema.SchemaManager;
-import org.apache.directory.api.ldap.model.schema.comparators.NormalizingComparator;
-import org.apache.directory.api.ldap.model.schema.registries.ComparatorRegistry;
-import org.apache.directory.api.ldap.model.schema.registries.SchemaLoader;
-import org.apache.directory.api.ldap.schemaextractor.SchemaLdifExtractor;
-import org.apache.directory.api.ldap.schemaextractor.impl.DefaultSchemaLdifExtractor;
-import org.apache.directory.api.ldap.schemaloader.LdifSchemaLoader;
-import org.apache.directory.api.ldap.schemamanager.impl.DefaultSchemaManager;
-import org.apache.directory.api.util.exception.Exceptions;
-import org.apache.directory.server.constants.ServerDNConstants;
-import org.apache.directory.server.core.DefaultDirectoryService;
-import org.apache.directory.server.core.api.CacheService;
-import org.apache.directory.server.core.api.DirectoryService;
-import org.apache.directory.server.core.api.InstanceLayout;
-import org.apache.directory.server.core.api.partition.Partition;
-import org.apache.directory.server.core.api.schema.SchemaPartition;
-import org.apache.directory.server.core.factory.DefaultDirectoryServiceFactory;
-import org.apache.directory.server.core.factory.DirectoryServiceFactory;
-import org.apache.directory.server.core.factory.JdbmPartitionFactory;
-import org.apache.directory.server.core.factory.PartitionFactory;
-import org.apache.directory.server.core.partition.ldif.LdifPartition;
-import org.apache.directory.server.i18n.I18n;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-
-/**
- * A Default factory for DirectoryService.
- * This is a copy of org.apache.directory.server.core.factory.DefaultDirectoryServiceFactory
- * created to control how the DirectoryService is created. This can be removed
- * when http://svn.apache.org/r1546144 in ApacheDS 2.0.0-M16 is available.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- */
-public class BaseDirectoryServiceFactory implements DirectoryServiceFactory
-{
- /** A logger for this class */
- private static final Logger LOG = LoggerFactory.getLogger( DefaultDirectoryServiceFactory.class );
-
- /** The directory service. */
- private DirectoryService directoryService;
-
- /** The partition factory. */
- private PartitionFactory partitionFactory;
-
-
- public BaseDirectoryServiceFactory()
- {
- directoryService = createDirectoryService();
- partitionFactory = createPartitionFactory();
- }
-
- protected DirectoryService createDirectoryService() {
- DirectoryService result;
- try
- {
- // Creating the instance here so that
- // we we can set some properties like accesscontrol, anon access
- // before starting up the service
- result = new DefaultDirectoryService();
-
- // No need to register a shutdown hook during tests because this
- // starts a lot of threads and slows down test execution
- result.setShutdownHookEnabled( false );
- }
- catch ( Exception e )
- {
- throw new RuntimeException( e );
- }
- return result;
- }
-
- protected PartitionFactory createPartitionFactory() {
- PartitionFactory result;
- try
- {
- String typeName = System.getProperty( "apacheds.partition.factory" );
- if ( typeName != null )
- {
- Class<? extends PartitionFactory> type = ( Class<? extends PartitionFactory> ) Class.forName( typeName );
- result = type.newInstance();
- }
- else
- {
- result = new JdbmPartitionFactory();
- }
- }
- catch ( Exception e )
- {
- LOG.error( "Error instantiating custom partition factory", e );
- throw new RuntimeException( e );
- }
- return result;
- }
-
- /**
- * {@inheritDoc}
- */
- public void init( String name ) throws Exception
- {
- if ( ( directoryService != null ) && directoryService.isStarted() )
- {
- return;
- }
-
- build( name );
- }
-
-
- /**
- * Build the working directory
- */
- private void buildInstanceDirectory( String name ) throws IOException
- {
- String instanceDirectory = System.getProperty( "workingDirectory" );
-
- if ( instanceDirectory == null )
- {
- instanceDirectory = System.getProperty( "java.io.tmpdir" ) + "/server-work-" + name;
- }
-
- InstanceLayout instanceLayout = new InstanceLayout( instanceDirectory );
-
- if ( instanceLayout.getInstanceDirectory().exists() )
- {
- try
- {
- FileUtils.deleteDirectory( instanceLayout.getInstanceDirectory() );
- }
- catch ( IOException e )
- {
- LOG.warn( "couldn't delete the instance directory before initializing the DirectoryService", e );
- }
- }
-
- directoryService.setInstanceLayout( instanceLayout );
- }
-
-
- /**
- * Inits the schema and schema partition.
- */
- private void initSchema() throws Exception
- {
- File workingDirectory = directoryService.getInstanceLayout().getPartitionsDirectory();
-
- // Extract the schema on disk (a brand new one) and load the registries
- File schemaRepository = new File( workingDirectory, "schema" );
- SchemaLdifExtractor extractor = new DefaultSchemaLdifExtractor( workingDirectory );
-
- try
- {
- extractor.extractOrCopy();
- }
- catch ( IOException ioe )
- {
- // The schema has already been extracted, bypass
- }
-
- SchemaLoader loader = new LdifSchemaLoader( schemaRepository );
- SchemaManager schemaManager = new DefaultSchemaManager( loader );
-
- // We have to load the schema now, otherwise we won't be able
- // to initialize the Partitions, as we won't be able to parse
- // and normalize their suffix Dn
- schemaManager.loadAllEnabled();
-
- // Tell all the normalizer comparators that they should not normalize anything
- ComparatorRegistry comparatorRegistry = schemaManager.getComparatorRegistry();
-
- for ( LdapComparator<?> comparator : comparatorRegistry )
- {
- if ( comparator instanceof NormalizingComparator )
- {
- ( ( NormalizingComparator ) comparator ).setOnServer();
- }
- }
-
- directoryService.setSchemaManager( schemaManager );
-
- // Init the LdifPartition
- LdifPartition ldifPartition = new LdifPartition( schemaManager /*, directoryService.getDnFactory()*/ );
- ldifPartition.setPartitionPath( new File( workingDirectory, "schema" ).toURI() );
- SchemaPartition schemaPartition = new SchemaPartition( schemaManager );
- schemaPartition.setWrappedPartition( ldifPartition );
- directoryService.setSchemaPartition( schemaPartition );
-
- List<Throwable> errors = schemaManager.getErrors();
-
- if ( errors.size() != 0 )
- {
- throw new Exception( I18n.err( I18n.ERR_317, Exceptions.printErrors( errors ) ) );
- }
- }
-
-
- /**
- * Inits the system partition.
- *
- * @throws Exception the exception
- */
- private void initSystemPartition() throws Exception
- {
- // change the working directory to something that is unique
- // on the system and somewhere either under target directory
- // or somewhere in a temp area of the machine.
-
- // Inject the System Partition
- Partition systemPartition = partitionFactory.createPartition(
- directoryService.getSchemaManager(),
- //directoryService.getDnFactory(),
- "system",
- ServerDNConstants.SYSTEM_DN,
- 500,
- new File( directoryService.getInstanceLayout().getPartitionsDirectory(), "system" ) );
- systemPartition.setSchemaManager( directoryService.getSchemaManager() );
-
- partitionFactory.addIndex( systemPartition, SchemaConstants.OBJECT_CLASS_AT, 100 );
-
- directoryService.setSystemPartition( systemPartition );
- }
-
-
- /**
- * Builds the directory server instance.
- *
- * @param name the instance name
- */
- private void build( String name ) throws Exception
- {
- directoryService.setInstanceId( name );
- buildInstanceDirectory( name );
-
- CacheService cacheService = new CacheService();
- cacheService.initialize( directoryService.getInstanceLayout() );
-
- directoryService.setCacheService( cacheService );
-
- // Init the service now
- initSchema();
- initSystemPartition();
-
- directoryService.startup();
- }
-
-
- /**
- * {@inheritDoc}
- */
- public DirectoryService getDirectoryService() throws Exception
- {
- return directoryService;
- }
-
-
- /**
- * {@inheritDoc}
- */
- public PartitionFactory getPartitionFactory() throws Exception
- {
- return partitionFactory;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryService.java
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryService.java b/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryService.java
deleted file mode 100644
index 68fa1da..0000000
--- a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.apache.hadoop.gateway.security.ldap;
-
-public class SimpleDirectoryService extends BaseDirectoryService {
-
- public SimpleDirectoryService() throws Exception {
- }
-
- protected void showSecurityWarnings() throws Exception {
- // NoOp - This prevents confusing warnings from being output.
- }
-
-}
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryServiceFactory.java
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryServiceFactory.java b/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryServiceFactory.java
deleted file mode 100644
index 72a05ff..0000000
--- a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleDirectoryServiceFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.apache.hadoop.gateway.security.ldap;
-
-import org.apache.directory.server.core.api.DirectoryService;
-
-public class SimpleDirectoryServiceFactory extends BaseDirectoryServiceFactory {
-
- protected DirectoryService createDirectoryService() {
- DirectoryService result;
- try {
- result = new SimpleDirectoryService();
- } catch( Exception e ) {
- throw new RuntimeException( e );
- }
- return result;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/knox/blob/3158bc84/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapDirectoryServer.java
----------------------------------------------------------------------
diff --git a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapDirectoryServer.java b/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapDirectoryServer.java
deleted file mode 100644
index 139b83b..0000000
--- a/gateway-test-ldap/src/main/java/org/apache/hadoop/gateway/security/ldap/SimpleLdapDirectoryServer.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.apache.hadoop.gateway.security.ldap;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.directory.server.core.api.CoreSession;
-import org.apache.directory.server.core.api.DirectoryService;
-import org.apache.directory.server.core.api.partition.Partition;
-import org.apache.directory.server.core.factory.DirectoryServiceFactory;
-import org.apache.directory.server.ldap.LdapServer;
-import org.apache.directory.server.protocol.shared.store.LdifFileLoader;
-import org.apache.directory.server.protocol.shared.transport.TcpTransport;
-import org.apache.directory.server.protocol.shared.transport.Transport;
-import org.apache.log4j.PropertyConfigurator;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.net.ServerSocket;
-import java.util.UUID;
-
-public class SimpleLdapDirectoryServer {
-
- private DirectoryServiceFactory factory;
-
- private DirectoryService service;
-
- private LdapServer server;
-
- public SimpleLdapDirectoryServer( String rootDn, File usersLdif, Transport... transports ) throws Exception {
- if( !usersLdif.exists() ) {
- throw new FileNotFoundException( usersLdif.getAbsolutePath() );
- }
-
- factory = new SimpleDirectoryServiceFactory();
- factory.init( UUID.randomUUID().toString() );
- service = factory.getDirectoryService();
-
- Partition partition = factory.getPartitionFactory().createPartition(
- service.getSchemaManager(), "users", rootDn, 500, service.getInstanceLayout().getInstanceDirectory() );
- service.addPartition( partition );
-
- CoreSession session = service.getAdminSession();
- LdifFileLoader lfl = new LdifFileLoader( session, usersLdif, null );
- lfl.execute();
-
- server = new LdapServer();
- server.setTransports( transports );
- server.setDirectoryService( service );
- }
-
- public void start() throws Exception {
- service.startup();
- server.start();
- }
-
- public void stop( boolean clean ) throws Exception {
- server.stop();
- service.shutdown();
- if( clean ) {
- FileUtils.deleteDirectory( service.getInstanceLayout().getInstanceDirectory() );
- }
- }
-
- public static void main( String[] args ) throws Exception {
- PropertyConfigurator.configure( System.getProperty( "log4j.configuration" ) );
-
- SimpleLdapDirectoryServer ldap;
-
- File file;
- if ( args.length < 1 ) {
- file = new File( "conf/users.ldif" );
- } else {
- File dir = new File( args[0] );
- if( !dir.exists() || !dir.isDirectory() ) {
- throw new FileNotFoundException( dir.getAbsolutePath() );
- }
- file = new File( dir, "users.ldif" );
- }
-
- if( !file.exists() || !file.canRead() ) {
- throw new FileNotFoundException( file.getAbsolutePath() );
- }
-
- int port = 33389;
-
- // Make sure the port is free.
- ServerSocket socket = new ServerSocket( port );
- socket.close();
-
- TcpTransport transport = new TcpTransport( port );
- ldap = new SimpleLdapDirectoryServer( "dc=hadoop,dc=apache,dc=org", file, transport );
- ldap.start();
- }
-
-}