mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-15 04:24:57 +01:00
* CalDAV/Calendar: fix group invitations were not shown on devices unless explicit accepted
This commit is contained in:
parent
471a5a60b9
commit
887c8ff991
@ -329,7 +329,7 @@ class calendar_groupdav extends Api\CalDAV\Handler
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chunk-size for DB queries of profind_generator
|
* Chunk-size for DB queries of propfind_generator
|
||||||
*/
|
*/
|
||||||
const CHUNK_SIZE = 500;
|
const CHUNK_SIZE = 500;
|
||||||
|
|
||||||
@ -361,14 +361,16 @@ class calendar_groupdav extends Api\CalDAV\Handler
|
|||||||
}
|
}
|
||||||
$sync_collection = $filter['sync-collection'];
|
$sync_collection = $filter['sync-collection'];
|
||||||
|
|
||||||
for($chunk=0; $events =& $this->bo->search($filter+[
|
$events = null;
|
||||||
|
for($chunk=0; (!$chunk || count($events) === self::CHUNK_SIZE) && // stop after we have not got a full chunk
|
||||||
|
($events =& $this->bo->search($filter+[
|
||||||
'offset' => $chunk*self::CHUNK_SIZE,
|
'offset' => $chunk*self::CHUNK_SIZE,
|
||||||
'num_rows' => self::CHUNK_SIZE,
|
'num_rows' => self::CHUNK_SIZE,
|
||||||
]); ++$chunk)
|
])); ++$chunk)
|
||||||
{
|
{
|
||||||
foreach($events as $event)
|
foreach($events as $event)
|
||||||
{
|
{
|
||||||
$no_active_participants = !$this->hasActiveParticipants($event, $filter['users'], $events);
|
$no_active_participants = !$this->hasActiveParticipants($event, $filter['users'], $exceptions);
|
||||||
|
|
||||||
// sync-collection report: deleted entries need to be reported without properties, same for rejected or deleted invitations
|
// sync-collection report: deleted entries need to be reported without properties, same for rejected or deleted invitations
|
||||||
if ($sync_collection && ($event['deleted'] && !$event['cal_reference'] ||
|
if ($sync_collection && ($event['deleted'] && !$event['cal_reference'] ||
|
||||||
@ -421,7 +423,7 @@ class calendar_groupdav extends Api\CalDAV\Handler
|
|||||||
$content = $this->iCal($event, $filter['users'],
|
$content = $this->iCal($event, $filter['users'],
|
||||||
strpos($path, '/inbox/') !== false ? 'REQUEST' : null,
|
strpos($path, '/inbox/') !== false ? 'REQUEST' : null,
|
||||||
!isset($calendar_data['children']['expand']) ? false :
|
!isset($calendar_data['children']['expand']) ? false :
|
||||||
($calendar_data['children']['expand']['attrs'] ? $calendar_data['children']['expand']['attrs'] : true), $events);
|
($calendar_data['children']['expand']['attrs'] ?: true), $exceptions);
|
||||||
$props['getcontentlength'] = bytes($content);
|
$props['getcontentlength'] = bytes($content);
|
||||||
$props['calendar-data'] = Api\CalDAV::mkprop(Api\CalDAV::CALDAV,'calendar-data',$content);
|
$props['calendar-data'] = Api\CalDAV::mkprop(Api\CalDAV::CALDAV,'calendar-data',$content);
|
||||||
}
|
}
|
||||||
@ -472,23 +474,20 @@ class calendar_groupdav extends Api\CalDAV\Handler
|
|||||||
* Check an event has active (not rejected or deleted) participants against an (array of) user- or group-id(s)
|
* Check an event has active (not rejected or deleted) participants against an (array of) user- or group-id(s)
|
||||||
*
|
*
|
||||||
* For recurring events / series-master we have to check all exceptions too!
|
* For recurring events / series-master we have to check all exceptions too!
|
||||||
* For a group-id we also check against all members!
|
* For a group-id we also check against all members and for a user-id we also check the memberships!
|
||||||
*
|
*
|
||||||
* @param array $event
|
* @param array $event
|
||||||
* @param int|int[] $users user(s) to check
|
* @param int|int[] $users user(s) to check
|
||||||
* @param array|null &$events on return exceptions to the series as returned by self::get_series() ($expand=false!)
|
* @param array|null &$exceptions on return exceptions to the series as returned by self::get_series() ($expand=false!)
|
||||||
* @return bool true: user(s) is an active participant, or false if not (incl. all exceptions for recurring events)
|
* @return bool true: user(s) is an active participant, or false if not (incl. all exceptions for recurring events)
|
||||||
*/
|
*/
|
||||||
protected function hasActiveParticipants(array $event, $users, array &$events=null) : bool
|
protected function hasActiveParticipants(array $event, $users, array &$exceptions=null) : bool
|
||||||
{
|
{
|
||||||
$events = null;
|
$exceptions = null;
|
||||||
if (!is_array($users))
|
if (!is_array($users))
|
||||||
{
|
{
|
||||||
$users = [$users];
|
$add = $users < 0 ? 'members' : 'memberships';
|
||||||
if ($users[0] < 0)
|
$users = array_merge([$users], Api\Accounts::getInstance()->$add($users, true) ?: []);
|
||||||
{
|
|
||||||
$users = array_merge($users, Api\Accounts::getInstance()->members($users[0], true) ?: []);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// return true event(-master) has active participants
|
// return true event(-master) has active participants
|
||||||
foreach(array_intersect_key($event['participants'], array_flip($users)) as $status)
|
foreach(array_intersect_key($event['participants'], array_flip($users)) as $status)
|
||||||
@ -506,8 +505,8 @@ class calendar_groupdav extends Api\CalDAV\Handler
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check exceptions for recurring event
|
// check exceptions for recurring event
|
||||||
$events =& self::get_series($event['uid'], $this->bo, false, $users[0], $event);
|
$exceptions =& self::get_series($event['uid'], $this->bo, false, $users[0], $event);
|
||||||
foreach($events as $exception)
|
foreach($exceptions as $exception)
|
||||||
{
|
{
|
||||||
if (empty($exception['reference'])) continue; // master / identical to $event and already checked
|
if (empty($exception['reference'])) continue; // master / identical to $event and already checked
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user