From 9f443811d6c86db26eb474a61df7021f98c32c78 Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Mon, 07 Jun 2010 08:59:50 +0000
Subject: [PATCH] Add support for MS AD Permissive Modify Control (Issue/Enhancement #4238)

---
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java |   30 +++++++++++++++++++++---------
 1 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
index b8e1d38..c011803 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyOperation.java
@@ -120,6 +120,11 @@
   protected boolean noOp;
 
   /**
+   * Indicates whether the request included the Permissive Modify control.
+   */
+  protected boolean permissiveModify = false;
+
+  /**
    * Indicates whether this modify operation includees a password change.
    */
   protected boolean passwordChanged;
@@ -287,7 +292,7 @@
   public void addModification(Modification modification)
     throws DirectoryException
   {
-    modifiedEntry.applyModification(modification);
+    modifiedEntry.applyModification(modification, permissiveModify);
     super.addModification(modification);
   }
 
@@ -839,6 +844,10 @@
         {
           noOp = true;
         }
+        else if (oid.equals(OID_PERMISSIVE_MODIFY_CONTROL))
+        {
+          permissiveModify = true;
+        }
         else if (oid.equals(OID_LDAP_READENTRY_PREREAD))
         {
           preReadRequest =
@@ -1496,7 +1505,7 @@
     LinkedList<AttributeValue> duplicateValues =
       new LinkedList<AttributeValue>();
     modifiedEntry.addAttribute(attr, duplicateValues);
-    if (!duplicateValues.isEmpty())
+    if (!duplicateValues.isEmpty() && !permissiveModify)
     {
       StringBuilder buffer = new StringBuilder();
       Iterator<AttributeValue> iterator = duplicateValues.iterator();
@@ -1604,18 +1613,21 @@
       }
       else
       {
-        StringBuilder buffer = new StringBuilder();
-        Iterator<AttributeValue> iterator = missingValues.iterator();
-        buffer.append(iterator.next().getValue().toString());
-        while (iterator.hasNext())
+        if (! permissiveModify)
         {
-          buffer.append(", ");
+          StringBuilder buffer = new StringBuilder();
+          Iterator<AttributeValue> iterator = missingValues.iterator();
           buffer.append(iterator.next().getValue().toString());
-        }
+          while (iterator.hasNext())
+          {
+            buffer.append(", ");
+            buffer.append(iterator.next().getValue().toString());
+          }
 
-        throw new DirectoryException(ResultCode.NO_SUCH_ATTRIBUTE,
+          throw new DirectoryException(ResultCode.NO_SUCH_ATTRIBUTE,
                        ERR_MODIFY_DELETE_MISSING_VALUES.get(
                             String.valueOf(entryDN), attr.getName(), buffer));
+        }
       }
     }
     else

--
Gitblit v1.10.0