. * */ namespace OCA\Contacts\CardDAV; use Sabre\VObject; use OCA\Contacts\VObject\VCard; /** * This class overrides Sabre_CardDAV_Plugin::validateVCard() to be able * to import partially invalid vCards by ignoring invalid lines and to * validate and upgrade using \OCA\Contacts\VCard. */ class Plugin extends \Sabre_CardDAV_Plugin { /** * Checks if the submitted vCard data is in fact, valid. * * An exception is thrown if it's not. * * @param resource|string $data * @return void */ protected function validateVCard(&$data) { \OCP\Util::writeLog('contacts', __METHOD__, \OCP\Util::DEBUG); // If it's a stream, we convert it to a string first. if (is_resource($data)) { $data = stream_get_contents($data); } // Converting the data to unicode, if needed. $data = \Sabre_DAV_StringUtil::ensureUTF8($data); try { $vobj = VObject\Reader::read($data, VObject\Reader::OPTION_IGNORE_INVALID_LINES); } catch (VObject\ParseException $e) { throw new \Sabre_DAV_Exception_UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage()); } if ($vobj->name !== 'VCARD') { throw new \Sabre_DAV_Exception_UnsupportedMediaType('This collection can only support vcard objects.'); } $vobj->validate(VCard::REPAIR|VCard::UPGRADE); $data = $vobj->serialize(); } }