mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Chris Ridd
05.17.2012 ec2f56f84108d78dd7c96d07f9ce18cb8fa64e84
Fix OPENDJ-620 Referrals returned when not in scope.
2 files modified
100 ■■■■■ changed files
opends/src/server/org/opends/server/backends/jeb/DN2URI.java 3 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java 97 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/backends/jeb/DN2URI.java
@@ -23,6 +23,7 @@
 *
 *
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 *      Portions Copyright 2012 ForgeRock AS
 */
package org.opends.server.backends.jeb;
@@ -669,7 +670,7 @@
          if (searchOp.getScope() == SearchScope.SINGLE_LEVEL)
          {
            if(JebFormat.findDNKeyParent(key.getData(), 0,
                                       key.getSize()) == baseDN.length)
                                       key.getSize()) != baseDN.length)
            {
              continue;
            }
opends/tests/unit-tests-testng/src/server/org/opends/server/core/SearchOperationTestCase.java
@@ -23,7 +23,7 @@
 *
 *
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 *      Portions copyright 2011 ForgeRock AS
 *      Portions copyright 2011-2012 ForgeRock AS
 */
package org.opends.server.core;
@@ -193,6 +193,47 @@
                               referralEntry.getOperationalAttributes());
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
    assertNotNull(DirectoryServer.getEntry(referralEntry.getDN()));
    Entry level1Entry = TestCaseUtils.makeEntry(
        "dn: ou=level1," + BASE,
        "objectclass: top",
        "objectclass: organizationalunit",
        "ou: level1");
    addOperation =
        connection.processAdd(level1Entry.getDN(),
                              level1Entry.getObjectClasses(),
                              level1Entry.getUserAttributes(),
                              level1Entry.getOperationalAttributes());
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
    assertNotNull(DirectoryServer.getEntry(level1Entry.getDN()));
    Entry level2Entry = TestCaseUtils.makeEntry(
        "dn: ou=level2,ou=level1," + BASE,
        "objectclass: top",
        "objectclass: organizationalunit",
        "ou: level2");
    addOperation =
        connection.processAdd(level2Entry.getDN(),
                              level2Entry.getObjectClasses(),
                              level2Entry.getUserAttributes(),
                              level2Entry.getOperationalAttributes());
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
    assertNotNull(DirectoryServer.getEntry(level2Entry.getDN()));
    Entry referral2Entry = TestCaseUtils.makeEntry(
        "dn: ou=level3,ou=level2,ou=level1," + BASE,
        "objectclass: extensibleobject",
        "objectclass: referral",
        "ref: ldap://hostb/OU=People,O=MNN,C=US",
        "ref: ldap://hostc/OU=People,O=MNN,C=US",
        "ref: ldap://hostd/OU=People,O=MNN,C=US");
   addOperation =
        connection.processAdd(referral2Entry.getDN(),
                              referral2Entry.getObjectClasses(),
                              referral2Entry.getUserAttributes(),
                              referral2Entry.getOperationalAttributes());
   assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
   assertNotNull(DirectoryServer.getEntry(referral2Entry.getDN()));
  }
@@ -376,8 +417,8 @@
    searchOperation.run();
    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
    assertEquals(searchOperation.getEntriesSent(), 2);
    assertEquals(searchOperation.getReferencesSent(), 1);
    assertEquals(searchOperation.getEntriesSent(), 4);
    assertEquals(searchOperation.getReferencesSent(), 2);
    assertEquals(searchOperation.getErrorMessage().length(), 0);
    examineCompletedOperation(searchOperation);
@@ -874,6 +915,54 @@
    searchOperation.run();
    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
    assertEquals(searchOperation.getReferencesSent(), 2);
    assertEquals(searchOperation.getErrorMessage().length(), 0);
    examineCompletedOperation(searchOperation);
    List<SearchResultReference> references =
         searchOperation.getSearchReferences();
    assertEquals(references.size(), 2);
    // One contains 2 URLs, the other contains 3. Cannot guarantee
    // ordering of the returned references, so just check the total is correct.
    int urls = references.get(0).getReferralURLs().size() +
        references.get(1).getReferralURLs().size();
    assertEquals(urls, 5);
  }
  /**
   * This does a single-level search that finds one referral object, but
   * not the one in a deeper subtree.
   *
   * @throws Exception
   */
  @Test
  public void testSearchSingleDeepReferences() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    InternalClientConnection conn =
         InternalClientConnection.getRootConnection();
    InternalSearchOperation searchOperation =
         new InternalSearchOperation(
              conn,
              InternalClientConnection.nextOperationID(),
              InternalClientConnection.nextMessageID(),
              new ArrayList<Control>(),
              ByteString.valueOf(BASE),
              SearchScope.SINGLE_LEVEL,
              DereferencePolicy.NEVER_DEREF_ALIASES,
              Integer.MAX_VALUE,
              Integer.MAX_VALUE,
              false,
              LDAPFilter.decode("(ou=*)"),
              null, null);
    searchOperation.run();
    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
    assertEquals(searchOperation.getReferencesSent(), 1);
    assertEquals(searchOperation.getErrorMessage().length(), 0);
    examineCompletedOperation(searchOperation);
@@ -1047,7 +1136,7 @@
    searchOperation.run();
    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
    assertEquals(searchOperation.getEntriesSent(), 3);
    assertEquals(searchOperation.getEntriesSent(), 5);
    assertEquals(searchOperation.getErrorMessage().length(), 0);
  }