public function formatItems($items, $format, $parameters = null) { $vtodos = array(); if ($format === self::FORMAT_TODO) { $user_timezone = CalendarApp::getTimezone(); foreach ($items as $item) { $item['item_source'] = CalendarApp::validateItemSource($item['item_source'], CalendarApp::SHARETODOPREFIX); if (!TasksApp::checkSharedTodo($item['item_source'])) { $event = TasksApp::getEventObject($item['item_source']); $vcalendar = VObject::parse($event['calendardata']); $vtodo = $vcalendar->VTODO; $accessclass = $vtodo->getAsString('CLASS'); if ($accessclass == '' || $accessclass == 'PUBLIC') { $permissions['permissions'] = $item['permissions']; $permissions['calendarcolor'] = '#cccccc'; $permissions['isOnlySharedTodo'] = true; $permissions['calendarowner'] = Object::getowner($item['item_source']); $permissions['displayname'] = $item['uid_owner']; //\OCP\Util::writeLog('calendar','Cal Owner :'.$permissions['calendarowner'].$vtodo -> getAsString('SUMMARY') ,\OCP\Util::DEBUG); $permissions['iscompleted'] = false; if ($vtodo->COMPLETED) { $permissions['iscompleted'] = true; $vtodos['done'][] = TasksApp::arrayForJSON($item['item_source'], $vtodo, $user_timezone, $permissions, $event); } else { $vtodos['open'][] = TasksApp::arrayForJSON($item['item_source'], $vtodo, $user_timezone, $permissions, $event); } } } //$vtodos[] = $vtodo; } } return $vtodos; }
public function parseAlarm($aEvents) { $factor = 60; foreach ($aEvents as $event) { $startalarmtime = 0; $vMode = ''; $object = VObject::parse($event['calendardata']); if (isset($object->VEVENT)) { $vevent = $object->VEVENT; $dtstart = $vevent->DTSTART; $vMode = 'event'; } if (isset($object->VTODO)) { $vevent = $object->VTODO; $dtstart = $vevent->DUE; $vMode = 'todo'; } if ($event['startdate'] !== '' && ($vMode == 'event' || $vMode == 'todo')) { $starttimeTmp = new \DateTime($event['startdate'], new \DateTimeZone('UTC')); $starttimeTmp->setTimezone(new \DateTimeZone(self::$tz)); $starttime = $starttimeTmp->format('d.m.Y H:i'); } else { $starttime = $dtstart->getDateTime()->format('d.m.Y H:i'); } $startTimeShow = $starttime; $starttime = strtotime($starttime); if ($vevent->VALARM) { $valarm = $vevent->VALARM; $triggerTime = $valarm->getAsString('TRIGGER'); if (stristr($triggerTime, 'PT')) { $triggerAlarm = self::parseTrigger($triggerTime); $startalarmtime = $starttime + $triggerAlarm; } else { $triggerDate = $valarm->TRIGGER; if ($triggerDate->getValueType() !== 'DURATION' && $valarm->getAsString('ACTION') === 'DISPLAY') { $triggerAlarm = $triggerDate->getDateTime()->format('d.m.Y H:i'); $startalarmtime = strtotime($triggerAlarm); } } $triggerAction = $valarm->getAsString('ACTION'); } // $checktime=$startalarmtime-$this->nowTime; if ($this->nowTime == $startalarmtime) { $userid = Object::getowner($event['id']); $link = ''; $icon = ''; if ($vMode === 'event') { $link = \OC::$server->getURLGenerator()->linkToRoute(App::$appname . '.page.index') . '#' . urlencode($event['id']); $icon = 'calendar'; } if ($vMode === 'todo') { $link = \OC::$server->getURLGenerator()->linkToRoute('tasksplus.page.index') . '#' . urlencode($event['id']); $icon = 'tasks'; } $this->activeAlarms[$event['id']] = array('id' => $event['id'], 'userid' => $userid, 'icon' => $icon, 'link' => $link, 'action' => $triggerAction, 'summary' => $event['summary'], 'startdate' => $startTimeShow); } //\OCP\Util::writeLog('calendar', 'AlarmCheck Active:' . $event['summary'] . ' -> ' . date('d.m.Y H:i', $startalarmtime) . ' : ' . date('d.m.Y H:i', $this -> nowTime), \OCP\Util::DEBUG); } }
/** * @brief Remove all properties which should not be exported for the AccessClass Confidential * @param string $id Event ID * @param VObject_VObject $vobject Sabre VObject * @return object */ public static function cleanByAccessClass($id, $vobject) { // Do not clean your own calendar if (Object::getowner($id) === \OCP\USER::getUser()) { return $vobject; } if (isset($vobject->VEVENT)) { $velement = $vobject->VEVENT; } elseif (isset($vobject->VJOURNAL)) { $velement = $vobject->VJOURNAL; } elseif (isset($vobject->VTODO)) { $velement = $vobject->VTODO; } if (isset($velement->CLASS) && $velement->CLASS->getValue() == 'CONFIDENTIAL') { foreach ($velement->children as &$property) { switch ($property->name) { case 'CREATED': case 'DTSTART': case 'RRULE': case 'DURATION': case 'DTEND': case 'CLASS': case 'UID': break; case 'SUMMARY': $property->setValue(App::$l10n->t('Busy')); break; default: $velement->__unset($property->name); unset($property); break; } } } return $vobject; }
/** * * @param string $query * @return \OCP\Search\Result */ function search($query) { $today = date('Y-m-d', time()); $allowedCommands = array('#ra' => 1, '#dt' => 1); $calendars = Calendar::allCalendars(\OCP\USER::getUser(), true); $activeCalendars = ''; $config = \OC::$server->getConfig(); foreach ($calendars as $calendar) { $isAktiv = $calendar['active']; if ($config->getUserValue(\OCP\USER::getUser(), CalendarApp::$appname, 'calendar_' . $calendar['id']) != '') { $isAktiv = $config->getUserValue(\OCP\USER::getUser(), CalendarApp::$appname, 'calendar_' . $calendar['id']); } if (!array_key_exists('active', $calendar)) { $isAktiv = 1; } if ($isAktiv == 1 && (int) $calendar['issubscribe'] === 0) { $activeCalendars[] = $calendar; } } if (count($activeCalendars) == 0 || !\OCP\App::isEnabled(CalendarApp::$appname)) { //return false; } $results = array(); $searchquery = array(); if (substr_count($query, ' ') > 0) { $searchquery = explode(' ', $query); } else { $searchquery[] = $query; } $user_timezone = CalendarApp::getTimezone(); $l = \OC::$server->getL10N(TasksApp::$appname); $isDate = false; if (strlen($query) >= 5 && self::validateDate($query)) { $isDate = true; //\OCP\Util::writeLog('calendar','VALID DATE FOUND', \OCP\Util::DEBUG); } //foreach($calendars as $calendar) { $objects = TasksApp::all($activeCalendars); foreach ($objects as $object) { if ($object['objecttype'] != 'VTODO') { continue; } $searchAdvanced = false; if ($isDate == true && strlen($query) >= 5) { $tempQuery = strtotime($query); $checkDate = date('Y-m-d', $tempQuery); if (substr_count($object['startdate'], $checkDate) > 0 || substr_count($object['enddate'], $checkDate) > 0) { $searchAdvanced = true; } } if (array_key_exists($query, $allowedCommands) && $allowedCommands[$query]) { if ($query == '#dt') { $search = $object['startdate']; if (substr_count($search, $today) > 0) { $searchAdvanced = true; } } if ($query == '#ra') { if ($object['isalarm'] == 1) { $searchAdvanced = true; } } } if (substr_count(strtolower($object['summary']), strtolower($query)) > 0 || $searchAdvanced == true) { $calendardata = VObject::parse($object['calendardata']); $vtodo = $calendardata->VTODO; if (Object::getowner($object['id']) !== \OCP\USER::getUser()) { if (isset($vtodo->CLASS) && $vtodo->CLASS->getValue() === 'CONFIDENTIAL') { continue; } if (isset($vtodo->CLASS) && ($vtodo->CLASS->getValue() === 'PRIVATE' || $vtodo->CLASS->getValue() === '')) { continue; } } if ($vtodo->DUE) { $dtstart = $vtodo->DUE; $start_dt = $dtstart->getDateTime(); $start_dt->setTimezone(new \DateTimeZone($user_timezone)); if ($dtstart->getValueType() == 'DATE') { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y'); } else { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i'); } } if ($vtodo->DTSTART) { $dtstart1 = $vtodo->DTSTART; $start_dt = $dtstart1->getDateTime(); $start_dt->setTimezone(new \DateTimeZone($user_timezone)); if ($dtstart1->getValueType() == 'DATE') { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y'); } else { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i'); } } $link = \OC::$server->getURLGenerator()->linkToRoute(TasksApp::$appname . '.page.index') . '#' . urlencode($object['id']); $returnData['id'] = $object['id']; $returnData['description'] = $object['summary'] . ' ' . $info; $returnData['link'] = $link; $results[] = new Result($returnData); } } //} return $results; }
/** * @brief generates the output for an event which will be readable for our js * @param (mixed) $event - event object / array * @param (int) $start - DateTime object of start * @param (int) $end - DateTime object of end * @return (array) $output - readable output */ public static function generateEventOutput(array $event, $start, $end, $list = false) { if (!isset($event['calendardata']) && !isset($event['vevent'])) { return false; } if (!isset($event['calendardata']) && isset($event['vevent'])) { $event['calendardata'] = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud's Internal iCal System\n" . $event['vevent']->serialize() . "END:VCALENDAR"; } try { $object = VObject::parse($event['calendardata']); if (!$object) { \OCP\Util::writeLog(self::$appname, __METHOD__ . ' Error parsing event: ' . print_r($event, true), \OCP\Util::DEBUG); return array(); } $output = array(); if ($object->name === 'VEVENT') { $vevent = $object; } elseif (isset($object->VEVENT)) { $vevent = $object->VEVENT; } else { \OCP\Util::writeLog(self::$appname, __METHOD__ . ' Object contains not event: ' . print_r($event, true), \OCP\Util::DEBUG); return $output; } $id = $event['id']; $SUMMARY = !is_null($vevent->SUMMARY) && $vevent->SUMMARY->getValue() != '' ? strtr($vevent->SUMMARY->getValue(), array('\\,' => ',', '\\;' => ';')) : (string) self::$l10n->t('unnamed'); if ($event['summary'] != '') { $SUMMARY = $event['summary']; } if (Object::getowner($id) !== \OCP\USER::getUser()) { // do not show events with private or unknown access class // \OCP\Util::writeLog('calendar','Sharee ID: ->'.$event['calendarid'].':'.$event['summary'], \OCP\Util::DEBUG); if (isset($vevent->CLASS) && $vevent->CLASS->getValue() === 'CONFIDENTIAL') { $SUMMARY = (string) self::$l10n->t('Busy'); } if (isset($vevent->CLASS) && ($vevent->CLASS->getValue() === 'PRIVATE' || $vevent->CLASS->getValue() === '')) { return $output; } $object = Object::cleanByAccessClass($id, $object); } $event['orgevent'] = ''; if (array_key_exists('org_objid', $event) && $event['org_objid'] > 0) { $event['orgevent'] = array('calendarcolor' => '#000'); } $event['isalarm'] = false; if (isset($vevent->VALARM)) { $event['isalarm'] = true; } $event['privat'] = false; if (isset($vevent->CLASS) && $vevent->CLASS->getValue() === 'PRIVATE') { $event['privat'] = 'private'; } if (isset($vevent->CLASS) && $vevent->CLASS->getValue() === 'CONFIDENTIAL') { $event['privat'] = 'confidential'; } $allday = $vevent->DTSTART->getValueType() == 'DATE' ? true : false; $last_modified = @$vevent->__get('LAST-MODIFIED'); $calid = ''; if (array_key_exists('calendarid', $event)) { $calid = $event['calendarid']; } /* $eventPerm = ''; if (array_key_exists('permissions', $event)) { $eventPerm = Calendar::permissionReader($event['permissions']); } $location = (!is_null($vevent -> LOCATION) && $vevent -> LOCATION -> getValue() != '') ? $vevent -> getAsString('LOCATION') : ''; */ $bDay = false; if (array_key_exists('bday', $event)) { $bDay = $event['bday']; } $isEventShared = false; if (isset($event['shared']) && $event['shared'] === 1) { $isEventShared = $event['shared']; } $lastmodified = $last_modified ? $last_modified->getDateTime()->format('U') : 0; $staticoutput = array('id' => (int) $event['id'], 'title' => $SUMMARY, 'lastmodified' => $lastmodified, 'categories' => $vevent->getAsArray('CATEGORIES'), 'calendarid' => (int) $calid, 'bday' => $bDay, 'shared' => $isEventShared, 'privat' => $event['privat'], 'isrepeating' => false, 'isalarm' => $event['isalarm'], 'orgevent' => $event['orgevent'], 'allDay' => $allday); if (Object::isrepeating($id) && Repeat::is_cached_inperiod($event['id'], $start, $end)) { $cachedinperiod = Repeat::get_inperiod($id, $start, $end); foreach ($cachedinperiod as $cachedevent) { $dynamicoutput = array(); if ($allday) { $start_dt = new \DateTime($cachedevent['startdate'], new \DateTimeZone('UTC')); $end_dt = new \DateTime($cachedevent['enddate'], new \DateTimeZone('UTC')); $dynamicoutput['start'] = $start_dt->format('Y-m-d'); $dynamicoutput['end'] = $end_dt->format('Y-m-d'); $dynamicoutput['startlist'] = $start_dt->format('Y/m/d'); $dynamicoutput['endlist'] = $end_dt->format('Y/m/d'); } else { $start_dt = new \DateTime($cachedevent['startdate'], new \DateTimeZone('UTC')); $end_dt = new \DateTime($cachedevent['enddate'], new \DateTimeZone('UTC')); $start_dt->setTimezone(new \DateTimeZone(self::$tz)); $end_dt->setTimezone(new \DateTimeZone(self::$tz)); $dynamicoutput['start'] = $start_dt->format('Y-m-d H:i:s'); $dynamicoutput['end'] = $end_dt->format('Y-m-d H:i:s'); $dynamicoutput['startlist'] = $start_dt->format('Y/m/d H:i:s'); $dynamicoutput['endlist'] = $end_dt->format('Y/m/d H:i:s'); } $dynamicoutput['isrepeating'] = true; $output[] = array_merge($staticoutput, $dynamicoutput); } } else { if (Object::isrepeating($id) || $event['repeating'] == 1) { $object->expand($start, $end); } foreach ($object->getComponents() as $singleevent) { if (!$singleevent instanceof \Sabre\VObject\Component\VEvent) { continue; } $dynamicoutput = Object::generateStartEndDate($singleevent->DTSTART, Object::getDTEndFromVEvent($singleevent), $allday, self::$tz); $output[] = array_merge($staticoutput, $dynamicoutput); } } return $output; } catch (\Exception $e) { $uid = 'unknown'; if (isset($event['uri'])) { $uid = $event['uri']; } \OCP\Util::writeLog(self::$appname, 'Event (' . $uid . ') contains invalid data!', \OCP\Util::WARN); } }
/** * @brief analyses the parameter for calendar parameter and returns the objects * @param (string) $calendarid - calendarid * @param (int) $start - unixtimestamp of start * @param (int) $end - unixtimestamp of end * @return (array) $events */ public static function getrequestedEvents($calendarid, $start, $end) { $events = array(); if ($calendarid === 'shared_events') { $checkStart = $start->format('U'); $singleevents = \OCP\Share::getItemsSharedWith(self::SHAREEVENT, ShareEvent::FORMAT_EVENT); foreach ($singleevents as $singleevent) { $startCheck_dt = new \DateTime($singleevent['startdate'], new \DateTimeZone('UTC')); $checkStartSE = $startCheck_dt->format('U'); if ($checkStartSE > $checkStart) { $singleevent['summary'] .= ' (' . (string) self::$l10n->t('by') . ' ' . Object::getowner($singleevent['id']) . ')'; $events[] = $singleevent; } } } else { if (is_numeric($calendarid)) { $calendar = self::getCalendar($calendarid); \OCP\Response::enableCaching(0); \OCP\Response::setETagHeader($calendar['ctag']); $events = Object::allInPeriod($calendarid, $start, $end); } else { \OCP\Util::emitHook('OCA\\CalendarPlus', 'getEvents', array('calendar_id' => $calendarid, 'events' => &$events)); } } return $events; }
/** * @brief Get the permissions for a calendar / an event * @param (int) $id - id of the calendar / event * @param (string) $type - type of the id (calendar/event) * @return (int) $permissions - CRUDS permissions * @param (string) $accessclass - access class (rfc5545, section 3.8.1.3) * @see \OCP\Share */ public static function getPermissions($id, $type, $accessclass = '') { $permissions_all = \OCP\PERMISSION_ALL; if ($type === self::CALENDAR) { $calendar = self::getCalendar($id, false, false); if ($calendar['userid'] === \OCP\USER::getUser()) { return $permissions_all; } else { $sharedCalendar = \OCP\Share::getItemSharedWithBySource(CalendarApp::SHARECALENDAR, CalendarApp::SHARECALENDARPREFIX . $id); if ($sharedCalendar) { return $sharedCalendar['permissions']; } } } elseif ($type == self::TODO) { if (Object::getowner($id) === \OCP\USER::getUser()) { return $permissions_all; } else { $object = Object::find($id); $cal = Calendar::find($object['calendarid']); if (\OCP\USER::isLoggedIn()) { $sharedCalendar = \OCP\Share::getItemSharedWithBySource(CalendarApp::SHARECALENDAR, CalendarApp::SHARECALENDARPREFIX . $object['calendarid']); $sharedEvent = \OCP\Share::getItemSharedWithBySource(CalendarApp::SHARETODO, CalendarApp::SHARETODOPREFIX . $id); $calendar_permissions = 0; $event_permissions = 0; if ($sharedCalendar) { $calendar_permissions = $sharedCalendar['permissions']; } if ($sharedEvent) { $event_permissions = $sharedEvent['permissions']; } } if (!\OCP\USER::isLoggedIn()) { $sharedByLinkCalendar = \OCP\Share::getItemSharedWithByLink(CalendarApp::SHARECALENDAR, CalendarApp::SHARECALENDARPREFIX . $object['calendarid'], $cal['userid']); if ($sharedByLinkCalendar) { $calendar_permissions = $sharedByLinkCalendar['permissions']; $event_permissions = 0; } } if ($accessclass === 'PRIVATE') { return 0; } elseif ($accessclass === 'CONFIDENTIAL') { return \OCP\PERMISSION_READ; } else { return max($calendar_permissions, $event_permissions); } } } return 0; }