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:
Christian Binder 2009-10-01 13:30:18 +00:00
parent 8ae115dbb5
commit 9621d17f28

View File

@ -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,
); );