* CalDAV: fixed users participating only in exceptions of a recurring event were also shown in whole series in Thunderbird and iCal

This commit is contained in:
Ralf Becker 2014-11-10 20:04:59 +00:00
parent cc049e25d0
commit a95f08f88c

View File

@ -613,7 +613,7 @@ class calendar_groupdav extends groupdav_handler
if (isset($expand['start'])) $expand['start'] = $this->vCalendar->_parseDateTime($expand['start']); if (isset($expand['start'])) $expand['start'] = $this->vCalendar->_parseDateTime($expand['start']);
if (isset($expand['end'])) $expand['end'] = $this->vCalendar->_parseDateTime($expand['end']); if (isset($expand['end'])) $expand['end'] = $this->vCalendar->_parseDateTime($expand['end']);
} }
$events =& self::get_series($event['uid'], $this->bo, $expand); $events =& self::get_series($event['uid'], $this->bo, $expand, $user);
} }
elseif(!$this->client_shared_uid_exceptions && $event['reference']) elseif(!$this->client_shared_uid_exceptions && $event['reference'])
{ {
@ -630,19 +630,13 @@ class calendar_groupdav extends groupdav_handler
* @param string $uid UID * @param string $uid UID
* @param calendar_bo $bo=null calendar_bo object to reuse for search call * @param calendar_bo $bo=null calendar_bo object to reuse for search call
* @param boolean|array $expand=false true or array with values for 'start', 'end' to expand recurrences * @param boolean|array $expand=false true or array with values for 'start', 'end' to expand recurrences
* @param int $user=null account_id of calendar to display, to remove master, if current user does not participate in
* @return array * @return array
*/ */
private static function &get_series($uid,calendar_bo $bo=null, $expand=false) private static function &get_series($uid,calendar_bo $bo=null, $expand=false, $user=null)
{ {
if (is_null($bo)) $bo = new calendar_bopdate(); if (is_null($bo)) $bo = new calendar_bopdate();
if (!($masterId = array_shift($bo->find_event(array('uid' => $uid), 'master')))
|| !($master = $bo->read($masterId, 0, false, 'server')))
{
return array(); // should never happen
}
$exceptions =& $master['recur_exception'];
$params = array( $params = array(
'query' => array('cal_uid' => $uid), 'query' => array('cal_uid' => $uid),
'filter' => 'owner', // return all possible entries 'filter' => 'owner', // return all possible entries
@ -653,11 +647,31 @@ class calendar_groupdav extends groupdav_handler
$events =& $bo->search($params); $events =& $bo->search($params);
$master = null;
foreach($events as $k => &$recurrence) foreach($events as $k => &$recurrence)
{ {
if (!isset($master)) // first event is master
{
$master = $recurrence;
$exceptions =& $master['recur_exception'];
unset($events[$k]);
continue;
}
//error_log(__FILE__.'['.__LINE__.'] '.__METHOD__."($uid)[$k]:" . array2string($recurrence)); //error_log(__FILE__.'['.__LINE__.'] '.__METHOD__."($uid)[$k]:" . array2string($recurrence));
if ($recurrence['id'] != $master['id']) // real exception if ($recurrence['id'] != $master['id']) // real exception
{ {
// user is NOT participating in this exception
if ($user && !isset($recurrence['participants'][$user]))
{
// if he is NOT in master, delete this exception
if (!isset($master['participants'][$user]))
{
unset($events[$k]);
continue;
}
// otherwise mark him in this exception as rejected
$recurrence['participants'][$user] = 'R';
}
//error_log('real exception: '.array2string($recurrence)); //error_log('real exception: '.array2string($recurrence));
// remove from masters recur_exception, as exception is include // remove from masters recur_exception, as exception is include
// at least Lightning "understands" EXDATE as exception from what's included // at least Lightning "understands" EXDATE as exception from what's included
@ -683,7 +697,8 @@ class calendar_groupdav extends groupdav_handler
$recurrence['recur_type'] = MCAL_RECUR_NONE; // is set, as this is a copy of the master $recurrence['recur_type'] = MCAL_RECUR_NONE; // is set, as this is a copy of the master
// not for included exceptions (Lightning): $master['recur_exception'][] = $recurrence['start']; // not for included exceptions (Lightning): $master['recur_exception'][] = $recurrence['start'];
} }
if (!$expand) // only add master if we are not expanding and current user participates in master (and not just some exceptions)
if (!$expand && (!$user || isset($master['participants'][$user])))
{ {
$events = array_merge(array($master), $events); $events = array_merge(array($master), $events);
} }