function handle_remote_attendee_reply(vCalendar $ical) { $attendees = $ical->GetAttendees(); // attendee reply have just one attendee if (count($attendees) != 1) { return; } $attendee = $attendees[0]; $uidparam = $ical->GetPropertiesByPath("VCALENDAR/*/UID"); $uid = $uidparam[0]->Value(); $parameters = $attendee->Parameters(); $propertyText = ''; foreach ($parameters as $key => $param) { if (!empty($propertyText)) { $propertyText .= ';'; } $propertyText .= $key . '=' . $param; } //$propertyText .= ':' . $attendee->Value(); $qry = new AwlQuery('SELECT dav_id, calendar_item.collection_id AS collection_id, calendar_item.dav_name AS dav_name, caldav_data FROM calendar_item LEFT JOIN caldav_data USING(dav_id) WHERE uid = :uid'); $qry->Bind(':uid', $uid); $qry->Exec('select dav_id, collection_id'); if ($row = $qry->Fetch()) { $qry = new AwlQuery('UPDATE calendar_attendee SET email_status=:statusTo, partstat=:partstat, params=:params WHERE attendee=:attendee AND dav_id = :dav_id'); // user accepted $qry->Bind(':statusTo', EMAIL_STATUS::NORMAL); $qry->Bind(':attendee', $attendee->Value()); $qry->Bind(':dav_id', $row->dav_id); $qry->Bind(':params', $propertyText); $qry->Bind(':partstat', $parameters['PARTSTAT']); $qry->Exec('changeStatusTo'); //'(SELECT dav_id FROM calendar_item WHERE uid = :uid)'; $collection_id = $row->collection_id; $dav_name = $row->dav_name; //$qry->QDo("SELECT write_sync_change( $collection_id, 200, :dav_name)", array(':dav_name' => $dav_name ) ); //$qry->Execute(); $this->update_caldav_data($row->caldav_data, $row->dav_id); } return true; }
function handle_remote_attendee_reply(vCalendar $ical) { $attendees = $ical->GetAttendees(); // attendee reply have just one attendee if (count($attendees) != 1) { return; } $attendee = $attendees[0]; $uidparam = $ical->GetPropertiesByPath("VCALENDAR/*/UID"); $uid = $uidparam[0]->Value(); $qry = new AwlQuery('UPDATE calendar_attendee SET email_status=:statusTo WHERE attendee=:attendee AND dav_id = (SELECT dav_id FROM calendar_item WHERE uid = :uid)'); // user accepted $qry->Bind(':statusTo', EMAIL_STATUS::NORMAL); $qry->Bind(':attendee', $attendee->Value()); $qry->Bind(':uid', $uid); $qry->Exec('changeStatusTo'); return true; }
function doItipAttendeeReply(vCalendar $resource, $partstat) { global $request; $organizer = $resource->GetOrganizer(); $organizer_email = preg_replace('/^mailto:/i', '', $organizer->Value()); $organizer_principal = new Principal('email', $organizer_email); if (!$organizer_principal->Exists()) { dbg_error_log('schedule', 'Unknown ORGANIZER "%s" - unable to notify.', $organizer->Value()); header("Debug: Could maybe do the iMIP message dance for organizer " . $organizer->Value()); return true; } $sql = 'SELECT caldav_data.dav_name, caldav_data.caldav_data FROM caldav_data JOIN calendar_item USING(dav_id) '; $sql .= 'WHERE caldav_data.collection_id IN (SELECT collection_id FROM collection WHERE is_calendar AND user_no =?) '; $sql .= 'AND uid=? LIMIT 1'; $uids = $resource->GetPropertiesByPath('/VCALENDAR/*/UID'); if (count($uids) == 0) { dbg_error_log('schedule', 'No UID in VCALENDAR - giving up on REPLY.'); return true; } $uid = $uids[0]->Value(); $qry = new AwlQuery($sql, $organizer_principal->user_no(), $uid); if (!$qry->Exec('schedule', __LINE__, __FILE__) || $qry->rows() < 1) { dbg_error_log('schedule', 'Could not find original event from organizer - giving up on REPLY.'); return true; } $row = $qry->Fetch(); $collection_path = preg_replace('{/[^/]+$}', '/', $row->dav_name); $segment_name = str_replace($collection_path, '', $row->dav_name); $vcal = new vCalendar($row->caldav_data); $attendees = $vcal->GetAttendees(); foreach ($attendees as $v) { $email = preg_replace('/^mailto:/i', '', $v->Value()); if ($email == $request->principal->email()) { $attendee = $v; break; } } if (empty($attendee)) { dbg_error_log('schedule', 'Could not find ATTENDEE in VEVENT - giving up on REPLY.'); return true; } $attendee->SetParameterValue('PARTSTAT', $partstat); $attendee->SetParameterValue('SCHEDULE-STATUS', '2.0'); $vcal->UpdateAttendeeStatus($request->principal->email(), clone $attendee); $organizer_calendar = new WritableCollection(array('path' => $collection_path)); $organizer_inbox = new WritableCollection(array('path' => $organizer_principal->internal_url('schedule-inbox'))); $schedule_reply = GetItip(new vCalendar($row->caldav_data), 'REPLY', $attendee->Value()); $schedule_request = GetItip(new vCalendar($row->caldav_data), 'REQUEST', null); dbg_error_log('schedule', 'Writing ATTENDEE scheduling REPLY from %s to %s', $request->principal->email(), $organizer_principal->email()); $response = '3.7'; // Organizer was not found on server. if (!$organizer_calendar->Exists()) { if (doImipMessage('REPLY', $organizer_principal->email(), $vcal)) { $response = '1.1'; // Scheduling whoosit 'Sent' } else { dbg_error_log('ERROR', 'Default calendar at "%s" does not exist for user "%s"', $organizer_calendar->dav_name(), $schedule_target->username()); $response = '5.2'; // No scheduling support for user } } else { if (!$organizer_inbox->HavePrivilegeTo('schedule-deliver-reply')) { $response = '3.8'; // No authority to deliver replies to organizer. } $response = '1.2'; // Scheduling reply delivered successfully if ($organizer_calendar->WriteCalendarMember($vcal, false, false, $segment_name) === false) { dbg_error_log('ERROR', 'Could not write updated calendar member to %s', $attendee_calendar->dav_name()); trace_bug('Failed to write scheduling resource.'); } $organizer_inbox->WriteCalendarMember($schedule_reply, false, false, $request->principal->username() . $segment_name); } dbg_error_log('schedule', 'Status for organizer <%s> set to "%s"', $organizer->Value(), $response); $organizer->SetParameterValue('SCHEDULE-STATUS', $response); $resource->UpdateOrganizerStatus($organizer); // Which was passed in by reference, and we're updating it here. // Now we loop through the *other* ATTENDEEs, updating them on the status of the ATTENDEE DECLINE/ACCEPT foreach ($attendees as $attendee) { $email = preg_replace('/^mailto:/i', '', $attendee->Value()); if ($email == $request->principal->email() || $email == $organizer_principal->email()) { continue; } $agent = $attendee->GetParameterValue('SCHEDULE-AGENT'); if (!empty($agent) && $agent != 'SERVER') { continue; } $schedule_target = new Principal('email', $email); if ($schedule_target->Exists()) { $attendee_calendar = new WritableCollection(array('path' => $schedule_target->internal_url('schedule-default-calendar'))); if (!$attendee_calendar->Exists()) { dbg_error_log('ERROR', 'Default calendar at "%s" does not exist for user "%s"', $attendee_calendar->dav_name(), $schedule_target->username()); continue; } else { $attendee_inbox = new WritableCollection(array('path' => $schedule_target->internal_url('schedule-inbox'))); if (!$attendee_inbox->HavePrivilegeTo('schedule-deliver-invite')) { continue; } if ($attendee_calendar->WriteCalendarMember($vcal, false) === false) { dbg_error_log('ERROR', 'Could not write updated calendar member to %s', $attendee_calendar->dav_name()); trace_bug('Failed to write scheduling resource.'); } $attendee_inbox->WriteCalendarMember($schedule_request, false); } } else { header("Debug: Could maybe do the iMIP message dance for attendee " . $email); } } return true; }