From a829b1cd386364a4028d19c0d208657685ce5513 Mon Sep 17 00:00:00 2001
From: Valery Kharseko <vharseko@3a-systems.ru>
Date: Mon, 09 Sep 2024 09:05:28 +0000
Subject: [PATCH] [#387] FIX do not check DIT structure parent/child on same ObjectClass (#390)

---
 opendj-server-legacy/src/test/java/org/opends/server/extensions/Issue387TestCase.java |  108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java                 |    2 
 2 files changed, 109 insertions(+), 1 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java b/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
index 608f239..a2fdb87 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/Entry.java
@@ -2196,7 +2196,7 @@
             logger.error(message);
           }
         }
-        else
+        else if (!structuralClass.equals(parentStructuralClass))
         {
           Collection<NameForm> allNFs = getSchema().getNameForms(parentStructuralClass);
           if(allNFs != null)
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/extensions/Issue387TestCase.java b/opendj-server-legacy/src/test/java/org/opends/server/extensions/Issue387TestCase.java
new file mode 100644
index 0000000..97e9b31
--- /dev/null
+++ b/opendj-server-legacy/src/test/java/org/opends/server/extensions/Issue387TestCase.java
@@ -0,0 +1,108 @@
+/*
+ * The contents of this file are subject to the terms of the Common Development and
+ * Distribution License (the License). You may not use this file except in compliance with the
+ * License.
+ *
+ * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
+ * specific language governing permission and limitations under the License.
+ *
+ * When distributing Covered Software, include this CDDL Header Notice in each file and include
+ * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
+ * Header, with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyright [year] [name of copyright owner]".
+ *
+ * Copyright 2024 3A Systems, LLC.
+ */
+package org.opends.server.extensions;
+
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.DN;
+import org.forgerock.opendj.ldap.SearchScope;
+import org.forgerock.opendj.server.config.meta.VirtualAttributeCfgDefn;
+import org.opends.server.TestCaseUtils;
+import org.opends.server.api.VirtualAttributeProvider;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.Entry;
+import org.opends.server.types.SearchFilter;
+import org.opends.server.types.VirtualAttributeRule;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.Collections;
+
+import static org.forgerock.opendj.ldap.schema.CoreSchema.getGoverningStructureRuleAttributeType;
+import static org.testng.Assert.*;
+
+/**
+ * A set of test cases for the governing structure rule virtual attribute
+ * provider.
+ */
+public class Issue387TestCase
+       extends ExtensionsTestCase
+{
+
+  /**
+   * Ensures that the Directory Server is running.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @BeforeClass
+  public void startServer()
+         throws Exception
+  {
+    TestCaseUtils.startServer();
+    TestCaseUtils.initializeTestBackend(true);
+    TestCaseUtils.clearBackend("userRoot", "dc=example,dc=com");
+
+    int resultCode = TestCaseUtils.applyModifications(true,
+    "dn: cn=schema",
+    "changetype: modify",
+    "add: nameForms",
+    "nameForms: ( 1.3.6.1.4.1.56521.999.8.1.7 NAME 'commonNameForm' DESC 'Name Form for a commonName orgRole structure' OC organizationalRole MUST cn )",
+    "-",
+    "add: ditStructureRules",
+    "dITStructureRules: ( 150 NAME 'commonNameStructureRule'  FORM commonNameForm )",
+    "dITStructureRules: ( 151 NAME 'commonNameSubStructureRule' FORM commonNameForm SUP 150 )"
+    );
+    assertEquals(resultCode, 0);
+  }
+
+    @Test
+    public void test()
+            throws Exception
+    {
+        GoverningStructureRuleVirtualAttributeProvider provider =
+                new GoverningStructureRuleVirtualAttributeProvider();
+
+        Entry entry = TestCaseUtils.addEntry(
+                "dn: cn=first,dc=example,dc=com",
+                "objectClass: top",
+                "objectClass: organizationalRole"
+                );
+
+        entry.processVirtualAttributes();
+        assertTrue(provider.hasValue(entry, getRule(provider), ByteString.valueOfUtf8("150")));
+
+
+        entry = DirectoryServer.getEntry(DN.valueOf("dc=example,dc=com"));
+        assertNotNull(entry);
+        assertFalse(entry.hasAttribute(getGoverningStructureRuleAttributeType()));
+
+        entry = TestCaseUtils.addEntry(
+                "dn: cn=second,cn=first,dc=example,dc=com",
+                "objectClass: top",
+                "objectClass: organizationalRole"
+        );
+        entry.processVirtualAttributes();
+        assertTrue(provider.hasValue(entry, getRule(provider), ByteString.valueOfUtf8("150")));
+    }
+
+    private VirtualAttributeRule getRule(VirtualAttributeProvider<?> provider)
+    {
+        return new VirtualAttributeRule(getGoverningStructureRuleAttributeType(), provider,
+                Collections.<DN>emptySet(), SearchScope.WHOLE_SUBTREE,
+                Collections.<DN>emptySet(),
+                Collections.<SearchFilter>emptySet(),
+                VirtualAttributeCfgDefn.ConflictBehavior.VIRTUAL_OVERRIDES_REAL);
+    }
+}

--
Gitblit v1.10.0