forked from extern/egroupware
make ical class ready to propagate a status only exception to a real exception. this is just successful if the user has ACL edit rights on the event - otherwise the propagation attempt gets ignored. additionaly added some logical fixes
This commit is contained in:
parent
8ae115dbb5
commit
9621d17f28
@ -809,7 +809,7 @@ class calendar_ical extends calendar_boupdate
|
|||||||
$event_info = $this->get_event_info($event);
|
$event_info = $this->get_event_info($event);
|
||||||
|
|
||||||
// common adjustments for new events
|
// common adjustments for new events
|
||||||
if(!isset($event['id']))
|
if(!is_array($event_info['stored_event']))
|
||||||
{
|
{
|
||||||
// set non blocking all day depending on the user setting
|
// set non blocking all day depending on the user setting
|
||||||
if($this->isWholeDay($event) && $this->nonBlockingAllday)
|
if($this->isWholeDay($event) && $this->nonBlockingAllday)
|
||||||
@ -834,7 +834,7 @@ class calendar_ical extends calendar_boupdate
|
|||||||
}
|
}
|
||||||
|
|
||||||
// common adjustments for existing events
|
// common adjustments for existing events
|
||||||
if (isset($event['id']) && is_array($event_info['stored_event']))
|
if (is_array($event_info['stored_event']))
|
||||||
{
|
{
|
||||||
if ($merge)
|
if ($merge)
|
||||||
{
|
{
|
||||||
@ -933,6 +933,7 @@ class calendar_ical extends calendar_boupdate
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'SERIES-EXCEPTION':
|
case 'SERIES-EXCEPTION':
|
||||||
|
case 'SERIES-EXCEPTION-PROPAGATE':
|
||||||
Horde::logMessage('importVCAL event SERIES-EXCEPTION',__FILE__, __LINE__, PEAR_LOG_DEBUG);
|
Horde::logMessage('importVCAL event SERIES-EXCEPTION',__FILE__, __LINE__, PEAR_LOG_DEBUG);
|
||||||
|
|
||||||
// update event
|
// update event
|
||||||
@ -999,6 +1000,7 @@ class calendar_ical extends calendar_boupdate
|
|||||||
case 'SINGLE':
|
case 'SINGLE':
|
||||||
case 'SERIES-MASTER':
|
case 'SERIES-MASTER':
|
||||||
case 'SERIES-EXCEPTION':
|
case 'SERIES-EXCEPTION':
|
||||||
|
case 'SERIES-EXCEPTION-PROPAGATE':
|
||||||
if(is_array($event_info['stored_event'])) // status update requires a stored event
|
if(is_array($event_info['stored_event'])) // status update requires a stored event
|
||||||
{
|
{
|
||||||
if($event_info['acl_edit'])
|
if($event_info['acl_edit'])
|
||||||
@ -1016,12 +1018,12 @@ class calendar_ical extends calendar_boupdate
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'SERIES-EXCEPTION-STATUS':
|
case 'SERIES-EXCEPTION-STATUS':
|
||||||
if(is_array($event_info['stored_event'])) // status update requires a stored master event
|
if(is_array($event_info['master_event'])) // status update requires a stored master event
|
||||||
{
|
{
|
||||||
if($event_info['acl_edit'])
|
if($event_info['acl_edit'])
|
||||||
{
|
{
|
||||||
// update all participants if we have the right to do that
|
// update all participants if we have the right to do that
|
||||||
$this->update_status($event, $event_info['stored_event'], $event['recurrence']);
|
$this->update_status($event, $event_info['master_event'], $event['recurrence']);
|
||||||
}
|
}
|
||||||
elseif(isset($event['participants'][$this->user]) || isset($event_info['master_event']['participants'][$this->user]))
|
elseif(isset($event['participants'][$this->user]) || isset($event_info['master_event']['participants'][$this->user]))
|
||||||
{
|
{
|
||||||
@ -1043,6 +1045,7 @@ class calendar_ical extends calendar_boupdate
|
|||||||
case 'SINGLE':
|
case 'SINGLE':
|
||||||
case 'SERIES-MASTER':
|
case 'SERIES-MASTER':
|
||||||
case 'SERIES-EXCEPTION':
|
case 'SERIES-EXCEPTION':
|
||||||
|
case 'SERIES-EXCEPTION-PROPAGATE':
|
||||||
// delete old alarms
|
// delete old alarms
|
||||||
if(count($event_info['stored_event']['alarm']) > 0)
|
if(count($event_info['stored_event']['alarm']) > 0)
|
||||||
{
|
{
|
||||||
@ -1094,6 +1097,20 @@ class calendar_ical extends calendar_boupdate
|
|||||||
case 'SERIES-EXCEPTION-STATUS':
|
case 'SERIES-EXCEPTION-STATUS':
|
||||||
$return_id = is_array($event_info['master_event']) ? $event_info['master_event']['id'] . ':' . $event['recurrence'] : false;
|
$return_id = is_array($event_info['master_event']) ? $event_info['master_event']['id'] . ':' . $event['recurrence'] : false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'SERIES-EXCEPTION-PROPAGATE':
|
||||||
|
if($event_info['acl_edit'] && is_array($event_info['stored_event']))
|
||||||
|
{
|
||||||
|
// we had sufficient rights to propagate the status only exception to a real one
|
||||||
|
$return_id = $event_info['stored_event']['id'];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we did not have sufficient rights to propagate the status only exception to a real one
|
||||||
|
// we have to keep the SERIES-EXCEPTION-STATUS id and keep the event untouched
|
||||||
|
$return_id = $event_info['master_event']['id'] . ':' . $event['recurrence'];
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->log)
|
if($this->log)
|
||||||
@ -2138,8 +2155,11 @@ class calendar_ical extends calendar_boupdate
|
|||||||
* SERIES-MASTER the series master
|
* SERIES-MASTER the series master
|
||||||
* SERIES-EXCEPTION event is a real exception
|
* SERIES-EXCEPTION event is a real exception
|
||||||
* SERIES-EXCEPTION-STATUS event is a status only exception
|
* SERIES-EXCEPTION-STATUS event is a status only exception
|
||||||
|
* SERIES-EXCEPTION-PROPAGATE event was a status only exception in the past and is now a real exception
|
||||||
* stored_event => if event already exists in the database array with event data or false
|
* stored_event => if event already exists in the database array with event data or false
|
||||||
* master_event => if event is of type SERIES-EXCEPTION or SERIES-EXCEPTION-STATUS the corresponding series master event array
|
* master_event => for event type SERIES-EXCEPTION, SERIES-EXCEPTION-STATUS or SERIES-EXCEPTION-PROPAGATE
|
||||||
|
* the corresponding series master event array
|
||||||
|
* NOTE: this param is false if event is of type SERIES-MASTER
|
||||||
*/
|
*/
|
||||||
private function get_event_info($event)
|
private function get_event_info($event)
|
||||||
{
|
{
|
||||||
@ -2170,22 +2190,35 @@ class calendar_ical extends calendar_boupdate
|
|||||||
|
|
||||||
if(isset($event['id']) && $master_event['id'] != $event['id'])
|
if(isset($event['id']) && $master_event['id'] != $event['id'])
|
||||||
{
|
{
|
||||||
$type = 'SERIES-EXCEPTION'; //event is already a real exception
|
$type = 'SERIES-EXCEPTION'; // this is an existing exception
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$type = 'SERIES-EXCEPTION-STATUS'; // default if we cannot find a proof for a fundamental change
|
$type = 'SERIES-EXCEPTION-STATUS'; // default if we cannot find a proof for a fundamental change
|
||||||
$recurrence_event = $this->read($master_event['id'],$event['recurrence']);
|
// the recurrence_event is the master event with start and end adjusted to the recurrence
|
||||||
|
$recurrence_event = $master_event;
|
||||||
|
$recurrence_event['start'] = $event['recurrence'];
|
||||||
|
$recurrence_event['end'] = $event['recurrence'] + ($master_event['end'] - $master_event['start']);
|
||||||
// check for changed data
|
// check for changed data
|
||||||
foreach (array('start','end','uid','owner','title','description',
|
foreach (array('start','end','uid','owner','title','description',
|
||||||
'location','priority','public','special','non_blocking') as $key)
|
'location','priority','public','special','non_blocking') as $key)
|
||||||
{
|
{
|
||||||
if (!empty($event[$key]) && $recurrence_event[$key] != $event[$key])
|
if (!empty($event[$key]) && $recurrence_event[$key] != $event[$key])
|
||||||
{
|
{
|
||||||
$type = 'SERIES-EXCEPTION';
|
if(isset($event['id']))
|
||||||
|
{
|
||||||
|
$type = 'SERIES-EXCEPTION-PROPAGATE';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$type = 'SERIES-EXCEPTION'; // this is a new exception
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// the event id here is always the id of the master event
|
||||||
|
// unset it to prevent confusion of stored event and master event
|
||||||
|
unset($event['id']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2195,14 +2228,32 @@ class calendar_ical extends calendar_boupdate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// read existing event
|
||||||
if(isset($event['id']))
|
if(isset($event['id']))
|
||||||
{
|
{
|
||||||
$stored_event = $this->read($event['id']);
|
$stored_event = $this->read($event['id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check ACL
|
||||||
|
if($return_master)
|
||||||
|
{
|
||||||
|
$acl_edit = $this->check_perms(EGW_ACL_EDIT, $master_event['id']);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(is_array($stored_event))
|
||||||
|
{
|
||||||
|
$acl_edit = $this->check_perms(EGW_ACL_EDIT, $stored_event['id']);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$acl_edit = true; // new event
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'type' => $type,
|
'type' => $type,
|
||||||
'acl_edit' => is_array($stored_event) ? $this->check_perms(EGW_ACL_EDIT, $stored_event) : true,
|
'acl_edit' => $acl_edit,
|
||||||
'stored_event' => is_array($stored_event) ? $stored_event : false,
|
'stored_event' => is_array($stored_event) ? $stored_event : false,
|
||||||
'master_event' => $return_master ? $master_event : false,
|
'master_event' => $return_master ? $master_event : false,
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user