Ejemplo n.º 1
0
 /**
  * Updates the VCard-formatted object
  *
  * @param string $cardData
  * @return string|null
  */
 public function put($cardData)
 {
     if (is_resource($cardData)) {
         $cardData = stream_get_contents($cardData);
     }
     // Converting to UTF-8, if needed
     $cardData = DAV\StringUtil::ensureUTF8($cardData);
     $etag = $this->carddavBackend->updateCard($this->addressBookInfo['id'], $this->cardData['uri'], $cardData);
     $this->cardData['carddata'] = $cardData;
     $this->cardData['etag'] = $etag;
     return $etag;
 }
Ejemplo n.º 2
0
 /**
  * Checks if the submitted iCalendar data is in fact, valid.
  *
  * An exception is thrown if it's not.
  *
  * @param resource|string $data
  * @param string $path
  * @return void
  */
 protected function validateICalendar(&$data, $path)
 {
     // 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 = DAV\StringUtil::ensureUTF8($data);
     try {
         $vobj = VObject\Reader::read($data);
     } catch (VObject\ParseException $e) {
         throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid iCalendar 2.0 data. Parse error: ' . $e->getMessage());
     }
     if ($vobj->name !== 'VCALENDAR') {
         throw new DAV\Exception\UnsupportedMediaType('This collection can only support iCalendar objects.');
     }
     // Get the Supported Components for the target calendar
     list($parentPath, $object) = DAV\URLUtil::splitPath($path);
     $calendarProperties = $this->server->getProperties($parentPath, array('{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'));
     $supportedComponents = $calendarProperties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue();
     $foundType = null;
     $foundUID = null;
     foreach ($vobj->getComponents() as $component) {
         switch ($component->name) {
             case 'VTIMEZONE':
                 continue 2;
             case 'VEVENT':
             case 'VTODO':
             case 'VJOURNAL':
                 if (is_null($foundType)) {
                     $foundType = $component->name;
                     if (!in_array($foundType, $supportedComponents)) {
                         throw new Exception\InvalidComponentType('This calendar only supports ' . implode(', ', $supportedComponents) . '. We found a ' . $foundType);
                     }
                     if (!isset($component->UID)) {
                         throw new DAV\Exception\BadRequest('Every ' . $component->name . ' component must have an UID');
                     }
                     $foundUID = (string) $component->UID;
                 } else {
                     if ($foundType !== $component->name) {
                         throw new DAV\Exception\BadRequest('A calendar object must only contain 1 component. We found a ' . $component->name . ' as well as a ' . $foundType);
                     }
                     if ($foundUID !== (string) $component->UID) {
                         throw new DAV\Exception\BadRequest('Every ' . $component->name . ' in this object must have identical UIDs');
                     }
                 }
                 break;
             default:
                 throw new DAV\Exception\BadRequest('You are not allowed to create components of type: ' . $component->name . ' here');
         }
     }
     if (!$foundType) {
         throw new DAV\Exception\BadRequest('iCalendar object must contain at least 1 of VEVENT, VTODO or VJOURNAL');
     }
 }
 /**
  * This method checks the validity of a text-match.
  *
  * A single text-match should be specified as well as the specific property
  * or parameter we need to validate.
  *
  * @param VObject\Node|string $check Value to check against.
  * @param array $textMatch
  * @return bool
  */
 protected function validateTextMatch($check, array $textMatch)
 {
     if ($check instanceof VObject\Node) {
         $check = (string) $check;
     }
     $isMatching = \SabreForRainLoop\DAV\StringUtil::textMatch($check, $textMatch['value'], $textMatch['collation']);
     return $textMatch['negate-condition'] xor $isMatching;
 }
Ejemplo n.º 4
0
 /**
  * Validates if a text-filter can be applied to a specific property.
  *
  * @param array $texts
  * @param array $filters
  * @param string $test
  * @return bool
  */
 protected function validateTextMatches(array $texts, array $filters, $test)
 {
     foreach ($filters as $filter) {
         $success = false;
         foreach ($texts as $haystack) {
             $success = DAV\StringUtil::textMatch($haystack, $filter['value'], $filter['collation'], $filter['match-type']);
             // Breaking on the first match
             if ($success) {
                 break;
             }
         }
         if ($filter['negate-condition']) {
             $success = !$success;
         }
         if ($success && $test === 'anyof') {
             return true;
         }
         if (!$success && $test == 'allof') {
             return false;
         }
     }
     // If we got all the way here, it means we haven't been able to
     // determine early if the test failed or not.
     //
     // This implies for 'anyof' that the test failed, and for 'allof' that
     // we succeeded. Sounds weird, but makes sense.
     return $test === 'allof';
 }
Ejemplo n.º 5
0
 /**
  * Creates a new file
  *
  * The contents of the new file must be a valid VCARD.
  *
  * This method may return an ETag.
  *
  * @param string $name
  * @param resource $vcardData
  * @return string|null
  */
 public function createFile($name, $vcardData = null)
 {
     if (is_resource($vcardData)) {
         $vcardData = stream_get_contents($vcardData);
     }
     // Converting to UTF-8, if needed
     $vcardData = DAV\StringUtil::ensureUTF8($vcardData);
     return $this->carddavBackend->createCard($this->addressBookInfo['id'], $name, $vcardData);
 }