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