12require_once(
'iSchedule.php');
13require_once(
'vComponent.php');
14require_once(
'vCalendar.php');
15require_once(
'WritableCollection.php');
16include_once(
'freebusy-functions.php');
26 private $date_format_type;
31 private $default_privileges;
32 private $is_principal;
34 private $is_addressbook;
35 private $collection_id;
36 private $resourcetypes;
46 function __construct($principal) {
48 foreach( $principal AS $k => $v ) {
51 $this->username = $principal->username();
52 $this->user_no = $principal->user_no();
53 $this->principal_id = $principal->principal_id();
54 $this->email = $principal->email();
55 $this->dav_name = $principal->dav_name();
56 $this->principal = $principal;
58 $this->logged_in =
true;
62 function AllowedTo($do_something) {
68if ( $d->validateRequest ( ) ) {
69 $ical =
new vCalendar( $request->raw_post );
71 $addresses = Array ();
72 $attendees = $ical->GetAttendees();
73 foreach( $attendees AS $v ) {
74 $email = preg_replace(
'/^mailto:/i',
'', $v->Value() );
75 $addresses[] = $email;
77 $organizer = $ical->GetOrganizer();
78 $addresses[] = preg_replace(
'/^mailto:/i',
'', $organizer->Value() );
79 $recipients = Array ();
80 $attendees_ok = Array ();
81 $attendees_fail = Array ();
82 if ( strpos ( $_SERVER[
'HTTP_RECIPIENT'],
',' ) ===
false ) {
83 $recipients[] = $_SERVER[
'HTTP_RECIPIENT'];
86 $rcpt = explode (
',', $_SERVER[
'HTTP_RECIPIENT'] );
87 foreach ( $rcpt as $k => $v ) {
88 $recipients[$k] = preg_replace(
'/^mailto:/i',
'', trim ( $v ) );
91 if ( ! in_array ( preg_replace(
'/^mailto:/i',
'', $_SERVER[
'HTTP_ORIGINATOR'] ), $addresses ) ) {
92 $request->DoResponse( 412, translate(
'sender must be organizer or attendee of event') );
94 foreach ( $recipients as $v ) {
95 if ( ! in_array ( preg_replace(
'/^mailto:/i',
'', $v ), $addresses ) ) {
96 dbg_error_log(
'ischedule',
'recipient missing from event ' . $v );
97 $reply->XMLResponse( 403, translate(
'recipient must be organizer or attendee of event') . $v );
100 $email = preg_replace(
'/^mailto:/',
'', $v );
101 dbg_error_log(
'ischedule',
'recipient ' . $v );
102 $schedule_target =
new Principal(
'email',$email);
103 if ( $schedule_target ==
false ){
104 array_push ( $attendees_fail, $schedule_target );
107 array_push ( $attendees_ok, $schedule_target );
110 $method = $ical->GetPValue(
'METHOD');
112 $content_type = explode (
';', $_SERVER[
'CONTENT_TYPE'] );
113 if ( $content_type[0] !=
'text/calendar' )
114 $reply->XMLResponse( 406,
'content must be text/calendar' );
116 $content_parts = Array ();
117 foreach ( $content_type as $v ) {
118 if ($v ==
'text/calendar')
121 list ( $a, $b ) = explode (
'=', trim ( $v ), 2 );
122 $content_parts[strtolower($a)] = strtoupper($b);
124 if ( isset ( $content_parts[
'method'] ) )
125 $method = $content_parts[
'method'];
129 if ( $content_parts[
'component'] ==
'VFREEBUSY' ) {
130 ischedule_freebusy_request ( $ical, $attendees_ok, $attendees_fail );
132 if ( $content_parts[
'component'] ==
'VEVENT' ) {
133 ischedule_request ( $ical, $attendees_ok, $attendees_fail );
136 if ( $content_parts[
'component'] ==
'VTODO' ) {
137 ischedule_request ( $ical, $attendees_ok, $attendees_fail );
140 if ( $content_parts[
'component'] ==
'VJOURNAL' ) {
145 ischedule_request ( $ical, $attendees_ok, $attendees_fail );
148 ischedule_request ( $ical, $attendees_ok, $attendees_fail );
151 ischedule_request ( $ical, $attendees_ok, $attendees_fail );
159 case 'DECLINECOUNTER':
162 dbg_error_log(
'ischedule',
'invalid request' );
163 $request->DoResponse( 400, translate(
'invalid request') );
167 dbg_error_log(
'ischedule',
'invalid request' );
168 $request->DoResponse( 400, translate(
'invalid request') );
171function ischedule_freebusy_request( $ic, $attendees, $attendees_fail) {
172 global $c, $session, $request;
173 $reply =
new XMLDocument( array(
"urn:ietf:params:xml:ns:ischedule" =>
"I" ) );
174 $icalAttendees = $ic->GetAttendees();
175 $responses = array();
176 $ical = $ic->GetComponents(
'VFREEBUSY');
178 $fbq_start = $ical->GetPValue(
'DTSTART');
179 $fbq_end = $ical->GetPValue(
'DTEND');
180 if ( ! ( isset($fbq_start) || isset($fbq_end) ) ) {
181 $request->DoResponse( 400,
'All valid freebusy requests MUST contain a DTSTART and a DTEND' );
187 foreach( $attendees AS $k => $attendee ) {
188 $response = $reply->NewXMLElement(
"response",
false,
false,
'urn:ietf:params:xml:ns:ischedule');
189 $fb = get_freebusy(
'^'.$attendee->dav_name, $range_start, $range_end );
191 $fb->AddProperty(
'UID', $ical->GetPValue(
'UID') );
192 $fb->SetProperties( $ical->GetProperties(
'ORGANIZER'),
'ORGANIZER');
193 foreach ( $ical->GetProperties(
'ATTENDEE') as $at ) {
194 if ( $at->Value() ==
'mailto:' . $attendee->email )
195 $fb->AddProperty( $at );
198 $vcal =
new vCalendar( array(
'METHOD' =>
'REPLY') );
199 $vcal->AddComponent( $fb );
201 $response = $reply->NewXMLElement(
"response",
false,
false,
'urn:ietf:params:xml:ns:ischedule' );
202 $response->NewElement(
"recipient",
'mailto:'.$attendee->email,
false,
'urn:ietf:params:xml:ns:ischedule' );
203 $response->NewElement(
"request-status",
"2.0;Success",
false,
'urn:ietf:params:xml:ns:ischedule' );
204 $response->NewElement(
"calendar-data", $vcal->Render(),
false,
'urn:ietf:params:xml:ns:ischedule' );
206 $responses[] = $response;
209 foreach ( $attendees_fail AS $k => $attendee ) {
210 $XMLresponse = $reply->NewXMLElement(
"response",
false,
false,
'urn:ietf:params:xml:ns:ischedule');
211 $XMLresponse->NewElement(
"recipient", $reply->href(
'mailto:'.$attendee));
212 $XMLresponse->NewElement(
"request-status",
'5.3;cannot schedule this user, unknown or access denied');
213 $responses[] = $XMLresponse;
215 $response = $reply->NewXMLElement(
"schedule-response", $responses, $reply->GetXmlNsArray(),
'urn:ietf:params:xml:ns:ischedule' );
216 $request->XMLResponse( 200, $response );
219function ischedule_request( $ic, $attendees, $attendees_fail ) {
220 global $c, $session, $request;
221 $oldSession = $session;
222 $reply =
new XMLDocument( array(
"urn:ietf:params:xml:ns:ischedule" =>
"I" ) );
223 $responses = array();
224 $ical = $ic->GetComponents(
'VEVENT');
227 foreach ( $attendees AS $k => $attendee ) {
228 $XMLresponse = $reply->NewXMLElement(
"response",
false,
false,
'urn:ietf:params:xml:ns:ischedule');
229 dbg_error_log(
'ischedule',
'scheduling event for ' .$attendee->email);
230 $schedule_target =
new Principal(
'email',$attendee->email);
232 if ( $schedule_target->Exists() ) {
234 $attendee_calendar =
new WritableCollection(array(
'path' => $schedule_target->internal_url(
'schedule-default-calendar')));
235 if ( !$attendee_calendar->Exists() ) {
236 dbg_error_log(
'ERROR',
'Default calendar at "%s" does not exist for user "%s"',
237 $attendee_calendar->dav_name(), $schedule_target->username());
238 $response =
'5.3;cannot schedule this user, unknown or access denied';
241 $attendee_inbox =
new WritableCollection(array(
'path' => $schedule_target->internal_url(
'schedule-inbox')));
242 if ( ! $attendee_inbox->HavePrivilegeTo(
'schedule-deliver-invite') ) {
243 $response =
'3.8;denied';
245 else if ( $attendee_inbox->WriteCalendarMember($ic,
false) !==
false ) {
246 $response =
'2.0;delivered';
249 $session = $oldSession;
251 dbg_error_log(
'ischedule',
'Status for attendee <%s> set to "%s"', $attendee->email, $response );
252 $XMLresponse->NewElement(
"recipient",
'mailto:'.$attendee->email,
false,
'urn:ietf:params:xml:ns:ischedule' );
253 $XMLresponse->NewElement(
"request-status", $response,
false,
'urn:ietf:params:xml:ns:ischedule' );
254 $responses[] = $XMLresponse;
257 foreach ( $attendees_fail AS $k => $attendee ) {
258 $XMLresponse = $reply->NewXMLElement(
"response",
false,
false,
'urn:ietf:params:xml:ns:ischedule');
259 $XMLresponse->NewElement(
"recipient",
'mailto:'.$attendee->email,
false,
'urn:ietf:params:xml:ns:ischedule' );
260 $XMLresponse->NewElement(
"request-status",
'5.3;cannot schedule this user, unknown or access denied',
false,
'urn:ietf:params:xml:ns:ischedule' );
261 $responses[] = $XMLresponse;
264 $response = $reply->NewXMLElement(
"schedule-response", $responses, $reply->GetXmlNsArray(),
'urn:ietf:params:xml:ns:ischedule' );
265 $request->XMLResponse( 200, $response );
268function ischedule_cancel( $ic, $attendees, $attendees_fail ) {
269 global $c, $session, $request;
270 $reply =
new XMLDocument( array(
"DAV:" =>
"",
"urn:ietf:params:xml:ns:caldav" =>
"C",
"urn:ietf:params:xml:ns:ischedule" =>
"I" ) );
271 $responses = array();
272 $ical = $ic->GetComponents(
'VEVENT');
275 foreach ( $attendees AS $k => $attendee ) {
276 $XMLresponse = $reply->NewXMLElement(
"response",
false,
false,
'urn:ietf:params:xml:ns:ischedule');
277 dbg_error_log(
'ischedule',
'scheduling event for ' .$attendee->email);
278 $schedule_target =
new Principal(
'email',$attendee->email);
280 if ( $schedule_target->Exists() ) {
281 $attendee_calendar =
new WritableCollection(array(
'path' => $schedule_target->internal_url(
'schedule-default-calendar')));
282 if ( !$attendee_calendar->Exists() ) {
283 dbg_error_log(
'ERROR',
'Default calendar at "%s" does not exist for user "%s"',
284 $attendee_calendar->dav_name(), $schedule_target->username());
285 $response =
'5.3;cannot schedule this user, unknown or access denied';
288 $attendee_inbox =
new WritableCollection(array(
'path' => $schedule_target->internal_url(
'schedule-inbox')));
289 if ( ! $attendee_inbox->HavePrivilegeTo(
'schedule-deliver-invite') ) {
290 $response =
'3.8;denied';
292 else if ( $attendee_inbox->WriteCalendarMember($ic,
false) !==
false ) {
293 $response =
'2.0;delivered';
297 dbg_error_log(
'PUT',
'Status for attendee <%s> set to "%s"', $attendee->email, $response );
298 $XMLresponse->NewElement(
"recipient", $reply->href(
'mailto:'.$attendee->email),
false,
'urn:ietf:params:xml:ns:ischedule' );
299 $XMLresponse->NewElement(
"request-status", $response,
false,
'urn:ietf:params:xml:ns:ischedule' );
300 $responses[] = $XMLresponse;
303 foreach ( $attendees_fail AS $k => $attendee ) {
304 $XMLresponse = $reply->NewXMLElement(
"response",
false,
false,
'urn:ietf:params:xml:ns:ischedule');
305 $XMLresponse->NewElement(
"recipient", $reply->href(
'mailto:'.$attendee->email),
false,
'urn:ietf:params:xml:ns:ischedule' );
306 $XMLresponse->NewElement(
"request-status",
'5.3;cannot schedule this user, unknown or access denied',
false,
'urn:ietf:params:xml:ns:ischedule' );
307 $responses[] = $XMLresponse;
310 $response = $reply->NewXMLElement(
"schedule-response", $responses, $reply->GetXmlNsArray(),
'urn:ietf:params:xml:ns:ischedule' );
311 $request->XMLResponse( 200, $response );