From 38c1951266b1fda074340be4a8eb840a60f9ac11 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sun, 24 Mar 2013 13:00:17 -0400
Subject: [PATCH] Be less restrictive on vCard import, do not require FN when N exists

---
 program/lib/Roundcube/rcube_vcard.php |    4 +++-
 program/steps/addressbook/import.inc  |   11 ++++++++++-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/program/lib/Roundcube/rcube_vcard.php b/program/lib/Roundcube/rcube_vcard.php
index de28767..54bb952 100644
--- a/program/lib/Roundcube/rcube_vcard.php
+++ b/program/lib/Roundcube/rcube_vcard.php
@@ -491,7 +491,9 @@
             if (preg_match('/^END:VCARD$/i', $line)) {
                 // parse vcard
                 $obj = new rcube_vcard(self::cleanup($vcard_block), $charset, true, self::$fieldmap);
-                if (!empty($obj->displayname) || !empty($obj->email)) {
+                // FN and N is required by vCard format (RFC 2426)
+                // on import we can be less restrictive, let's addressbook decide
+                if (!empty($obj->displayname) || !empty($obj->surname) || !empty($obj->firstname) || !empty($obj->email)) {
                     $out[] = $obj;
                 }
 
diff --git a/program/steps/addressbook/import.inc b/program/steps/addressbook/import.inc
index df07d64..72da150 100644
--- a/program/steps/addressbook/import.inc
+++ b/program/steps/addressbook/import.inc
@@ -209,6 +209,15 @@
         foreach ($vcards as $vcard) {
             $a_record = $vcard->get_assoc();
 
+            // Generate contact's display name (must be before validation), the same we do in save.inc
+            if (empty($a_record['name'])) {
+                $a_record['name'] = rcube_addressbook::compose_display_name($a_record, true);
+                // Reset it if equals to email address (from compose_display_name())
+                if ($a_record['name'] == $a_record['email'][0]) {
+                    $a_record['name'] = '';
+                }
+            }
+
             // skip invalid (incomplete) entries
             if (!$CONTACTS->validate($a_record, true)) {
                 $IMPORT_STATS->invalid++;
@@ -250,7 +259,7 @@
 
             if ($success) {
                 $IMPORT_STATS->inserted++;
-                $IMPORT_STATS->names[] = $vcard->displayname ? $vcard->displayname : $email;
+                $IMPORT_STATS->names[] = $a_record['name'] ? $a_record['name'] : $email;
             }
             else {
                 $IMPORT_STATS->errors++;

--
Gitblit v1.9.1