blob: 7ab9b31876bb5ac0499ca2ab10c0486e31bba48b [file] [log] [blame]
/*
* 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
*
* https://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.directory.api.ldap.model.ldif;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.apache.directory.api.i18n.I18n;
import org.apache.directory.api.ldap.model.constants.SchemaConstants;
import org.apache.directory.api.ldap.model.entry.Attribute;
import org.apache.directory.api.ldap.model.entry.Modification;
import org.apache.directory.api.ldap.model.entry.ModificationOperation;
import org.apache.directory.api.ldap.model.message.Control;
import org.apache.directory.api.ldap.model.schema.SchemaManager;
import org.apache.directory.api.ldap.schema.manager.impl.DefaultSchemaManager;
import org.apache.directory.api.util.Strings;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
/**
* Test the LdifReader class
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@Execution( ExecutionMode.CONCURRENT )
public class SchemaAwareLdifReaderTest
{
private static byte[] data;
private static File HJENSEN_JPEG_FILE = null;
private static File FIONA_JPEG_FILE = null;
private SchemaManager schemaManager;
private static File createFile( String name, byte[] data ) throws IOException
{
File jpeg = File.createTempFile( name, "jpg" );
jpeg.createNewFile();
DataOutputStream os = new DataOutputStream( new FileOutputStream( jpeg ) );
os.write( data );
os.close();
// This file will be deleted when the JVM
// will exit.
jpeg.deleteOnExit();
return jpeg;
}
/**
* Create a file to be used by ":<" values
*/
@BeforeAll
public static void setUp() throws Exception
{
data = new byte[256];
for ( int i = 0; i < 256; i++ )
{
data[i] = ( byte ) i;
}
HJENSEN_JPEG_FILE = createFile( "hjensen", data );
FIONA_JPEG_FILE = createFile( "fiona", data );
}
/**
* Initialize the SchemaManager
*/
@BeforeEach
public void init()
{
schemaManager = new DefaultSchemaManager();
}
@Test
public void testLdifNull() throws Exception
{
String ldif = null;
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 0, entries.size() );
}
@Test
public void testLdifEmpty() throws Exception
{
String ldif = "";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 0, entries.size() );
}
@Test
public void testLdifEmptyLines() throws Exception
{
String ldif = "\n\n\r\r\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 0, entries.size() );
}
@Test
public void testLdifComments() throws Exception
{
String ldif =
"#Comment 1\r" +
"#\r" +
" th\n" +
" is is still a comment\n" +
"\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 0, entries.size() );
}
@Test
public void testLdifVersion() throws Exception
{
String ldif =
"#Comment 1\r" +
"#\r" +
" th\n" +
" is is still a comment\n" +
"\n" +
"version:\n" +
" 1\n" +
"# end";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 0, entries.size() );
assertEquals( 1, reader.getVersion() );
}
@Test
public void testLdifVersionStart() throws Exception
{
String ldif =
"version:\n" +
" 1\n" +
"\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"dependencies:\n" +
"envVars:";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, reader.getVersion() );
assertNotNull( entries );
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( ldif.length(), entry.getLengthBeforeParsing() );
assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn().getName() );
Attribute attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
}
/**
* Test the ldif parser with a file without a version. It should default to 1
* @throws Exception
*/
@Test
public void testLdifWithoutVersion() throws Exception
{
String ldif =
"#Comment 1\r" +
"#\r" +
" th\n" +
" is is still a comment\n" +
"\n" +
"# end";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 0, entries.size() );
assertEquals( 1, reader.getVersion() );
}
/**
* Spaces at the end of values should not be included into values.
*
* @throws Exception
*/
@Test
public void testLdifParserEndSpaces() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"dependencies:\n" +
"envVars:";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertNotNull( entries );
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn().getName() );
Attribute attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
}
@Test
public void testLdifParserAddAttrCaseInsensitiveAttrId() throws Exception
{
// test that mixed case attr ids work at all
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: modify\n" +
"add: administrativeRole\n" +
"administrativeRole: accessControlSpecificArea\n" +
"-";
testReaderAttrIdCaseInsensitive( ldif );
// test that attr id comparisons are case insensitive and that the version in the add: line is used.
// See DIRSERVER-1029 for some discussion.
ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: modify\n" +
"add: administrativeRole\n" +
"administrativerole: accessControlSpecificArea\n" +
"-";
testReaderAttrIdCaseInsensitive( ldif );
}
private void testReaderAttrIdCaseInsensitive( String ldif ) throws Exception
{
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
assertNotNull( entries );
reader.close();
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isChangeModify() );
assertEquals( "dc=example,dc=com", entry.getDn().getName() );
List<Modification> mods = entry.getModifications();
assertTrue( mods.size() == 1 );
Attribute attr = mods.get( 0 ).getAttribute();
assertTrue( attr.getId().equals( "administrativerole" ) );
assertEquals( attr.getString(), "accessControlSpecificArea" );
}
/**
* Changes and entries should not be mixed
*
* @throws Exception
*/
@Test
public void testLdifParserCombinedEntriesChanges() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"dependencies:\n" +
"envVars:\n" +
"\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"control: 1.2.840.113556.1.4.805 true\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception ne )
{
assertTrue( true );
}
finally
{
reader.close();
}
}
/**
* Changes and entries should not be mixed
*
* @throws Exception
*/
@Test
public void testLdifParserCombinedEntriesChanges2() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"dependencies:\n" +
"envVars:\n" +
"\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception ne )
{
assertTrue( true );
}
finally
{
reader.close();
}
}
/**
* Changes and entries should not be mixed
*
* @throws Exception
*/
@Test
public void testLdifParserCombinedChangesEntries() throws Exception
{
String ldif =
"version: 1\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"control: 1.2.840.113556.1.4.805 true\n" +
"changetype: delete\n" +
"\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"dependencies:\n" +
"envVars:\n";
LdifReader reader = new LdifReader( schemaManager );
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception ne )
{
assertTrue( true );
}
finally
{
reader.close();
}
}
/**
* Changes and entries should not be mixed
*
* @throws Exception
*/
@Test
public void testLdifParserCombinedChangesEntries2() throws Exception
{
String ldif =
"version: 1\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"changetype: delete\n" +
"\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"dependencies:\n" +
"envVars:\n";
LdifReader reader = new LdifReader( schemaManager );
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception ne )
{
assertTrue( true );
}
finally
{
reader.close();
}
}
@Test
public void testLdifParser() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"userPassword:";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertNotNull( entries );
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn().getName() );
Attribute attr = entry.get( "cn" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "apApplication" ) );
attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "userPassword" );
assertEquals( "", attr.get().getString() );
}
@Test
public void testLdifParserMuiltiLineComments() throws Exception
{
String ldif =
"#comment\n" +
" still a comment\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1#another comment\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1\n" +
"serviceType: http\n" +
"userPassword:\n" +
"httpHeaders:\n" +
"startupOptions:";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertNotNull( entries );
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn().getName() );
Attribute attr = entry.get( "cn" );
assertTrue( attr.contains( "app1#another comment" ) );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "apApplication" ) );
attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "userPassword" );
assertEquals( "", attr.get().getString() );
}
@Test
public void testLdifParserMultiLineEntries() throws Exception
{
String ldif =
"#comment\n" +
"dn: cn=app1,ou=appli\n" +
" cations,ou=conf,dc=apache,dc=org\n" +
"cn: app1#another comment\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1\n" +
"serviceType: http\n" +
"userPassword:\n" +
"httpHeaders:\n" +
"startupOptions:";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertNotNull( entries );
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn().getName() );
Attribute attr = entry.get( "cn" );
assertTrue( attr.contains( "app1#another comment" ) );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "apApplication" ) );
attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "userPassword" );
assertEquals( "", attr.get().getString() );
}
@Test
public void testLdifParserBase64() throws Exception
{
String ldif =
"#comment\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn:: RW1tYW51ZWwgTMOpY2hhcm55\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1\n" +
"serviceType: http\n" +
"userPassword:\n" +
"httpHeaders:\n" +
"startupOptions:";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertNotNull( entries );
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn().getName() );
Attribute attr = entry.get( "cn" );
assertTrue( attr.contains( "Emmanuel L\u00e9charny" ) );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "apApplication" ) );
attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "userPassword" );
assertEquals( "", attr.get().getString() );
}
@Test
public void testLdifParserBase64MultiLine() throws Exception
{
String ldif =
"#comment\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn:: RW1tYW51ZWwg\n" +
" TMOpY2hhcm55ICA=\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1\n" +
"serviceType: http\n" +
"userPassword:\n" +
"httpHeaders:\n" +
"startupOptions:";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertNotNull( entries );
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=app1,ou=applications,ou=conf,dc=apache,dc=org", entry.getDn().getName() );
Attribute attr = entry.get( "cn" );
assertTrue( attr.contains( "Emmanuel L\u00e9charny " ) );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "apApplication" ) );
attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "userPassword" );
assertEquals( "", attr.get().getString() );
}
@Test
public void testLdifParserRFC2849Sample1() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Barbara Jensen\n" +
"cn: Barbara J Jensen\n" +
"cn: Babs Jensen\n" +
"sn: Jensen\n" +
"uid: bjensen\n" +
"telephonenumber: +1 408 555 1212\n" +
"description: A big sailing fan.\n" +
"\n" +
"dn: cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Bjorn Jensen\n" +
"sn: Jensen\n" +
"telephonenumber: +1 408 555 1212";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 2, entries.size() );
// Entry 1
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com", entry.getDn().getName() );
Attribute attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "person" ) );
assertTrue( attr.contains( "organizationalPerson" ) );
attr = entry.get( "cn" );
assertTrue( attr.contains( "Barbara Jensen" ) );
assertTrue( attr.contains( "Barbara J Jensen" ) );
assertTrue( attr.contains( "Babs Jensen" ) );
attr = entry.get( "sn" );
assertTrue( attr.contains( "Jensen" ) );
attr = entry.get( "uid" );
assertTrue( attr.contains( "bjensen" ) );
attr = entry.get( "telephonenumber" );
assertTrue( attr.contains( "+1 408 555 1212" ) );
attr = entry.get( "description" );
assertTrue( attr.contains( "A big sailing fan." ) );
// Entry 2
entry = entries.get( 1 );
assertTrue( entry.isLdifContent() );
attr = entry.get( "dn" );
assertEquals( "cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com", entry.getDn().getName() );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "person" ) );
assertTrue( attr.contains( "organizationalPerson" ) );
attr = entry.get( "cn" );
assertTrue( attr.contains( "Bjorn Jensen" ) );
attr = entry.get( "sn" );
assertTrue( attr.contains( "Jensen" ) );
attr = entry.get( "telephonenumber" );
assertTrue( attr.contains( "+1 408 555 1212" ) );
}
@Test
public void testLdifParserRFC2849Sample2() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Barbara Jensen\n" +
"cn: Barbara J Jensen\n" +
"cn: Babs Jensen\n" +
"sn: Jensen\n" +
"uid: bjensen\n" +
"telephonenumber: +1 408 555 1212\n" +
"description:Babs is a big sailing fan, and travels extensively in sea\n" +
" rch of perfect sailing conditions.\n" +
"title:Product Manager, Rod and Reel Division";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry 1
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com", entry.getDn().getName() );
Attribute attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "person" ) );
assertTrue( attr.contains( "organizationalPerson" ) );
attr = entry.get( "cn" );
assertTrue( attr.contains( "Barbara Jensen" ) );
assertTrue( attr.contains( "Barbara J Jensen" ) );
assertTrue( attr.contains( "Babs Jensen" ) );
attr = entry.get( "sn" );
assertTrue( attr.contains( "Jensen" ) );
attr = entry.get( "uid" );
assertTrue( attr.contains( "bjensen" ) );
attr = entry.get( "telephonenumber" );
assertTrue( attr.contains( "+1 408 555 1212" ) );
attr = entry.get( "description" );
assertTrue( attr
.contains( "Babs is a big sailing fan, and travels extensively in search of perfect sailing conditions." ) );
attr = entry.get( "title" );
assertTrue( attr.contains( "Product Manager, Rod and Reel Division" ) );
}
@Test
public void testLdifParserRFC2849Sample3() throws Exception, Exception
{
String ldif =
"version: 1\n" +
"dn: cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Gern Jensen\n" +
"cn: Gern O Jensen\n" +
"sn: Jensen\n" +
"uid: gernj\n" +
"telephonenumber: +1 408 555 1212\n" +
"description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl\n" +
" IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG\n" +
" VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg\n" +
" b3V0IG1vcmUu";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry 1
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com", entry.getDn().getName() );
Attribute attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "person" ) );
assertTrue( attr.contains( "organizationalPerson" ) );
attr = entry.get( "cn" );
assertTrue( attr.contains( "Gern Jensen" ) );
assertTrue( attr.contains( "Gern O Jensen" ) );
attr = entry.get( "sn" );
assertTrue( attr.contains( "Jensen" ) );
attr = entry.get( "uid" );
assertTrue( attr.contains( "gernj" ) );
attr = entry.get( "telephonenumber" );
assertTrue( attr.contains( "+1 408 555 1212" ) );
attr = entry.get( "description" );
assertTrue( attr
.contains( "What a careful reader you are! This value is base-64-encoded because it has a control character in it (a CR).\r" +
" By the way, you should really get out more." ) );
}
@Test
public void testLdifParserRFC2849Sample3VariousSpacing() throws Exception, Exception
{
String ldif =
"version:1\n" +
"dn:cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com \n" +
"objectclass:top\n" +
"objectclass: person \n" +
"objectclass:organizationalPerson\n" +
"cn:Gern Jensen\n" +
"cn:Gern O Jensen\n" +
"sn:Jensen\n" +
"uid:gernj\n" +
"telephonenumber:+1 408 555 1212 \n" +
"description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl\n" +
" IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG\n" +
" VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg\n" +
" b3V0IG1vcmUu ";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry 1
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com", entry.getDn().getName() );
Attribute attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "person" ) );
assertTrue( attr.contains( "organizationalPerson" ) );
attr = entry.get( "cn" );
assertTrue( attr.contains( "Gern Jensen" ) );
assertTrue( attr.contains( "Gern O Jensen" ) );
attr = entry.get( "sn" );
assertTrue( attr.contains( "Jensen" ) );
attr = entry.get( "uid" );
assertTrue( attr.contains( "gernj" ) );
attr = entry.get( "telephonenumber" );
assertTrue( attr.contains( "+1 408 555 1212" ) );
attr = entry.get( "description" );
assertTrue( attr
.contains( "What a careful reader you are! This value is base-64-encoded because it has a control character "
+ "in it (a CR).\r By the way, you should really get out more."
) );
}
@Test
public void testLdifParserRFC2849Sample4() throws Exception, Exception
{
String ldif =
"version: 1\n"
+
"dn:: b3U95Za25qWt6YOoLG89QWlyaXVz\n"
+
"# dn:: ou=���������,o=Airius\n"
+
"objectclass: top\n"
+
"objectclass: organizationalUnit\n"
+
"ou:: 5Za25qWt6YOo\n"
+
"# ou:: ���������\n"
+
"ou;lang-ja:: 5Za25qWt6YOo\n"
+
"# ou;lang-ja:: ���������\n"
+
"ou;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2\n"
+
"# ou;lang-ja:: ������������������\n"
+
"ou;lang-en: Sales\n"
+
"description: Japanese office\n"
+
"\n"
+
"dn:: dWlkPXJvZ2FzYXdhcmEsb3U95Za25qWt6YOoLG89QWlyaXVz\n"
+
"# dn:: uid=rogasawara,ou=���������,o=Airius\n"
+
"userpassword: {SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM=\n"
+
"objectclass: top\n"
+
"objectclass: person\n"
+
"objectclass: organizationalPerson\n"
+
"objectclass: inetOrgPerson\n"
+
"uid: rogasawara\n"
+
"mail: rogasawara@airius.co.jp\n"
+
"givenname;lang-ja:: 44Ot44OJ44OL44O8\n"
+
"# givenname;lang-ja:: ������������\n"
+
"sn;lang-ja:: 5bCP56yg5Y6f\n"
+
"# sn;lang-ja:: ���������\n"
+
"cn;lang-ja:: 5bCP56yg5Y6fIOODreODieODi+ODvA==\n"
+
"# cn;lang-ja:: ��������� ������������\n"
+
"title;lang-ja:: 5Za25qWt6YOoIOmDqOmVtw==\n"
+
"# title;lang-ja:: ��������� ������\n"
+
"preferredlanguage: ja\n"
+
"givenname:: 44Ot44OJ44OL44O8\n"
+
"# givenname:: ������������\n"
+
"sn:: 5bCP56yg5Y6f\n"
+
"# sn:: ���������\n"
+
"cn:: 5bCP56yg5Y6fIOODreODieODi+ODvA==\n"
+
"# cn:: ��������� ������������\n"
+
"title:: 5Za25qWt6YOoIOmDqOmVtw==\n"
+
"# title:: ��������� ������\n"
+
"givenname;lang-ja;phonetic:: 44KN44Gp44Gr44O8\n"
+
"# givenname;lang-ja;phonetic:: ������������\n"
+
"sn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJ\n"
+
"# sn;lang-ja;phonetic:: ���������������\n"
+
"cn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJIOOCjeOBqeOBq+ODvA==\n"
+
"# cn;lang-ja;phonetic:: ��������������� ������������\n"
+
"title;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2IOOBtuOBoeOCh+OBhg==\n" +
"# title;lang-ja;phonetic::\n" +
"# ������������������ ������������\n" +
"givenname;lang-en: Rodney\n" +
"sn;lang-en: Ogasawara\n" +
"cn;lang-en: Rodney Ogasawara\n" +
"title;lang-en: Sales, Director\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
String[][][] values =
{
{
{ "dn", "ou=\u55b6\u696d\u90e8,o=Airius" }, // 55b6 = ���, 696d = ���, 90e8 = ���
{ "objectclass", "top" },
{ "objectclass", "organizationalUnit" },
{ "ou", "\u55b6\u696d\u90e8" },
{ "ou;lang-ja", "\u55b6\u696d\u90e8" },
{ "ou;lang-ja;phonetic", "\u3048\u3044\u304e\u3087\u3046\u3076" }, // 3048 = ���, 3044 = ���, 304e = ���
// 3087 = ���, 3046 = ���, 3076 = ���
{ "ou;lang-en", "Sales" },
{ "description", "Japanese office" } },
{
{ "dn", "uid=rogasawara,ou=\u55b6\u696d\u90e8,o=Airius" },
{ "userpassword", "{SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM=" },
{ "objectclass", "top" },
{ "objectclass", "person" },
{ "objectclass", "organizationalPerson" },
{ "objectclass", "inetOrgPerson" },
{ "uid", "rogasawara" },
{ "mail", "rogasawara@airius.co.jp" },
{ "givenname;lang-ja", "\u30ed\u30c9\u30cb\u30fc" }, // 30ed = ���, 30c9 = ���, 30cb = ���, 30fc = ���
{ "sn;lang-ja", "\u5c0f\u7b20\u539f" }, // 5c0f = ���, 7b20 = ���, 539f = ���
{ "cn;lang-ja", "\u5c0f\u7b20\u539f \u30ed\u30c9\u30cb\u30fc" },
{ "title;lang-ja", "\u55b6\u696d\u90e8 \u90e8\u9577" }, // 9577 = ���
{ "preferredlanguage", "ja" },
{ "givenname", "\u30ed\u30c9\u30cb\u30fc" },
{ "sn", "\u5c0f\u7b20\u539f" },
{ "cn", "\u5c0f\u7b20\u539f \u30ed\u30c9\u30cb\u30fc" },
{ "title", "\u55b6\u696d\u90e8 \u90e8\u9577" },
{ "givenname;lang-ja;phonetic", "\u308d\u3069\u306b\u30fc" }, // 308d = ���,3069 = ���, 306b = ���
{ "sn;lang-ja;phonetic", "\u304a\u304c\u3055\u308f\u3089" }, // 304a = ���, 304c = ���,3055 = ���,308f = ���, 3089 = ���
{ "cn;lang-ja;phonetic", "\u304a\u304c\u3055\u308f\u3089 \u308d\u3069\u306b\u30fc" },
{ "title;lang-ja;phonetic", "\u3048\u3044\u304e\u3087\u3046\u3076 \u3076\u3061\u3087\u3046" }, // 304E = ���, 3061 = ���
{ "givenname;lang-en", "Rodney" },
{ "sn;lang-en", "Ogasawara" },
{ "cn;lang-en", "Rodney Ogasawara" },
{ "title;lang-en", "Sales, Director" } } };
assertEquals( 2, entries.size() );
// Entry 1
for ( int i = 0; i < entries.size(); i++ )
{
LdifEntry entry = entries.get( i );
assertTrue( entry.isLdifContent() );
for ( int j = 0; j < values[i].length; j++ )
{
if ( "dn".equalsIgnoreCase( values[i][j][0] ) )
{
assertEquals( values[i][j][1], entry.getDn().getName() );
}
else
{
Attribute attr = entry.get( values[i][j][0] );
if ( attr.contains( values[i][j][1] ) )
{
assertTrue( true );
}
else
{
assertTrue( attr.contains( values[i][j][1].getBytes( StandardCharsets.UTF_8 ) ) );
}
}
}
}
}
@Test
public void testLdifParserRFC2849Sample5() throws Exception, Exception
{
String ldif =
"version: 1\n" +
"dn: cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Horatio Jensen\n" +
"cn: Horatio N Jensen\n" +
"sn: Jensen\n" +
"uid: hjensen\n" +
"telephonenumber: +1 408 555 1212\n" +
"jpegphoto:< file:" +
HJENSEN_JPEG_FILE.getAbsolutePath() +
"\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
String[][] values =
{
{ "dn", "cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com" },
{ "objectclass", "top" },
{ "objectclass", "person" },
{ "objectclass", "organizationalPerson" },
{ "cn", "Horatio Jensen" },
{ "cn", "Horatio N Jensen" },
{ "sn", "Jensen" },
{ "uid", "hjensen" },
{ "telephonenumber", "+1 408 555 1212" },
{ "jpegphoto", null } };
assertEquals( 1, entries.size() );
// Entry 1
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
for ( int i = 0; i < values.length; i++ )
{
if ( "dn".equalsIgnoreCase( values[i][0] ) )
{
assertEquals( values[i][1], entry.getDn().getName() );
}
else if ( "jpegphoto".equalsIgnoreCase( values[i][0] ) )
{
// We can't have a jpegPhoto with a null value
assertNull( entry.get( values[i][0] ) );
}
else
{
Attribute attr = entry.get( values[i][0] );
if ( attr.contains( values[i][1] ) )
{
assertTrue( true );
}
else
{
assertTrue( attr.contains( values[i][1].getBytes( StandardCharsets.UTF_8 ) ) );
}
}
}
}
@Test
public void testLdifParserRFC2849Sample5WithSizeLimit() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Horatio Jensen\n" +
"cn: Horatio N Jensen\n" +
"sn: Jensen\n" +
"uid: hjensen\n" +
"telephonenumber: +1 408 555 1212\n" +
"jpegphoto:< file:" +
HJENSEN_JPEG_FILE.getAbsolutePath() +
"\n";
LdifReader reader = new LdifReader( schemaManager );
reader.setSizeLimit( 128 );
reader.close();
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception ne )
{
assertTrue( ne.getMessage().startsWith( I18n.ERR_13442_ERROR_PARSING_LDIF_BUFFER.getErrorCode() ),
I18n.err( I18n.ERR_13442_ERROR_PARSING_LDIF_BUFFER ) );
}
}
@Test
public void testLdifParserRFC2849Sample6() throws Exception, Exception
{
String ldif =
"version: 1\n" +
// First entry modification : ADD
"# Add a new entry\n" +
"dn: cn=Fiona Jensen, ou=Marketing, dc=airius, dc=com\n" +
"changetype: add\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Fiona Jensen\n" +
"sn: Jensen\n" +
"uid: fiona\n" +
"telephonenumber: +1 408 555 1212\n" +
"jpegphoto:< file:" +
FIONA_JPEG_FILE.getAbsolutePath() +
"\n" +
"\n"
+
// Second entry modification : DELETE
"# Delete an existing entry\n" +
"dn: cn=Robert Jensen, ou=Marketing, dc=airius, dc=com\n" +
"changetype: delete\n" +
"\n"
+
// Third entry modification : MODRDN
"# Modify an entry's relative distinguished name\n" +
"dn: cn=Paul Jensen, ou=Product Development, dc=airius, dc=com\n" +
"changetype: modrdn\n" +
"newrdn: cn=Paula Jensen\n" +
"deleteoldrdn: 1\n" +
"\n"
+
// Forth entry modification : MODRDN
"# Rename an entry and move all of its children to a new location in\n" +
"# the directory tree (only implemented by LDAPv3 servers).\n" +
"dn: ou=PD Accountants, ou=Product Development, dc=airius, dc=com\n" +
"changetype: moddn\n" +
"newrdn: ou=Product Development Accountants\n" +
"deleteoldrdn: 0\n" +
"newsuperior: ou=Accounting, dc=airius, dc=com\n" +
"# Modify an entry: add an additional value to the postaladdress\n" +
"# attribute, completely delete the description attribute, replace\n" +
"# the telephonenumber attribute with two values, and delete a specific\n" +
"# value from the facsimiletelephonenumber attribute\n" +
"\n"
+
// Fitfh entry modification : MODIFY
"dn: cn=Paula Jensen, ou=Product Development, dc=airius, dc=com\n" +
"changetype: modify\n" +
"add: postaladdress\n" +
"postaladdress: 123 Anystreet $ Sunnyvale, CA $ 94086\n" +
"-\n" +
"delete: description\n" +
"-\n" +
"replace: telephonenumber\n" +
"telephonenumber: +1 408 555 1234\n" +
"telephonenumber: +1 408 555 5678\n" +
"-\n" +
"delete: facsimiletelephonenumber\n" +
"facsimiletelephonenumber: +1 408 555 9876\n" +
"-\n" +
"\n"
+
// Sixth entry modification : MODIFY
"# Modify an entry: replace the postaladdress attribute with an empty\n" +
"# set of values (which will cause the attribute to be removed), and\n" +
"# delete the entire description attribute. Note that the first will\n" +
"# always succeed, while the second will only succeed if at least\n" +
"# one value for the description attribute is present.\n" +
"dn: cn=Ingrid Jensen, ou=Product Support, dc=airius, dc=com\n" +
"changetype: modify\n" +
"replace: postaladdress\n" +
"-\n" +
"delete: description\n" +
"-\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
String[][][] values =
{
// First entry modification : ADD
{
{ "dn", "cn=Fiona Jensen, ou=Marketing, dc=airius, dc=com" },
{ "objectclass", "top" },
{ "objectclass", "person" },
{ "objectclass", "organizationalPerson" },
{ "cn", "Fiona Jensen" },
{ "sn", "Jensen" },
{ "uid", "fiona" },
{ "telephonenumber", "+1 408 555 1212" },
{ "jpegphoto", "" } },
// Second entry modification : DELETE
{
{ "dn", "cn=Robert Jensen, ou=Marketing, dc=airius, dc=com" } },
// Third entry modification : MODRDN
{
{ "dn", "cn=Paul Jensen, ou=Product Development, dc=airius, dc=com" },
{ "cn=Paula Jensen" } },
// Forth entry modification : MODRDN
{
{ "dn", "ou=PD Accountants, ou=Product Development, dc=airius, dc=com" },
{ "ou=Product Development Accountants" },
{ "ou=Accounting, dc=airius, dc=com" } },
// Fitfh entry modification : MODIFY
{
{ "dn", "cn=Paula Jensen, ou=Product Development, dc=airius, dc=com" },
// add
{ "postaladdress", "123 Anystreet $ Sunnyvale, CA $ 94086" },
// delete
{ "description" },
// replace
{ "telephonenumber", "+1 408 555 1234", "+1 408 555 5678" },
// delete
{ "facsimiletelephonenumber", "+1 408 555 9876" }, },
// Sixth entry modification : MODIFY
{
{ "dn", "cn=Ingrid Jensen, ou=Product Support, dc=airius, dc=com" },
// replace
{ "postaladdress" },
// delete
{ "description" } } };
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isChangeAdd() );
for ( int i = 0; i < values.length; i++ )
{
if ( "dn".equalsIgnoreCase( values[0][i][0] ) )
{
assertEquals( values[0][i][1], entry.getDn().getName() );
}
else if ( "jpegphoto".equalsIgnoreCase( values[0][i][0] ) )
{
Attribute attr = entry.get( values[0][i][0] );
assertEquals( Strings.dumpBytes( data ), Strings.dumpBytes( attr.getBytes() ) );
}
else
{
Attribute attr = entry.get( values[0][i][0] );
if ( attr.contains( values[0][i][1] ) )
{
assertTrue( true );
}
else
{
assertTrue( attr.contains( values[0][i][1].getBytes( StandardCharsets.UTF_8 ) ) );
}
}
}
// Second entry
entry = entries.get( 1 );
assertTrue( entry.isChangeDelete() );
assertEquals( values[1][0][1], entry.getDn().getName() );
// Third entry
entry = entries.get( 2 );
assertTrue( entry.isChangeModRdn() );
assertEquals( values[2][0][1], entry.getDn().getName() );
assertEquals( values[2][1][0], entry.getNewRdn() );
assertTrue( entry.isDeleteOldRdn() );
// Forth entry
entry = entries.get( 3 );
assertTrue( entry.isChangeModDn() );
assertEquals( values[3][0][1], entry.getDn().getName() );
assertEquals( values[3][1][0], entry.getNewRdn() );
assertFalse( entry.isDeleteOldRdn() );
assertEquals( values[3][2][0], entry.getNewSuperior() );
// Fifth entry
entry = entries.get( 4 );
List<Modification> modifs = entry.getModifications();
assertTrue( entry.isChangeModify() );
assertEquals( values[4][0][1], entry.getDn().getName() );
// "add: postaladdress"
// "postaladdress: 123 Anystreet $ Sunnyvale, CA $ 94086"
Modification item = modifs.get( 0 );
assertEquals( ModificationOperation.ADD_ATTRIBUTE, item.getOperation() );
assertEquals( values[4][1][0], item.getAttribute().getId() );
assertTrue( item.getAttribute().contains( values[4][1][1] ) );
// "delete: description\n" +
item = modifs.get( 1 );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, item.getOperation() );
assertEquals( values[4][2][0], item.getAttribute().getId() );
// "replace: telephonenumber"
// "telephonenumber: +1 408 555 1234"
// "telephonenumber: +1 408 555 5678"
item = modifs.get( 2 );
assertEquals( ModificationOperation.REPLACE_ATTRIBUTE, item.getOperation() );
assertEquals( values[4][3][0], item.getAttribute().getUpId() );
assertTrue( item.getAttribute().contains( values[4][3][1], values[4][3][2] ) );
// "delete: facsimiletelephonenumber"
// "facsimiletelephonenumber: +1 408 555 9876"
item = modifs.get( 3 );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, item.getOperation() );
assertEquals( values[4][4][0], item.getAttribute().getId() );
assertTrue( item.getAttribute().contains( values[4][4][1] ) );
// Sixth entry
entry = entries.get( 5 );
modifs = entry.getModifications();
assertTrue( entry.isChangeModify() );
assertEquals( values[5][0][1], entry.getDn().getName() );
// "replace: postaladdress"
item = modifs.get( 0 );
assertEquals( ModificationOperation.REPLACE_ATTRIBUTE, item.getOperation() );
assertEquals( values[5][1][0], item.getAttribute().getId() );
// "delete: description"
item = modifs.get( 1 );
assertEquals( ModificationOperation.REMOVE_ATTRIBUTE, item.getOperation() );
assertEquals( values[5][2][0], item.getAttribute().getId() );
}
@Test
public void testLdifParserRFC2849Sample7() throws Exception, Exception
{
String ldif =
"version: 1\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"control: 1.2.840.113556.1.4.805 true\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
LdifEntry entry = entries.get( 0 );
assertEquals( "ou=Product Development, dc=airius, dc=com", entry.getDn().getName() );
assertTrue( entry.isChangeDelete() );
// Check the control
Control control = entry.getControl( "1.2.840.113556.1.4.805" );
assertEquals( "1.2.840.113556.1.4.805", control.getOid() );
assertTrue( control.isCritical() );
}
@Test
public void testLdifParserRFC2849Sample7NoValueNoCritical() throws Exception, Exception
{
String ldif =
"version: 1\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"control: 1.2.840.113556.1.4.805\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
LdifEntry entry = entries.get( 0 );
assertEquals( "ou=Product Development, dc=airius, dc=com", entry.getDn().getName() );
assertTrue( entry.isChangeDelete() );
// Check the control
Control control = entry.getControl( "1.2.840.113556.1.4.805" );
assertEquals( "1.2.840.113556.1.4.805", control.getOid() );
assertFalse( control.isCritical() );
}
@Test
public void testLdifParserRFC2849Sample7NoCritical() throws Exception, Exception
{
String ldif =
"version: 1\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"control: 1.2.840.113556.1.4.805:control-value\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
LdifEntry entry = entries.get( 0 );
assertEquals( "ou=Product Development, dc=airius, dc=com", entry.getDn().getName() );
assertTrue( entry.isChangeDelete() );
// Check the control
LdifControl control = entry.getControl( "1.2.840.113556.1.4.805" );
assertEquals( "1.2.840.113556.1.4.805", control.getOid() );
assertFalse( control.isCritical() );
assertEquals( "control-value", Strings.utf8ToString( control.getValue() ) );
}
@Test
public void testLdifParserRFC2849Sample7NoOid() throws Exception
{
String ldif =
"version: 1\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"control: true\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception ne )
{
assertTrue( true );
}
finally
{
reader.close();
}
}
@Test
public void testLdifParserRFC2849Sample7BadOid() throws Exception
{
String ldif =
"version: 1\n" +
"# Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n" +
"dn: ou=Product Development, dc=airius, dc=com\n" +
"control: 1.2.840.113A556.1.4.805 true\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception ne )
{
assertTrue( true );
}
finally
{
reader.close();
}
}
@Test
public void testLdifReaderDirServer() throws Exception, Exception
{
String ldif =
"# -------------------------------------------------------------------\n" +
"#\n" +
"# Licensed to the Apache Software Foundation (ASF) under one\n" +
"# or more contributor license agreements. See the NOTICE file\n" +
"# distributed with this work for additional information\n" +
"# regarding copyright ownership. The ASF licenses this file\n" +
"# to you under the Apache License, Version 2.0 (the\n" +
"# \"License\"); you may not use this file except in compliance\n" +
"# with the License. You may obtain a copy of the License at\n" +
"# \n" +
"# https://www.apache.org/licenses/LICENSE-2.0\n" +
"# \n" +
"# Unless required by applicable law or agreed to in writing,\n" +
"# software distributed under the License is distributed on an\n" +
"# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n" +
"# KIND, either express or implied. See the License for the\n" +
"# specific language governing permissions and limitations\n" +
"# under the License. \n" +
"# \n" +
"#\n" +
"# EXAMPLE.COM is freely and reserved for testing according to this RFC:\n" +
"#\n" +
"# http://www.rfc-editor.org/rfc/rfc2606.txt\n" +
"#\n" +
"# -------------------------------------------------------------------\n" +
"\n" +
"dn: ou=Users, dc=example, dc=com\n" +
"objectclass: top\n" +
"objectclass: organizationalunit\n" +
"ou: Users";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
LdifEntry entry = entries.get( 0 );
assertEquals( "ou=Users, dc=example, dc=com", entry.getDn().getName() );
Attribute attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "organizationalunit" ) );
attr = entry.get( "ou" );
assertTrue( attr.contains( "Users" ) );
}
@Test
public void testLdifParserCommentsEmptyLines() throws Exception, Exception
{
String ldif =
"#\n"
+
"# Licensed to the Apache Software Foundation (ASF) under one\n"
+
"# or more contributor license agreements. See the NOTICE file\n"
+
"# distributed with this work for additional information\n"
+
"# regarding copyright ownership. The ASF licenses this file\n"
+
"# to you under the Apache License, Version 2.0 (the\n"
+
"# \"License\"); you may not use this file except in compliance\n"
+
"# with the License. You may obtain a copy of the License at\n"
+
"# \n"
+
"# https://www.apache.org/licenses/LICENSE-2.0\n"
+
"# \n"
+
"# Unless required by applicable law or agreed to in writing,\n"
+
"# software distributed under the License is distributed on an\n"
+
"# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n"
+
"# KIND, either express or implied. See the License for the\n"
+
"# specific language governing permissions and limitations\n"
+
"# under the License. \n"
+
"# \n"
+
"#\n"
+
"#\n"
+
"# EXAMPLE.COM is freely and reserved for testing according to this RFC:\n"
+
"#\n"
+
"# http://www.rfc-editor.org/rfc/rfc2606.txt\n"
+
"#\n"
+
"#\n"
+
"\n"
+
"#\n"
+
"# This ACI allows brouse access to the root suffix and one level below that to anyone.\n"
+
"# At this level there is nothing critical exposed. Everything that matters is one or\n"
+
"# more levels below this.\n"
+
"#\n"
+
"\n"
+
"dn: cn=browseRootAci,dc=example,dc=com\n"
+
"objectClass: top\n"
+
"objectClass: subentry\n"
+
"objectClass: accessControlSubentry\n"
+
"subtreeSpecification: { maximum 1 }\n"
+
"prescriptiveACI: { identificationTag \"browseRoot\", precedence 100, authenticationLevel none, itemOrUserFirst userFirst: { userClasses { allUsers }, userPermissions { { protectedItems {entry}, grantsAndDenials { grantReturnDN, grantBrowse } } } } }\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
LdifEntry entry = entries.get( 0 );
assertEquals( "cn=browseRootAci,dc=example,dc=com", entry.getDn().getName() );
Attribute attr = entry.get( "objectClass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( SchemaConstants.SUBENTRY_OC ) );
assertTrue( attr.contains( "accessControlSubentry" ) );
attr = entry.get( "subtreeSpecification" );
assertTrue( attr.contains( "{ maximum 1 }" ) );
attr = entry.get( "prescriptiveACI" );
assertTrue( attr
.contains( "{ identificationTag \"browseRoot\", precedence 100, authenticationLevel none, itemOrUserFirst userFirst: { userClasses { allUsers }, userPermissions { { protectedItems {entry}, grantsAndDenials { grantReturnDN, grantBrowse } } } } }" ) );
}
@Test
public void testRemoveAttribute() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=Horatio Jensen, ou=Product Testing, dc=airius, dc=com\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Horatio Jensen\n" +
"cn: Horatio N Jensen\n" +
"sn: Jensen\n" +
"uid: hjensen\n" +
"telephonenumber: +1 408 555 1212\n" +
"jpegphoto:< file:" +
HJENSEN_JPEG_FILE.getAbsolutePath() +
"\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
LdifEntry entry = entries.get( 0 );
assertNotNull( entry.get( "uid" ) );
entry.removeAttribute( "uid" );
assertNull( entry.get( "uid" ) );
}
@Test
public void testChangeTypeAdd() throws Exception
{
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: add\n" +
"cn: ATTR1\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry
LdifEntry entry = entries.get( 0 );
assertEquals( "dc=example,dc=com", entry.getDn().getName() );
assertTrue( entry.isLdifChange() );
assertTrue( entry.isChangeAdd() );
assertEquals( 1, entry.getEntry().size() );
Attribute attr = entry.get( "cn" );
assertTrue( attr.contains( "ATTR1" ) );
}
@Test
public void testChangeTypeAddAttrs2Values() throws Exception
{
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: add\n" +
"cn: ATTR1\n" +
"cn: ATTR2\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry
LdifEntry entry = entries.get( 0 );
assertEquals( "dc=example,dc=com", entry.getDn().getName() );
assertTrue( entry.isLdifChange() );
assertTrue( entry.isChangeAdd() );
assertEquals( 1, entry.getEntry().size() );
Attribute attr = entry.get( "cn" );
assertEquals( 2, attr.size() );
assertTrue( attr.contains( "ATTR1" ) );
assertTrue( attr.contains( "ATTR2" ) );
}
@Test
public void testChangeTypeAdd2Attrs2Values() throws Exception
{
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: add\n" +
"cn: ATTR1\n" +
"cn: ATTR2\n" +
"sn: ATTR1\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry
LdifEntry entry = entries.get( 0 );
assertEquals( "dc=example,dc=com", entry.getDn().getName() );
assertTrue( entry.isLdifChange() );
assertTrue( entry.isChangeAdd() );
assertEquals( 2, entry.getEntry().size() );
Attribute attr = entry.get( "cn" );
assertEquals( 2, attr.size() );
assertTrue( attr.contains( "ATTR1" ) );
assertTrue( attr.contains( "ATTR2" ) );
Attribute attr2 = entry.get( "sn" );
assertEquals( 1, attr2.size() );
assertTrue( attr2.contains( "ATTR1" ) );
}
@Test
public void testChangeTypeDelete() throws Exception
{
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry
LdifEntry entry = entries.get( 0 );
assertEquals( "dc=example,dc=com", entry.getDn().getName() );
assertTrue( entry.isLdifChange() );
assertTrue( entry.isChangeDelete() );
}
@Test
public void testLdifChangeDeleteWithControl() throws Exception
{
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"control: 1.1.1\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry
LdifEntry entry = entries.get( 0 );
assertEquals( "dc=example,dc=com", entry.getDn().getName() );
assertTrue( entry.isLdifChange() );
assertTrue( entry.isChangeDelete() );
assertTrue( entry.hasControls() );
assertEquals( 1, entry.getControls().size() );
LdifControl control = entry.getControl( "1.1.1" );
assertEquals( "1.1.1", control.getOid() );
assertFalse( control.isCritical() );
assertNull( control.getValue() );
}
@Test
public void testLdifChangeDeleteWithControls() throws Exception
{
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"control: 1.1.1\n" +
"control: 1.1.2 true\n" +
"control: 1.1.3:ABCDEF\n" +
"control: 1.1.4 true:ABCDEF\n" +
"control: 1.1.5::RW1tYW51ZWwgTMOpY2hhcm55\n" +
"control: 1.1.6 true::RW1tYW51ZWwgTMOpY2hhcm55\n" +
"changetype: delete\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertEquals( 1, entries.size() );
// Entry
LdifEntry entry = entries.get( 0 );
assertEquals( "dc=example,dc=com", entry.getDn().getName() );
assertTrue( entry.isLdifChange() );
assertTrue( entry.isChangeDelete() );
assertTrue( entry.hasControls() );
assertEquals( 6, entry.getControls().size() );
// First control
LdifControl control = entry.getControl( "1.1.1" );
assertEquals( "1.1.1", control.getOid() );
assertFalse( control.isCritical() );
assertNull( control.getValue() );
// Second control
control = entry.getControl( "1.1.2" );
assertEquals( "1.1.2", control.getOid() );
assertTrue( control.isCritical() );
assertNull( control.getValue() );
// Third control
control = entry.getControl( "1.1.3" );
assertEquals( "1.1.3", control.getOid() );
assertFalse( control.isCritical() );
assertEquals( "ABCDEF", Strings.utf8ToString( control.getValue() ) );
// Forth control
control = entry.getControl( "1.1.4" );
assertEquals( "1.1.4", control.getOid() );
assertTrue( control.isCritical() );
assertEquals( "ABCDEF", Strings.utf8ToString( control.getValue() ) );
// Fifth control
control = entry.getControl( "1.1.5" );
assertEquals( "1.1.5", control.getOid() );
assertFalse( control.isCritical() );
assertEquals( "Emmanuel L\u00e9charny", Strings.utf8ToString( control.getValue() ) );
// Sixth control
control = entry.getControl( "1.1.6" );
assertEquals( "1.1.6", control.getOid() );
assertTrue( control.isCritical() );
assertEquals( "Emmanuel L\u00e9charny", Strings.utf8ToString( control.getValue() ) );
}
@Test
public void testChangeTypeDeleteBadEntry() throws Exception
{
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: delete\n" +
"attr1: test";
assertThrows( LdapLdifException.class, ( ) ->
{
try ( LdifReader reader = new LdifReader( schemaManager ) )
{
reader.parseLdif( ldif );
}
} );
}
@Test
public void testLdifContentWithControl() throws Exception
{
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"control: 1.1.1\n" +
"attr1: test";
try ( LdifReader reader = new LdifReader( schemaManager ) )
{
assertThrows( LdapLdifException.class, ( ) ->
{
reader.parseLdif( ldif );
} );
}
}
/**
* Test that we can parse a LDIF with a modify changeType and see if the
* empty attribute and the attribute deletion aren't producing the same Modify entry
* @throws Exception
*/
@Test
public void testLdifParserChangeTypeModifyDeleteEmptyValue() throws Exception
{
// test that mixed case attr ids work at all
String ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: modify\n" +
"delete: userPassword\n" +
"-\n" +
"\n" +
"dn: dc=example,dc=com\n" +
"changetype: modify\n" +
"delete: userPassword\n" +
"userPassword:\n" +
"-";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
LdifEntry entry1 = entries.get( 0 );
Modification modification = entry1.getModifications().get( 0 );
assertEquals( 0, modification.getAttribute().size() );
assertNull( modification.getAttribute().get() );
LdifEntry entry2 = entries.get( 1 );
modification = entry2.getModifications().get( 0 );
assertEquals( 1, modification.getAttribute().size() );
assertNotNull( modification.getAttribute().get() );
assertNull( modification.getAttribute().getBytes() );
}
/**
* Test lengths when multiple entries are present
*
* @throws Exception
*/
@Test
public void testLdifParserLengthAndOffset() throws Exception
{
String ldif1 = "dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"dependencies:\n" +
"envVars:\n";
String comment = "# This comment was copied. Delete an entry. The operation will attach the LDAPv3\n" +
"# Tree Delete Control defined in [9]. The criticality\n" +
"# field is \"true\" and the controlValue field is\n" +
"# absent, as required by [9].\n";
String version = "version: 1\n";
String ldif =
version +
ldif1 +
"\n" +
comment +
ldif1 + "\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> lstEntries = null;
try
{
lstEntries = reader.parseLdif( ldif );
}
catch ( Exception ne )
{
fail();
}
finally
{
reader.close();
}
LdifEntry entry1 = lstEntries.get( 0 );
assertEquals( version.length() + ldif1.length(), entry1.getLengthBeforeParsing() );
LdifEntry entry2 = lstEntries.get( 1 );
assertEquals( ldif1.length() + comment.length(), entry2.getLengthBeforeParsing() );
byte[] data = Strings.getBytesUtf8( ldif );
String ldif1Bytes = new String( data, ( int ) entry1.getOffset(), entry1.getLengthBeforeParsing(),
StandardCharsets.UTF_8 );
assertNotNull( reader.parseLdif( ldif1Bytes ).get( 0 ) );
String ldif2Bytes = new String( data, ( int ) entry2.getOffset(), entry2.getLengthBeforeParsing(),
StandardCharsets.UTF_8 );
assertNotNull( reader.parseLdif( ldif2Bytes ).get( 0 ) );
File file = File.createTempFile( "offsetTest", "ldif" );
file.deleteOnExit();
OutputStreamWriter writer = new OutputStreamWriter( new FileOutputStream( file ), Charset.defaultCharset() );
writer.write( ldif );
writer.close();
RandomAccessFile raf = new RandomAccessFile( file, "r" );
LdifReader ldifReader = new LdifReader( file );
LdifEntry rafEntry1 = ldifReader.next();
data = new byte[rafEntry1.getLengthBeforeParsing()];
raf.read( data, ( int ) rafEntry1.getOffset(), data.length );
reader = new LdifReader( schemaManager );
LdifEntry reReadeRafEntry1 = reader.parseLdif( new String( data, Charset.defaultCharset() ) ).get( 0 );
assertNotNull( reReadeRafEntry1 );
assertEquals( rafEntry1.getOffset(), reReadeRafEntry1.getOffset() );
assertEquals( rafEntry1.getLengthBeforeParsing(), reReadeRafEntry1.getLengthBeforeParsing() );
reader.close();
LdifEntry rafEntry2 = ldifReader.next();
data = new byte[rafEntry2.getLengthBeforeParsing()];
raf.readFully( data, 0, data.length );
reader = new LdifReader( schemaManager );
LdifEntry reReadeRafEntry2 = reader.parseLdif( new String( data, Charset.defaultCharset() ) ).get( 0 );
assertNotNull( reReadeRafEntry2 );
assertEquals( rafEntry2.getLengthBeforeParsing(), reReadeRafEntry2.getLengthBeforeParsing() );
reader.close();
ldifReader.close();
raf.close();
}
@Test
// for DIRAPI-174
public void testLineNumber() throws Exception
{
String ldif =
"versionN: 1\n" + // wrong tag name 'versionN'
"dn: dc=example,dc=com\n" +
"changetype: delete\n" +
"attr1: test";
try ( LdifReader reader = new LdifReader( schemaManager ) )
{
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception e )
{
}
assertEquals( 1, reader.getLineNumber() );
}
ldif =
"version: 1\n" +
"d n: dc=example,dc=com\n" + // wrong name "d n"
"changetype: delete\n" +
"attr1: test";
try ( LdifReader reader = new LdifReader( schemaManager ) )
{
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception e )
{
}
assertEquals( 2, reader.getLineNumber() );
}
// wrong changetype
ldif =
"version: 1\n" +
"dn: dc=example,dc=com\n" +
"changetype: delete\n" +
"attr1: test";
try ( LdifReader reader = new LdifReader( schemaManager ) )
{
try
{
reader.parseLdif( ldif );
fail();
}
catch ( Exception e )
{
}
assertEquals( 4, reader.getLineNumber() );
}
ldif =
"version: 1\n" +
"dn: cn=app1,ou=applications,ou=conf,dc=apache,dc=org\n" +
"cn: app1\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"dependencies:\n" +
"envVars:\n\n" + // watch out the extra newline while counting
"d n: cn=app2,ou=applications,ou=conf,dc=apache,dc=org\n" + // wrong start
"cn: app2\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app2 \n" +
"dependencies:\n" +
"envVars:";
try ( LdifReader reader = new LdifReader( schemaManager ) )
{
try
{
reader.parseLdif( ldif );
fail( "shouldn't be parsed" );
}
catch ( Exception e )
{
}
assertEquals( 10, reader.getLineNumber() );
}
}
@Test
public void testLdifParserRootDSE() throws Exception
{
String ldif =
"version: 1\n" +
"dn:\n" +
"cn:: YXBwMQ==\n" +
"objectClass: top\n" +
"objectClass: apApplication\n" +
"displayName: app1 \n" +
"userPassword: test";
try ( LdifReader reader = new LdifReader( schemaManager ) )
{
List<LdifEntry> entries = reader.parseLdif( ldif );
assertNotNull( entries );
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "", entry.getDn().getName() );
Attribute attr = entry.get( "cn" );
if ( attr.isHumanReadable() )
{
String cn = attr.getString();
}
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "apApplication" ) );
attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "userPassword" );
assertEquals( "test", attr.get().getString() );
}
}
/**
* Test a LDIF generated by a request with 1.1
*/
@Test
public void testLdifParserNoAttribute() throws Exception
{
String ldif =
"version: 1\n" +
"dn: cn=test1\n" +
"\n" +
"dn: cn=test2\n" +
"\n" +
"dn: cn=test3";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
reader.close();
assertNotNull( entries );
// Check test 1
LdifEntry entry = entries.get( 0 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=test1", entry.getDn().getName() );
assertEquals( 0, entry.size() );
// Check test 2
entry = entries.get( 1 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=test2", entry.getDn().getName() );
assertEquals( 0, entry.size() );
// Check test 3
entry = entries.get( 2 );
assertTrue( entry.isLdifContent() );
assertEquals( "cn=test3", entry.getDn().getName() );
assertEquals( 0, entry.size() );
}
@Test
public void testLdifParserWithUnderscoresAT() throws Exception, Exception
{
String ldif =
"version: 1\n" +
"# Add a new entry\n" +
"dn: cn=Fiona Jensen, ou=Marketing, dc=airius, dc=com\n" +
"changetype: add\n" +
"objectclass: top\n" +
"objectclass: person\n" +
"objectclass: organizationalPerson\n" +
"cn: Fiona Jensen\n" +
"sn: Jensen\n" +
"uid: fiona\n" +
"telephonenumber: +1 408 555 1212\n" +
"An_idiot_Attribute: thanks M$ for that";
LdifReader reader = new LdifReader( schemaManager );
schemaManager.setRelaxed();
List<LdifEntry> entries = reader.parseLdif( ldif );
LdifEntry entry = entries.get( 0 );
assertEquals( entry.get( "An_idiot_Attribute" ).getString(), "thanks M$ for that" );
reader.close();
}
@Test
public void testLdifParserWithMixedATHR() throws Exception, Exception
{
String ldif =
"version: 1\n" +
"# Add a new entry\n" +
"dn: cn=DeviceTypes,cn=SDT,cn=prod_81,o=myconfiguration\n" +
"cn: DeviceTypes\n" +
"javaClassName: java.lang.String\n" +
"description: P:Phone (except BlackBerry)\n" +
"description:: WjpCbGFja0JlcnJ5w4LCrg==\n" +
"description: 3:Internet only device\n" +
"objectClass: top\n" +
"objectClass: javaobject\n" +
"objectClass: myconfigstringvaluedobject\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
LdifEntry entry = entries.get( 0 );
// Check that the myconfigstringvalue contains 3 values
assertEquals( 3, entry.get( "description" ).size() );
assertTrue( entry.get( "description" ).isHumanReadable() );
reader.close();
}
@Test
public void testLdifParserWithMixedATBinary() throws Exception, Exception
{
String ldif =
"version: 1\n" +
"# Add a new entry\n" +
"dn: cn=DeviceTypes,cn=SDT,cn=prod_81,o=myconfiguration\n" +
"cn: DeviceTypes\n" +
"javaClassName: java.lang.String\n" +
"description:: WjpCbGFja0JlcnJ5w4LCrg==\n" +
"description: P:Phone (except BlackBerry)\n" +
"description: 3:Internet only device\n" +
"objectClass: top\n" +
"objectClass: javaobject\n" +
"objectClass: myconfigstringvaluedobject\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
LdifEntry entry = entries.get( 0 );
// Check that the myconfigstringvalue contains 3 values
assertEquals( 3, entry.get( "description" ).size() );
assertTrue( entry.get( "description" ).isHumanReadable() );
reader.close();
}
@Test
public void testLdifParserWithReplaceEmptyValue() throws Exception, Exception
{
String ldif =
"dn: cn=Steven Nguyen,ou=SAP,dc=sap,dc=local\n" +
"changetype: modify\n" +
"replace: objectClass\n" +
"objectClass: top\n" +
"objectClass: user\n" +
"objectClass: person\n" +
"objectClass: organizationalPerson\n" +
"-\n" +
"replace: userPassword\n" +
"userPassword:: dGVzdA==\n" +
"-\n" +
"replace: javaSerializedData\n" +
"-\n";
LdifReader reader = new LdifReader( schemaManager );
List<LdifEntry> entries = reader.parseLdif( ldif );
LdifEntry entry = entries.get( 0 );
assertEquals( ldif, entry.toString() );
reader.close();
}
@Test
public void testLdifParserWithNullDn() throws Exception, Exception
{
String ldif1 =
"dn: ads-authenticatorid=anonymousauthenticator,ou=authenticators,ads-interceptorId=authenticationInterceptor,ou=interceptors,ads-directoryServiceId=default,ou=config\n" +
"ads-authenticatorid: anonymousauthenticator\n" +
"objectclass: top\n" +
"objectclass: ads-base\n" +
"objectClass: ads-authenticator\n" +
"objectClass: ads-authenticatorImpl\n" +
"ads-authenticatorClass: org.apache.directory.server.core.authn.AnonymousAuthenticator\n" +
"ads-baseDn: \n" +
"ads-enabled: TRUE";
String ldif2 =
"dn: ads-authenticatorid=anonymousauthenticator,ou=authenticators,ads-interceptorId=authenticationInterceptor,ou=interceptors,ads-directoryServiceId=default,ou=config\n" +
"ads-authenticatorid: anonymousauthenticator\n" +
"objectclass: top\n" +
"objectclass: ads-base\n" +
"objectClass: ads-authenticator\n" +
"objectClass: ads-authenticatorImpl\n" +
"ads-authenticatorClass: org.apache.directory.server.core.authn.AnonymousAuthenticator\n" +
"ads-baseDn:\n" +
"ads-enabled: TRUE";
try ( LdifReader reader = new LdifReader( schemaManager ) )
{
List<LdifEntry> entries1 = reader.parseLdif( ldif1 );
LdifEntry entry1 = entries1.get( 0 );
List<LdifEntry> entries2 = reader.parseLdif( ldif2 );
LdifEntry entry2 = entries2.get( 0 );
assertEquals( entry1, entry2 );
}
}
}