From 7145b9165f3789848a543d1245c64babaf43e233 Mon Sep 17 00:00:00 2001
From: Maxim Thomas <maxim.thomas@gmail.com>
Date: Fri, 07 Jun 2024 13:54:13 +0000
Subject: [PATCH] Embedded OpenDJ module initial commit (#340)

---
 opendj-embedded/src/main/java/org/openidentityplatform/opendj/embedded/Config.java             |  132 ++++++++++
 opendj-embedded/pom.xml                                                                        |  112 ++++++++
 opendj-embedded/src/test/java/org/openidentityplatform/opendj/embedded/EmbeddedOpenDJTest.java |   87 ++++++
 opendj-embedded/src/test/resources/logback-test.xml                                            |   12 
 .github/workflows/deploy.yml                                                                   |    2 
 .github/workflows/release.yml                                                                  |    2 
 .github/workflows/build.yml                                                                    |    2 
 opendj-embedded/src/main/java/org/openidentityplatform/opendj/embedded/EmbeddedOpenDJ.java     |  238 ++++++++++++++++++
 opendj-embedded/src/test/resources/opendj/data.ldif                                            |   18 +
 opendj-embedded/src/test/resources/opendj/99-users.ldif                                        |  151 +++++++++++
 pom.xml                                                                                        |    1 
 11 files changed, 754 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 500498c..db144eb 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -18,7 +18,7 @@
       if: runner.os == 'Linux'
       shell: bash
       run:   |
-        sudo apt-get install ppa-purge && sudo ppa-purge -y ppa:ubuntu-toolchain-r/test
+        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
         sudo dpkg --add-architecture i386
         sudo mkdir -pm755 /etc/apt/keyrings && sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
         sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 33afd05..05dfbc1 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -18,7 +18,7 @@
         if: runner.os == 'Linux'
         shell: bash
         run:   |
-          sudo apt-get install ppa-purge && sudo ppa-purge -y ppa:ubuntu-toolchain-r/test
+          sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
           sudo dpkg --add-architecture i386
           sudo mkdir -pm755 /etc/apt/keyrings && sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
           sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 9ba1f63..f55df90 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -22,7 +22,7 @@
       - name: Install wine+rpm for distribution
         shell: bash
         run:   |
-          sudo apt-get install ppa-purge && sudo ppa-purge -y ppa:ubuntu-toolchain-r/test
+          sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
           sudo dpkg --add-architecture i386
           sudo mkdir -pm755 /etc/apt/keyrings && sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
           sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources
diff --git a/opendj-embedded/pom.xml b/opendj-embedded/pom.xml
new file mode 100644
index 0000000..2458189
--- /dev/null
+++ b/opendj-embedded/pom.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  The contents of this file are subject to the terms of the Common Development and
+  Distribution License (the License). You may not use this file except in compliance with the
+  License.
+
+  You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
+  specific language governing permission and limitations under the License.
+
+  When distributing Covered Software, include this CDDL Header Notice in each file and include
+  the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
+  Header, with the fields enclosed by brackets [] replaced by your own identifying
+  information: "Portions Copyright [year] [name of copyright owner]".
+
+  Copyright 2024 3A Systems LLC.
+-->
+<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.openidentityplatform.opendj</groupId>
+        <artifactId>opendj-parent</artifactId>
+        <version>4.6.3</version>
+    </parent>
+    <name>OpenDJ Embedded Server</name>
+    <artifactId>opendj-embedded</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openidentityplatform.opendj</groupId>
+            <artifactId>opendj-server-legacy</artifactId>
+            <type>jar</type>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.2.11</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.9</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+    <build>
+        <resources>
+            <resource><directory>${project.basedir}/src/main/resources</directory></resource>
+            <resource><directory>${project.build.directory}/test-resources</directory></resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>3.2.5</version>
+                <configuration>
+                    <properties>
+                        <property>
+                            <name>usedefaultlisteners</name>
+                            <value>true</value>
+                        </property>
+                    </properties>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <artifactItems>
+                        <artifactItem>
+                            <groupId>org.openidentityplatform.opendj</groupId>
+                            <artifactId>opendj-server-legacy</artifactId>
+                            <type>zip</type>
+                            <overWrite>false</overWrite>
+                            <outputDirectory>${project.build.directory}/test-resources/embedded-opendj</outputDirectory>
+                            <destFileName>opendj.zip</destFileName>
+                        </artifactItem>
+                    </artifactItems>
+                    <outputDirectory>${project.build.directory}</outputDirectory>
+                    <overWriteReleases>false</overWriteReleases>
+                    <overWriteSnapshots>true</overWriteSnapshots>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/opendj-embedded/src/main/java/org/openidentityplatform/opendj/embedded/Config.java b/opendj-embedded/src/main/java/org/openidentityplatform/opendj/embedded/Config.java
new file mode 100644
index 0000000..143c867
--- /dev/null
+++ b/opendj-embedded/src/main/java/org/openidentityplatform/opendj/embedded/Config.java
@@ -0,0 +1,132 @@
+/*
+ * The contents of this file are subject to the terms of the Common Development and
+ * Distribution License (the License). You may not use this file except in compliance with the
+ * License.
+ *
+ * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
+ * specific language governing permission and limitations under the License.
+ *
+ * When distributing Covered Software, include this CDDL Header Notice in each file and include
+ * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
+ * Header, with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyright [year] [name of copyright owner]".
+ *
+ * Copyright 2024 3A Systems LLC.
+ */
+
+package org.openidentityplatform.opendj.embedded;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Config {
+
+    private final String CONFIG_PREFIX = Config.class.getPackage().getName();
+    private int port = Integer.parseInt(System.getProperty(CONFIG_PREFIX + ".port", "1389"));
+
+    private int adminPort = Integer.parseInt(System.getProperty(CONFIG_PREFIX + ".admin_port", "4444"));
+
+    private String adminPassword = System.getProperty(CONFIG_PREFIX + ".password", "passw0rd");
+
+    private String baseDN = System.getProperty(CONFIG_PREFIX + ".root", "dc=openidentityplatform,dc=org");
+
+    private String backendType = System.getProperty(CONFIG_PREFIX + ".backend", "je");
+
+    private int jmxPort = Integer.parseInt(System.getProperty(CONFIG_PREFIX + ".jmx_port", "1689"));
+
+    private String ldifSchema = System.getProperty(CONFIG_PREFIX + ".ldif.schema");
+
+    private String file = System.getProperty(CONFIG_PREFIX + ".ldif.data", "/test.ldif");
+
+    private Set<String> skipSet = new HashSet<>(Arrays.asList(System.getProperty(CONFIG_PREFIX + ".skip", ",ou=sample-skip-group,").toLowerCase().split(";")));
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public int getAdminPort() {
+        return adminPort;
+    }
+
+    public void setAdminPort(int adminPort) {
+        this.adminPort = adminPort;
+    }
+
+
+    public String getAdminPassword() {
+        return adminPassword;
+    }
+
+    public void setAdminPassword(String adminPassword) {
+        this.adminPassword = adminPassword;
+    }
+
+    public String getBaseDN() {
+        return baseDN;
+    }
+
+    public void setBaseDN(String baseDN) {
+        this.baseDN = baseDN;
+    }
+
+    public String getBackendType() {
+        return backendType;
+    }
+
+    public void setBackendType(String backendType) {
+        this.backendType = backendType;
+    }
+
+    public int getJmxPort() {
+        return jmxPort;
+    }
+
+    public void setJmxPort(int jmxPort) {
+        this.jmxPort = jmxPort;
+    }
+
+    public String getLdifSchema() {
+        return ldifSchema;
+    }
+
+    public void setLdifSchema(String ldifSchema) {
+        this.ldifSchema = ldifSchema;
+    }
+
+    public String getFile() {
+        return file;
+    }
+
+    public void setFile(String file) {
+        this.file = file;
+    }
+
+
+    public Set<String> getSkipSet() {
+        return skipSet;
+    }
+
+    public void setSkipSet(Set<String> skipSet) {
+        this.skipSet = skipSet;
+    }
+
+    @Override
+    public String toString() {
+        return "Config {" +
+                "port=" + port +
+                ", adminPort=" + adminPort +
+                ", adminPassword='" + adminPassword + '\'' +
+                ", baseDN='" + baseDN + '\'' +
+                ", backendType='" + backendType + '\'' +
+                ", jmxPort=" + jmxPort +
+                ", ldifSchema='" + ldifSchema + '\'' +
+                ", file='" + file + '\'' +
+                ", skipSet=" + skipSet +
+                '}';
+    }
+}
diff --git a/opendj-embedded/src/main/java/org/openidentityplatform/opendj/embedded/EmbeddedOpenDJ.java b/opendj-embedded/src/main/java/org/openidentityplatform/opendj/embedded/EmbeddedOpenDJ.java
new file mode 100644
index 0000000..fc88890
--- /dev/null
+++ b/opendj-embedded/src/main/java/org/openidentityplatform/opendj/embedded/EmbeddedOpenDJ.java
@@ -0,0 +1,238 @@
+/*
+ * The contents of this file are subject to the terms of the Common Development and
+ * Distribution License (the License). You may not use this file except in compliance with the
+ * License.
+ *
+ * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
+ * specific language governing permission and limitations under the License.
+ *
+ * When distributing Covered Software, include this CDDL Header Notice in each file and include
+ * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
+ * Header, with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyright [year] [name of copyright owner]".
+ *
+ * Copyright 2024 3A Systems LLC.
+ */
+
+package org.openidentityplatform.opendj.embedded;
+
+import org.apache.commons.io.FileUtils;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.config.client.ManagementContext;
+import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.DN;
+import org.forgerock.opendj.ldap.LdapException;
+import org.forgerock.opendj.ldap.SearchScope;
+import org.forgerock.opendj.ldap.responses.SearchResultEntry;
+import org.forgerock.opendj.ldif.ConnectionEntryReader;
+import org.forgerock.opendj.ldif.EntryReader;
+import org.forgerock.opendj.ldif.LDIFEntryReader;
+import org.forgerock.opendj.ldif.LDIFEntryWriter;
+import org.forgerock.opendj.server.config.client.BackendCfgClient;
+import org.forgerock.opendj.server.embedded.ConfigParameters;
+import org.forgerock.opendj.server.embedded.ConnectionParameters;
+import org.forgerock.opendj.server.embedded.EmbeddedDirectoryServer;
+import org.forgerock.opendj.server.embedded.EmbeddedDirectoryServerException;
+import org.forgerock.opendj.server.embedded.SetupParameters;
+import org.forgerock.opendj.server.embedded.UpgradeParameters;
+import org.opends.server.backends.MemoryBackend;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class EmbeddedOpenDJ implements Runnable, Closeable {
+    private static final String JAR_SCHEMA_DIRECTORY = "opendj/config/schema/";
+
+    final static Logger logger = LoggerFactory.getLogger(EmbeddedOpenDJ.class.getName());
+    final EmbeddedDirectoryServer server;
+
+    final Config config;
+
+    public EmbeddedOpenDJ() {
+        this(new Config());
+    }
+
+    public EmbeddedOpenDJ(Config config) {
+
+        logger.info("Create embedded OpenDJ instance: {}", config);
+
+        this.config = config;
+        File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
+        File rootDirectory = new File(tempDirectory, "opendj");
+        try {
+            if(rootDirectory.exists()) {
+                FileUtils.deleteDirectory(rootDirectory);
+            }
+            rootDirectory.mkdir();
+
+            File configDirectory = new File(rootDirectory, "config");
+            File schemaDirectory = new File(configDirectory, "schema");
+            server = EmbeddedDirectoryServer.manageEmbeddedDirectoryServer(
+                    ConfigParameters.configParams()
+                            .serverRootDirectory(rootDirectory.getPath())
+                            .configurationFile(Paths.get(rootDirectory.getPath(), "config", "config.ldif").toString()),
+                    ConnectionParameters.connectionParams()
+                            .hostName("localhost")
+                            .ldapPort(config.getPort())
+                            .adminPort(config.getAdminPort())
+                            .bindDn("cn=Directory Manager")
+                            .bindPassword(config.getAdminPassword()),
+                    System.out,
+                    System.err);
+
+            copyFilesFromJar(Collections.singletonList("opendj.zip"),"embedded-opendj/",rootDirectory);
+            server.extractArchiveForSetup(new File(rootDirectory,"opendj.zip"));
+
+            server.setup(
+                    SetupParameters.setupParams()
+                            .baseDn(config.getBaseDN())
+                            .backendType(config.getBackendType())
+                            .jmxPort(config.getJmxPort())
+            );
+
+            List<String> schemaFiles = new ArrayList<>();
+            if (config.getLdifSchema() != null) {
+                schemaFiles.add(config.getLdifSchema());
+            }
+
+            copyFilesFromJar(schemaFiles, JAR_SCHEMA_DIRECTORY, schemaDirectory);
+
+        }catch (Exception e) {
+            logger.error("Error initializing OpenDJ");
+            throw new RuntimeException(e);
+        }
+        Runtime.getRuntime().addShutdownHook(new Thread(this::close));
+    }
+
+    @Override
+    public void run() {
+        try {
+            final DN baseDN = DN.valueOf(config.getBaseDN());
+            try {
+                ManagementContext config = server.getConfiguration();
+                BackendCfgClient userRoot = config.getRootConfiguration().getBackend("userRoot");
+                userRoot.setBaseDN((Collections.singletonList(baseDN)));
+                userRoot.setEnabled(true);
+                userRoot.commit();
+                config.close();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+
+            logger.info("Check upgrade OpenDJ ...");
+            server.upgrade(UpgradeParameters.upgradeParams().isIgnoreErrors(false));
+
+            logger.info("Start OpenDJ ...");
+            server.start();
+
+        } catch (Exception e) {
+            logger.error("Error starting OpenDJ", e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void close()  {
+        if (server.isRunning())
+            try {
+                logger.info("Shutting down OpenDJ ...");
+                server.stop(this.getClass().getName(), LocalizableMessage.raw("Stopped after receiving Control-C"));
+            }catch (Throwable e) {
+                logger.error("Error stopping OpenDJ", e);
+            }
+    }
+
+    private void copyFilesFromJar(List<String> jarFiles, String jarDirectory, File outputDirectory) throws IOException{
+        for(String jarFile : jarFiles) {
+            File outputFile = new File(outputDirectory, new File(jarFile).getName());
+            final String resourcePath = !jarFile.contains("/")
+                    ? "/"+jarDirectory + jarFile
+                    : jarFile;
+            InputStream in = new File(jarFile).exists()
+                    ? Files.newInputStream(new File(jarFile).toPath())
+                    : MemoryBackend.class.getResourceAsStream(resourcePath);
+            if (in == null) {
+                throw new IOException("cannot find " + resourcePath);
+            }
+            FileUtils.copyInputStreamToFile(in, outputFile);
+            in.close();
+        }
+    }
+
+    public void importData(InputStream inputStream) throws EmbeddedDirectoryServerException, IOException {
+        logger.info("start import ldif from stream");
+
+        EntryReader reader;
+        try {
+            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+            reader = new LDIFEntryReader(bufferedReader);
+        } catch (Exception e) {
+            logger.error("import ldif : {}", e, e);
+            throw e;
+        }
+        org.forgerock.opendj.ldap.Entry  entryBefore;
+        final Connection connection = server.getInternalConnection();
+        long recordCount = 0;
+        while (reader.hasNext() && (entryBefore = reader.readEntry()) != null) {
+            recordCount++;
+            try {
+                connection.add(entryBefore);
+                logger.info("import ldif : {}",entryBefore.getName());
+            }catch (LdapException e) {
+                logger.error("import ldif : {} {}",entryBefore.getName(),e.toString());
+            }
+        }
+        if(recordCount == 0) {
+            logger.error("no records were imported, check file contents and permissions");
+            throw new RuntimeException("no records were imported");
+        }
+        reader.close();
+        connection.close();
+    }
+
+    public void getData(String baseDN, OutputStream out) throws IOException, EmbeddedDirectoryServerException {
+        LDIFEntryWriter ldifWriter = new LDIFEntryWriter(out);
+        final Connection connection = server.getInternalConnection();
+
+        ConnectionEntryReader reader = connection.search(baseDN, SearchScope.WHOLE_SUBTREE, "(objectClass=*)");
+        while(reader.hasNext()) {
+            if (!reader.isReference()) {
+                SearchResultEntry se = reader.readEntry();
+                if (!skipEntry(se)) {
+                    ldifWriter.writeEntry(se);
+                    logger.info("export {}", se.toString());
+                }
+            }
+        }
+        reader.close();
+        ldifWriter.close();
+        connection.close();
+    }
+
+    private boolean skipEntry(SearchResultEntry se) {
+        for (String skip : config.getSkipSet()) {
+            if (se.getName().toString().toLowerCase().contains(skip)){
+                logger.trace("ignore export {}", se);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean isRunning() {
+        return server != null && server.isRunning();
+    }
+
+}
diff --git a/opendj-embedded/src/test/java/org/openidentityplatform/opendj/embedded/EmbeddedOpenDJTest.java b/opendj-embedded/src/test/java/org/openidentityplatform/opendj/embedded/EmbeddedOpenDJTest.java
new file mode 100644
index 0000000..ece5c5c
--- /dev/null
+++ b/opendj-embedded/src/test/java/org/openidentityplatform/opendj/embedded/EmbeddedOpenDJTest.java
@@ -0,0 +1,87 @@
+/*
+ * The contents of this file are subject to the terms of the Common Development and
+ * Distribution License (the License). You may not use this file except in compliance with the
+ * License.
+ *
+ * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
+ * specific language governing permission and limitations under the License.
+ *
+ * When distributing Covered Software, include this CDDL Header Notice in each file and include
+ * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
+ * Header, with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyright [year] [name of copyright owner]".
+ *
+ * Copyright 2024 3A Systems LLC.
+ */
+
+package org.openidentityplatform.opendj.embedded;
+
+import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.LDAPConnectionFactory;
+import org.forgerock.opendj.ldap.SearchScope;
+import org.forgerock.opendj.ldap.requests.Requests;
+import org.forgerock.opendj.ldap.requests.SearchRequest;
+import org.forgerock.opendj.ldap.responses.BindResult;
+import org.forgerock.opendj.ldap.responses.SearchResultEntry;
+import org.forgerock.opendj.ldif.ConnectionEntryReader;
+import org.testng.annotations.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+public class EmbeddedOpenDJTest {
+
+    @Test
+    public void testOpenDJ() throws Exception {
+        //set custom configuration
+        Config config = new Config();
+
+        //load custom schema from resource
+        URI schemaUri = getClass().getClassLoader().getResource("opendj/99-users.ldif").toURI();
+        config.setLdifSchema(new File(schemaUri).toString());
+
+        //start embedded OpenDJ server
+        EmbeddedOpenDJ embeddedOpenDJ = new EmbeddedOpenDJ(config);
+        embeddedOpenDJ.run();
+        assertTrue(embeddedOpenDJ.isRunning());
+
+        //import ldif data from an input stream
+        URI resUri = getClass().getClassLoader().getResource("opendj/data.ldif").toURI();
+        byte[] bytes = Files.readAllBytes(Paths.get(resUri));
+        String newBytes = new String(bytes);
+        InputStream is = new ByteArrayInputStream(newBytes.getBytes(StandardCharsets.UTF_8));
+        embeddedOpenDJ.importData(is);
+
+        //export OpenDJ data
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        embeddedOpenDJ.getData("dc=openidentityplatform,dc=org", bos);
+        String imported = bos.toString();
+        assertTrue(imported.contains("dn: uid=jdoe,ou=people,dc=openidentityplatform,dc=org"));
+
+        //test search in the imported data
+        try(LDAPConnectionFactory factory = new LDAPConnectionFactory("localhost", 1389);
+            Connection connection = factory.getConnection()) {
+            BindResult result = connection.bind("cn=Directory Manager", "passw0rd".toCharArray());
+            assertTrue(result.isSuccess());
+
+            SearchRequest request = Requests.newSearchRequest("dc=openidentityplatform,dc=org",
+                    SearchScope.WHOLE_SUBTREE, "(uid=jdoe)", "uid");
+            ConnectionEntryReader reader = connection.search(request);
+            SearchResultEntry entry = reader.readEntry();
+            entry.getAllAttributes();
+        }
+
+        //stop OpenDJ
+        embeddedOpenDJ.close();
+        assertFalse(embeddedOpenDJ.isRunning());
+    }
+}
\ No newline at end of file
diff --git a/opendj-embedded/src/test/resources/logback-test.xml b/opendj-embedded/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..cd6b5f4
--- /dev/null
+++ b/opendj-embedded/src/test/resources/logback-test.xml
@@ -0,0 +1,12 @@
+<configuration debug="true">
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <layout>
+            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
+        </layout>
+    </appender>
+    <root level="debug">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+
+</configuration>
\ No newline at end of file
diff --git a/opendj-embedded/src/test/resources/opendj/99-users.ldif b/opendj-embedded/src/test/resources/opendj/99-users.ldif
new file mode 100644
index 0000000..00a7a3d
--- /dev/null
+++ b/opendj-embedded/src/test/resources/opendj/99-users.ldif
@@ -0,0 +1,151 @@
+dn: cn=schema
+objectClass: top
+objectClass: ldapSubentry
+objectClass: subschema
+cn: schema
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.78 NAME 'sunServiceSchema' DESC 'SMS Attribute to Store xml schema of a particular service' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.79 NAME 'sunserviceID' DESC 'Attribute to store the reference to the inherited object' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.81 NAME 'sunsmspriority' DESC 'To store the priority of the service with respect to its siblings' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.82 NAME 'sunPluginSchema' DESC 'To store the plugin schema information' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.83 NAME 'sunKeyValue' DESC 'Attribute to store the encoded key values of the services' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.84 NAME 'sunxmlKeyValue' DESC 'Attribute to store the key values in xml format' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.2.840.113556.1.2.102 NAME 'memberof' DESC 'Group that the entry belongs to' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'iPlanet Delegated Administrator' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.692 NAME 'inetUserStatus' DESC '"active", "inactive", or "deleted" status of a user' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Nortel subscriber interoperability' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.693 NAME 'inetUserHttpURL' DESC 'A users Web addresses' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Nortel subscriber interoperability' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.1466.101.120.42 NAME 'preferredLocale' DESC 'preferred locale for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'iPlanet' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.1466.101.120.43 NAME 'preferredTimeZone' DESC 'preferred time zone for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'iPlanet' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1053 NAME 'iplanet-am-session-service-status' DESC 'Session Service Status' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1065 NAME 'iplanet-am-session-max-session-time' DESC 'Max Service Time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1066 NAME 'iplanet-am-session-max-idle-time' DESC 'Max Session Idle Time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1067 NAME 'iplanet-am-session-max-caching-time' DESC 'Max Session Caching Time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.752 NAME 'iplanet-am-session-quota-limit' DESC 'Session Quota Constraints' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1068 NAME 'iplanet-am-session-get-valid-sessions' DESC 'Get Valid Sessions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1069 NAME 'iplanet-am-session-destroy-sessions' DESC 'Destroy Session' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1071 NAME 'iplanet-am-user-auth-modules' DESC 'User Auth Modules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1072 NAME 'iplanet-am-user-admin-start-dn' DESC 'Starting DN for Admin User' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1073 NAME 'iplanet-am-user-service-status' DESC 'User Service Status' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.1074 NAME 'iplanet-am-user-login-status' DESC 'User Login Status' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 2.16.840.1.113730.3.1.976 NAME 'iplanet-am-user-account-life' DESC 'User Account Life' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.58 NAME 'iplanet-am-user-auth-config' DESC 'User Authentication Configuration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.59 NAME 'iplanet-am-user-alias-list' DESC 'User Alias Names List' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.62 NAME 'iplanet-am-auth-configuration' DESC 'Authentication Configuration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.63 NAME 'iplanet-am-auth-login-success-url' DESC 'Redirection URL After Successful Login' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.64 NAME 'iplanet-am-auth-login-failure-url' DESC 'Redirection URL for Failed User Authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.65 NAME 'iplanet-am-auth-post-login-process-class' DESC 'Class Name for Post Authentication Processing' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.793 NAME 'sunAMAuthInvalidAttemptsData' DESC 'XML data for Invalid Login Attempts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.71 NAME 'iplanet-am-user-success-url' DESC 'Redirection URL for Successful User Authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.72 NAME 'iplanet-am-user-failure-url' DESC 'Redirection URL for Failed User Authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.589 NAME 'iplanet-am-user-password-reset-options' DESC 'Password Reset Options' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.590 NAME 'iplanet-am-user-password-reset-question-answer' DESC 'Password Reset User Question Answer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.591 NAME 'iplanet-am-user-password-reset-force-reset' DESC 'Password Reset Force Reset password' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.823 NAME 'sunIdentityMSISDNNumber' DESC 'User MSISDN Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.73 NAME 'iplanet-am-user-federation-info-key' DESC 'User Federation Information Key' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.74 NAME 'iplanet-am-user-federation-info' DESC 'User Federation Information' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.821 NAME 'sunIdentityServerDiscoEntries' DESC 'User DiscoEntries' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.825 NAME 'sunIdentityServerPPCommonNameCN' DESC 'Liberty PP CommonName CN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.826 NAME 'sunIdentityServerPPCommonNameFN' DESC 'Liberty PP CommonName FN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.827 NAME 'sunIdentityServerPPCommonNameSN' DESC 'Liberty PP CommonName SN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.828 NAME 'sunIdentityServerPPCommonNameMN' DESC 'Liberty PP CommonName MN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.829 NAME 'sunIdentityServerPPCommonNameAltCN' DESC 'Liberty PP CommonName Alt CN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.830 NAME 'sunIdentityServerPPCommonNamePT' DESC 'Liberty PP CommonName PersonalTitle' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.831 NAME 'sunIdentityServerPPInformalName' DESC 'Liberty PP InformalName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.832 NAME 'sunIdentityServerPPLegalIdentityLegalName' DESC 'Liberty PP LegalName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.833 NAME 'sunIdentityServerPPLegalIdentityDOB' DESC 'Liberty PP Date of Birth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.834 NAME 'sunIdentityServerPPLegalIdentityMaritalStatus' DESC 'Liberty PP Marital Status' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.835 NAME 'sunIdentityServerPPLegalIdentityGender' DESC 'Liberty PP Gender' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.836 NAME 'sunIdentityServerPPLegalIdentityAltIdType' DESC 'Liberty PP AltID Type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.837 NAME 'sunIdentityServerPPLegalIdentityAltIdValue' DESC 'Liberty PP AltID Type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.838 NAME 'sunIdentityServerPPLegalIdentityVATIdType' DESC 'Liberty PP IDType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.839 NAME 'sunIdentityServerPPLegalIdentityVATIdValue' DESC 'Liberty PP IDValue' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.840 NAME 'sunIdentityServerPPEmploymentIdentityJobTitle' DESC 'Liberty PP JobTitle' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.841 NAME 'sunIdentityServerPPEmploymentIdentityOrg' DESC 'Liberty PP Org' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.842 NAME 'sunIdentityServerPPEmploymentIdentityAltO' DESC 'Liberty PP Alt Orgs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.848 NAME 'sunIdentityServerPPAddressCard' DESC 'Liberty PP AddressCard' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.849 NAME 'sunIdentityServerPPMsgContact' DESC 'Liberty PP MsgContact' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.850 NAME 'sunIdentityServerPPFacadeMugShot' DESC 'Liberty PP FacadeMugShot' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.851 NAME 'sunIdentityServerPPFacadeWebSite' DESC 'Liberty PP FacadeWebSite' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.852 NAME 'sunIdentityServerPPFacadeNamePronounced' DESC 'Liberty PP FacadeNamePronounced' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.853 NAME 'sunIdentityServerPPFacadeGreetSound' DESC 'Liberty PP FacadeGreetSound' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.854 NAME 'sunIdentityServerPPFacadegreetmesound' DESC 'Liberty PP FacadeMeGreetSound' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.855 NAME 'sunIdentityServerPPDemographicsDisplayLanguage' DESC 'Liberty PP DemographicsDisplayLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.856 NAME 'sunIdentityServerPPDemographicsLanguage' DESC 'Liberty PP DemographicsLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.857 NAME 'sunIdentityServerPPDemographicsAge' DESC 'Liberty PP DemographicsAge' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.858 NAME 'sunIdentityServerPPDemographicsBirthDay' DESC 'Liberty PP DemographicsBirthDay' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.859 NAME 'sunIdentityServerPPDemographicsTimeZone' DESC 'Liberty PP DemographicsTimeZone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.860 NAME 'sunIdentityServerPPSignKey' DESC 'Liberty PP SignKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.861 NAME 'sunIdentityServerPPEncryptKey' DESC 'Liberty PP EncryPTKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.862 NAME 'sunIdentityServerPPEmergencyContact' DESC 'Liberty PP EmergencyContact' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.989 NAME 'sun-fm-saml2-nameid-infokey' DESC 'SAML 2.0 Name Identifier Information Key' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.990 NAME 'sun-fm-saml2-nameid-info' DESC 'SAML 2.0 Name Identifier Information' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.131 NAME 'oath2faEnabled' DESC 'Indicator for enabling of OATH 2FA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.96 NAME 'coreTokenId' DESC 'Token unique ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.97 NAME 'coreTokenType' DESC 'Token type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.98 NAME 'coreTokenExpirationDate' DESC 'Token expiration date' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.99 NAME 'coreTokenUserId' DESC 'ID of the owning user' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.100 NAME 'coreTokenObject' DESC 'Serialised JSON object for Token' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.101 NAME 'coreTokenString01' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.102 NAME 'coreTokenString02' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.103 NAME 'coreTokenString03' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.104 NAME 'coreTokenString04' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.105 NAME 'coreTokenString05' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.106 NAME 'coreTokenString06' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.107 NAME 'coreTokenString07' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.108 NAME 'coreTokenString08' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.109 NAME 'coreTokenString09' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.110 NAME 'coreTokenString10' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.111 NAME 'coreTokenString11' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.112 NAME 'coreTokenString12' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.113 NAME 'coreTokenString13' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.114 NAME 'coreTokenString14' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.115 NAME 'coreTokenString15' DESC 'General mapped string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.116 NAME 'coreTokenInteger01' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.117 NAME 'coreTokenInteger02' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.118 NAME 'coreTokenInteger03' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.119 NAME 'coreTokenInteger04' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.120 NAME 'coreTokenInteger05' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.121 NAME 'coreTokenInteger06' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.122 NAME 'coreTokenInteger07' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.123 NAME 'coreTokenInteger08' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.124 NAME 'coreTokenInteger09' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.125 NAME 'coreTokenInteger10' DESC 'General mapped integer field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.126 NAME 'coreTokenDate01' DESC 'General mapped date field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.127 NAME 'coreTokenDate02' DESC 'General mapped date field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.128 NAME 'coreTokenDate03' DESC 'General mapped date field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.129 NAME 'coreTokenDate04' DESC 'General mapped date field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.130 NAME 'coreTokenDate05' DESC 'General mapped date field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.136 NAME 'coreTokenMultiString01' DESC 'General mapped multi value string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.137 NAME 'coreTokenMultiString02' DESC 'General mapped multi value string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.138 NAME 'coreTokenMultiString03' DESC 'General mapped multi value string field' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.3.1 NAME 'assignedDashboard' DESC 'Dashboard App registry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.4 NAME 'devicePrintProfiles' DESC 'Device print profiles information is stored in this attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.5 NAME 'kbaInfo' DESC 'Knowledge Based Authentication information is stored in this attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.6 NAME 'kbaActiveIndex' DESC 'Knowledge Based Authentication Active Index' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.132 NAME 'umaLabelId' DESC 'UMA Label ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM UMA' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.133 NAME 'umaLabelType' DESC 'UMA Label type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM UMA' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.134 NAME 'umaLabelName' DESC 'UMA Label name' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'ForgeRock OpenAM UMA' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.135 NAME 'umaLabelResourceSet' DESC 'UMA Label resource set ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'ForgeRock OpenAM UMA' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.10 NAME 'oathDeviceProfiles' DESC 'OATH device profiles string' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+attributeTypes: ( 1.3.6.1.4.1.36733.2.2.1.11 NAME 'pushDeviceProfiles' DESC 'Push device profiles string' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.25 NAME 'sunservice' DESC 'object containing service information' SUP top STRUCTURAL MUST ou MAY ( labeledURI $ sunServiceSchema $ sunKeyValue $ sunxmlKeyValue $ sunPluginSchema $ description ) X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.104 NAME 'sunRealmService' DESC 'object containing service information for realms' SUP top STRUCTURAL MAY ( o $ labeledURI $ sunKeyValue $ sunxmlKeyValue $ description ) X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.27 NAME 'sunservicecomponent' DESC 'Sub-components of the service' SUP organizationalUnit STRUCTURAL MUST ou MAY ( labeledURI $ sunserviceID $ sunsmspriority $ sunKeyValue $ sunxmlKeyValue $ description ) X-ORIGIN 'Sun Java System Identity Management' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.76 NAME 'sunFederationManagerDataStore' DESC 'FSUser provider OC' SUP top AUXILIARY MAY ( iplanet-am-user-federation-info-key $ iplanet-am-user-federation-info $ sunIdentityServerDiscoEntries ) X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.127 NAME 'sunIdentityServerLibertyPPService' DESC 'sunIdentityServerLibertyPPService OC' SUP top AUXILIARY MAY ( sunIdentityServerPPCommonNameCN $ sunIdentityServerPPCommonNameAltCN $ sunIdentityServerPPCommonNameFN $ sunIdentityServerPPCommonNameSN $ sunIdentityServerPPCommonNamePT $ sunIdentityServerPPCommonNameMN $ sunIdentityServerPPInformalName $ sunIdentityServerPPLegalIdentityLegalName $ sunIdentityServerPPLegalIdentityDOB $ sunIdentityServerPPLegalIdentityMaritalStatus $ sunIdentityServerPPLegalIdentityGender $ sunIdentityServerPPLegalIdentityAltIdType $ sunIdentityServerPPLegalIdentityAltIdValue $ sunIdentityServerPPLegalIdentityVATIdType $ sunIdentityServerPPLegalIdentityVATIdValue $ sunIdentityServerPPEmploymentIdentityJobTitle $ sunIdentityServerPPEmploymentIdentityOrg $ sunIdentityServerPPEmploymentIdentityAltO $ sunIdentityServerPPAddressCard $ sunIdentityServerPPMsgContact $ sunIdentityServerPPFacadeMugShot $ sunIdentityServerPPFacadeWebSite $ sunIdentityServerPPFacadeNamePronounced $ sunIdentityServerPPFacadeGreetSound $ sunIdentityServerPPFacadegreetmesound $ sunIdentityServerPPDemographicsDisplayLanguage $ sunIdentityServerPPDemographicsLanguage $ sunIdentityServerPPDemographicsBirthDay $ sunIdentityServerPPDemographicsAge $ sunIdentityServerPPDemographicsTimeZone $ sunIdentityServerPPSignKey $ sunIdentityServerPPEncryptKey $ sunIdentityServerPPEmergencyContact ) X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.148 NAME 'sunFMSAML2NameIdentifier' DESC 'SAML 2.0 name identifier objectclass' SUP top AUXILIARY MAY ( sun-fm-saml2-nameid-infokey $ sun-fm-saml2-nameid-info ) X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 2.16.840.1.113730.3.2.175 NAME 'iplanet-am-session-service' DESC 'Session Service OC' SUP top AUXILIARY MAY ( iplanet-am-session-max-session-time $ iplanet-am-session-max-idle-time $ iplanet-am-session-max-caching-time $ iplanet-am-session-quota-limit $ iplanet-am-session-get-valid-sessions $ iplanet-am-session-destroy-sessions $ iplanet-am-session-service-status ) X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 2.16.840.1.113730.3.2.176 NAME 'iplanet-am-user-service' DESC 'User Service OC' SUP top AUXILIARY MAY ( iplanet-am-user-auth-modules $ iplanet-am-user-login-status $ iplanet-am-user-admin-start-dn $ iplanet-am-user-auth-config $ iplanet-am-user-alias-list $ iplanet-am-user-success-url $ iplanet-am-user-failure-url $ iplanet-am-user-password-reset-options $ iplanet-am-user-password-reset-question-answer $ iplanet-am-user-password-reset-force-reset $ sunIdentityMSISDNNumber ) X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 2.16.840.1.113730.3.2.184 NAME 'iplanet-am-managed-person' DESC 'Managed Person OC' SUP top AUXILIARY MAY iplanet-am-user-account-life X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.23 NAME 'iplanet-am-auth-configuration-service' DESC 'Authentication Configuration Service OC' SUP top AUXILIARY MAY ( iplanet-am-auth-configuration $ iplanet-am-auth-login-success-url $ iplanet-am-auth-login-failure-url $ iplanet-am-auth-post-login-process-class $ oath2faEnabled ) X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.118 NAME 'sunAMAuthAccountLockout' DESC 'Invalid Login Attempts Object Class' SUP top AUXILIARY MAY sunAMAuthInvalidAttemptsData X-ORIGIN 'OpenSSO' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 2.16.840.1.113730.3.2.130 NAME 'inetuser' DESC 'Auxiliary class which has to be present in an entry for delivery of subscriber services' SUP top AUXILIARY MAY ( uid $ inetUserStatus $ inetUserHTTPURL $ userPassword $ memberof ) X-ORIGIN 'Nortel subscriber interoperability' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.1466.101.120.142 NAME 'iPlanetPreferences' AUXILIARY MAY ( preferredLanguage $ preferredLocale $ preferredTimeZone ) X-ORIGIN 'iPlanet' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.2.2.27 NAME 'frCoreToken' DESC 'object containing ForgeRock Core Token' SUP top STRUCTURAL MUST ( coreTokenId $ coreTokenType ) MAY ( coreTokenExpirationDate $ coreTokenUserId $ coreTokenObject $ coreTokenString01 $ coreTokenString02 $ coreTokenString03 $ coreTokenString04 $ coreTokenString05 $ coreTokenString06 $ coreTokenString07 $ coreTokenString08 $ coreTokenString09 $ coreTokenString10 $ coreTokenString11 $ coreTokenString12 $ coreTokenString13 $ coreTokenString14 $ coreTokenString15 $ coreTokenInteger01 $ coreTokenInteger02 $ coreTokenInteger03 $ coreTokenInteger04 $ coreTokenInteger05 $ coreTokenInteger06 $ coreTokenInteger07 $ coreTokenInteger08 $ coreTokenInteger09 $ coreTokenInteger10 $ coreTokenDate01 $ coreTokenDate02 $ coreTokenDate03 $ coreTokenDate04 $ coreTokenDate05 $ coreTokenMultiString01 $ coreTokenMultiString02 $ coreTokenMultiString03 ) X-ORIGIN 'ForgeRock OpenAM CTSv2' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.2.2.3.1 NAME 'forgerock-am-dashboard-service' AUXILIARY MAY assignedDashboard X-ORIGIN 'Forgerock' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.2.2.4 NAME 'devicePrintProfilesContainer' DESC 'Class containing device print profiles' SUP top AUXILIARY MAY devicePrintProfiles X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.2.2.5 NAME 'kbaInfoContainer' DESC 'Class containing KBA information' SUP top AUXILIARY MAY ( kbaInfo $ kbaActiveIndex ) X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.2.2.28 NAME 'frUmaLabel' DESC 'object containing ForgeRock UMA Resource Set Label' SUP top STRUCTURAL MUST ( umaLabelId $ umaLabelType ) MAY ( umaLabelName $ umaLabelResourceSet ) X-ORIGIN 'ForgeRock OpenAM UMA' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.2.2.10 NAME 'oathDeviceProfilesContainer' DESC 'Class containing OATH device profiles' SUP top AUXILIARY MAY oathDeviceProfiles X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+objectClasses: ( 1.3.6.1.4.1.36733.2.2.2.11 NAME 'pushDeviceProfilesContainer' DESC 'Class containing Push device profiles' SUP top AUXILIARY MAY ( pushDeviceProfiles ) X-ORIGIN 'OpenAM' X-SCHEMA-FILE '99-user.ldif' )
+modifiersName: cn=Directory Manager,cn=Root DNs,cn=config
+modifyTimestamp: 20171112221315Z
+
diff --git a/opendj-embedded/src/test/resources/opendj/data.ldif b/opendj-embedded/src/test/resources/opendj/data.ldif
new file mode 100644
index 0000000..e3fe9e3
--- /dev/null
+++ b/opendj-embedded/src/test/resources/opendj/data.ldif
@@ -0,0 +1,18 @@
+dn: dc=openidentityplatform,dc=org
+objectClass: top
+objectClass: domain
+dc: openidentityplatform
+
+dn: ou=people,dc=openidentityplatform,dc=org
+objectclass: top
+objectclass: organizationalUnit
+ou: people
+
+dn: uid=jdoe,ou=people,dc=openidentityplatform,dc=org
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+cn: John Doe
+sn: John
+uid: jdoe
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 96f2d54..1d86e5e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -270,6 +270,7 @@
         <module>opendj-embedded-server-examples</module>
         <module>opendj-openidm-account-change-notification-handler</module>
         <module>opendj-packages</module>
+        <module>opendj-embedded</module>
     </modules>
 
     <build>

--
Gitblit v1.10.0