From 3a0dc87856cc0c2a47649e58e930621506e64cbf Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sun, 05 May 2013 10:39:29 -0400
Subject: [PATCH] Fix backslash character handling on vCard import (#1489085)

---
 CHANGELOG                             |    1 +
 program/lib/Roundcube/rcube_vcard.php |   23 ++++++++++++++++++++++-
 tests/Framework/VCard.php             |   14 ++++++++++++++
 3 files changed, 37 insertions(+), 1 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 56d5d7b..c97df8c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix backslash character handling on vCard import (#1489085)
 - Fix csv import from Thunderbird with French localization (#1489059)
 - Fix messages list focus issue in Opera and Webkit (#1489058)
 - Make PHP code eval() free, use create_function()
diff --git a/program/lib/Roundcube/rcube_vcard.php b/program/lib/Roundcube/rcube_vcard.php
index 54bb952..cc3a358 100644
--- a/program/lib/Roundcube/rcube_vcard.php
+++ b/program/lib/Roundcube/rcube_vcard.php
@@ -784,9 +784,30 @@
                 }
                 return $result;
             }
+
+            $s = strtr($s, $rep2);
         }
 
-        return strtr($s, array("\r" => '', '\\\\' => '\\', '\n' => "\n", '\N' => "\n", '\,' => ',', '\;' => ';'));
+        // some implementations (GMail) use non-standard backslash before colon (#1489085)
+        // we will handle properly any backslashed character - removing dummy backslahes
+        // return strtr($s, array("\r" => '', '\\\\' => '\\', '\n' => "\n", '\N' => "\n", '\,' => ',', '\;' => ';'));
+
+        $s   = str_replace("\r", '', $s);
+        $pos = 0;
+
+        while (($pos = strpos($s, '\\', $pos)) !== false) {
+            $next = substr($s, $pos + 1, 1);
+            if ($next == 'n' || $next == 'N') {
+                $s = substr_replace($s, "\n", $pos, 2);
+            }
+            else {
+                $s = substr_replace($s, '', $pos, 1);
+            }
+
+            $pos += 1;
+        }
+
+        return $s;
     }
 
     /**
diff --git a/tests/Framework/VCard.php b/tests/Framework/VCard.php
index 15aa5d8..3353b5b 100644
--- a/tests/Framework/VCard.php
+++ b/tests/Framework/VCard.php
@@ -65,6 +65,20 @@
         $this->assertEquals("prefix", $vcard['prefix'], "Decode backslash character");
     }
 
+    /**
+     * Backslash parsing test (#1489085)
+     */
+    function test_parse_five()
+    {
+        $vcard = "BEGIN:VCARD\nVERSION:3.0\nN:last\\\\\\a;fir\\nst\nURL:http\\://domain.tld\nEND:VCARD";
+        $vcard = new rcube_vcard($vcard, null);
+        $vcard = $vcard->get_assoc();
+
+        $this->assertEquals("last\\a", $vcard['surname'], "Decode dummy backslash character");
+        $this->assertEquals("fir\nst", $vcard['firstname'], "Decode backslash character");
+        $this->assertEquals("http://domain.tld", $vcard['website:other'][0], "Decode dummy backslash character");
+    }
+
     function test_import()
     {
         $input = file_get_contents($this->_srcpath('apple.vcf'));

--
Gitblit v1.9.1