From commits-return-20231-apmail-directory-commits-archive=directory.apache.org@directory.apache.org Mon Nov 10 18:38:32 2008 Return-Path: Delivered-To: apmail-directory-commits-archive@www.apache.org Received: (qmail 60999 invoked from network); 10 Nov 2008 18:38:32 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 10 Nov 2008 18:38:32 -0000 Received: (qmail 92755 invoked by uid 500); 10 Nov 2008 18:38:39 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 92718 invoked by uid 500); 10 Nov 2008 18:38:39 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 92709 invoked by uid 99); 10 Nov 2008 18:38:39 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 10 Nov 2008 10:38:39 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 10 Nov 2008 18:37:28 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 08F142388999; Mon, 10 Nov 2008 10:37:41 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r712718 - in /directory: apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/search/ apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/ apacheds/trunk/server-integ/src/test/java... Date: Mon, 10 Nov 2008 18:37:39 -0000 To: commits@directory.apache.org From: seelmann@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20081110183741.08F142388999@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: seelmann Date: Mon Nov 10 10:37:37 2008 New Revision: 712718 URL: http://svn.apache.org/viewvc?rev=712718&view=rev Log: DIRSERVER-1287: o Usage of Pattern.quote() when composing regular expression for substring search o Interim fix in NormalizingVisitor.decodeEscapedHex() to make a filters like (cn=\5C) working o Fixed test in AndCursurTest o Added some tests Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/search/SearchIT.java directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java directory/apacheds/trunk/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/StringTools.java directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/StringToolsTest.java Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/search/SearchIT.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/search/SearchIT.java?rev=712718&r1=712717&r2=712718&view=diff ============================================================================== --- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/search/SearchIT.java (original) +++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/operations/search/SearchIT.java Mon Nov 10 10:37:37 2008 @@ -1256,7 +1256,7 @@ assertFalse( results.contains( "cn=testGroup4,ou=groups,ou=system" ) ); assertTrue( results.contains( "cn=testGroup5,ou=groups,ou=system" ) ); } - + @Test public void testSearchWithEscapedCharsInFilter() throws Exception @@ -1271,28 +1271,30 @@ vicious.put( ocls ); vicious.put( "cn", "Sid Vicious" ); vicious.put( "sn", "Vicious" ); - vicious.put( "description", "(sex pistols)" ); + vicious.put( "description", "(sex*pis\\tols)" ); DirContext ctx = sysRoot.createSubcontext( "cn=Sid Vicious", vicious ); assertNotNull( ctx ); ctx = ( DirContext ) sysRoot.lookup( "cn=Sid Vicious" ); assertNotNull( ctx ); - + Attributes attributes = ctx.getAttributes( "" ); - - assertEquals( "(sex pistols)", attributes.get( "description" ).get() ); + + assertEquals( "(sex*pis\\tols)", attributes.get( "description" ).get() ); // Now, search for the description SearchControls controls = new SearchControls(); controls.setSearchScope( SearchControls.SUBTREE_SCOPE ); controls.setDerefLinkFlag( false ); - controls.setReturningAttributes( new String[] { "*" } ); - sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES, - AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() ); + controls.setReturningAttributes( new String[] + { "*" } ); + sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES, AliasDerefMode.NEVER_DEREF_ALIASES + .getJndiValue() ); HashMap map = new HashMap(); - NamingEnumeration list = sysRoot.search( "", "(description=\\28sex pistols\\29)", controls ); - + NamingEnumeration list = sysRoot + .search( "", "(description=\\28sex\\2Apis\\5Ctols\\29)", controls ); + while ( list.hasMore() ) { SearchResult result = list.next(); @@ -1308,6 +1310,62 @@ } + @Test + public void testSubstringSearchWithEscapedCharsInFilter() throws Exception + { + // Create an entry with special chars in the description attribute + LdapContext sysRoot = getSystemContext( service ); + // Create entry cn=Sid Vicious, ou=system + Attributes vicious = new BasicAttributes( true ); + Attribute ocls = new BasicAttribute( "objectClass" ); + ocls.add( "top" ); + ocls.add( "person" ); + vicious.put( ocls ); + vicious.put( "cn", "Sid Vicious" ); + vicious.put( "sn", "Vicious" ); + vicious.put( "description", "(sex*pis\\tols)" ); + DirContext ctx = sysRoot.createSubcontext( "cn=Sid Vicious", vicious ); + assertNotNull( ctx ); + + ctx = ( DirContext ) sysRoot.lookup( "cn=Sid Vicious" ); + assertNotNull( ctx ); + + Attributes attributes = ctx.getAttributes( "" ); + + assertEquals( "(sex*pis\\tols)", attributes.get( "description" ).get() ); + + // Now, search for the description + SearchControls controls = new SearchControls(); + controls.setSearchScope( SearchControls.SUBTREE_SCOPE ); + controls.setDerefLinkFlag( false ); + controls.setReturningAttributes( new String[] + { "*" } ); + sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES, AliasDerefMode.NEVER_DEREF_ALIASES + .getJndiValue() ); + + String[] filters = new String[] + { "(description=*\\28*)", "(description=*\\29*)", "(description=*\\2A*)", "(description=*\\5C*)" }; + for ( String filter : filters ) + { + HashMap map = new HashMap(); + NamingEnumeration list = sysRoot.search( "", filter, controls ); + + while ( list.hasMore() ) + { + SearchResult result = list.next(); + map.put( result.getName(), result.getAttributes() ); + } + + assertEquals( "Expected number of results returned was incorrect!", 1, map.size() ); + + Attributes attrs = map.get( "cn=Sid Vicious,ou=system" ); + + assertNotNull( attrs.get( "objectClass" ) ); + assertNotNull( attrs.get( "cn" ) ); + } + } + + /** * Test a search with a bad filter : there is a missing closing ')' */ Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java?rev=712718&r1=712717&r2=712718&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/normalization/NormalizingVisitor.java Mon Nov 10 10:37:37 2008 @@ -179,7 +179,13 @@ if ( escaped ) { // We should not have a '\' at the end of the string - throw new InvalidNameException( "The value must not ends with a '\\'." ); + //throw new InvalidNameException( "The value must not ends with a '\\'." ); + + // TODO: We have a weird behaviour: + // - If a request (cn=\5C) comes over the wire the '\5C' is already decoded to a '\'. + // - If we use the embedded LdapContext it is not decoded here. + // This is just a hack to make it working. + buf.append( '\\' ); } return buf.toString(); Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java?rev=712718&r1=712717&r2=712718&view=diff ============================================================================== --- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java (original) +++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/operations/search/SearchIT.java Mon Nov 10 10:37:37 2008 @@ -20,7 +20,16 @@ package org.apache.directory.server.operations.search; +import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +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.util.Arrays; +import java.util.HashMap; import java.util.HashSet; import java.util.Set; @@ -44,19 +53,10 @@ import org.apache.directory.server.core.subtree.SubentryInterceptor; import org.apache.directory.server.integ.SiRunner; import org.apache.directory.server.ldap.LdapService; - -import static org.apache.directory.server.integ.ServerIntegrationUtils.getWiredContext; - import org.apache.directory.shared.ldap.constants.SchemaConstants; import org.apache.directory.shared.ldap.message.control.SubentriesControl; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.fail; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; /** @@ -1377,8 +1377,46 @@ result.close(); } - - + + + @Test + public void testSubstringSearchWithEscapedCharsInFilter() throws Exception + { + LdapContext ctx = ( LdapContext ) getWiredContext( ldapService ).lookup( BASE ); + + Attributes attrs = new BasicAttributes( "objectClass", "inetOrgPerson", true ); + attrs.get( "objectClass" ).add( "organizationalPerson" ); + attrs.get( "objectClass" ).add( "person" ); + attrs.put( "givenName", "Jim" ); + attrs.put( "sn", "Bean" ); + attrs.put( "cn", "jimbean" ); + attrs.put( "description", "(sex*pis\\tols)" ); + ctx.createSubcontext( "cn=jimbean", attrs ); + + SearchControls controls = new SearchControls(); + controls.setSearchScope( SearchControls.ONELEVEL_SCOPE ); + controls.setReturningAttributes( new String[] + { "cn" } ); + + String[] filters = new String[] + { "(description=*\\28*)", "(description=*\\29*)", "(description=*\\2A*)", "(description=*\\5C*)" }; + for ( String filter : filters ) + { + HashMap map = new HashMap(); + NamingEnumeration res = ctx.search( "", filter, controls ); + assertTrue( res.hasMore() ); + SearchResult result = res.next(); + assertNotNull( result ); + attrs = result.getAttributes(); + assertEquals( 1, attrs.size() ); + assertNotNull( attrs.get( "cn" ) ); + assertEquals( 1, attrs.get( "cn" ).size() ); + assertEquals( "jimbean", ( String ) attrs.get( "cn" ).get() ); + assertFalse( res.hasMore() ); + } + } + + /** * Test for DIRSERVER-1180 where search hangs when an invalid a substring * expression missing an any field is used in a filter: i.e. (cn=**). @@ -1408,4 +1446,5 @@ assertTrue( true ); } } + } Modified: directory/apacheds/trunk/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java?rev=712718&r1=712717&r2=712718&view=diff ============================================================================== --- directory/apacheds/trunk/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java (original) +++ directory/apacheds/trunk/xdbm-search/src/test/java/org/apache/directory/server/xdbm/search/impl/AndCursorTest.java Mon Nov 10 10:37:37 2008 @@ -189,7 +189,7 @@ List> evaluators = new ArrayList>(); Evaluator eval; - ExprNode exprNode = new SubstringNode( "cn", "J*", null ); + ExprNode exprNode = new SubstringNode( "cn", "J", null ); eval = new SubstringEvaluator( ( SubstringNode ) exprNode, store, registries ); IndexCursor wrapped = new SubstringCursor( store, ( SubstringEvaluator ) eval ); Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/StringTools.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/StringTools.java?rev=712718&r1=712717&r2=712718&view=diff ============================================================================== --- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/StringTools.java (original) +++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/util/StringTools.java Mon Nov 10 10:37:37 2008 @@ -803,20 +803,20 @@ if ( initialPattern != null ) { - buf.append( '^' ).append( initialPattern ); + buf.append( '^' ).append( Pattern.quote( initialPattern ) ); } if ( anyPattern != null ) { for ( int i = 0; i < anyPattern.length; i++ ) { - buf.append( ".*" ).append( anyPattern[i] ); + buf.append( ".*" ).append( Pattern.quote( anyPattern[i] ) ); } } if ( finalPattern != null ) { - buf.append( ".*" ).append( finalPattern ); + buf.append( ".*" ).append( Pattern.quote( finalPattern ) ); } else { Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/StringToolsTest.java URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/StringToolsTest.java?rev=712718&r1=712717&r2=712718&view=diff ============================================================================== --- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/StringToolsTest.java (original) +++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/util/StringToolsTest.java Mon Nov 10 10:37:37 2008 @@ -289,6 +289,29 @@ } + /** + * Tests StringTools.getRegex() with some LDAP filter special characters. + */ + public void testGetRegexpWithLdapFilterSpecialChars() throws Exception + { + Pattern[] patterns = new Pattern[] + { StringTools.getRegex( null, new String[] + { "(" }, null ), StringTools.getRegex( null, new String[] + { ")" }, null ), StringTools.getRegex( null, new String[] + { "*" }, null ), StringTools.getRegex( null, new String[] + { "\\" }, null ), }; + + for ( Pattern pattern : patterns ) + { + boolean b1 = pattern.matcher( "a(b*c\\d)e" ).matches(); + assertTrue( b1 ); + + boolean b3 = pattern.matcher( "Test test" ).matches(); + assertFalse( b3 ); + } + } + + public void testDeepTrim() { assertEquals( "", StringTools.deepTrim( " ", false ) );