Aleksander Machniak
2013-12-04 18b40c1a3214518764e99f69b581bd7c90426091
Fix issue where groups were not deleted when "Replace entire addressbook" option on contacts import was used (#1489420)
5 files modified
56 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_addressbook.php 4 ●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_contacts.php 35 ●●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_ldap.php 14 ●●●●● patch | view | raw | blame | history
program/steps/addressbook/import.inc 2 ●●● patch | view | raw | blame | history
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)
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 */
    }
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
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');
            }
        }
    }
    /**
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) {