Aleksander Machniak
2013-05-05 e4f288c3fe8cba1e271d346ec393c02db0793773
Fix backslash character handling on vCard import (#1489085)
3 files modified
38 ■■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_vcard.php 23 ●●●●● patch | view | raw | blame | history
tests/Framework/VCard.php 14 ●●●●● patch | view | raw | blame | history
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)
- Fix Reply-To header handling in Reply-All action (#1489037)
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;
    }
    /**
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'));