blob: c4bd98e55e1416c93d6987a474297b8a662693f7 [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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.api.ldap.model.ldif;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
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.Entry;
import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException;
import org.apache.directory.api.ldap.model.ldif.LdapLdifException;
import org.apache.directory.api.ldap.model.ldif.LdifAttributesReader;
import org.apache.directory.api.util.Strings;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import com.mycila.junit.concurrent.Concurrency;
import com.mycila.junit.concurrent.ConcurrentJunitRunner;
/**
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@RunWith(ConcurrentJunitRunner.class)
@Concurrency()
public class LdifAttributesReaderTest
{
/** Uses a temporary folder rule */
@Rule
public TemporaryFolder tmpFolder= new TemporaryFolder();
private byte[] data;
private File HJENSEN_JPEG_FILE = null;
private File createFile( String name, byte[] data ) throws IOException
{
File jpeg = tmpFolder.newFile( name + ".jpg" );
DataOutputStream os = new DataOutputStream( new FileOutputStream( jpeg ) );
os.write( data );
os.close();
return jpeg;
}
/**
* Create a file to be used by ":<" values
*/
@Before
public 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 );
}
@Test
public void testLdifNull() throws LdapLdifException
{
String ldif = null;
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertEquals( 0, entry.size() );
}
@Test
public void testLdifEmpty() throws LdapLdifException
{
String ldif = "";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertEquals( 0, entry.size() );
}
@Test
public void testLdifEmptyLines() throws LdapLdifException
{
String ldif = "\n\n\r\r\n";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertNull( entry );
}
@Test
public void testLdifComments() throws LdapLdifException
{
String ldif =
"#Comment 1\r"
+ "#\r"
+ " th\n"
+ " is is still a comment\n"
+ "\n";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertNull( entry );
}
@Test
public void testLdifVersionStart() throws LdapLdifException
{
String ldif =
"cn: app1\n"
+ "objectClass: top\n"
+ "objectClass: apApplication\n"
+ "displayName: app1 \n"
+ "dependencies:\n"
+ "envVars:";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertEquals( 1, reader.getVersion() );
assertNotNull( entry );
Attribute attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
}
/**
* Spaces at the end of values should not be included into values.
*
* @throws NamingException
*/
@Test
public void testLdifParserEndSpaces() throws LdapLdifException
{
String ldif =
"cn: app1\n"
+ "objectClass: top\n"
+ "objectClass: apApplication\n"
+ "displayName: app1 \n"
+ "dependencies:\n"
+ "envVars:";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertNotNull( entry );
Attribute attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
}
@Test
public void testLdifParser() throws LdapLdifException, LdapInvalidAttributeValueException
{
String ldif =
"cn: app1\n"
+ "objectClass: top\n"
+ "objectClass: apApplication\n"
+ "displayName: app1 \n"
+ "dependencies:\n"
+ "envVars:";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertNotNull( entry );
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( "dependencies" );
assertNull( attr.get().getValue() );
attr = entry.get( "envvars" );
assertNull( attr.get().getValue() );
}
@Test
public void testLdifParserMuiltiLineComments() throws LdapLdifException
{
String ldif =
"#comment\n"
+ " still a comment\n"
+ "cn: app1#another comment\n"
+ "objectClass: top\n"
+ "objectClass: apApplication\n"
+ "displayName: app1\n"
+ "serviceType: http\n"
+ "dependencies:\n"
+ "httpHeaders:\n"
+ "startupOptions:\n"
+ "envVars:";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertNotNull( entry );
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( "dependencies" );
assertNull( attr.get().getValue() );
attr = entry.get( "envvars" );
assertNull( attr.get().getValue() );
}
@Test
public void testLdifParserMultiLineEntries() throws LdapLdifException
{
String ldif =
"#comment\n"
+ "cn: app1#another comment\n"
+ "objectClass: top\n"
+ "objectClass: apAppli\n"
+ " cation\n"
+ "displayName: app1\n"
+ "serviceType: http\n"
+ "dependencies:\n"
+ "httpHeaders:\n"
+ "startupOptions:\n"
+ "envVars:";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertNotNull( entry );
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( "dependencies" );
assertNull( attr.get().getValue() );
attr = entry.get( "envvars" );
assertNull( attr.get().getValue() );
}
@Test
public void testLdifParserBase64() throws LdapLdifException, UnsupportedEncodingException
{
String ldif =
"#comment\n"
+ "cn:: RW1tYW51ZWwgTMOpY2hhcm55\n"
+ "objectClass: top\n"
+ "objectClass: apApplication\n"
+ "displayName: app1\n"
+ "serviceType: http\n"
+ "dependencies:\n"
+ "httpHeaders:\n"
+ "startupOptions:\n"
+ "envVars:";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertNotNull( entry );
Attribute attr = entry.get( "cn" );
assertTrue( attr.contains( "Emmanuel L\u00e9charny".getBytes( "UTF-8" ) ) );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "apApplication" ) );
attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "dependencies" );
assertNull( attr.get().getValue() );
attr = entry.get( "envvars" );
assertNull( attr.get().getValue() );
}
@Test
public void testLdifParserBase64MultiLine() throws LdapLdifException, UnsupportedEncodingException
{
String ldif =
"#comment\n"
+ "cn:: RW1tYW51ZWwg\n"
+ " TMOpY2hhcm55ICA=\n"
+ "objectClass: top\n"
+ "objectClass: apApplication\n"
+ "displayName: app1\n"
+ "serviceType: http\n"
+ "dependencies:\n"
+ "httpHeaders:\n"
+ "startupOptions:\n"
+ "envVars:";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
assertNotNull( entry );
Attribute attr = entry.get( "cn" );
assertTrue( attr.contains( "Emmanuel L\u00e9charny ".getBytes( "UTF-8" ) ) );
attr = entry.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "apApplication" ) );
attr = entry.get( "displayname" );
assertTrue( attr.contains( "app1" ) );
attr = entry.get( "dependencies" );
assertNull( attr.get().getValue() );
attr = entry.get( "envvars" );
assertNull( attr.get().getValue() );
}
@Test
public void testLdifParserRFC2849Sample1() throws LdapLdifException
{
String ldif =
"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";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
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." ) );
}
@Test
public void testLdifParserRFC2849Sample2() throws LdapLdifException
{
String ldif =
"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";
LdifAttributesReader reader = new LdifAttributesReader();
Entry entry = reader.parseEntry( ldif );
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 LdapLdifException, Exception
{
String ldif =
"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";
LdifAttributesReader reader = new LdifAttributesReader();
Attributes attributes = reader.parseAttributes( ldif );
javax.naming.directory.Attribute attr = attributes.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "person" ) );
assertTrue( attr.contains( "organizationalPerson" ) );
attr = attributes.get( "cn" );
assertTrue( attr.contains( "Gern Jensen" ) );
assertTrue( attr.contains( "Gern O Jensen" ) );
attr = attributes.get( "sn" );
assertTrue( attr.contains( "Jensen" ) );
attr = attributes.get( "uid" );
assertTrue( attr.contains( "gernj" ) );
attr = attributes.get( "telephonenumber" );
assertTrue( attr.contains( "+1 408 555 1212" ) );
attr = attributes.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."
.getBytes( "UTF-8" ) ) );
}
@Test
public void testLdifParserRFC2849Sample3VariousSpacing() throws LdapLdifException, Exception
{
String ldif =
"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 ";
LdifAttributesReader reader = new LdifAttributesReader();
Attributes attributes = reader.parseAttributes( ldif );
javax.naming.directory.Attribute attr = attributes.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "person" ) );
assertTrue( attr.contains( "organizationalPerson" ) );
attr = attributes.get( "cn" );
assertTrue( attr.contains( "Gern Jensen" ) );
assertTrue( attr.contains( "Gern O Jensen" ) );
attr = attributes.get( "sn" );
assertTrue( attr.contains( "Jensen" ) );
attr = attributes.get( "uid" );
assertTrue( attr.contains( "gernj" ) );
attr = attributes.get( "telephonenumber" );
assertTrue( attr.contains( "+1 408 555 1212" ) );
attr = attributes.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."
.getBytes( "UTF-8" ) ) );
}
@Test
public void testLdifParserRFC2849Sample4() throws NamingException, Exception
{
String ldif =
"# 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";
LdifAttributesReader reader = new LdifAttributesReader();
Attributes attributes = reader.parseAttributes( ldif );
String[][] values =
{
{ "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" } };
for ( int j = 0; j < values.length; j++ )
{
javax.naming.directory.Attribute attr = attributes.get( values[j][0] );
if ( attr.contains( values[j][1] ) )
{
assertTrue( true );
}
else
{
assertTrue( attr.contains( values[j][1].getBytes( "UTF-8" ) ) );
}
}
}
@Test
public void testLdifParserRFC2849Sample5() throws NamingException, Exception
{
String ldif =
"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";
LdifAttributesReader reader = new LdifAttributesReader();
Attributes attributes = reader.parseAttributes( ldif );
String[][] values =
{
{ "objectclass", "top" },
{ "objectclass", "person" },
{ "objectclass", "organizationalPerson" },
{ "cn", "Horatio Jensen" },
{ "cn", "Horatio N Jensen" },
{ "sn", "Jensen" },
{ "uid", "hjensen" },
{ "telephonenumber", "+1 408 555 1212" },
{ "jpegphoto", null } };
for ( int i = 0; i < values.length; i++ )
{
if ( "jpegphoto".equalsIgnoreCase( values[i][0] ) )
{
javax.naming.directory.Attribute attr = attributes.get( values[i][0] );
assertEquals( Strings.dumpBytes( data ), Strings.dumpBytes( ( byte[] ) attr.get() ) );
}
else
{
javax.naming.directory.Attribute attr = attributes.get( values[i][0] );
if ( attr.contains( values[i][1] ) )
{
assertTrue( true );
}
else
{
assertTrue( attr.contains( values[i][1].getBytes( "UTF-8" ) ) );
}
}
}
}
@Test
public void testLdifParserRFC2849Sample5WithSizeLimit() throws Exception
{
String ldif =
"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";
LdifAttributesReader reader = new LdifAttributesReader();
reader.setSizeLimit( 128 );
try
{
reader.parseEntry( ldif );
fail();
}
catch ( LdapLdifException ne )
{
assertTrue( I18n.err( I18n.ERR_12009_ERROR_PARSING_LDIF_BUFFER ), ne.getMessage().startsWith(
I18n.ERR_12009_ERROR_PARSING_LDIF_BUFFER.getErrorCode() ) );
}
}
@Test
public void testLdifAttributesReaderDirServer() throws NamingException, 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"
+ "# http://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"
+ "objectclass: top\n"
+ "objectclass: organizationalunit\n"
+ "ou: Users";
LdifAttributesReader reader = new LdifAttributesReader();
Attributes attributes = reader.parseAttributes( ldif );
javax.naming.directory.Attribute attr = attributes.get( "objectclass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( "organizationalunit" ) );
attr = attributes.get( "ou" );
assertTrue( attr.contains( "Users" ) );
}
@Test
public void testLdifParserCommentsEmptyLines() throws NamingException, 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"
+ "# http://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"
+ "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";
LdifAttributesReader reader = new LdifAttributesReader();
Attributes attributes = reader.parseAttributes( ldif );
javax.naming.directory.Attribute attr = attributes.get( "objectClass" );
assertTrue( attr.contains( "top" ) );
assertTrue( attr.contains( SchemaConstants.SUBENTRY_OC ) );
assertTrue( attr.contains( "accessControlSubentry" ) );
attr = attributes.get( "subtreeSpecification" );
assertTrue( attr.contains( "{ maximum 1 }" ) );
attr = attributes.get( "prescriptiveACI" );
assertTrue( attr
.contains( "{ identificationTag \"browseRoot\", precedence 100, authenticationLevel none, itemOrUserFirst userFirst: { userClasses { allUsers }, userPermissions { { protectedItems {entry}, grantsAndDenials { grantReturnDN, grantBrowse } } } } }" ) );
}
}