diff --git a/lib/Kolab/CardDAV/ContactsBackend.php b/lib/Kolab/CardDAV/ContactsBackend.php --- a/lib/Kolab/CardDAV/ContactsBackend.php +++ b/lib/Kolab/CardDAV/ContactsBackend.php @@ -982,10 +982,12 @@ break; case 'PHOTO': - $param = $prop->offsetGet('encoding') ?: $prop->parameters[0]; - if (($pvalue = $param->getValue()) && (strtolower($pvalue) == 'b' || strtolower($pvalue) == 'base64') || strtolower($param->name) == 'base64') { + if ($prop instanceof VObject\Property\Binary && $value) { $contact['photo'] = $value; } + else if ($prop instanceof VObject\Property\Uri && preg_match('|^data:image/[a-z]+;base64,|i', $value, $m)) { + $contact['photo'] = base64_decode(substr($value, strlen($m[0]))); + } break; // VCard 4.0 properties diff --git a/test/Unit/CardDAV/ContactsBackend.php b/test/Unit/CardDAV/ContactsBackend.php --- a/test/Unit/CardDAV/ContactsBackend.php +++ b/test/Unit/CardDAV/ContactsBackend.php @@ -25,4 +25,31 @@ $this->assertRegexp('/PHOTO;ENCODING=b;TYPE=GIF:R0l/', $vcard); } + + /** + * Test vCard PHOTO (T2043) + * + * @dataProvider data_T2043 + */ + function test_T2043($input, $output, $version) + { + $backend = new ContactsBackend; + $vcard = "BEGIN:VCARD\nVERSION:$version\nN:Thompson;Default;;;\nUID:1\n$input\nEND:VCARD"; + $contact = $backend->parse_vcard($vcard); + + $this->assertSame($output, $contact['photo']); + } + + function data_T2043() + { + return array( + array('PHOTO;JPEG;ENCODING=BASE64:' . base64_encode('abc'), 'abc', '2.1'), + array('PHOTO;TYPE=JPEG;ENCODING=b:' . base64_encode('abc'), 'abc', '3.0'), + array('PHOTO:data:image/jpeg;base64,'. base64_encode('abc'), 'abc', '4.0'), + // As we do not support photo URLs yet we expect NULL here + //array('PHOTO;JPEG:http://example.com/photo.jpg', null, '2.1'), // invalid? + array('PHOTO;TYPE=JPEG;VALUE=URI:http://example.com/photo.jpg', null, '3.0'), + array('PHOTO;MEDIATYPE=image/jpeg:http://example.com/photo.jpg', null, '4.0'), + ); + } }