From 0ae536aeab51a8971f78a1d8a6faf0d21899c23c Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 25 Sep 2015 13:44:44 +0000
Subject: [PATCH] OPENDJ-2302 Import is overly case-sensitive
---
opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java | 15 +++----
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java | 4 +-
opendj-server-legacy/src/test/java/org/opends/server/backends/jeb/TestImportJob.java | 91 ++++++++++++++++++++++++++++++++++++++++-----
3 files changed, 89 insertions(+), 21 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
index 0cfa17e..e02361d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
@@ -4187,12 +4187,10 @@
private boolean insert(DN dn, DatabaseEntry val, DatabaseEntry key)
throws JebException
{
- // Use a compact representation for key
- byte[] dnBytesForKey = dn.toNormalizedByteString().toByteArray();
- key.setData(hashCode(dnBytesForKey));
+ byte[] dnBytes = dn.toNormalizedByteString().toByteArray();
+ key.setData(hashCode(dnBytes));
- // Use a reversible representation for value
- byte[] dnBytesForValue = StaticUtils.getBytes(dn.toString());
+ byte[] dnBytesForValue = dnBytes;
int len = PackedInteger.getWriteIntLength(dnBytesForValue.length);
byte[] dataBytes = new byte[dnBytesForValue.length + len];
int pos = PackedInteger.writeInt(dataBytes, 0, dnBytesForValue.length);
@@ -4280,15 +4278,14 @@
{
Cursor cursor = null;
DatabaseEntry key = new DatabaseEntry();
- byte[] dnBytesForKey = dn.toNormalizedByteString().toByteArray();
- key.setData(hashCode(dnBytesForKey));
+ byte[] dnBytes = dn.toNormalizedByteString().toByteArray();
+ key.setData(hashCode(dnBytes));
try
{
cursor = dnCache.openCursor(null, CursorConfig.DEFAULT);
DatabaseEntry dns = new DatabaseEntry();
OperationStatus status = cursor.getSearchKey(key, dns, LockMode.DEFAULT);
- byte[] dnBytesForValue = StaticUtils.getBytes(dn.toString());
- return status == OperationStatus.SUCCESS && isDNMatched(dns.getData(), dnBytesForValue);
+ return status == OperationStatus.SUCCESS && isDNMatched(dns.getData(), dnBytes);
}
finally
{
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java
index c42a279..80e3af9 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java
@@ -3407,7 +3407,7 @@
// Use a compact representation for key
// and a reversible representation for value
final ByteString key = fnv1AHashCode(dn);
- final ByteString dnValue = ByteString.valueOf(dn);
+ final ByteString dnValue = dn.toNormalizedByteString();
return insert(key, dnValue);
}
@@ -3511,7 +3511,7 @@
final ByteString key = fnv1AHashCode(dn);
final ByteString existingDns = txn.read(dnCache, key);
- return containsDN(existingDns, ByteString.valueOf(dn));
+ return containsDN(existingDns, dn.toNormalizedByteString());
}
});
}
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/backends/jeb/TestImportJob.java b/opendj-server-legacy/src/test/java/org/opends/server/backends/jeb/TestImportJob.java
index dc0f035..06f0baf 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/backends/jeb/TestImportJob.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/backends/jeb/TestImportJob.java
@@ -305,15 +305,82 @@
}
@Test
- public void testImportAll() throws Exception
+ public void testImportCaseInsensitiveDNs() throws Exception
{
- TestCaseUtils.clearJEBackend(backendID);
+ String top2 =
+ "dn: dc=case_insensitive_dns,dc=importtest,dc=com\n"
+ + "objectclass: top\n"
+ + "objectclass: domain\n"
+ + "dc: case_insensitive_dns\n"
+ + "\n"
+ + "dn: ou=People,dc=CASE_INSENSITIVE_DNS,dc=importtest,dc=com\n"
+ + "objectclass: top\n"
+ + "objectclass: organizationalUnit\n"
+ + "ou: People\n";
+ writeTo(top2, "top2.ldif");
RejectSkippedEntries entries = new RejectSkippedEntries();
+ LDIFImportConfig importConfig = newLDIFImportConfig(entries, "top.ldif", "top2.ldif");
+ cleanImport(importConfig);
+
+ importLDIF(importConfig);
+ entries.noSkippedOrRejectedEntries();
+ }
+
+ @Test
+ public void testImportDNsWithInteger() throws Exception
+ {
+ String entryWithIntegerInDN =
+ "dn: photo=#04020001,ou=People,dc=importtest,dc=com\n"
+ + "objectClass: top\n"
+ + "objectClass: person\n"
+ + "objectClass: organizationalPerson\n"
+ + "objectClass: inetOrgPerson\n"
+ + "givenName: Aaccf\n"
+ + "sn: Amar\n"
+ + "cn: Aaccf Amar\n"
+ + "initials: AQA\n"
+ + "employeeNumber: 0\n"
+ + "uid: user.0\n"
+ + "mail: user.0@example.com\n"
+ + "userPassword: password\n"
+ + "telephoneNumber: 380-535-2354\n"
+ + "homePhone: 707-626-3913\n"
+ + "pager: 456-345-7750\n"
+ + "mobile: 366-674-7274\n"
+ + "street: 99262 Eleventh Street\n"
+ + "l: Salem\n"
+ + "st: NM\n"
+ + "postalCode: 36530\n"
+ + "postalAddress: Aaccf Amar$99262 Eleventh Street$Salem, NM 36530\n"
+ + "description: This is the description for Aaccf Amar.\n";
+ writeTo(entryWithIntegerInDN, "entryWithIntegerInDN.ldif");
+
+ RejectSkippedEntries entries = new RejectSkippedEntries();
+ LDIFImportConfig importConfig = newLDIFImportConfig(entries, "top.ldif", "entryWithIntegerInDN.ldif");
+ cleanImport(importConfig);
+
+ importLDIF(importConfig);
+ entries.noSkippedOrRejectedEntries();
+
+ EntryContainer entryContainer = getEntryContainer(importtestDN);
+ entryContainer.sharedLock.lock();
+ try
+ {
+ assertTrue(entryContainer.entryExists(DN.valueOf("photo=#04020001,ou=People,dc=importtest,dc=com")));
+ }
+ finally
+ {
+ entryContainer.sharedLock.unlock();
+ }
+ }
+
+ @Test(dependsOnMethods = { "testImportCaseInsensitiveDNs", "testImportDNsWithInteger" })
+ public void testImportAll() throws Exception
+ {
+ RejectSkippedEntries entries = new RejectSkippedEntries();
LDIFImportConfig importConfig = newLDIFImportConfig(entries, "top.ldif", "entries1.ldif");
- importConfig.setAppendToExistingData(false);
- importConfig.setReplaceExistingEntries(false);
- importConfig.setValidateSchema(true);
+ cleanImport(importConfig);
importLDIF(importConfig);
entries.noSkippedOrRejectedEntries();
@@ -444,13 +511,9 @@
@Test(dependsOnMethods = "testImportReplaceExisting")
public void testImportAppend() throws Exception
{
- TestCaseUtils.clearJEBackend(backendID);
-
RejectSkippedEntries entries = new RejectSkippedEntries();
LDIFImportConfig importConfig = newLDIFImportConfig(entries, "top.ldif");
- importConfig.setAppendToExistingData(false);
- importConfig.setReplaceExistingEntries(false);
- importConfig.setValidateSchema(true);
+ cleanImport(importConfig);
importLDIF(importConfig);
entries.noSkippedOrRejectedEntries();
@@ -528,6 +591,14 @@
return cfg;
}
+ private void cleanImport(LDIFImportConfig importConfig) throws Exception
+ {
+ TestCaseUtils.clearJEBackend(backendID);
+ importConfig.setAppendToExistingData(false);
+ importConfig.setReplaceExistingEntries(false);
+ importConfig.setValidateSchema(true);
+ }
+
private void importLDIF(LDIFImportConfig importConfig) throws DirectoryException
{
Backend<?> backend = DirectoryServer.getBackend(backendID);
--
Gitblit v1.10.0