From 0203f16312bc949a5cf46ce90fa43de9119e23a8 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Mon, 05 Mar 2012 14:56:17 -0500
Subject: [PATCH] - Fix duplicate names handling in addressbook searches (#1488375)

---
 program/steps/addressbook/list.inc   |    2 +-
 CHANGELOG                            |    1 +
 program/steps/addressbook/undo.inc   |    7 -------
 program/steps/addressbook/func.inc   |   18 ++++++++++++++++++
 program/steps/addressbook/delete.inc |    3 ++-
 program/steps/addressbook/export.inc |    3 ++-
 program/steps/addressbook/search.inc |    3 ++-
 7 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 59c44b9..5864b2b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix duplicate names handling in addressbook searches (#1488375)
 - Fix displaying HTML messages from Disqus (#1488372)
 - Exclude E_STRICT from error_reporting for PHP 5.4
 - Copy all skins in installto script (#1488376)
diff --git a/program/steps/addressbook/delete.inc b/program/steps/addressbook/delete.inc
index beba1ae..f19dcf4 100644
--- a/program/steps/addressbook/delete.inc
+++ b/program/steps/addressbook/delete.inc
@@ -72,6 +72,7 @@
 
 // update saved search after data changed
 if (($search_request = $_REQUEST['_search']) && isset($_SESSION['search'][$search_request])) {
+    $sort_col = $RCMAIL->config->get('addressbook_sort_col', 'name');
     $search  = (array)$_SESSION['search'][$search_request];
     $records = array();
 
@@ -94,7 +95,7 @@
 
         while ($row = $result->next()) {
             $row['sourceid'] = $s;
-            $key = $row['name'] . ':' . $row['sourceid'];
+            $key = rcmail_contact_key($row, $sort_col);
             $records[$key] = $row;
         }
         unset($result);
diff --git a/program/steps/addressbook/export.inc b/program/steps/addressbook/export.inc
index 0fe193b..c0dbd8b 100644
--- a/program/steps/addressbook/export.inc
+++ b/program/steps/addressbook/export.inc
@@ -27,6 +27,7 @@
 // Use search result
 if (!empty($_REQUEST['_search']) && isset($_SESSION['search'][$_REQUEST['_search']]))
 {
+    $sort_col = $RCMAIL->config->get('addressbook_sort_col', 'name');
     $search  = (array)$_SESSION['search'][$_REQUEST['_search']];
     $records = array();
 
@@ -44,7 +45,7 @@
 
         while ($row = $result->next()) {
             $row['sourceid'] = $s;
-            $key = $row['name'] . ':' . $row['sourceid'];
+            $key = rcmail_contact_key($row, $sort_col);
             $records[$key] = $row;
         }
         unset($result);
diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc
index f261527..84796ba 100644
--- a/program/steps/addressbook/func.inc
+++ b/program/steps/addressbook/func.inc
@@ -729,6 +729,24 @@
 }
 
 
+function rcmail_contact_key($row, $sort_col)
+{
+    $key = $row[$sort_col] . ':' . $row['sourceid'];
+
+    // add email to a key to not skip contacts with the same name (#1488375)
+    if (!empty($row['email'])) {
+         if (is_array($row['email'])) {
+             $key .= ':' . implode(':', $row['email']);
+         }
+         else {
+             $key .= ':' . $row['email'];
+         }
+     }
+
+     return $key;
+}
+
+
 /**
  * Returns contact ID(s) and source(s) from GET/POST data
  *
diff --git a/program/steps/addressbook/list.inc b/program/steps/addressbook/list.inc
index de7149b..91852a4 100644
--- a/program/steps/addressbook/list.inc
+++ b/program/steps/addressbook/list.inc
@@ -50,7 +50,7 @@
 
         while ($row = $result->next()) {
             $row['sourceid'] = $s;
-            $key = $row[$sort_col] . ':' . $row['sourceid'];
+            $key = rcmail_contact_key($row, $sort_col);
             $records[$key] = $row;
         }
         unset($result);
diff --git a/program/steps/addressbook/search.inc b/program/steps/addressbook/search.inc
index 54d2c4d..2c65481 100644
--- a/program/steps/addressbook/search.inc
+++ b/program/steps/addressbook/search.inc
@@ -147,6 +147,7 @@
     $sources    = $RCMAIL->get_address_sources();
     $search_set = array();
     $records    = array();
+    $sort_col   = $RCMAIL->config->get('addressbook_sort_col', 'name');
 
     foreach ($sources as $s) {
         $source = $RCMAIL->get_address_book($s['id']);
@@ -185,7 +186,7 @@
 
         while ($row = $result->next()) {
             $row['sourceid'] = $s['id'];
-            $key = $row['name'] . ':' . $row['sourceid'];
+            $key = rcmail_contact_key($row, $sort_col);
             $records[$key] = $row;
         }
 
diff --git a/program/steps/addressbook/undo.inc b/program/steps/addressbook/undo.inc
index 88701a4..4283ed1 100644
--- a/program/steps/addressbook/undo.inc
+++ b/program/steps/addressbook/undo.inc
@@ -68,13 +68,6 @@
             continue;
         }
 
-        while ($row = $result->next()) {
-            $row['sourceid'] = $s;
-            $key = $row['name'] . ':' . $row['sourceid'];
-            $records[$key] = $row;
-        }
-        unset($result);
-
         $search[$s] = $source->get_search_set();
     }
 

--
Gitblit v1.9.1