From 18b40c1a3214518764e99f69b581bd7c90426091 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Wed, 04 Dec 2013 07:58:43 -0500
Subject: [PATCH] Fix issue where groups were not deleted when "Replace entire addressbook" option on contacts import was used (#1489420)

---
 CHANGELOG                                   |    1 +
 program/lib/Roundcube/rcube_addressbook.php |    4 +++-
 program/steps/addressbook/import.inc        |    2 +-
 program/lib/Roundcube/rcube_ldap.php        |   14 +++++++++++++-
 program/lib/Roundcube/rcube_contacts.php    |   35 ++++++++++++++++++++++++-----------
 5 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index c047873..3f1bcf3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix issue where groups were not deleted when "Replace entire addressbook" option on contacts import was used (#1489420)
 - Fix unreliable mimetype tests in Installer (#1489453)
 - Fix performance of listing writeable folders (#1489451)
 
diff --git a/program/lib/Roundcube/rcube_addressbook.php b/program/lib/Roundcube/rcube_addressbook.php
index 886f65c..ed6ffcd 100644
--- a/program/lib/Roundcube/rcube_addressbook.php
+++ b/program/lib/Roundcube/rcube_addressbook.php
@@ -311,8 +311,10 @@
 
     /**
      * Mark all records in database as deleted
+     *
+     * @param bool $with_groups Remove also groups
      */
-    function delete_all()
+    function delete_all($with_groups = false)
     {
         /* empty for read-only address books */
     }
diff --git a/program/lib/Roundcube/rcube_contacts.php b/program/lib/Roundcube/rcube_contacts.php
index 2e03352..ee53f44 100644
--- a/program/lib/Roundcube/rcube_contacts.php
+++ b/program/lib/Roundcube/rcube_contacts.php
@@ -812,16 +812,30 @@
 
     /**
      * Remove all records from the database
+     *
+     * @param bool $with_groups Remove also groups
+     *
+     * @return int Number of removed records
      */
-    function delete_all()
+    function delete_all($with_groups = false)
     {
         $this->cache = null;
 
-        $this->db->query("UPDATE ".$this->db->table_name($this->db_name).
-            " SET del=1, changed=".$this->db->now().
-            " WHERE user_id = ?", $this->user_id);
+        $this->db->query("UPDATE " . $this->db->table_name($this->db_name)
+            . " SET del = 1, changed = " . $this->db->now()
+            . " WHERE user_id = ?", $this->user_id);
 
-        return $this->db->affected_rows();
+        $count = $this->db->affected_rows();
+
+        if ($with_groups) {
+            $this->db->query("UPDATE " . $this->db->table_name($this->db_groups)
+                . " SET del = 1, changed = " . $this->db->now()
+                . " WHERE user_id = ?", $this->user_id);
+
+            $count += $this->db->affected_rows();
+        }
+
+        return $count;
     }
 
 
@@ -860,11 +874,11 @@
     function delete_group($gid)
     {
         // flag group record as deleted
-        $sql_result = $this->db->query(
-            "UPDATE ".$this->db->table_name($this->db_groups).
-            " SET del=1, changed=".$this->db->now().
-            " WHERE contactgroup_id=?".
-            " AND user_id=?",
+        $this->db->query(
+            "UPDATE " . $this->db->table_name($this->db_groups)
+            . " SET del = 1, changed = " . $this->db->now()
+            . " WHERE contactgroup_id = ?"
+            . " AND user_id = ?",
             $gid, $this->user_id
         );
 
@@ -872,7 +886,6 @@
 
         return $this->db->affected_rows();
     }
-
 
     /**
      * Rename a specific contact group
diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php
index b733e24..2d4aa08 100644
--- a/program/lib/Roundcube/rcube_ldap.php
+++ b/program/lib/Roundcube/rcube_ldap.php
@@ -1324,8 +1324,10 @@
 
     /**
      * Remove all contact records
+     *
+     * @param bool $with_groups Delete also groups if enabled
      */
-    function delete_all()
+    function delete_all($with_groups = false)
     {
         // searching for contact entries
         $dn_list = $this->ldap->list_entries($this->base_dn, $this->prop['filter'] ? $this->prop['filter'] : '(objectclass=*)');
@@ -1336,6 +1338,16 @@
             }
             $this->delete($dn_list);
         }
+
+        if ($with_groups && $this->groups && ($groups = $this->_fetch_groups()) && count($groups)) {
+            foreach ($groups as $group) {
+                $this->ldap->delete($group['dn']);
+            }
+
+            if ($this->cache) {
+                $this->cache->remove('groups');
+            }
+        }
     }
 
     /**
diff --git a/program/steps/addressbook/import.inc b/program/steps/addressbook/import.inc
index 60f5d7b..4cfa947 100644
--- a/program/steps/addressbook/import.inc
+++ b/program/steps/addressbook/import.inc
@@ -249,7 +249,7 @@
         $IMPORT_STATS->inserted = $IMPORT_STATS->skipped = $IMPORT_STATS->invalid = $IMPORT_STATS->errors = 0;
 
         if ($replace) {
-            $CONTACTS->delete_all();
+            $CONTACTS->delete_all($CONTACTS->groups && $with_groups < 2);
         }
 
         if ($with_groups) {

--
Gitblit v1.9.1