1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  package org.apache.directory.server.core.jndi;
21  
22  
23  import org.apache.directory.server.core.DirectoryService;
24  import org.apache.directory.server.core.integ.CiRunner;
25  import static org.apache.directory.server.core.integ.IntegrationUtils.getSystemContext;
26  import static org.apache.directory.server.core.integ.IntegrationUtils.getSchemaContext;
27  import org.apache.directory.shared.ldap.constants.JndiPropertyConstants;
28  import org.apache.directory.shared.ldap.exception.LdapSizeLimitExceededException;
29  import org.apache.directory.shared.ldap.exception.LdapTimeLimitExceededException;
30  import org.apache.directory.shared.ldap.message.AliasDerefMode;
31  import static org.junit.Assert.assertEquals;
32  import static org.junit.Assert.assertTrue;
33  import static org.junit.Assert.assertFalse;
34  import static org.junit.Assert.assertNull;
35  import static org.junit.Assert.assertNotNull;
36  import static org.junit.Assert.fail;
37  
38  import org.junit.Ignore;
39  import org.junit.Test;
40  import org.junit.runner.RunWith;
41  
42  import javax.naming.NamingEnumeration;
43  import javax.naming.NamingException;
44  import javax.naming.directory.Attribute;
45  import javax.naming.directory.Attributes;
46  import javax.naming.directory.BasicAttribute;
47  import javax.naming.directory.BasicAttributes;
48  import javax.naming.directory.DirContext;
49  import javax.naming.directory.ModificationItem;
50  import javax.naming.directory.SearchControls;
51  import javax.naming.directory.SearchResult;
52  import javax.naming.ldap.LdapContext;
53  import java.util.HashMap;
54  import java.util.Set;
55  import java.util.HashSet;
56  
57  
58  /**
59   * Tests the search() methods of the provider.
60   *
61   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
62   * @version $Rev: 691179 $
63   */
64  @RunWith ( CiRunner.class )
65  public class SearchIT
66  {
67      private static final String RDN = "cn=Heather Nova";
68      private static final String FILTER = "(objectclass=*)";
69  
70      public static DirectoryService service;
71  
72      /**
73       * @todo put this into ldif and use ldif annotation to import
74       *
75       * @param sysRoot the system root to add entries to
76       * @throws NamingException on errors
77       */
78      protected void createData( LdapContext sysRoot ) throws Exception
79      {
80          /*
81           * create ou=testing00,ou=system
82           */
83          Attributes attributes = new BasicAttributes( true );
84          Attribute attribute = new BasicAttribute( "objectClass" );
85          attribute.add( "top" );
86          attribute.add( "organizationalUnit" );
87          attributes.put( attribute );
88          attributes.put( "ou", "testing00" );
89  
90          DirContext ctx = sysRoot.createSubcontext( "ou=testing00", attributes );
91          assertNotNull( ctx );
92  
93          ctx = ( DirContext ) sysRoot.lookup( "ou=testing00" );
94          assertNotNull( ctx );
95          attributes = ctx.getAttributes( "" );
96          assertNotNull( attributes );
97          assertEquals( "testing00", attributes.get( "ou" ).get() );
98          attribute = attributes.get( "objectClass" );
99          assertNotNull( attribute );
100         assertTrue( attribute.contains( "top" ) );
101         assertTrue( attribute.contains( "organizationalUnit" ) );
102 
103         /*
104          * create ou=testing01,ou=system
105          */
106         attributes = new BasicAttributes( true );
107         attribute = new BasicAttribute( "objectClass" );
108         attribute.add( "top" );
109         attribute.add( "organizationalUnit" );
110         attributes.put( attribute );
111         attributes.put( "ou", "testing01" );
112 
113         ctx = sysRoot.createSubcontext( "ou=testing01", attributes );
114         assertNotNull( ctx );
115 
116         ctx = ( DirContext ) sysRoot.lookup( "ou=testing01" );
117         assertNotNull( ctx );
118         attributes = ctx.getAttributes( "" );
119         assertNotNull( attributes );
120         assertEquals( "testing01", attributes.get( "ou" ).get() );
121         attribute = attributes.get( "objectClass" );
122         assertNotNull( attribute );
123         assertTrue( attribute.contains( "top" ) );
124         assertTrue( attribute.contains( "organizationalUnit" ) );
125 
126         /*
127          * create ou=testing02,ou=system
128          */
129         attributes = new BasicAttributes( true );
130         attribute = new BasicAttribute( "objectClass" );
131         attribute.add( "top" );
132         attribute.add( "organizationalUnit" );
133         attributes.put( attribute );
134         attributes.put( "ou", "testing02" );
135         ctx = sysRoot.createSubcontext( "ou=testing02", attributes );
136         assertNotNull( ctx );
137 
138         ctx = ( DirContext ) sysRoot.lookup( "ou=testing02" );
139         assertNotNull( ctx );
140 
141         attributes = ctx.getAttributes( "" );
142         assertNotNull( attributes );
143         assertEquals( "testing02", attributes.get( "ou" ).get() );
144 
145         attribute = attributes.get( "objectClass" );
146         assertNotNull( attribute );
147         assertTrue( attribute.contains( "top" ) );
148         assertTrue( attribute.contains( "organizationalUnit" ) );
149 
150         /*
151          * create ou=subtest,ou=testing01,ou=system
152          */
153         ctx = ( DirContext ) sysRoot.lookup( "ou=testing01" );
154 
155         attributes = new BasicAttributes( true );
156         attribute = new BasicAttribute( "objectClass" );
157         attribute.add( "top" );
158         attribute.add( "organizationalUnit" );
159         attributes.put( attribute );
160         attributes.put( "ou", "subtest" );
161 
162         ctx = ctx.createSubcontext( "ou=subtest", attributes );
163         assertNotNull( ctx );
164 
165         ctx = ( DirContext ) sysRoot.lookup( "ou=subtest,ou=testing01" );
166         assertNotNull( ctx );
167 
168         attributes = ctx.getAttributes( "" );
169         assertNotNull( attributes );
170         assertEquals( "subtest", attributes.get( "ou" ).get() );
171 
172         attribute = attributes.get( "objectClass" );
173         assertNotNull( attribute );
174         assertTrue( attribute.contains( "top" ) );
175         assertTrue( attribute.contains( "organizationalUnit" ) );
176 
177         // Create entry cn=Heather Nova, ou=system
178         Attributes heather = new BasicAttributes( true );
179         Attribute ocls = new BasicAttribute( "objectClass" );
180         ocls.add( "top" );
181         ocls.add( "person" );
182         heather.put( ocls );
183         heather.put( "cn", "Heather Nova" );
184         heather.put( "sn", "Nova" );
185         ctx = sysRoot.createSubcontext( RDN, heather );
186         assertNotNull( ctx );
187 
188         ctx = ( DirContext ) sysRoot.lookup( RDN );
189         assertNotNull( ctx );
190 
191 
192         // -------------------------------------------------------------------
193         // Enable the nis schema
194         // -------------------------------------------------------------------
195 
196         // check if nis is disabled
197         LdapContext schemaRoot = getSchemaContext( service );
198         Attributes nisAttrs = schemaRoot.getAttributes( "cn=nis" );
199         boolean isNisDisabled = false;
200         if ( nisAttrs.get( "m-disabled" ) != null )
201         {
202             isNisDisabled = ( ( String ) nisAttrs.get( "m-disabled" ).get() ).equalsIgnoreCase( "TRUE" );
203         }
204 
205         // if nis is disabled then enable it
206         if ( isNisDisabled )
207         {
208             Attribute disabled = new BasicAttribute( "m-disabled" );
209             ModificationItem[] mods = new ModificationItem[] {
210                 new ModificationItem( DirContext.REMOVE_ATTRIBUTE, disabled ) };
211             schemaRoot.modifyAttributes( "cn=nis", mods );
212         }
213 
214         // -------------------------------------------------------------------
215         // Add a bunch of nis groups
216         // -------------------------------------------------------------------
217 
218         addNisPosixGroup( "testGroup0", 0 );
219         addNisPosixGroup( "testGroup1", 1 );
220         addNisPosixGroup( "testGroup2", 2 );
221         addNisPosixGroup( "testGroup4", 4 );
222         addNisPosixGroup( "testGroup5", 5 );
223     }
224 
225 
226     private DirContext addNisPosixGroup( String name, int gid ) throws Exception
227     {
228         Attributes attrs = new BasicAttributes( "objectClass", "top", true );
229         attrs.get( "objectClass" ).add( "posixGroup" );
230         attrs.put( "cn", name );
231         attrs.put( "gidNumber", String.valueOf( gid ) );
232         return getSystemContext( service ).createSubcontext( "cn="+name+",ou=groups", attrs );
233     }
234 
235 
236     @Test
237     public void testSearchOneLevel() throws Exception
238     {
239         LdapContext sysRoot = getSystemContext( service );
240         createData( sysRoot );
241 
242         SearchControls controls = new SearchControls();
243         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
244         controls.setDerefLinkFlag( false );
245         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
246                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
247         HashMap<String,Attributes> map = new HashMap<String,Attributes>();
248 
249         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=*)", controls );
250         
251         while ( list.hasMore() )
252         {
253             SearchResult result = list.next();
254             map.put( result.getName(), result.getAttributes() );
255         }
256 
257         assertEquals( "Expected number of results returned was incorrect!", 6, map.size() );
258         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
259         assertTrue( map.containsKey( "ou=testing01,ou=system" ) );
260         assertTrue( map.containsKey( "ou=testing02,ou=system" ) );
261     }
262 
263 
264     @Test
265     public void testSearchSubTreeLevel() throws Exception
266     {
267         LdapContext sysRoot = getSystemContext( service );
268         createData( sysRoot );
269 
270         SearchControls controls = new SearchControls();
271         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
272         controls.setDerefLinkFlag( false );
273         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
274                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
275 
276         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
277         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=*)", controls );
278         
279         while ( list.hasMore() )
280         {
281             SearchResult result = list.next();
282             map.put( result.getName(), result.getAttributes() );
283         }
284 
285         assertEquals( "Expected number of results returned was incorrect", 11, map.size() );
286         assertTrue( map.containsKey( "ou=system" ) );
287         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
288         assertTrue( map.containsKey( "ou=testing01,ou=system" ) );
289         assertTrue( map.containsKey( "ou=testing02,ou=system" ) );
290         assertTrue( map.containsKey( "ou=subtest,ou=testing01,ou=system" ) );
291     }
292 
293 
294     @Test
295     public void testSearchSubTreeLevelNoAttributes() throws Exception
296     {
297         LdapContext sysRoot = getSystemContext( service );
298         createData( sysRoot );
299 
300         SearchControls controls = new SearchControls();
301         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
302         controls.setDerefLinkFlag( false );
303         controls.setReturningAttributes( new String[]{ "1.1" } );
304         
305         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
306                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
307 
308         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
309         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing02)", controls );
310         
311         while ( list.hasMore() )
312         {
313             SearchResult result = list.next();
314             map.put( result.getName(), result.getAttributes() );
315         }
316 
317         assertEquals( "Expected number of results returned was incorrect", 1, map.size() );
318         assertTrue( map.containsKey( "ou=testing02,ou=system" ) );
319         Attributes attrs = map.get( "ou=testing02,ou=system" );
320         
321         assertEquals( 0, attrs.size() );
322     }
323 
324 
325     @Test
326     public void testSearchSubstringSubTreeLevel() throws Exception
327     {
328         LdapContext sysRoot = getSystemContext( service );
329         createData( sysRoot );
330 
331         SearchControls controls = new SearchControls();
332         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
333         controls.setDerefLinkFlag( false );
334         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
335                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
336 
337         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
338         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(objectClass=organ*)", controls );
339         
340         while ( list.hasMore() )
341         {
342             SearchResult result = list.next();
343             map.put( result.getName(), result.getAttributes() );
344         }
345 
346         // 13 because it also matches organizationalPerson which the admin is
347         assertEquals( "Expected number of results returned was incorrect", 13, map.size() );
348         assertTrue( map.containsKey( "ou=system" ) );
349         assertTrue( map.containsKey( "ou=configuration,ou=system" ) );
350         assertTrue( map.containsKey( "ou=interceptors,ou=configuration,ou=system" ) );
351         assertTrue( map.containsKey( "ou=partitions,ou=configuration,ou=system" ) );
352         assertTrue( map.containsKey( "ou=services,ou=configuration,ou=system" ) );
353         assertTrue( map.containsKey( "ou=groups,ou=system" ) );
354         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
355         assertTrue( map.containsKey( "ou=testing01,ou=system" ) );
356         assertTrue( map.containsKey( "ou=subtest,ou=testing01,ou=system" ) );
357         assertTrue( map.containsKey( "ou=testing02,ou=system" ) );
358         assertTrue( map.containsKey( "ou=users,ou=system" ) );
359         assertTrue( map.containsKey( "prefNodeName=sysPrefRoot,ou=system" ) );
360         assertTrue( map.containsKey( "uid=admin,ou=system" ) );
361     }
362 
363 
364     /**
365      * Tests to make sure undefined attributes in filter assertions are pruned and do not
366      * result in exceptions.
367      */
368     @Test
369     public void testBogusAttributeInSearchFilter() throws Exception
370     {
371         boolean oldSetAllowAnnonymousAccess = service.isAllowAnonymousAccess();
372         service.setAllowAnonymousAccess( true );
373 
374         LdapContext sysRoot = getSystemContext( service );
375         SearchControls cons = new SearchControls();
376         NamingEnumeration<SearchResult> e = sysRoot.search( "", "(bogusAttribute=abc123)", cons );
377         assertNotNull( e );
378         
379         e = sysRoot.search( "", "(!(bogusAttribute=abc123))", cons );
380         assertNotNull( e );
381         assertFalse( e.hasMore() );
382         
383         e = sysRoot.search( "", "(|(bogusAttribute=abc123)(bogusAttribute=abc123))", cons );
384         assertNotNull( e );
385         assertFalse( e.hasMore() );
386         
387         e = sysRoot.search( "", "(|(bogusAttribute=abc123)(ou=abc123))", cons );
388         assertNotNull( e );
389         assertFalse( e.hasMore() );
390 
391         e = sysRoot.search( "", "(OBJECTclass=*)", cons );
392         assertNotNull( e );
393         assertTrue( e.hasMore() );
394 
395         e = sysRoot.search( "", "(objectclass=*)", cons );
396         assertNotNull( e );
397         
398         service.setAllowAnonymousAccess( oldSetAllowAnnonymousAccess );
399     }
400 
401 
402     @Test
403     public void testSearchFilterArgs() throws Exception
404     {
405         LdapContext sysRoot = getSystemContext( service );
406         createData( sysRoot );
407 
408         SearchControls controls = new SearchControls();
409         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
410         controls.setDerefLinkFlag( false );
411         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
412                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
413         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
414 
415         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(|(ou={0})(ou={1}))", new Object[]
416             { "testing00", "testing01" }, controls );
417         
418         while ( list.hasMore() )
419         {
420             SearchResult result = list.next();
421             map.put( result.getName(), result.getAttributes() );
422         }
423 
424         assertEquals( "Expected number of results returned was incorrect!", 2, map.size() );
425         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
426         assertTrue( map.containsKey( "ou=testing01,ou=system" ) );
427     }
428 
429 
430     @Test
431     @Ignore ( "TODO - fix me" )
432     public void testSearchSizeLimit() throws Exception
433     {
434         LdapContext sysRoot = getSystemContext( service );
435         createData( sysRoot );
436 
437         SearchControls controls = new SearchControls();
438         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
439         controls.setDerefLinkFlag( false );
440         controls.setCountLimit( 7 );
441         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
442                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
443 
444         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
445         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=*)", controls );
446 
447         try
448         {
449             while ( list.hasMore() )
450             {
451                 SearchResult result = list.next();
452                 map.put( result.getName(), result.getAttributes() );
453             }
454             
455             fail( "Should not get here due to a SizeLimitExceededException" );
456         }
457         catch ( LdapSizeLimitExceededException e )
458         {
459         }
460         assertEquals( "Expected number of results returned was incorrect", 7, map.size() );
461     }
462 
463 
464     @Test
465     @Ignore ( "TODO - fix me" )
466     public void testSearchTimeLimit() throws Exception, InterruptedException
467     {
468         LdapContext sysRoot = getSystemContext( service );
469         createData( sysRoot );
470 
471         SearchControls controls = new SearchControls();
472         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
473         controls.setDerefLinkFlag( false );
474         controls.setTimeLimit( 200 );
475         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
476                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
477 
478         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
479         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=*)", controls );
480 
481         try
482         {
483             while ( list.hasMore() )
484             {
485                 SearchResult result = ( SearchResult ) list.next();
486                 
487                 // leep 201 ms before fetching the next element ...
488             	Thread.sleep( 201 );
489                 map.put( result.getName(), result.getAttributes() );
490             }
491             
492             fail( "Should not get here due to a TimeLimitExceededException" );
493         }
494         catch ( LdapTimeLimitExceededException e )
495         {
496         }
497         
498         assertEquals( "Expected number of results returned was incorrect", 1, map.size() );
499     }
500     
501 
502     @Test
503     public void testFilterExpansion0() throws Exception
504     {
505         LdapContext sysRoot = getSystemContext( service );
506         createData( sysRoot );
507 
508         SearchControls controls = new SearchControls();
509         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
510         controls.setDerefLinkFlag( false );
511         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
512                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
513         
514         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
515         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(name=testing00)", controls );
516         
517         while ( list.hasMore() )
518         {
519             SearchResult result = list.next();
520             map.put( result.getName(), result.getAttributes() );
521         }
522         
523         assertEquals( "size of results", 1, map.size() );
524         assertTrue( "contains ou=testing00,ou=system", map.containsKey( "ou=testing00,ou=system" ) ); 
525     }
526     
527 
528     @Test
529     public void testFilterExpansion1() throws Exception
530     {
531         LdapContext sysRoot = getSystemContext( service );
532         createData( sysRoot );
533 
534         SearchControls controls = new SearchControls();
535         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
536         controls.setDerefLinkFlag( false );
537         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
538                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
539         
540         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
541         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(name=*)", controls );
542         
543         while ( list.hasMore() )
544         {
545             SearchResult result = list.next();
546             map.put( result.getName(), result.getAttributes() );
547         }
548         
549         assertEquals( "size of results", 19, map.size() );
550         assertTrue( "contains ou=testing00,ou=system", map.containsKey( "ou=testing00,ou=system" ) ); 
551         assertTrue( "contains ou=testing01,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); 
552         assertTrue( "contains ou=testing02,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); 
553         assertTrue( "contains ou=configuration,ou=system", map.containsKey( "ou=configuration,ou=system" ) ); 
554         assertTrue( "contains ou=groups,ou=system", map.containsKey( "ou=groups,ou=system" ) ); 
555         assertTrue( "contains ou=interceptors,ou=configuration,ou=system", map.containsKey( "ou=interceptors,ou=configuration,ou=system" ) ); 
556         assertTrue( "contains ou=partitions,ou=configuration,ou=system", map.containsKey( "ou=partitions,ou=configuration,ou=system" ) ); 
557         assertTrue( "contains ou=services,ou=configuration,ou=system", map.containsKey( "ou=services,ou=configuration,ou=system" ) ); 
558         assertTrue( "contains ou=subtest,ou=testing01,ou=system", map.containsKey( "ou=subtest,ou=testing01,ou=system" ) ); 
559         assertTrue( "contains ou=system", map.containsKey( "ou=system" ) ); 
560         assertTrue( "contains ou=users,ou=system", map.containsKey( "ou=users,ou=system" ) ); 
561         assertTrue( "contains uid=admin,ou=system", map.containsKey( "uid=admin,ou=system" ) ); 
562         assertTrue( "contains cn=administrators,ou=groups,ou=system", map.containsKey( "cn=Administrators,ou=groups,ou=system" ) ); 
563     }
564     
565     
566     @Test
567     public void testFilterExpansion2() throws Exception
568     {
569         LdapContext sysRoot = getSystemContext( service );
570         createData( sysRoot );
571 
572         SearchControls controls = new SearchControls();
573         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
574         controls.setDerefLinkFlag( false );
575         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
576                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
577         
578         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
579         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(|(name=testing00)(name=testing01))", controls );
580         
581         while ( list.hasMore() )
582         {
583             SearchResult result = list.next();
584             map.put( result.getName(), result.getAttributes() );
585         }
586         
587         assertEquals( "size of results", 2, map.size() );
588         assertTrue( "contains ou=testing00,ou=system", map.containsKey( "ou=testing00,ou=system" ) ); 
589         assertTrue( "contains ou=testing01,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); 
590     }
591 
592 
593     @Test
594     public void testFilterExpansion4() throws Exception
595     {
596         LdapContext sysRoot = getSystemContext( service );
597         createData( sysRoot );
598 
599         SearchControls controls = new SearchControls();
600         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
601         controls.setDerefLinkFlag( false );
602         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
603                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
604         
605         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
606         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(name=testing*)", controls );
607         
608         while ( list.hasMore() )
609         {
610             SearchResult result = list.next();
611             map.put( result.getName(), result.getAttributes() );
612         }
613         
614         assertEquals( "size of results", 3, map.size() );
615         assertTrue( "contains ou=testing00,ou=system", map.containsKey( "ou=testing00,ou=system" ) ); 
616         assertTrue( "contains ou=testing01,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); 
617         assertTrue( "contains ou=testing02,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); 
618     }
619 
620 
621     @Test
622     public void testFilterExpansion5() throws Exception
623     {
624         LdapContext sysRoot = getSystemContext( service );
625         createData( sysRoot );
626 
627         SearchControls controls = new SearchControls();
628         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
629         controls.setDerefLinkFlag( false );
630         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
631                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
632         
633         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
634         String filter = "(|(2.5.4.11.1=testing*)(2.5.4.54=testing*)(2.5.4.10=testing*)" +
635             "(2.5.4.6=testing*)(2.5.4.43=testing*)(2.5.4.7.1=testing*)(2.5.4.10.1=testing*)" +
636             "(2.5.4.44=testing*)(2.5.4.11=testing*)(2.5.4.4=testing*)(2.5.4.8.1=testing*)" +
637             "(2.5.4.12=testing*)(1.3.6.1.4.1.18060.0.4.1.2.3=testing*)" +
638             "(2.5.4.7=testing*)(2.5.4.3=testing*)(2.5.4.8=testing*)(2.5.4.42=testing*))";
639         NamingEnumeration<SearchResult> list = sysRoot.search( "", filter, controls );
640         
641         while ( list.hasMore() )
642         {
643             SearchResult result = list.next();
644             map.put( result.getName(), result.getAttributes() );
645         }
646         
647         assertEquals( "size of results", 3, map.size() );
648         assertTrue( "contains ou=testing00,ou=system", map.containsKey( "ou=testing00,ou=system" ) ); 
649         assertTrue( "contains ou=testing01,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); 
650         assertTrue( "contains ou=testing02,ou=system", map.containsKey( "ou=testing01,ou=system" ) ); 
651     }
652     
653 
654     @Test
655     public void testOpAttrDenormalizationOff() throws Exception
656     {
657         LdapContext sysRoot = getSystemContext( service );
658         createData( sysRoot );
659 
660         SearchControls controls = new SearchControls();
661         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
662         controls.setDerefLinkFlag( false );
663         controls.setReturningAttributes( new String[] { "creatorsName" } );
664         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
665                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
666         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
667 
668         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing00)", controls );
669         
670         while ( list.hasMore() )
671         {
672             SearchResult result = list.next();
673             map.put( result.getName(), result.getAttributes() );
674         }
675 
676         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
677         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
678         Attributes attrs = map.get( "ou=testing00,ou=system" );
679         assertEquals( "normalized creator's name", "0.9.2342.19200300.100.1.1=admin,2.5.4.11=system", 
680             attrs.get( "creatorsName" ).get() );
681     }
682 
683 
684     @Test
685     public void testOpAttrDenormalizationOn() throws Exception
686     {
687         LdapContext sysRoot = getSystemContext( service );
688         createData( sysRoot );
689 
690         service.setDenormalizeOpAttrsEnabled( true );
691         SearchControls controls = new SearchControls();
692         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
693         controls.setDerefLinkFlag( false );
694         controls.setReturningAttributes( new String[] { "creatorsName" } );
695         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
696                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
697         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
698 
699         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing00)", controls );
700         
701         while ( list.hasMore() )
702         {
703             SearchResult result = list.next();
704             map.put( result.getName(), result.getAttributes() );
705         }
706 
707         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
708         assertTrue( map.containsKey( "ou=testing00,ou=system" ) );
709         Attributes attrs = map.get( "ou=testing00,ou=system" );
710         assertEquals( "normalized creator's name", "uid=admin,ou=system", 
711             attrs.get( "creatorsName" ).get() );
712     }
713 
714     
715     /**
716      * Creation of required attributes of a person entry.
717      *
718      * @param cn the commonName of the person
719      * @param sn the surName of the person
720      * @return the attributes of a new person entry
721      */
722     protected Attributes getPersonAttributes( String sn, String cn )
723     {
724         Attributes attributes = new BasicAttributes( true );
725         Attribute attribute = new BasicAttribute( "objectClass" );
726         attribute.add( "top" );
727         attribute.add( "person" );
728         attributes.put( attribute );
729         attributes.put( "cn", cn );
730         attributes.put( "sn", sn );
731 
732         return attributes;
733     }
734 
735 
736     @Test
737     public void testBinaryAttributesInFilter() throws Exception
738     {
739         LdapContext sysRoot = getSystemContext( service );
740         createData( sysRoot );
741 
742         byte[] certData = new byte[] { 0x34, 0x56, 0x4e, 0x5f };
743         
744         // First let's add a some binary data representing a userCertificate
745         Attributes attrs = getPersonAttributes( "Bush", "Kate Bush" );
746         attrs.put( "userCertificate", certData );
747 
748         Attribute objectClasses = attrs.get( "objectClass" );
749         objectClasses.add( "strongAuthenticationUser" );
750 
751         sysRoot.createSubcontext( "cn=Kate Bush", attrs );
752 
753         // Search for kate by cn first
754         SearchControls controls = new SearchControls();
755         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
756         NamingEnumeration<SearchResult> enm = sysRoot.search( "", "(cn=Kate Bush)", controls );
757         assertTrue( enm.hasMore() );
758         SearchResult sr = enm.next();
759         assertNotNull( sr );
760         assertFalse( enm.hasMore() );
761         assertEquals( "cn=Kate Bush,ou=system", sr.getName() );
762 
763         enm = sysRoot.search( "", "(userCertificate=\\34\\56\\4E\\5F)", controls );
764         assertTrue( enm.hasMore() );
765         sr = ( SearchResult ) enm.next();
766         assertNotNull( sr );
767         assertFalse( enm.hasMore() );
768         assertEquals( "cn=Kate Bush,ou=system", sr.getName() );
769     }
770 
771 
772     @Test
773     public void testSearchOperationalAttr() throws Exception
774     {
775         LdapContext sysRoot = getSystemContext( service );
776         createData( sysRoot );
777 
778         SearchControls controls = new SearchControls();
779         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
780         controls.setDerefLinkFlag( false );
781         controls.setReturningAttributes( new String[] { "+" } );
782         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
783                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
784         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
785 
786         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing01)", controls );
787         
788         while ( list.hasMore() )
789         {
790             SearchResult result = list.next();
791             map.put( result.getName(), result.getAttributes() );
792         }
793 
794         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
795 
796         Attributes attrs = map.get( "ou=testing01,ou=system" );
797 
798         assertNotNull( attrs.get( "createTimestamp" ) );
799         assertNotNull( attrs.get( "creatorsName" ) );
800         assertNull( attrs.get( "objectClass" ) );
801         assertNull( attrs.get( "ou" ) );
802     }
803 
804 
805     @Test
806     public void testSearchUserAttr() throws Exception
807     {
808         LdapContext sysRoot = getSystemContext( service );
809         createData( sysRoot );
810 
811         SearchControls controls = new SearchControls();
812         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
813         controls.setDerefLinkFlag( false );
814         controls.setReturningAttributes( new String[] { "*" } );
815         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
816                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
817         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
818 
819         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing01)", controls );
820         
821         while ( list.hasMore() )
822         {
823             SearchResult result = list.next();
824             map.put( result.getName(), result.getAttributes() );
825         }
826 
827         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
828 
829         Attributes attrs = map.get( "ou=testing01,ou=system" );
830 
831         assertNotNull( attrs.get( "objectClass" ) );
832         assertNotNull( attrs.get( "ou" ) );
833         assertNull( attrs.get( "createTimestamp" ) );
834         assertNull( attrs.get( "creatorsName" ) );
835     }
836 
837 
838     @Test
839     public void testSearchUserAttrAndOpAttr() throws Exception
840     {
841         LdapContext sysRoot = getSystemContext( service );
842         createData( sysRoot );
843 
844         SearchControls controls = new SearchControls();
845         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
846         controls.setDerefLinkFlag( false );
847         controls.setReturningAttributes( new String[] { "*", "creatorsName" } );
848         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
849                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
850         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
851 
852         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing01)", controls );
853         
854         while ( list.hasMore() )
855         {
856             SearchResult result = list.next();
857             map.put( result.getName(), result.getAttributes() );
858         }
859 
860         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
861 
862         Attributes attrs = map.get( "ou=testing01,ou=system" );
863 
864         assertNotNull( attrs.get( "objectClass" ) );
865         assertNotNull( attrs.get( "ou" ) );
866         assertNotNull( attrs.get( "creatorsName" ) );
867         assertNull( attrs.get( "createTimestamp" ) );
868     }
869 
870 
871     @Test
872     public void testSearchUserAttrAndNoAttr() throws Exception
873     {
874         LdapContext sysRoot = getSystemContext( service );
875         createData( sysRoot );
876 
877         SearchControls controls = new SearchControls();
878         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
879         controls.setDerefLinkFlag( false );
880         controls.setReturningAttributes( new String[] { "1.1", "ou" } );
881         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
882                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
883         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
884 
885         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing01)", controls );
886         
887         while ( list.hasMore() )
888         {
889             SearchResult result = list.next();
890             map.put( result.getName(), result.getAttributes() );
891         }
892 
893         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
894 
895         Attributes attrs = map.get( "ou=testing01,ou=system" );
896 
897         assertNull( attrs.get( "objectClass" ) );
898         assertNotNull( attrs.get( "ou" ) );
899         assertNull( attrs.get( "creatorsName" ) );
900         assertNull( attrs.get( "createTimestamp" ) );
901     }
902 
903 
904     @Test
905     public void testSearchNoAttr() throws Exception
906     {
907         LdapContext sysRoot = getSystemContext( service );
908         createData( sysRoot );
909 
910         SearchControls controls = new SearchControls();
911         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
912         controls.setDerefLinkFlag( false );
913         controls.setReturningAttributes( new String[] { "1.1" } );
914         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
915                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
916         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
917 
918         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing01)", controls );
919         
920         while ( list.hasMore() )
921         {
922             SearchResult result = list.next();
923             map.put( result.getName(), result.getAttributes() );
924         }
925 
926         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
927 
928         Attributes attrs = map.get( "ou=testing01,ou=system" );
929 
930         assertNull( attrs.get( "objectClass" ) );
931         assertNull( attrs.get( "ou" ) );
932         assertNull( attrs.get( "creatorsName" ) );
933         assertNull( attrs.get( "createTimestamp" ) );
934     }
935 
936 
937     @Test
938     public void testSearchAllAttr() throws Exception
939     {
940         LdapContext sysRoot = getSystemContext( service );
941         createData( sysRoot );
942 
943         SearchControls controls = new SearchControls();
944         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
945         controls.setDerefLinkFlag( false );
946         controls.setReturningAttributes( new String[] { "+", "*" } );
947         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
948                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
949         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
950 
951         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(ou=testing01)", controls );
952         
953 
954         while ( list.hasMore() )
955         {
956             SearchResult result = list.next();
957             map.put( result.getName(), result.getAttributes() );
958         }
959 
960         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
961 
962         Attributes attrs = map.get( "ou=testing01,ou=system" );
963 
964         assertNotNull( attrs.get( "createTimestamp" ) );
965         assertNotNull( attrs.get( "creatorsName" ) );
966         assertNotNull( attrs.get( "objectClass" ) );
967         assertNotNull( attrs.get( "ou" ) );
968     }
969 
970 
971     /**
972      * Search an entry and fetch an attribute with unknown option
973      * @throws NamingException if there are errors
974      */
975     @Test
976     public void testSearchFetchNonExistingAttributeOption() throws Exception
977     {
978         LdapContext sysRoot = getSystemContext( service );
979         createData( sysRoot );
980 
981         SearchControls ctls = new SearchControls();
982         ctls.setSearchScope( SearchControls.OBJECT_SCOPE );
983         ctls.setReturningAttributes( new String[]
984             { "cn", "sn;unknownOption", "badAttr" } );
985 
986         NamingEnumeration<SearchResult> result = sysRoot.search( RDN, FILTER, ctls );
987 
988         if ( result.hasMore() )
989         {
990             SearchResult entry = result.next();
991             Attributes attrs = entry.getAttributes();
992             Attribute cn = attrs.get( "cn" );
993 
994             assertNotNull( cn );
995             assertEquals( "Heather Nova", cn.get().toString() );
996 
997             Attribute sn = attrs.get( "sn" );
998             assertNull( sn );
999         }
1000         else
1001         {
1002             fail( "entry " + RDN + " not found" );
1003         }
1004 
1005         result.close();
1006     }
1007 
1008 
1009     /**
1010      * Search an entry and fetch an attribute with twice the same attributeType
1011      * @throws NamingException if there are errors
1012      */
1013     @Test
1014     public void testSearchFetchTwiceSameAttribute() throws Exception
1015     {
1016         LdapContext sysRoot = getSystemContext( service );
1017         createData( sysRoot );
1018 
1019         SearchControls ctls = new SearchControls();
1020         ctls.setSearchScope( SearchControls.OBJECT_SCOPE );
1021         ctls.setReturningAttributes( new String[]
1022             { "cn", "cn" } );
1023 
1024         NamingEnumeration<SearchResult> result = sysRoot.search( RDN, FILTER, ctls );
1025 
1026         if ( result.hasMore() )
1027         {
1028             SearchResult entry = result.next();
1029             Attributes attrs = entry.getAttributes();
1030             Attribute cn = attrs.get( "cn" );
1031 
1032             assertNotNull( cn );
1033             assertEquals( "Heather Nova", cn.get().toString() );
1034         }
1035         else
1036         {
1037             fail( "entry " + RDN + " not found" );
1038         }
1039 
1040         result.close();
1041     }
1042 
1043 
1044     // this one is failing because it returns the admin user twice: count = 15
1045 //    public void testFilterExpansion3() throws Exception
1046 //    {
1047 //        SearchControls controls = new SearchControls();
1048 //        controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
1049 //        controls.setDerefLinkFlag( false );
1050 //        sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES, AliasDerefMode.NEVER_DEREF_ALIASES );
1051 //        
1052 //        List map = new ArrayList();
1053 //        NamingEnumeration list = sysRoot.search( "", "(name=*)", controls );
1054 //        while ( list.hasMore() )
1055 //        {
1056 //            SearchResult result = ( SearchResult ) list.next();
1057 //            map.add( result.getName() );
1058 //        }
1059 //        assertEquals( "size of results", 14, map.size() );
1060 //        assertTrue( "contains ou=testing00,ou=system", map.contains( "ou=testing00,ou=system" ) ); 
1061 //        assertTrue( "contains ou=testing01,ou=system", map.contains( "ou=testing01,ou=system" ) ); 
1062 //        assertTrue( "contains ou=testing02,ou=system", map.contains( "ou=testing01,ou=system" ) ); 
1063 //        assertTrue( "contains uid=akarasulu,ou=users,ou=system", map.contains( "uid=akarasulu,ou=users,ou=system" ) ); 
1064 //        assertTrue( "contains ou=configuration,ou=system", map.contains( "ou=configuration,ou=system" ) ); 
1065 //        assertTrue( "contains ou=groups,ou=system", map.contains( "ou=groups,ou=system" ) ); 
1066 //        assertTrue( "contains ou=interceptors,ou=configuration,ou=system", map.contains( "ou=interceptors,ou=configuration,ou=system" ) ); 
1067 //        assertTrue( "contains ou=partitions,ou=configuration,ou=system", map.contains( "ou=partitions,ou=configuration,ou=system" ) ); 
1068 //        assertTrue( "contains ou=services,ou=configuration,ou=system", map.contains( "ou=services,ou=configuration,ou=system" ) ); 
1069 //        assertTrue( "contains ou=subtest,ou=testing01,ou=system", map.contains( "ou=subtest,ou=testing01,ou=system" ) ); 
1070 //        assertTrue( "contains ou=system", map.contains( "ou=system" ) ); 
1071 //        assertTrue( "contains ou=users,ou=system", map.contains( "ou=users,ou=system" ) ); 
1072 //        assertTrue( "contains uid=admin,ou=system", map.contains( "uid=admin,ou=system" ) ); 
1073 //        assertTrue( "contains cn=administrators,ou=groups,ou=system", map.contains( "cn=administrators,ou=groups,ou=system" ) ); 
1074 //    }
1075 
1076 
1077 
1078     /**
1079      *  Convenience method that performs a one level search using the
1080      *  specified filter returning their DNs as Strings in a set.
1081      *
1082      * @param controls the search controls
1083      * @param filter the filter expression
1084      * @return the set of groups
1085      * @throws NamingException if there are problems conducting the search
1086      */
1087     public Set<String> searchGroups( String filter, SearchControls controls ) throws Exception
1088     {
1089         if ( controls == null )
1090         {
1091             controls = new SearchControls();
1092         }
1093 
1094         Set<String> results = new HashSet<String>();
1095         NamingEnumeration<SearchResult> list = getSystemContext( service ).search( "ou=groups", filter, controls );
1096 
1097         while( list.hasMore() )
1098         {
1099             SearchResult result = list.next();
1100             results.add( result.getName() );
1101         }
1102 
1103         return results;
1104     }
1105 
1106 
1107     /**
1108      *  Convenience method that performs a one level search using the
1109      *  specified filter returning their DNs as Strings in a set.
1110      *
1111      * @param filter the filter expression
1112      * @return the set of group names
1113      * @throws NamingException if there are problems conducting the search
1114      */
1115     public Set<String> searchGroups( String filter ) throws Exception
1116     {
1117         return searchGroups( filter, null );
1118     }
1119 
1120 
1121     @Test
1122     public void testSetup() throws Exception
1123     {
1124         LdapContext sysRoot = getSystemContext( service );
1125         createData( sysRoot );
1126 
1127         Set<String> results = searchGroups( "(objectClass=posixGroup)" );
1128         assertTrue( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1129         assertTrue( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1130         assertTrue( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1131         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1132         assertTrue( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1133         assertTrue( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1134     }
1135 
1136 
1137     @Test
1138     public void testLessThanSearch() throws Exception
1139     {
1140         LdapContext sysRoot = getSystemContext( service );
1141         createData( sysRoot );
1142 
1143         Set<String> results = searchGroups( "(gidNumber<=5)" );
1144         assertTrue( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1145         assertTrue( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1146         assertTrue( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1147         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1148         assertTrue( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1149         assertTrue( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1150 
1151         results = searchGroups( "(gidNumber<=4)" );
1152         assertTrue( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1153         assertTrue( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1154         assertTrue( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1155         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1156         assertTrue( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1157         assertFalse( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1158 
1159         results = searchGroups( "(gidNumber<=3)" );
1160         assertTrue( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1161         assertTrue( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1162         assertTrue( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1163         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1164         assertFalse( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1165         assertFalse( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1166 
1167         results = searchGroups( "(gidNumber<=0)" );
1168         assertTrue( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1169         assertFalse( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1170         assertFalse( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1171         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1172         assertFalse( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1173         assertFalse( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1174 
1175         results = searchGroups( "(gidNumber<=-1)" );
1176         assertFalse( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1177         assertFalse( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1178         assertFalse( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1179         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1180         assertFalse( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1181         assertFalse( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1182     }
1183 
1184 
1185     @Test
1186     public void testGreaterThanSearch() throws Exception
1187     {
1188         LdapContext sysRoot = getSystemContext( service );
1189         createData( sysRoot );
1190 
1191         Set<String> results = searchGroups( "(gidNumber>=0)" );
1192         assertTrue( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1193         assertTrue( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1194         assertTrue( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1195         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1196         assertTrue( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1197         assertTrue( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1198 
1199         results = searchGroups( "(gidNumber>=1)" );
1200         assertFalse( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1201         assertTrue( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1202         assertTrue( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1203         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1204         assertTrue( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1205         assertTrue( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1206 
1207         results = searchGroups( "(gidNumber>=3)" );
1208         assertFalse( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1209         assertFalse( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1210         assertFalse( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1211         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1212         assertTrue( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1213         assertTrue( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1214 
1215         results = searchGroups( "(gidNumber>=6)" );
1216         assertFalse( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1217         assertFalse( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1218         assertFalse( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1219         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1220         assertFalse( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1221         assertFalse( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1222     }
1223 
1224 
1225     @Test
1226     public void testNotOperator() throws Exception
1227     {
1228         LdapContext sysRoot = getSystemContext( service );
1229         createData( sysRoot );
1230 
1231         Set<String> results = searchGroups( "(!(gidNumber=4))" );
1232         assertTrue( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1233         assertTrue( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1234         assertTrue( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1235         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1236         assertFalse( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1237         assertTrue( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1238     }
1239 
1240 
1241     @Test
1242     public void testNotOperatorSubtree() throws Exception
1243     {
1244         LdapContext sysRoot = getSystemContext( service );
1245         createData( sysRoot );
1246 
1247         SearchControls controls = new SearchControls();
1248         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
1249 
1250         Set<String> results = searchGroups( "(!(gidNumber=4))", controls );
1251         assertTrue( results.contains( "cn=testGroup0,ou=groups,ou=system" ) );
1252         assertTrue( results.contains( "cn=testGroup1,ou=groups,ou=system" ) );
1253         assertTrue( results.contains( "cn=testGroup2,ou=groups,ou=system" ) );
1254         assertFalse( results.contains( "cn=testGroup3,ou=groups,ou=system" ) );
1255         assertFalse( results.contains( "cn=testGroup4,ou=groups,ou=system" ) );
1256         assertTrue( results.contains( "cn=testGroup5,ou=groups,ou=system" ) );
1257     }
1258     
1259 
1260     @Test
1261     public void testSearchWithEscapedCharsInFilter() throws Exception
1262     {
1263         // Create an entry with special chars in the description attribute
1264         LdapContext sysRoot = getSystemContext( service );
1265         // Create entry cn=Sid Vicious, ou=system
1266         Attributes vicious = new BasicAttributes( true );
1267         Attribute ocls = new BasicAttribute( "objectClass" );
1268         ocls.add( "top" );
1269         ocls.add( "person" );
1270         vicious.put( ocls );
1271         vicious.put( "cn", "Sid Vicious" );
1272         vicious.put( "sn", "Vicious" );
1273         vicious.put(  "description", "(sex pistols)" );
1274         DirContext ctx = sysRoot.createSubcontext( "cn=Sid Vicious", vicious );
1275         assertNotNull( ctx );
1276 
1277         ctx = ( DirContext ) sysRoot.lookup( "cn=Sid Vicious" );
1278         assertNotNull( ctx );
1279         
1280         Attributes attributes = ctx.getAttributes( "" );
1281         
1282         assertEquals( "(sex pistols)", attributes.get( "description" ).get() );
1283 
1284         // Now, search for the description
1285         SearchControls controls = new SearchControls();
1286         controls.setSearchScope( SearchControls.SUBTREE_SCOPE );
1287         controls.setDerefLinkFlag( false );
1288         controls.setReturningAttributes( new String[] { "*" } );
1289         sysRoot.addToEnvironment( JndiPropertyConstants.JNDI_LDAP_DAP_DEREF_ALIASES,
1290                 AliasDerefMode.NEVER_DEREF_ALIASES.getJndiValue() );
1291         HashMap<String, Attributes> map = new HashMap<String, Attributes>();
1292 
1293         NamingEnumeration<SearchResult> list = sysRoot.search( "", "(description=\\28sex pistols\\29)", controls );
1294         
1295         while ( list.hasMore() )
1296         {
1297             SearchResult result = list.next();
1298             map.put( result.getName(), result.getAttributes() );
1299         }
1300 
1301         assertEquals( "Expected number of results returned was incorrect!", 1, map.size() );
1302 
1303         Attributes attrs = map.get( "cn=Sid Vicious,ou=system" );
1304 
1305         assertNotNull( attrs.get( "objectClass" ) );
1306         assertNotNull( attrs.get( "cn" ) );
1307     }
1308 
1309 
1310     /**
1311      * Search operation with a base DN with quotes
1312      * Commented as it's not valid by RFC 5514
1313     @Test
1314     public void testSearchWithQuotesInBase() throws NamingException 
1315     {
1316         LdapContext sysRoot = getSystemContext( service );
1317         createData( sysRoot );
1318 
1319         SearchControls ctls = new SearchControls();
1320         ctls.setSearchScope( SearchControls.OBJECT_SCOPE );
1321         String filter = "(cn=Tori Amos)";
1322         ctls.setReturningAttributes( new String[]
1323             { "cn", "cn" } );
1324 
1325         // Search for cn="Tori Amos" (with quotes)
1326         String base = "cn=\"Tori Amos\"";
1327 
1328         try {
1329             // Check entry
1330             NamingEnumeration<SearchResult> result = sysRoot.search( base, filter, ctls );
1331             assertTrue( result.hasMore() );
1332             
1333             while ( result.hasMore() ) 
1334             {
1335                 SearchResult sr = result.next();
1336                 Attributes attrs = sr.getAttributes();
1337                 Attribute sn = attrs.get( "cn" );
1338                 assertNotNull(sn);
1339                 assertTrue( sn.contains( "Amos" ) );
1340             }
1341         } catch (Exception e) 
1342         {
1343             fail( e.getMessage() );
1344         }
1345     }
1346     */
1347 }