How to import ldif file using unboundid-ldap-sdp?
java, ldap, ldif, unboundid-ldap-sdk
Solution
Got this working thanks to Neil via https://sourceforge.net/p/ldap-sdk/discussion/1001257/thread/08ceb8da/?limit=25#65b0.
Specifically, I needed to do two things:
- Disable schema checking via:
InMemoryDirectoryServerConfig.setSchema(null)
- Added the following 4 lines to the top of the ldif:
dn: dc=mycompany,dc=com
objectClass: top
objectClass: domain
dc: mycompany
Problem
I exported the following ldif file from an LDAP server and am now trying to import it so that I can replicate the directory I exported it from: ``` dn: cn=MYCOMPANY Users,dc=mycompany,dc=com changetype: add objectClass: posixGroup objectClass: top cn: MYCOMPANY Users gidNumber: 1001 dn: cn=jim smith,cn=MYCOMPANY Users,dc=mycompany,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: top givenName: jim cn: jim smith sn: smith gidNumber: 1000 homeDirectory: /home/users/arolls uid: jsmith uidNumber: 1038 userPassword: {MD5}X03MO1qnZdYdgyfeuILPmQ== dn: cn=dave jones,cn=MYCOMPANY Users,dc=mycompany,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: top givenName: dave userPassword: {MD5}FhCDh0PMkOPk/dp0goLZuA== loginShell: /bin/sh cn: dave jones sn: dave gidNumber: 1000 homeDirectory: /home/users/dave uid: dave uidNumber: 1006 ``` I'm trying to import it using ``` LDIFReader r = new LDIFReader(resourceAsStream); LDIFChangeRecord readEntry = null; while ((readEntry = r.readChangeRecord()) != null) { readEntry.processChange(server); } ``` I'm getting the following error, would anyone know what I'm doing wrong? ``` LDAPException(resultCode=65 (object class violation), errorMessage='Unable to add entry 'cn=MYCOMPANY Users,dc=mycompany,dc=com' because it violates the provided schema: The entry contains object class posixGroup which is not defined in the schema. The entry contains attribute cn which is not allowed by its object classes and/or DIT content rule. The entry contains attribute gidNumber which is not defined in the schema. The entry's RDN contains attribute cn which is not allowed to be included in the entry.', diagnosticMessage='Unable to add entry 'cn=MYCOMPANY Users,dc=mycompany,dc=com' because it violates the provided schema: The entry contains object class posixGroup which is not defined in the schema. The entry contains attribute cn which is not allowed by its object classes and/or DIT content rule. The entry contains attribute gidNumber which is not defined in the schema. The entry's RDN contains attribute cn which is not allowed to be included in the entry.') at com.unboundid.ldap.listener.InMemoryDirectoryServer.add(InMemoryDirectoryServer.java:1382) at com.unboundid.ldif.LDIFAddChangeRecord.processChange(LDIFAddChangeRecord.java:213) at com.github.trevershick.test.ldap.LdapServerResource.loadLdifFiles(LdapServerResource.java:156) at com.github.trevershick.test.ldap.LdapServerResource.start(LdapServerResource.java:81) at org.rory.util.services.ldap.TestLDAPAuthUIUtilUsingInMemoryLdapServer.startup(TestLDAPAuthUIUtilUsingInMemoryLdapServer.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.lang.reflect.Method.invoke(Method.java:597) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) java.lang.NullPointerException at org.rory.util.services.ldap.TestLDAPAuthUIUtilUsingInMemoryLdapServer.shutdown(TestLDAPAuthUIUtilUsingInMemoryLdapServer.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.lang.reflect.Method.invoke(Method.java:597) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) ``` Many thanks!