public function testConvertToTine20ModelXCalendarAccess() { $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.10.2'); $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_lion_access_private.ics', 'r'); $event = $converter->toTine20Model($vcalendarStream); $this->assertEquals(Calendar_Model_Event::CLASS_PRIVATE, $event->class); $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_lion_access_attendee.ics', 'r'); $event = $converter->toTine20Model($vcalendarStream); $this->assertEquals(Calendar_Model_Event::CLASS_PUBLIC, $event->class); $iosPrivateIcs = dirname(__FILE__) . '/../../../Import/files/ios_private.ics'; $vcalendarStream = fopen($iosPrivateIcs, 'r'); $event = $converter->toTine20Model($vcalendarStream); $this->assertEquals(Calendar_Model_Event::CLASS_PRIVATE, $event->class); // try again with ios user agent $iosUserAgent = 'iOS/8.2 (12D508) dataaccessd/1.0'; list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($iosUserAgent); $converter = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version); $vcalendarStream = fopen($iosPrivateIcs, 'r'); $event = $converter->toTine20Model($vcalendarStream); $this->assertEquals(Calendar_Model_Event::CLASS_PRIVATE, $event->class); }
/** * this function creates a Calendar_Model_Event and stores it in the database * * @todo the header handling does not belong here. It should be moved to the DAV_Server class when supported * * @param Tinebase_Model_Container $container * @param stream|string $vobjectData */ public static function create(Tinebase_Model_Container $container, $name, $vobjectData) { if (is_resource($vobjectData)) { $vobjectData = stream_get_contents($vobjectData); } // Converting to UTF-8, if needed $vobjectData = Sabre_DAV_StringUtil::ensureUTF8($vobjectData); Sabre_CalDAV_ICalendarUtil::validateICalendarObject($vobjectData, array('VEVENT', 'VFREEBUSY')); list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']); $event = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version)->toTine20Model($vobjectData); $event->container_id = $container->getId(); $id = ($pos = strpos($name, '.')) === false ? $name : substr($name, 0, $pos); $event->setId($id); self::enforceEventParameters($event); if ($event->exdate instanceof Tinebase_Record_RecordSet) { foreach ($event->exdate as $exdate) { if ($exdate->is_deleted == false && $exdate->organizer != $event->organizer) { throw new Sabre_DAV_Exception_PreconditionFailed('Organizer for exdate must be the same like base event'); } } } // check if there is already an existing event with this ID // this can happen when the invitation email is faster then the caldav update or // or when an event gets moved to another container $filter = new Calendar_Model_EventFilter(array(array('field' => 'containerType', 'operator' => 'equals', 'value' => 'all'), array('field' => 'dtstart', 'operator' => 'equals', 'value' => $event->dtstart), array('field' => 'dtend', 'operator' => 'equals', 'value' => $event->dtend), array('condition' => 'OR', 'filters' => array(array('field' => 'id', 'operator' => 'equals', 'value' => $id), array('field' => 'uid', 'operator' => 'equals', 'value' => $id))))); $existingEvent = Calendar_Controller_MSEventFacade::getInstance()->search($filter, null, false, false, 'sync')->getFirstRecord(); if ($existingEvent === null) { $event = Calendar_Controller_MSEventFacade::getInstance()->create($event); $vevent = new self($container, $event); } else { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' update existing event'); } $vevent = new self($container, $existingEvent); $vevent->put($vobjectData); } return $vevent; }
/** * checks if client supports delegations * * @return boolean * * @todo don't use $_SERVER to fetch user agent * @todo move user agent parsing to Tinebase */ protected function _clientSupportsDelegations() { if (isset($_SERVER['HTTP_USER_AGENT'])) { list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']); $clientSupportsDelegations = $backend === Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX; } else { $clientSupportsDelegations = false; } return $clientSupportsDelegations; }
/** * get ics converter * * @return Calendar_Convert_Event_VCalendar_Abstract */ protected function _getConverter() { if (!$this->_converter) { list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($this->userAgent); $this->_converter = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version); } return $this->_converter; }
/** * test factory with useragent string from thunderbird */ public function testUserAgentIceowl() { list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent('Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20111110 Iceowl/1.0b1 Icedove/3.0.11'); $this->assertEquals(Calendar_Convert_Event_VCalendar_Factory::CLIENT_THUNDERBIRD, $backend); $this->assertEquals('1.0b1', $version); }
/** * create instance of Calendar_Convert_Event_VCalendar_* * * @return Calendar_Convert_Event_VCalendar_Abstract */ public function _getConverter() { list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']); if (!$this->_converter) { $this->_converter = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version); } return $this->_converter; }