blob: a1b88203f8c9c14b264ab9de7a80c17fcf70ede9 [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.server.operations.add;
import static org.apache.directory.server.integ.ServerIntegrationUtils.getAdminConnection;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.apache.directory.api.ldap.model.constants.SchemaConstants;
import org.apache.directory.api.ldap.model.cursor.EntryCursor;
import org.apache.directory.api.ldap.model.entry.Attribute;
import org.apache.directory.api.ldap.model.entry.DefaultEntry;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.message.SearchScope;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.ldap.client.api.LdapConnection;
import org.apache.directory.server.annotations.CreateLdapServer;
import org.apache.directory.server.annotations.CreateTransport;
import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
import org.apache.directory.server.core.integ.FrameworkRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Test case to demonstrate DIRSERVER-631 ("Creation of entry with special (and
* escaped) character in Rdn leads to wrong attribute value").
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
@RunWith(FrameworkRunner.class)
@CreateLdapServer(transports =
{ @CreateTransport(protocol = "LDAP") })
public class AddingEntriesWithSpecialCharactersInRDNIT extends AbstractLdapTestUnit
{
private Entry getPersonEntry( String sn, String cn ) throws LdapException
{
Entry entry = new DefaultEntry();
entry.add( SchemaConstants.OBJECT_CLASS_AT, "person" );
entry.add( SchemaConstants.CN_AT, cn );
entry.add( SchemaConstants.SN_AT, sn );
return entry;
}
private Entry getOrgUnitEntry( String ou ) throws LdapException
{
Entry entry = new DefaultEntry();
entry.add( SchemaConstants.OBJECT_CLASS_AT, "organizationalUnit" );
entry.add( SchemaConstants.OU_AT, ou );
return entry;
}
/**
* adding an entry with hash sign (#) in Rdn.
*
* @throws Exception
*/
@Test
public void testAddingWithHashRdn() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
Entry personEntry = getPersonEntry( "Bush", "Kate#Bush" );
String dn = "cn=Kate\\#Bush,ou=system";
personEntry.setDn( new Dn( dn ) );
connection.add( personEntry );
EntryCursor cursor = connection.search( "ou=system", "(cn=Kate#Bush)", SearchScope.SUBTREE, "*" );
boolean entryFound = false;
while ( cursor.next() )
{
Entry entry = cursor.get();
entryFound = true;
assertTrue( personEntry.getDn().equals( entry.getDn() ) );
Attribute cn = entry.get( "cn" );
assertNotNull( cn );
assertTrue( cn.contains( "Kate#Bush" ) );
}
cursor.close();
assertTrue( "entry found", entryFound );
connection.delete( dn );
connection.close();
}
/**
* adding an entry with comma sign (,) in Rdn.
*
* @throws Exception
*/
@Test
public void testAddingWithCommaInRdn() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
Entry entry = getPersonEntry( "Bush", "Bush, Kate" );
String dn = "cn=Bush\\, Kate,ou=system";
entry.setDn( new Dn( dn ) );
connection.add( entry );
EntryCursor cursor = connection.search( "ou=system", "(cn=Bush, Kate)", SearchScope.SUBTREE, "*" );
boolean entryFound = false;
while ( cursor.next() )
{
Entry sr = cursor.get();
entryFound = true;
assertTrue( entry.getDn().equals( sr.getDn() ) );
Attribute cn = sr.get( "cn" );
assertNotNull( cn );
assertTrue( cn.contains( "Bush, Kate" ) );
}
cursor.close();
assertTrue( "entry found", entryFound );
connection.delete( dn );
connection.close();
}
/**
* adding an entry with quotes (") in Rdn.
*/
@Test
public void testAddingWithQuotesInRdn() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
Entry entry = getPersonEntry( "Messer", "Mackie \"The Knife\" Messer" );
String dn = "cn=Mackie \\\"The Knife\\\" Messer,ou=system";
entry.setDn( new Dn( dn ) );
connection.add( entry );
EntryCursor cursor = connection.search( "ou=system", "(cn=Mackie \"The Knife\" Messer)",
SearchScope.SUBTREE, "*" );
boolean entryFound = false;
while ( cursor.next() )
{
Entry sr = cursor.get();
entryFound = true;
assertTrue( entry.getDn().equals( sr.getDn() ) );
Attribute cn = sr.get( "cn" );
assertNotNull( cn );
assertTrue( cn.contains( "Mackie \"The Knife\" Messer" ) );
}
cursor.close();
assertTrue( "entry found", entryFound );
connection.delete( dn );
connection.close();
}
/**
* adding an entry with backslash (\) in Rdn.
*/
@Test
public void testAddingWithBackslashInRdn() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
Entry entry = getOrgUnitEntry( "AC\\DC" );
String dn = "ou=AC\\\\DC,ou=system";
entry.setDn( new Dn( dn ) );
connection.add( entry );
EntryCursor cursor = connection.search( "ou=system", "(ou=AC\\5CDC)", SearchScope.SUBTREE, "*" );
boolean entryFound = false;
while ( cursor.next() )
{
Entry sr = cursor.get();
entryFound = true;
assertTrue( entry.getDn().equals( sr.getDn() ) );
Attribute ou = sr.get( "ou" );
assertNotNull( ou );
assertTrue( ou.contains( "AC\\DC" ) );
}
cursor.close();
assertTrue( "no entry found", entryFound );
connection.delete( dn );
connection.close();
}
/**
* adding an entry with greater sign (>) in Rdn.
*
* @throws Exception
*/
@Test
public void testAddingWithGreaterSignInRdn() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
Entry entry = getOrgUnitEntry( "East -> West" );
String dn = "ou=East -\\> West,ou=system";
entry.setDn( new Dn( dn ) );
connection.add( entry );
EntryCursor cursor = connection
.search( "ou=system", "(ou=East -> West)", SearchScope.SUBTREE, "*" );
boolean entryFound = false;
while ( cursor.next() )
{
Entry sr = cursor.get();
entryFound = true;
assertTrue( entry.getDn().equals( sr.getDn() ) );
Attribute ou = sr.get( "ou" );
assertNotNull( ou );
assertTrue( ou.contains( "East -> West" ) );
}
cursor.close();
assertTrue( "entry found", entryFound );
connection.delete( dn );
connection.close();
}
/**
* adding an entry with less sign (<) in Rdn.
*
* @throws Exception
*/
@Test
public void testAddingWithLessSignInRdn() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
Entry entry = getOrgUnitEntry( "Scissors 8<" );
String dn = "ou=Scissors 8\\<,ou=system";
entry.setDn( new Dn( dn ) );
connection.add( entry );
EntryCursor cursor = connection.search( "ou=system", "(ou=Scissors 8<)", SearchScope.SUBTREE, "*" );
boolean entryFound = false;
while ( cursor.next() )
{
Entry sr = cursor.get();
entryFound = true;
assertTrue( entry.getDn().equals( sr.getDn() ) );
Attribute ou = sr.get( "ou" );
assertNotNull( ou );
assertTrue( ou.contains( "Scissors 8<" ) );
}
cursor.close();
assertTrue( "entry found", entryFound );
connection.delete( dn );
connection.close();
}
/**
* adding an entry with semicolon (;) in Rdn.
*
* @throws Exception
*/
@Test
public void testAddingWithSemicolonInRdn() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
Entry entry = getOrgUnitEntry( "semicolon group;" );
String dn = "ou=semicolon group\\;,ou=system";
entry.setDn( new Dn( dn ) );
connection.add( entry );
EntryCursor cursor = connection.search( "ou=system", "(ou=semicolon group;)", SearchScope.SUBTREE,
"*" );
boolean entryFound = false;
while ( cursor.next() )
{
Entry sr = cursor.get();
entryFound = true;
assertTrue( entry.getDn().equals( sr.getDn() ) );
Attribute ou = sr.get( "ou" );
assertNotNull( ou );
assertTrue( ou.contains( "semicolon group;" ) );
}
cursor.close();
assertTrue( "entry found", entryFound );
connection.delete( dn );
connection.close();
}
/**
* adding an entry with equals sign (=) in Rdn.
*
* @throws Exception
*/
@Test
public void testAddingWithEqualsInRdn() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
Entry entry = getOrgUnitEntry( "nomen=omen" );
String dn = "ou=nomen\\=omen,ou=system";
entry.setDn( new Dn( dn ) );
connection.add( entry );
EntryCursor cursor = connection.search( "ou=system", "(ou=nomen=omen)", SearchScope.SUBTREE, "*" );
boolean entryFound = false;
while ( cursor.next() )
{
Entry sr = cursor.get();
entryFound = true;
assertTrue( entry.getDn().equals( sr.getDn() ) );
Attribute ou = sr.get( "ou" );
assertNotNull( ou );
assertTrue( ou.contains( "nomen=omen" ) );
}
cursor.close();
assertTrue( "entry found", entryFound );
connection.delete( dn );
connection.close();
}
@Test
public void testAddRdnWithEscapedSpaces() throws Exception
{
LdapConnection connection = getAdminConnection( getLdapServer() );
connection.setTimeOut( -1 );
Entry entry = new DefaultEntry(
"cn=\\ User, ou=system",
"objectClass: top",
"objectClass: person",
"objectClass: organizationalPerson",
"objectClass: inetOrgPerson",
"cn: User",
"sn: Name " );
connection.add( entry );
Entry addedEntry = connection.lookup( "cn=\\ User, ou=system" );
assertNotNull( addedEntry );
assertEquals( "Name", addedEntry.get( "sn" ).getString() );
assertEquals( "User", addedEntry.get( "cn" ).getString() );
assertEquals( 1, addedEntry.get( "cn" ).size() );
assertTrue( addedEntry.contains( "cn", "User" ) );
assertFalse( addedEntry.contains( "cn", " User" ) );
}
}