From e83f035887e3a463568465673ae92f365788c2a5 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 29 Aug 2009 14:41:17 -0400
Subject: [PATCH] - Fix LDAP contact update when RDN field is changed (#1485788)

---
 program/include/rcube_ldap.php |   31 +++++++++++++++++++++----------
 1 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php
index 37edca7..b13e883 100644
--- a/program/include/rcube_ldap.php
+++ b/program/include/rcube_ldap.php
@@ -480,32 +480,43 @@
       } // end if
     } // end foreach
 
-    // Update the entry as required.
     $dn = base64_decode($id);
+
+    // Update the entry as required.
     if (!empty($deletedata)) {
       // Delete the fields.
-      $res = ldap_mod_del($this->conn, $dn, $deletedata);
-      if ($res === FALSE) {
+      if (!ldap_mod_del($this->conn, $dn, $deletedata))
         return false;
-      } // end if
     } // end if
 
     if (!empty($replacedata)) {
+      // Handle RDN change
+      if ($replacedata[$this->prop['LDAP_rdn']]) {
+        $newdn = $this->prop['LDAP_rdn'].'='.$replacedata[$this->prop['LDAP_rdn']].','.$this->prop['base_dn']; 
+        if ($dn != $newdn) {
+          $newrdn = $this->prop['LDAP_rdn'].'='.$replacedata[$this->prop['LDAP_rdn']];
+          unset($replacedata[$this->prop['LDAP_rdn']]);
+        }
+      }
       // Replace the fields.
-      $res = ldap_mod_replace($this->conn, $dn, $replacedata);
-      if ($res === FALSE) {
-        return false;
+      if (!empty($replacedata)) {
+        if (!ldap_mod_replace($this->conn, $dn, $replacedata))
+          return false;
       } // end if
     } // end if
 
     if (!empty($newdata)) {
       // Add the fields.
-      $res = ldap_mod_add($this->conn, $dn, $newdata);
-      if ($res === FALSE) {
+      if (!ldap_mod_add($this->conn, $dn, $newdata))
         return false;
-      } // end if
     } // end if
 
+    // Handle RDN change
+    if (!empty($newrdn)) {
+      if (@ldap_rename($this->conn, $dn, $newrdn, NULL, TRUE))
+        return base64_encode($newdn);
+    }
+
     return true;
   }
   

--
Gitblit v1.9.1