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

Matthew Swift
11.03.2015 fb249f25fe98af8c2dcbf498872fd48c2c3ed854
OPENDJ-2090 - fix bounds checking for DN2ID children and subtree cursors.
3 files modified
47 ■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java 12 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/PluggableBackendImplTestCase.java 33 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/pdb/PDBTestCase.java 2 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java
@@ -206,14 +206,14 @@
   */
  private static final class ChildrenCursor extends SequentialCursorForwarding {
    private final ByteStringBuilder builder;
    private final ByteString parentDN;
    private final ByteString limit;
    private boolean cursorOnParent;
    ChildrenCursor(Cursor<ByteString, ByteString> delegate)
    {
      super(delegate);
      builder = new ByteStringBuilder(128);
      parentDN = delegate.isDefined() ? delegate.getKey() : null;
      limit = delegate.isDefined() ? afterKey(delegate.getKey()).toByteString() : null;
      cursorOnParent = true;
    }
@@ -228,7 +228,7 @@
        // Go to the next sibling
        delegate.positionToKeyOrNext(nextSibling());
      }
      return isDefined() && delegate.getKey().startsWith(parentDN);
      return isDefined() && delegate.getKey().compareTo(limit) < 0;
    }
    private ByteStringBuilder nextSibling()
@@ -242,18 +242,18 @@
   * at creation.
   */
  private static final class SubtreeCursor extends SequentialCursorForwarding {
    private final ByteString baseDN;
    private final ByteString limit;
    SubtreeCursor(Cursor<ByteString, ByteString> delegate)
    {
      super(delegate);
      baseDN = delegate.isDefined() ? delegate.getKey() : null;
      limit = delegate.isDefined() ? afterKey(delegate.getKey()).toByteString() : null;
    }
    @Override
    public boolean next()
    {
      return delegate.next() && delegate.getKey().startsWith(baseDN);
      return delegate.next() && delegate.getKey().compareTo(limit) < 0;
    }
  }
opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/PluggableBackendImplTestCase.java
@@ -83,6 +83,7 @@
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
@@ -527,7 +528,7 @@
    dnToMod = workEntries.get(0).getName();
    dnToDel = workEntries.get(1).getName();
    searchDN = entries.get(8).getName();
    searchDN = entries.get(1).getName();
    badEntryDN = testBaseDN.child(DN.valueOf("ou=bogus")).child(DN.valueOf("ou=dummy"));
    backupID = "backupID1";
@@ -759,21 +760,37 @@
        "Subtree search should return a correct number of entries");
  }
  @Test(dependsOnMethods = { "testAdd", "testModifyEntry", "testRenameEntry", "testDeleteAlreadyDeletedEntry" })
  public void testUserEntrySearch() throws Exception
  @DataProvider(name = "userEntrySearchData")
  protected Object[][] userEntrySearchData()
  {
    userEntrySearch(false);
    userEntrySearch(true);
    return new Object[][] {
      // @formatter:off
      { true,  SearchScope.BASE_OBJECT, 1 },
      { false, SearchScope.BASE_OBJECT, 1 },
      { true,  SearchScope.SINGLE_LEVEL, 0 },
      { false, SearchScope.SINGLE_LEVEL, 0 },
      { true,  SearchScope.WHOLE_SUBTREE, 1 },
      { false, SearchScope.WHOLE_SUBTREE, 1 },
      // @formatter:on
    };
  }
  private void userEntrySearch(boolean useInternalConnection) throws Exception
  @Test(dataProvider = "userEntrySearchData",
      dependsOnMethods = { "testAdd", "testModifyEntry", "testRenameEntry", "testDeleteAlreadyDeletedEntry" })
  public void testUserEntrySearch(boolean useInternalConnection, SearchScope scope, int expectedEntryCount)
      throws Exception
  {
    SearchRequest request = newSearchRequest(searchDN, SearchScope.BASE_OBJECT, "objectclass=*");
    SearchRequest request = newSearchRequest(searchDN, scope, "objectclass=*");
    List<SearchResultEntry> result = runSearch(request, useInternalConnection);
    assertEquals(result.size(), 1, "User entry search should return a single child entry");
    assertEquals(result.size(), expectedEntryCount, "User entry search should return " + expectedEntryCount
        + " child entry");
    if (expectedEntryCount > 0)
    {
    assertEquals(searchDN, result.get(0).getName(), "User entry search should return the expected entry");
  }
  }
  @Test(dependsOnMethods = { "testAdd", "testModifyEntry", "testRenameEntry", "testDeleteAlreadyDeletedEntry" })
  public void testGetEntry() throws Exception
opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/pdb/PDBTestCase.java
@@ -32,10 +32,12 @@
import org.opends.server.admin.std.server.PDBBackendCfg;
import org.opends.server.backends.pdb.PDBBackend;
import org.opends.server.backends.pluggable.PluggableBackendImplTestCase;
import org.testng.annotations.Test;
/**
 * PDBBackend Tester.
 */
@Test
public class PDBTestCase extends PluggableBackendImplTestCase<PDBBackendCfg>
{
  @Override