* Calendar/CalDAV: sending correct iMip REPLY to mail invitations and only reply to external chair

This commit is contained in:
Ralf Becker 2018-06-26 15:57:09 +02:00
parent 09ecfdbc46
commit c4e4eb45a4
2 changed files with 74 additions and 50 deletions

View File

@ -611,59 +611,60 @@ class calendar_boupdate extends calendar_bo
//
$msg_is_response = $msg_type == MSG_REJECTED || $msg_type == MSG_ACCEPTED || $msg_type == MSG_TENTATIVE || $msg_type == MSG_DELEGATED;
switch($ru = $part_prefs['calendar']['receive_updates'])
// always notify externals chairs
// EGroupware owner only get notified about responses, if pref is NOT "no"
if (!is_numeric($userid) && $role == 'CHAIR' &&
($msg_is_response || in_array($msg_type, array(MSG_ADDED, MSG_DELETED))))
{
case 'responses':
++$want_update;
case 'modifications':
if (!$msg_is_response)
{
switch($msg_type)
{
case MSG_DELETED: // treat deleting event as rejection to organizer
$msg_type = MSG_REJECTED;
break;
case MSG_ADDED: // new events use added, but organizer needs status
switch($status[0])
{
case 'A': $msg_type = MSG_ACCEPTED; break;
case 'R': $msg_type = MSG_REJECTED; break;
case 'T': $msg_type = MSG_TENTATIVE; break;
case 'D': $msg_type = MSG_DELEGATED; break;
}
break;
}
++$want_update;
}
else
{
switch($ru = $part_prefs['calendar']['receive_updates'])
{
case 'responses':
++$want_update;
}
case 'time_change_4h':
case 'time_change':
default:
if (is_array($new_event) && is_array($old_event))
{
$diff = max(abs(self::date2ts($old_event['start'])-self::date2ts($new_event['start'])),
abs(self::date2ts($old_event['end'])-self::date2ts($new_event['end'])));
$check = $ru == 'time_change_4h' ? 4 * 60 * 60 - 1 : 0;
if ($msg_type == MSG_MODIFIED && $diff > $check)
case 'modifications':
if (!$msg_is_response)
{
++$want_update;
}
}
case 'add_cancel':
if ($msg_is_response && ($old_event['owner'] == $userid || $role == 'CHAIR') ||
$msg_type == MSG_DELETED || $msg_type == MSG_ADDED || $msg_type == MSG_DISINVITE)
{
++$want_update;
}
break;
case 'no':
// always notify externals chairs
// EGroupware owner only get notified about responses, if pref is NOT "no"
if (!is_numeric($userid) && $role == 'CHAIR' &&
($msg_is_response || in_array($msg_type, array(MSG_ADDED, MSG_DELETED))))
{
switch($msg_type)
case 'time_change_4h':
case 'time_change':
default:
if (is_array($new_event) && is_array($old_event))
{
case MSG_DELETED: // treat deleting event as rejection to organizer
$msg_type = MSG_REJECTED;
break;
case MSG_ADDED: // new events use added, but organizer needs status
switch($status[0])
{
case 'A': $msg_type = MSG_ACCEPTED; break;
case 'R': $msg_type = MSG_REJECTED; break;
case 'T': $msg_type = MSG_TENTATIVE; break;
case 'D': $msg_type = MSG_DELEGATED; break;
}
break;
$diff = max(abs(self::date2ts($old_event['start'])-self::date2ts($new_event['start'])),
abs(self::date2ts($old_event['end'])-self::date2ts($new_event['end'])));
$check = $ru == 'time_change_4h' ? 4 * 60 * 60 - 1 : 0;
if ($msg_type == MSG_MODIFIED && $diff > $check)
{
++$want_update;
}
}
++$want_update;
}
break;
case 'add_cancel':
if ($msg_is_response && ($old_event['owner'] == $userid || $role == 'CHAIR') ||
$msg_type == MSG_DELETED || $msg_type == MSG_ADDED || $msg_type == MSG_DISINVITE)
{
++$want_update;
}
break;
}
}
//error_log(__METHOD__."(userid=$userid, receive_updates='$ru', msg_type=$msg_type, ..., role='$role') msg_is_response=$msg_is_response --> want_update=$want_update");
return $want_update > 0;
@ -852,6 +853,28 @@ class calendar_boupdate extends calendar_bo
}
}
}
// unless we notfiy externals about everything aka 'responses'
// we will notify only an external chair, if only one exists
if ($GLOBALS['egw_info']['user']['calendar']['notify_externals'] !== 'responses')
{
// check if we have *only* an external chair
$chair = null;
foreach($to_notify as $userid => $statusid)
{
$res_info = $quantity = $role = null;
calendar_so::split_status($statusid, $quantity, $role);
if ($role == 'CHAIR' && (empty($chair) || !is_numeric($chair)))
{
$chair = $userid;
}
}
// *only* an external chair --> do not notify anyone, but the external chair and the current user
if (!empty($chair) && !is_numeric($chair))
{
$to_notify = array($chair => $to_notify[$chair])+
(isset($to_notify[$user]) ? array($user => $to_notify[$user]) : array());
}
}
$user_prefs = $GLOBALS['egw_info']['user']['preferences'];
$startdate = new Api\DateTime($event['start']);
$enddate = new Api\DateTime($event['end']);

View File

@ -3225,10 +3225,7 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
}
$calendar_part = null;
$bodyParts = $this->mail_bo->getMessageBody($uid, ($htmlOptions?$htmlOptions:''), $partID, $structure, false, $mailbox, $calendar_part);
if (!$smime)
{
Api\Session::cache_control(true);
}
// for meeting requests (multipart alternative with text/calendar part) let calendar render it
if ($calendar_part && isset($GLOBALS['egw_info']['user']['apps']['calendar']))
{
@ -3245,6 +3242,10 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
array('event'=>null,'msg'=>'','useSession'=>true)
);
}
if (!$smime)
{
Api\Session::cache_control(true);
}
// Compose the content of the frame
$frameHtml =
$this->get_email_header($this->mail_bo->getStyles($bodyParts)).