private function getPublicEvent($itemSource, $shareOwner, $token) { $itemSource = CalendarApp::validateItemSource($itemSource, CalendarApp::SHAREEVENTPREFIX); $data = CalendarApp::getEventObject($itemSource, false, false); $object = VObject::parse($data['calendardata']); $vevent = $object->VEVENT; $object = Object::cleanByAccessClass($itemSource, $object); $accessclass = $vevent->getAsString('CLASS'); if ($accessclass == 'PRIVATE') { header('HTTP/1.0 404 Not Found'); $response = new TemplateResponse('core', '404', '', 'guest'); return $response; } $permissions = CalendarApp::getPermissions($itemSource, CalendarApp::EVENT, $accessclass); $dtstart = $vevent->DTSTART; $dtend = Object::getDTEndFromVEvent($vevent); $dtstartType = $vevent->DTSTART->getValueType(); if ($dtstartType == 'DATE') { $startdate = $dtstart->getDateTime()->format('d-m-Y'); $starttime = ''; $enddate = $dtend->getDateTime()->modify('-1 day')->format('d-m-Y'); $endtime = ''; $choosenDate = $choosenDate + 3600 * 24; $allday = true; } if ($dtstartType == 'DATE-TIME') { $startdate = $dtstart->getDateTime()->format('d-m-Y'); $starttime = $dtstart->getDateTime()->format('H:i'); $enddate = $dtend->getDateTime()->format('d-m-Y'); $endtime = $dtend->getDateTime()->format('H:i'); $allday = false; } $summary = strtr($vevent->getAsString('SUMMARY'), array('\\,' => ',', '\\;' => ';')); $location = strtr($vevent->getAsString('LOCATION'), array('\\,' => ',', '\\;' => ';')); $categories = $vevent->getAsArray('CATEGORIES'); $description = strtr($vevent->getAsString('DESCRIPTION'), array('\\,' => ',', '\\;' => ';')); $link = strtr($vevent->getAsString('URL'), array('\\,' => ',', '\\;' => ';')); $last_modified = $vevent->__get('LAST-MODIFIED'); if ($last_modified) { $lastmodified = $last_modified->getDateTime()->format('U'); } else { $lastmodified = 0; } $repeatInfo = array(); $repeat['repeat'] = ''; if ($data['repeating'] == 1) { $rrule = explode(';', $vevent->getAsString('RRULE')); $rrulearr = array(); $repeat['repeat_rules'] = ''; foreach ($rrule as $rule) { list($attr, $val) = explode('=', $rule); if ($attr != 'COUNT' && $attr !== 'UNTIL') { if ($repeat['repeat_rules'] === '') { $repeat['repeat_rules'] = $attr . '=' . $val; } else { $repeat['repeat_rules'] .= ';' . $attr . '=' . $val; } } if ($attr === 'COUNT' || $attr !== 'UNTIL') { $rrulearr[$attr] = $val; } } if (array_key_exists('COUNT', $rrulearr)) { $repeat['end'] = 'count'; $repeat['count'] = $rrulearr['COUNT']; } elseif (array_key_exists('UNTIL', $rrulearr)) { $repeat['end'] = 'date'; $endbydate_day = substr($rrulearr['UNTIL'], 6, 2); $endbydate_month = substr($rrulearr['UNTIL'], 4, 2); $endbydate_year = substr($rrulearr['UNTIL'], 0, 4); $repeat['date'] = $endbydate_day . '-' . $endbydate_month . '-' . $endbydate_year; } else { $repeat['end'] = 'never'; } $repeat_end_options = CalendarApp::getEndOptions(); if ($repeat['end'] === 'count') { $repeatInfo['end'] = $this->l10n->t('after') . ' ' . $repeat['count'] . ' ' . $this->l10n->t('Events'); } if ($repeat['end'] === 'date') { $repeatInfo['end'] = $repeat['date']; } if ($repeat['end'] === 'never') { $repeatInfo['end'] = $repeat_end_options[$repeat['end']]; } } else { $repeat['repeat'] = 'doesnotrepeat'; } $calendar_options[0]['id'] = $data['calendarid']; $access_class_options = CalendarApp::getAccessClassOptions(); $aOExdate = ''; if ($vevent->EXDATE) { $timezone = CalendarApp::getTimezone(); foreach ($vevent->EXDATE as $param) { $param = new \DateTime($param); $aOExdate[$param->format('U')] = $param->format('d-m-Y'); } } $timezone = \OC::$server->getSession()->get('public_link_timezone'); $sCat = ''; if (is_array($categories) && count($categories) > 0) { $sCat = $categories; } $params = ['eventid' => $itemSource, 'appname' => $this->appName, 'permissions' => $permissions, 'lastmodified' => $lastmodified, 'exDate' => $aOExdate, 'sharingToken' => $token, 'token' => $token, 'calendar_options' => $calendar_options, 'access_class_options' => $access_class_options, 'title' => $summary, 'accessclass' => $accessclass, 'location' => $location, 'calendar' => $data['calendarid'], 'timezone' => $timezone, 'uidOwner' => $shareOwner, 'displayName' => \OCP\User::getDisplayName($shareOwner), 'allday' => $allday, 'startdate' => $startdate, 'starttime' => $starttime, 'enddate' => $enddate, 'endtime' => $endtime, 'description' => $description, 'link' => $link, 'repeat_rules' => isset($repeat['repeat_rules']) ? $repeat['repeat_rules'] : '', 'repeat' => $repeat['repeat'], 'repeatInfo' => $repeat['repeat'] != 'doesnotrepeat' ? $repeatInfo : '', 'categories' => $sCat]; $response = new TemplateResponse($this->appName, 'publicevent', $params, 'base'); return $response; }
/** * @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); } }
/** * * @param string $query * @return \OCP\Search\Result */ function search($query) { $today = date('Y-m-d', time()); $allowedCommands = array('#ra' => 1, '#dt' => 1); $calendars = CalendarCalendar::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(CalendarApp::$appname); $isDate = false; if (strlen($query) >= 5 && self::validateDate($query)) { $isDate = true; //\OCP\Util::writeLog('calendar','VALID DATE FOUND', \OCP\Util::DEBUG); } foreach ($activeCalendars as $calendar) { $objects = Object::all($calendar['id']); foreach ($objects as $object) { if ($object['objecttype'] !== 'VEVENT') { continue; } $searchAdvanced = false; if ($isDate === true && strlen($query) >= 5) { // \OCP\Util::writeLog('calendar','search: ->'.$query, \OCP\Util::DEBUG); $tempQuery = strtotime($query); $checkDate = date('Y-m-d', $tempQuery); if (substr_count($object['startdate'], $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']); $vevent = $calendardata->VEVENT; if (Object::getowner($object['id']) !== \OCP\USER::getUser()) { if (isset($vevent->CLASS) && $vevent->CLASS->getValue() === 'CONFIDENTIAL') { continue; } if (isset($vevent->CLASS) && ($vevent->CLASS->getValue() === 'PRIVATE' || $vevent->CLASS->getValue() === '')) { continue; } } $dtstart = $vevent->DTSTART; $dtend = Object::getDTEndFromVEvent($vevent); $start_dt = $dtstart->getDateTime(); $start_dt->setTimezone(new \DateTimeZone($user_timezone)); $end_dt = $dtend->getDateTime(); $end_dt->setTimezone(new \DateTimeZone($user_timezone)); if ($dtstart->getValueType() == 'DATE') { $end_dt->modify('-1 sec'); if ($start_dt->format('d.m.Y') != $end_dt->format('d.m.Y')) { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y') . ' - ' . $end_dt->format('d.m.Y'); } else { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y'); } } else { $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i') . ' - ' . $end_dt->format('d.m.y H:i'); } $link = \OC::$server->getURLGenerator()->linkToRoute(CalendarApp::$appname . '.page.index') . '#' . urlencode($object['id']); $returnData['id'] = $object['id']; $returnData['description'] = $object['summary'] . ' ' . $info; $returnData['link'] = $link; $returnData['type'] = 'calendar'; //$results[]=$returnData; $results[] = new Result($returnData); //$name,$text,$link,$type } } } return $results; }
private function getVobjectData($id, $choosenDate, $data) { $result = []; if (!$data) { return false; } $sDateFormat = $this->configInfo->getUserValue($this->userId, $this->appName, 'dateformat', 'd-m-Y'); $object = VObject::parse($data['calendardata']); $vevent = $object->VEVENT; $object = Object::cleanByAccessClass($id, $object); $result['accessclass'] = $vevent->getAsString('CLASS'); $result['permissions'] = CalendarApp::getPermissions($id, CalendarApp::EVENT, $result['accessclass']); $dtstart = $vevent->DTSTART; $result['dtstart'] = $dtstart; $dtend = Object::getDTEndFromVEvent($vevent); $dateStartType = (string) $vevent->DTSTART->getValueType(); if ($dateStartType === 'DATE') { $result['startdate'] = $dtstart->getDateTime()->format($sDateFormat); $result['starttime'] = ''; $result['enddate'] = $dtend->getDateTime()->modify('-1 day')->format($sDateFormat); $result['endtime'] = ''; $result['choosenDate'] = $choosenDate + 3600 * 24; $result['allday'] = true; } if ($dateStartType === 'DATE-TIME') { $tz = CalendarApp::getTimezone(); $start_dt = new \DateTime($data['startdate'], new \DateTimeZone('UTC')); $end_dt = new \DateTime($data['enddate'], new \DateTimeZone('UTC')); $start_dt->setTimezone(new \DateTimeZone($tz)); $end_dt->setTimezone(new \DateTimeZone($tz)); $result['startdate'] = $start_dt->format($sDateFormat); $result['starttime'] = $start_dt->format('H:i'); $result['enddate'] = $end_dt->format($sDateFormat); $result['endtime'] = $end_dt->format('H:i'); $result['allday'] = false; $result['choosenDate'] = $choosenDate; } $result['summary'] = strtr($vevent->getAsString('SUMMARY'), array('\\,' => ',', '\\;' => ';')); $result['location'] = strtr($vevent->getAsString('LOCATION'), array('\\,' => ',', '\\;' => ';')); $result['categories'] = $vevent->getAsString('CATEGORIES'); $result['description'] = strtr($vevent->getAsString('DESCRIPTION'), array('\\,' => ',', '\\;' => ';')); $result['link'] = strtr($vevent->getAsString('URL'), array('\\,' => ',', '\\;' => ';')); $last_modified = $vevent->__get('LAST-MODIFIED'); if ($last_modified) { $result['lastmodified'] = $last_modified->getDateTime()->format('U'); } else { $result['lastmodified'] = 0; } $result['addSingleDeleteButton'] = false; if ((int) $data['repeating'] === 1) { $result['addSingleDeleteButton'] = true; $rrule = explode(';', $vevent->getAsString('RRULE')); $result['rrule'] = $this->parseRrules($rrule); } else { $result['rrule']['repeat'] = 'doesnotrepeat'; } //NEW Reminder $result['reminder_options'] = CalendarApp::getReminderOptions(); $result['alarm'] = $this->parseValarm($vevent, $result['reminder_options']); return $result; }
/** * @NoAdminRequired * * @brief generates the cache the first time * @param integer $id * @return bool true */ public function generateEventCache($id) { $event = Object::find($id); if ((int) $event['repeating'] === 0) { return false; } $calendarId = Object::getCalendarid($id); $object = VObject::parse($event['calendardata']); $start = new \DateTime('01-01-' . date('Y') . ' 00:00:00', new \DateTimeZone('UTC')); $start->modify('-2 years'); $end = new \DateTime('31-12-' . date('Y') . ' 23:59:59', new \DateTimeZone('UTC')); $end->modify('+2 years'); $object->expand($start, $end); foreach ($object->getComponents() as $vevent) { if (!$vevent instanceof \Sabre\VObject\Component) { continue; } $startenddate = Object::generateStartEndDate($vevent->DTSTART, Object::getDTEndFromVEvent($vevent), !$vevent->DTSTART->hasTime(), 'UTC'); $this->repeatDB->insertEvent($id, $calendarId, $startenddate['start'], $startenddate['end']); } return true; }