source: contrib/davical/inc/caldav-REPORT.php @ 3733

Revision 3733, 58.7 KB checked in by gabriel.malheiros, 13 years ago (diff)

Ticket #1541 - <Davical customizado para o Expresso.Utiliza Caldav e CardDav?>

Line 
1<?php
2/**
3* CalDAV Server - handle REPORT method
4*
5* @package   davical
6* @subpackage   caldav
7* @author    Andrew McMillan <andrew@morphoss.com>
8* @copyright Catalyst .Net Ltd, Morphoss Ltd
9* @license   http://gnu.org/copyleft/gpl.html GNU GPL v2
10*/
11dbg_error_log("REPORT", "method handler");
12
13require_once("XMLDocument.php");
14require_once('DAVResource.php');
15include_once("drivers_ldap.php");
16require_once('RRule-v2.php');
17
18if ( ! ini_get('open_basedir') && (isset($c->dbg['ALL']) || (isset($c->dbg['report']) && $c->dbg['report'])) ) {
19  $fh = fopen('/tmp/REPORT.txt','w');
20  if ( $fh ) {
21    fwrite($fh,$request->raw_post);
22    fclose($fh);
23  }
24}
25
26if ( !isset($request->xml_tags) ) {
27  $request->DoResponse( 406, translate("REPORT body contains no XML data!") );
28}
29$position = 0;
30$xmltree = BuildXMLTree( $request->xml_tags, $position);
31if ( !is_object($xmltree) ) {
32  $request->DoResponse( 406, translate("REPORT body is not valid XML data!") );
33}
34
35$target = new DAVResource($request->path);
36$target->NeedPrivilege( array('DAV::read', 'urn:ietf:params:xml:ns:caldav:read-free-busy'), true ); // They may have either
37
38if ( $xmltree->GetTag() != 'DAV::principal-property-search'
39                && $xmltree->GetTag() != 'DAV::principal-property-search-set' ) {
40  $target->NeedPrivilege( array('DAV::read', 'urn:ietf:params:xml:ns:caldav:read-free-busy'), true ); // They may have either
41}
42
43require_once("iCalendar.php");
44
45$reportnum = -1;
46$report = array();
47$denied = array();
48$unsupported = array();
49if ( isset($prop_filter) ) unset($prop_filter);
50
51if ( $xmltree->GetTag() == 'urn:ietf:params:xml:ns:caldav:free-busy-query' ) {
52  include("caldav-REPORT-freebusy.php");
53  exit; // Not that the above include should return anyway
54}
55
56$reply = new XMLDocument( array( "DAV:" => "" ) );
57switch( $xmltree->GetTag() ) {
58  case 'DAV::principal-property-search':
59    include("caldav-REPORT-principal.php");
60    exit; // Not that it should return anyway.
61  case 'DAV::principal-search-property-set':
62    include("caldav-REPORT-pps-set.php");
63    exit; // Not that it should return anyway.
64  case 'DAV::sync-collection':
65    include("caldav-REPORT-sync-collection.php");
66    exit; // Not that it should return anyway.
67  case 'DAV::expand-property':
68    include("caldav-REPORT-expand-property.php");
69    exit; // Not that it should return anyway.
70}
71
72
73/**
74* Return XML for a single calendar (or todo) entry from the DB
75*
76* @param array $properties The properties for this calendar
77* @param string $item The calendar data for this calendar
78*
79* @return string An XML document which is the response for the calendar
80******************************** Função Customizada para o Expresso ******************** 
81//
82//function calendar_to_xml( $properties, $item ) {
83//  global $session, $c, $request, $reply;
84//
85// dbg_error_log("REPORT","Building XML Response for item '%s'", $item->dav_name );
86//
87//  $denied = array();
88//  $caldav_data = $item->caldav_data;
89//  $displayname = $item->summary;
90//  if ( isset($properties['calendar-data']) || isset($properties['displayname']) ) {
91//    if ( !$request->AllowedTo('all') && $session->user_no != $item->user_no ){
92//      // the user is not admin / owner of this calendarlooking at his calendar and can not admin the other cal
93//      /** @todo We should examine the ORGANIZER and ATTENDEE fields in the event.  If this person is there then they should see this */
94//      if ( $item->class == 'CONFIDENTIAL' || !$request->AllowedTo('read') ) {
95//        $ical = new iCalComponent( $caldav_data );
96//        $resources = $ical->GetComponents('VTIMEZONE',false);
97//        $first = $resources[0];
98//
99//        // if the event is confidential we fake one that just says "Busy"
100//        $confidential = new iCalComponent();
101//        $confidential->SetType($first->GetType());
102//        $confidential->AddProperty( 'SUMMARY', translate('Busy') );
103//        $confidential->AddProperty( 'CLASS', 'CONFIDENTIAL' );
104//        $confidential->SetProperties( $first->GetProperties('DTSTART'), 'DTSTART' );
105//        $confidential->SetProperties( $first->GetProperties('RRULE'), 'RRULE' );
106//        $confidential->SetProperties( $first->GetProperties('DURATION'), 'DURATION' );
107//        $confidential->SetProperties( $first->GetProperties('DTEND'), 'DTEND' );
108//        $confidential->SetProperties( $first->GetProperties('UID'), 'UID' );
109//        $ical->SetComponents(array($confidential),$confidential->GetType());
110//
111//        $caldav_data = $ical->Render();
112//        $displayname = translate('Busy');
113//      }
114//    }
115//  }
116//
117//  $url = ConstructURL($item->dav_name);
118//
119//  $prop = new XMLElement("prop");
120//  foreach( $properties AS $k => $v ) {
121//    switch( $k ) {
122//      case 'getcontentlength':
123//        $contentlength = strlen($caldav_data);
124//        $prop->NewElement($k, $contentlength );
125//        break;
126//      case 'calendar-data':
127//        $reply->CalDAVElement($prop, $k, $caldav_data );
128//        break;
129//      case 'getcontenttype':
130//        $prop->NewElement($k, "text/calendar" );
131//        break;
132//      case 'current-user-principal':
133//        $prop->NewElement("current-user-principal", $request->current_user_principal_xml);
134//        break;
135//     case 'displayname':
136//        $prop->NewElement($k, $displayname );
137//        break;
138//      case 'resourcetype':
139//        $prop->NewElement($k); // Just an empty resourcetype for a non-collection.
140//        break;
141//      case 'getetag':
142//        $prop->NewElement($k, '"'.$item->dav_etag.'"' );
143//        break;
144//      case '"current-user-privilege-set"':
145//        $prop->NewElement($k, privileges($request->permissions) );
146//        break;
147//      case 'SOME-DENIED-PROPERTY':  /** indicating the style for future expansion */
148//        $denied[] = $v;
149//        break;
150//      default:
151//        dbg_error_log( 'REPORT', "Request for unsupported property '%s' of calendar item.", $v );
152//        $unsupported[] = $v;
153//   }
154//  }
155//  $status = new XMLElement("status", "HTTP/1.1 200 OK" );
156//
157//  $propstat = new XMLElement( "propstat", array( $prop, $status) );
158//  $href = new XMLElement("href", $url );
159//  $elements = array($href,$propstat);
160//
161//  if ( count($denied) > 0 ) {
162//    $status = new XMLElement("status", "HTTP/1.1 403 Forbidden" );
163//    $noprop = new XMLElement("prop");
164//    foreach( $denied AS $k => $v ) {
165//      $noprop->NewElement( strtolower($v) );
166//    }
167//    $elements[] = new XMLElement( "propstat", array( $noprop, $status) );
168//  }
169//
170//  $response = new XMLElement( "response", $elements );
171//
172//  return $response;
173//}
174//
175//*/
176/************* Função nova Customizada *************
177*/
178function contacts_to_xml( $properties, $item)
179{
180  global $session, $c, $request, $reply;
181  $path = preg_replace("/^\//","",$request->path);
182  //$filtro = "uid=".$path;
183  //$atributos = array("uidNumber");
184  //$uidnumber = ldapDrivers::requestAtributo($filtro, $atributos);
185  //if ($uidnumber == false) {
186  //             dbg_error_log( "REPORT", "Responding with report error:  usuario não encontrado no diretorio");
187  //             $request->DoResponse( 501, 'Database error');
188  //}
189  // $nome = $uidnumber['uidNumber'];
190  // $nome = $target->GetProperty('user_no');
191   $nome = $item->id_owner;
192   $mails = array();
193   $phones = array();
194   unset($VCARD);
195   $VCARD = "UID:$item->id_contact@$nome\n\n";
196   
197   /***************************
198   ********* DADOS DEFAULT ****
199   ****************************/
200   $VCARD .= "N:$item->family_names;$item->given_names\n\n";
201   $VCARD .= "FN:$item->names_ordered\n\n";
202   if ( isset($item->alias)) $VCARD .= "NICKNAME:$item->alias\n\n";
203   if ( isset($item->photo)) $VCARD .= "PHOTO:ENCODING=b;TYPE=JPEG:$item->photo\n\n";
204   if ( isset($item->birthdate)) $VCARD .= "BDAY:$item->birthdate\n\n";
205   if ( isset($item->notes)) $VCARD .= "NOTE:$item->notes\n\n";
206   /**************************
207   ********** EMAIL & TEL ****
208   ***************************/
209    $qry = new AwlQuery("SELECT * FROM phpgw_cc_contact_conns  inner join phpgw_cc_connections using(id_connection) WHERE  phpgw_cc_contact_conns.id_contact= :id", array(':id' => $item->id_contact));
210    if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows() > 0 ){
211      while( $email_tel = $qry->Fetch() ) {
212          if ( $email_tel->id_typeof_contact_connection == 1)
213             {
214               if ( $email_tel->connection_name == 'Principal' )
215                  $type=WORK;
216               else
217                  $type=HOME;
218               $VCARD .= "EMAIL;TYPE=$type:$email_tel->connection_value\n\n";
219              }
220          else if ( $email_tel->id_typeof_contact_connection == 2)
221             {
222                if ( $email_tel->connection_name == 'Trabalho' )
223                  $type=WORK;
224               else if ( $email_tel->connection_name == 'Casa' )
225                  $type=HOME;
226               else if ( $email_tel->connection_name == 'Celular' )
227                  $type=CELL;
228               else if ( $email_tel->connection_name == 'Fax' )
229                  $type=FAX;
230
231              $VCARD .= "TEL;TYPE=$type:$email_tel->connection_value\n\n";
232              }   
233      }
234    }
235   /**************************
236    ************ ADDR ********
237    **************************/
238    $qry = new AwlQuery("SELECT * FROM phpgw_cc_contact_addrs  inner join phpgw_cc_addresses  using(id_address) WHERE  phpgw_cc_contact_addrs.id_contact= :id", array(':id' => $item->id_contact));
239    if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows() > 0 ){
240      while( $addr = $qry->Fetch() ) {
241          if ( $addr->id_typeof_contact_address == 1)
242             {
243               $type=HOME;
244               $VCARD .= "ADR;TYPE=$type:;;$addr->address1;$addr->city;$addr->state;$addr->postal_code;$addr->id_contry\n\n";
245              }
246          else if ( $addr->id_typeof_contact_address == 2)
247             {
248               $type=WORK;
249               $VCARD .= "ADR;TYPE=$type:;;$addr->address1;$addr->city;$addr->state;$addr->postal_code;$addr->id_contry\n\n";
250              }
251      }
252    }   
253   
254
255   /********** PUBLIC KEY ********
256    *****************************/
257
258   
259
260
261   dbg_error_log("REPORT","Building XML Response for item '%s' usuario  '%s'", $item->id_contact,$nome );
262   $response = "BEGIN:VCARD\n\nVERSION:3.0\n\nPRODID:-//Inverse inc.//SOGo Connector 1.0//EN\n\n";
263   $response .= "$VCARD";
264   $response .= "END:VCARD\n\n";
265   $caldav_data = $response;
266   
267   $dav_nam = "{$item->id_contact}@{$item->id_owner}";
268   $dav_etag_nam = md5($item->id_contact.$item->id_owner.$item->last_update);
269   //$dav_name = "{$item->id_contact}@{$item->id_owner}";
270   $dav_name = sprintf('/%s/%s@%s.vcf',$path,$item->id_contact,$item->id_owner);
271   $url = ConstructURL($dav_name);
272 
273   $prop = new XMLElement("prop");                                                                                                     
274   foreach( $properties AS $k => $v ) {                                                                                                 
275    switch( $k ) {                                                                                                                     
276      case 'getcontentlength':                                                                                                         
277        $contentlength = strlen($caldav_data);                                                                                         
278        $prop->NewElement($k, $contentlength );                                                                                       
279        break;                                                                                                                         
280      case 'address-data':                                                                                                           
281        $reply->CardDAVElement($prop, $k, $caldav_data );                                                                               
282        break;                                                                                                                         
283      case 'getcontenttype':                                                                                                           
284        $prop->NewElement($k, "text/x-vcard" );                                                                                       
285        break;                                                                                                                         
286      case 'current-user-principal':                                                                                                   
287        $prop->NewElement("current-user-principal", $request->current_user_principal_xml);                                             
288        break;                                                                                                                         
289     case 'displayname':                                                                                                               
290        $prop->NewElement($k, $displayname );                                                                                         
291        break;                                                                                                                         
292      case 'resourcetype':                                                                                                             
293        $prop->NewElement($k); // Just an empty resourcetype for a non-collection.                                                     
294        break;                                                                                                                         
295      case 'getetag':                                                                                                                 
296        $prop->NewElement($k, '"'.$dav_etag_nam.'"' );                                                                               
297        break;                                                                                                                         
298      case '"current-user-privilege-set"':                                                                                             
299        $prop->NewElement($k, privileges($request->permissions) );                                                                     
300        break;                                                                                                                         
301      case 'SOME-DENIED-PROPERTY':  /** indicating the style for future expansion */                                                   
302        $denied[] = $v;                                                                                                               
303        break;                                                                                                                         
304      default:                                                                                                                         
305        dbg_error_log( 'REPORT', "Request for unsupported property '%s' of calendar item.", $v );                                     
306        $unsupported[] = $v;                                                                                                           
307   }                                                                                                                                   
308  } 
309
310   $status = new XMLElement("status", "HTTP/1.1 200 OK" );
311   $propstat = new XMLElement( "propstat", array( $prop, $status) );
312   $href = new XMLElement("href", $url );
313   $elements = array($href,$propstat);
314   if ( count($denied) > 0 ) {
315                $status = new XMLElement("status", "HTTP/1.1 403 Forbidden" );
316                $noprop = new XMLElement("prop");
317                foreach( $denied AS $k => $v ) {
318                $noprop->NewElement( strtolower($v) );
319          }
320     $elements[] = new XMLElement( "propstat", array( $noprop, $status) );
321    }
322
323
324 $response = new XMLElement( "response", $elements );
325 return $response;     
326
327}
328function calendar_to_xml( $properties, $item ) {                       
329        global $c, $request, $reply;
330        $path = preg_replace("/^\//","",$request->path);                                   
331        //$filtro = "uid=".$path;
332        //$atributos = array("uidNumber");
333        //$uidnumber = ldapDrivers::requestAtributo($filtro, $atributos);
334        //if ($uidnumber == false) {
335        //         dbg_error_log( "REPORT", "Responding with report error:  usuario não encontrado no diretorio");
336        //         $request->DoResponse( 501, 'Database error');
337        //} 
338        //$nome = $uidnumber['uidNumber'];
339        $nome = $item->owner;                         
340        dbg_error_log("REPORT","Building XML Response for item '%s' usuario  '%s'", $item->cal_id,$nome );
341        $mdate = $item->mdatetime;
342        $calid = $item->cal_id;
343        $modify_data = dataSegundosParaT($mdate,1);
344        $date = $item->datetime;
345        $create_data = dataSegundosParaT($date,1);
346        $start_data = dataSegundosParaT($date);
347        $edate = $item->edatetime;
348        $end_data = dataSegundosParaT($edate);
349        $titulo = utf8_encode($item->title);
350        $local = utf8_encode($item->location);
351        if($local != "" )
352              $local = "\n\nLOCATION:$local";
353        else
354              $local = "";                     
355        $descricao = utf8_encode($item->description);
356        if($descricao != "")
357              $descricao = "\n\nDESCRIPTION:".preg_replace('/\r\n/', '\\n', $descricao);
358        else
359              $descricao = "";
360        $moz="";
361       
362        /*******************
363         **** Sequencia ****
364         ******************/
365       
366        $sequec = "\n\nSEQUENCE:0";
367 
368        /*********
369         *ALARMES*
370         *********/
371        $alarme_id = $item->cal_id;
372        $alarme = new AwlQuery( "SELECT * FROM phpgw_async WHERE id = :alarme_id", array(':alarme_id' => 'cal:'.$alarme_id.':0'));
373        if ( $alarme->Exec("REPORT",__LINE__,__FILE__) && $alarme->rows() > 0 ){         
374                $nao_alarme = new AwlQuery( "SELECT * FROM phpgw_cal_extra WHERE  cal_id = :alarme_id AND (cal_extra_name = 'X-MOZ-LASTACK' OR cal_extra_name = :X-MOZ-LASTACK-PART)",array( ':alarme_id' => $alarme_id, ':X-MOZ-LASTACK-PART' => 'X-MOZ-LASTACK-PART-'.$nome));
375                if ( $nao_alarme->Exec("REPORT",__LINE__,__FILE__) && $nao_alarme->rows() == 1 ){                                                                                               
376                        $alarmeqryno = $nao_alarme->Fetch();                                                                                                                                   
377                        $moz = "\n\nX-MOZ-LASTACK:$alarmeqryno->cal_extra_value";
378                        $moz .= "\n\nX-MOZ-GENERATION:1";
379                        $modify_data = "$alarmeqryno->cal_extra_value";
380                        $adiamento = new AwlQuery( "SELECT * FROM phpgw_cal_extra WHERE  cal_id = :alarme_id AND cal_extra_name LIKE 'X-MOZ-SNOOZE%'",  array( ':alarme_id' => $alarme_id));                                       
381                        if ( $adiamento->Exec("REPORT",__LINE__,__FILE__) && $adiamento->rows() > 0 ){                                                                                         
382                             $admno = $adiamento->Fetch();                                                                                                                                     
383                            $moz .= "\n\n$admno->cal_extra_name:$admno->cal_extra_value";                                                                                                     
384                        } 
385                        dbg_error_log("REPORT","CANCELAR ALARME '%s' ", $moz);
386                                                                                                                                                                   
387                        //$deleta = new AwlQuery( "DELETE FROM phpgw_cal_extra  WHERE cal_id = '$alarme_id'");                                                                                 
388                        //$deleta->Exec("calquery",__LINE__,__FILE__);                                                                                                                         
389                                                                                                                                                                                               
390                }                                                                                                                                                                             
391                else{                                                                                                                                                                         
392                        $moz="";                                                                                                                                                               
393                }                                                                                                                                                                             
394               
395                $alarmeqry = $alarme->Fetch();
396                $tempo = split(";", $alarmeqry->data, 4);
397                $tempoalarme = $alarmeqry->next;// + $mais;
398                $agoranow = date_create();                 
399                $agora  = $agoranow->format("U");         
400                $segundos = split(":", $tempo[3], 2);     
401                if ( $tempoalarme >= $agora | $item->cal_type == 'M'){
402                        if ( $segundos[1] <= 3600 ){                 
403                                $minutos = $segundos[1]/60;           
404                                $VALARME = "\n\nBEGIN:VALARM\n\nTRIGGER;VALUE=DURATION:-PT${minutos}M\n\nDESCRIPTION:Descrição padrão Mozilla\n\nACTION:DISPLAY\n\nEND:VALARM";
405                        }                                                                                                                                                   
406                        else if ( $segundos[1] < 86400   ){                                                                                                                 
407                                $hora = $segundos[1]/60/60;                                                                                                                 
408                                $VALARME = "\n\nBEGIN:VALARM\n\nTRIGGER;VALUE=DURATION:-PT${hora}H\n\nDESCRIPTION:Descrição padrão Mozilla\n\nACTION:DISPLAY\n\nEND:VALARM";   
409                        }                                                                                                                                                   
410                        else if ( $segundos[1] == 604800 ){                                                                                                                 
411                                $VALARME = "\n\nBEGIN:VALARM\n\nTRIGGER;VALUE=DURATION:-P1W\n\nDESCRIPTION:Descrição padrão Mozilla\n\nACTION:DISPLAY\n\nEND:VALARM";         
412                        }                                                                                                                                                   
413                        else{                                                                                                                                               
414                                $dia = $segundos[1]/60/60/24;                                                                                                               
415                                $VALARME = "\n\nBEGIN:VALARM\n\nTRIGGER;VALUE=DURATION:-P${dia}D\n\nDESCRIPTION:Descrição padrão Mozilla\n\nACTION:DISPLAY\n\nEND:VALARM";     
416                        }                                                                                                                                                   
417                }                                                                                                                                                           
418                else{                                                                                                                                                       
419                        $VALARME ="";                                                                                                                                       
420                }                                                                                                                                                           
421        }                                                                                                                                                                   
422        else{                                                                                                                                                               
423                $VALARME ="";                                                                                                                                               
424        }                                                                                                                                                                   
425        //dbg_error_log("GET", "HORA LOCAL  = '%s'",$VALARME);                                                                                                             
426                                                                                                                                                                           
427        /*****************************************                                                                                                                         
428        **** Ajuste para TZ funcionar ************                                                                                                                         
429        *****************************************/                                                                                                                         
430
431        //$HorarioTimeZone = new DateTimeZone(date_default_timezone_get());
432        ///$create_data = dataSegundosParaT($item->datetime);               
433        //$retorna = date("Ymd\THis",$create_data);                         
434                                                                           
435
436
437
438
439
440
441
442        /*******************
443         *NOME DA CATEGORIA*
444         *******************/
445        $categories="";
446        //if (strlen($item->category)>2){
447        if ($item->category != "" ){     
448                $x= "select cat_name from phpgw_categories WHERE cat_id = :category";
449                $phpgw_query = new AwlQuery ($x,  array(':category' => $item->category));                                           
450                if ( $phpgw_query->Exec() && $phpgw_query->rows() > 0 ) {                   
451                        while( $id_cale = $phpgw_query->Fetch() ) {                       
452                                 $categories = "\n\nCATEGORIES:".utf8_encode($id_cale->cat_name);             
453                               //$categories = $id_cale->cat_name;                         
454                        }                                                                 
455                }                                                                         
456        }                                                                                 
457        $displayname = $item->title;                                                       
458
459        /**********
460         *CONVITES*
461         **********/
462
463        $cn = array();
464        $mail = array();
465        $estado = array();
466        $members = "";   
467        unset($cn);       
468        unset($mail);     
469        unset($estado);   
470        unset($envia_convite);
471        unset($mails);       
472        $part2= "SELECT cal_login,cal_status FROM phpgw_cal_user WHERE cal_id = :cal_id  AND cal_type = 'u'";
473        $querypart = new AwlQuery( $part2 , array(':cal_id' => $item->cal_id));                                                                         
474        $i=0;                                                                                                       
475        if ( $querypart->Exec("REPORT",__LINE__,__FILE__) && $querypart->rows() > 0 ) {                             
476                while( $id_cale = $querypart->Fetch() ) {                                                           
477                        if ($item->owner != $id_cale->cal_login){                                                   
478                                $filtro = "uidNumber=$id_cale->cal_login" ;                                         
479                                if (strlen($filtro) > 12){                                                         
480                                        $atributos=array("cn","mail");                                             
481                                        $usuario=  ldapDrivers::requestAtributo($filtro,$atributos);               
482                                        if (isset($usuario))                                                       
483                                        {                                                                           
484                                                $cn[$i] = $usuario['cn'];                                           
485                                                $mail[$i] = $usuario['mail'];                                       
486                                                switch ($id_cale->cal_status){                                     
487                                                        case 'A':                                                   
488                                                                $estado[$i] = "ACCEPTED";                           
489                                                                        break;                                     
490                                                        case 'T':                                                   
491                                                                $estado[$i] = "TENTATIVE";                         
492                                                                break;                                             
493                                                        case 'U':                                                   
494                                                                $estado[$i] = "NEEDS-ACTION";                       
495                                                                break;                                             
496                                                        case 'R':                                                   
497                                                                $estado[$i] = "DECLINED";                           
498                                                                break;                                             
499                                                }                                                                   
500                                        }                                                                           
501                                }                                                                                   
502                        }                                                                                           
503                        $i++;                                                                                       
504                }                                                                                                   
505        }                                                                                                           
506
507        if ( isset($item->ex_participants))
508        {                                 
509                $mails = split("[?,]",$item->ex_participants);
510        }                                                     
511        for ($i = 0; $i <= count($cn); $i++) {               
512                if (strlen($mail[$i])>5){                     
513                        $members = $members."\nATTENDEE;RSVP=TRUE;CN=$cn[$i];PARTSTAT=$estado[$i];ROLE=REQ-PARTICIPANT:MAILTO:$mail[$i]\r";
514                }                                                                                                                         
515                dbg_error_log("REPORT", "participantes interno funcao report $members");                                             
516        }                                                                                                                                 
517        for ($i = 0 ; $i <= count($mails); $i++) {                                                                                         
518                if ( $mails[$i] != '' ){                                                                                                   
519                        dbg_error_log("REPORT", "participante externo  = '%s'",$mails[$i]);                                           
520                        $members = $members."\nATTENDEE;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT:MAILTO:$mails[$i]\r";         
521                }                                                                                                                         
522        }                                                                                                                                 
523
524        $HorarioTimeZone = new DateTimeZone(date_default_timezone_get());
525        $HorarioTime = new DateTime("now", $HorarioTimeZone);           
526        $convite = new AwlQuery( "SELECT cal_extra_value FROM phpgw_cal_extra WHERE cal_id = :cal_id", array(':cal_id' => $item->cal_id));
527        if ( $convite->Exec("REPORT",__LINE__,__FILE__) && $convite->rows() > 0 ) {                           
528                $xmozconvite = $convite->Fetch();
529                dbg_error_log("REPORT", "estatus de ivio de convite  = '%s'",$xmozconvite->cal_extra_value);
530                if ($xmozconvite->cal_extra_value == "true"){                                                 
531                         $envia_convite = "X-MOZ-SEND-INVITATIONS:TRUE";                                     
532                            $convite = new AwlQuery( "DELETE FROM phpgw_cal_extra WHERE cal_id = :cal_id", array(':cal_id' => $item->cal_id));
533                            $convite->Exec("REPORT",__LINE__,__FILE__);                                         
534                }else{     
535                            $envia_convite = "X-MOZ-SEND-INVITATIONS:FALSE";
536                }                                                                                                 
537        }                                                                                                         
538                                                                                                                 
539
540        /*********
541         *PUBLICO*
542         *********/
543
544        if ( $item->is_public == 0 ){
545                $classe = "PRIVATE";
546                $transp = "\n\nTRANSP:TRANSPARENT"; 
547        }                           
548        else{                       
549                $classe = "PUBLIC"; 
550                $transp = "\n\nTRANSP:OPAQUE"; 
551 
552       }                           
553                                     
554        /*******************         
555         *EVENTOS REPETIDOS*         
556         *******************/       
557        unset($Rrule);
558        if ( $item->cal_type == 'M' ){
559                /**Busca exceções de eventos repetidos, quando são criados novos eventos a partir de uma repetição
560                 * Para ter funcionamento igual ao expresso, escondo o evento repetido.                           
561                 * Essa função apenas adiciona o horário dessa função ao campo EXDATE.                           
562                 */                                                                                               
563                if ( $item->recur_exception != ''){                                                               
564                        $listadeexcecao = array();                                                               
565                        $listadeexcecao = explode("," , $item->recur_exception);                                 
566                        foreach ($listadeexcecao AS $dataexcecao){                                               
567                                $execao = dataSegundosParaT($dataexcecao,1);                                     
568                                $exe = "$exe,$execao";                                                           
569                        }                                                                                         
570                }                                                                                                 
571                $exe = trim($exe, " ,");                                                                         
572                $x= "select datetime from phpgw_cal where reference = :cal_id";                             
573                $phpgw_query = new AwlQuery ($x, array(':cal_id' => $item->cal_id));                                                                 
574                if ( $phpgw_query->Exec() && $phpgw_query->rows() > 0 ) {                                           
575                        while( $id_cale = $phpgw_query->Fetch() ) {                                               
576                                date_default_timezone_set('UTC');                                                 
577                                $data_antiga = date("Ymd\THis",$item->datetime);                                 
578                                $data_nova = date("Ymd\THis",$id_cale->datetime);                                 
579                                date_default_timezone_set('America/Sao_Paulo');                                   
580                                $data_n = new DateTime($data_nova);                                               
581                                $data_a = new DateTime($data_antiga);                                             
582                                if ( $data_n->getOffset() > $data_a->getOffset() )                               
583                                       {                                                                         
584                                        $dias = $data_n->format('z') - $data_a->format('z');                     
585                                        $dias = $item->datetime + ($dias*86400) - 3600;                           
586                                        $data2 = dataSegundosParaT($dias,1);                                     
587                                        $exe = $exe . ",". $data2;                                               
588                                                                                                                 
589                                      }                                                                           
590                                elseif ( $data_n->getOffset() < $data_a->getOffset() )                           
591                                      {                                                                           
592                                        $dias = $data_n->format('z') - $data_a->format('z');                     
593                                        $dias = $item->datetime + ($dias*86400) + 3600;                           
594                                        $data2 = dataSegundosParaT($dias,1);                                     
595                                        $exe = $exe . ",". $data2;                                               
596
597                                      }
598                                 else   
599                                      {
600                                        $propstat = new XMLElement( "propstat", array( $prop, $status) );
601                                        $dias = $data_n->format('z') - $data_a->format('z');
602                                        $dias = $item->datetime + ($dias*86400);           
603                                        $data2 = dataSegundosParaT($dias,1);               
604                                        $exe = $exe . ",". $data2;                         
605                                    }                                                       
606                                                                                           
607                        }                                                                   
608                }                                                                           
609                $exe = trim($exe, " ,");                                                   
610                $exe = "\n\nEXDATE:$exe";                                                   
611
612                if (  $item->recur_enddate != 0){
613
614                        $until = dataSegundosParaT($item->recur_enddate,1);
615                        if (substr("$until", 9,2) == "03" ) {             
616                        $until = dataSegundosParaT($item->recur_enddate + 86400,1);
617                        }                                                         
618                }                                                                 
619               
620                $intervalo = $item->recur_interval;
621                switch($item->recur_type){         
622                        case 1:                   
623                                $frequencia = "DAILY";
624                                $Rrule = "FREQ=$frequencia";
625                                if ($until != ""){         
626                                        $Rrule .= ";UNTIL=$until";
627                                }                                 
628                                if ($intervalo != ""){           
629                                        $Rrule .= ";INTERVAL=$intervalo";
630                                }                                       
631                                break;                                   
632                        case 2:                                         
633                                $frequencia = "WEEKLY";                 
634                                $dia_sem = converte_semana($item->recur_data);
635                                $Rrule = "FREQ=$frequencia";                 
636                                if ($until != ""){                           
637                                        $Rrule .= ";UNTIL=$until";           
638                                }                                             
639                                if ($intervalo !=""){                         
640                                        $Rrule .= ";INTERVAL=$intervalo";     
641                                }                                             
642                                if($item->recur_data != ""){                 
643                                        $Rrule .= ";$dia_sem";               
644                                }                                             
645                                break;                                       
646                        case 3:                                               
647                                $frequencia = "MONTHLY";                     
648                                $Rrule = "FREQ=$frequencia";                 
649                                if ($until != ""){                           
650                                        $Rrule .= ";UNTIL=$until";           
651                                }                                             
652                                if ($intervalo !=""){                         
653                                        $Rrule .= ";INTERVAL=$intervalo";     
654                                }                                             
655                                break;                                       
656                        case 4:                                               
657                                $frequencia = "MONTHLY";                     
658                                $Rrule = "FREQ=$frequencia";                 
659                                if ($until != ""){                           
660                                        $Rrule .= ";UNTIL=$until";           
661                                }                                             
662                                if ($intervalo !=""){                         
663                                        $Rrule .= ";INTERVAL=$intervalo";     
664                                }                                             
665                                break;                                       
666                        case 5:                                               
667                                $frequencia = "YEARLY";                       
668                                $Rrule = "FREQ=$frequencia";                 
669                                if ($until != ""){                           
670                                        $Rrule .= ";UNTIL=$until";           
671                                }                                             
672                                if ($intervalo !=""){                         
673                                        $Rrule .= ";INTERVAL=$intervalo";     
674                                }                                             
675                                break;                                       
676                }                                                             
677
678        }
679        if(isset($Rrule))
680           $Rrule = "\n\nRRULE:$Rrule";
681         else
682           $Rrule = "";
683        $response = "BEGIN:VCALENDAR\n\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n\nVERSION:2.0";
684        $response .= "\n\nBEGIN:VTIMEZONE
685TZID:America/Sao_Paulo
686X-LIC-LOCATION:America/Sao_Paulo
687BEGIN:DAYLIGHT
688TZOFFSETFROM:-0300
689TZOFFSETTO:-0200
690TZNAME:BRST
691DTSTART:19701018T000000
692RRULE:FREQ=YEARLY;BYDAY=3SU;BYMONTH=10
693END:DAYLIGHT
694BEGIN:STANDARD
695TZOFFSETFROM:-0300
696TZOFFSETTO:-0300
697TZNAME:BRT
698DTSTART:19700215T000000
699RRULE:FREQ=YEARLY;BYDAY=3SU;BYMONTH=2
700END:STANDARD
701END:VTIMEZONE";
702        $response .= "\n\nBEGIN:VEVENT\n\nCREATED:$create_data\n\nLAST-MODIFIED:$modify_data\n\nDTSTAMP:$modify_data\n\nUID:$item->cal_id@$item->owner\n\n${members}\n\nSUMMARY:$titulo\n\n$recurrence_id\n\nDTSTART;TZID=America/Sao_Paulo:$start_data\n\nDTEND;TZID=America/Sao_Paulo:${end_data}${local}${categories}\r\nPRIORITY:$item->priority${descricao}${Rrule}${exe}${moz}$VALARME\n\n$envia_convite\n\nEND:VEVENT\n\n";                                                                                                                                                                               
703        $response .= "END:VCALENDAR\n\n\n";                                                                                                                                                                                               
704        $caldav_data = $response;                                                                                                                                                                                                           
705
706 
707        $dav_nam = "{$item->cal_id}{$item->owner}";
708        $dav_etag_nam= md5($item->cal_id.$item->owner.$item->last_update);
709        //$dav_name = "{$item->cal_id}@{$item->owner}@{$item->last_update}";
710        $dav_name = sprintf('/%s/%s@%s.ics',$path,$item->cal_id,$item->owner);
711        $url = ConstructURL($dav_name);                                       
712        $prop = new XMLElement("prop");
713        foreach( $properties AS $k => $v ) {
714                switch( $k ) {             
715                                 case 'getcontentlength':
716                                         $contentlength = strlen($caldav_data);
717                                         $prop->NewElement($k, $contentlength );
718                                         break;
719                                 case 'calendar-data':
720                                         $reply->CalDAVElement($prop, $k, $caldav_data );
721                                         break;
722                                 case 'getcontenttype':
723                                         $prop->NewElement($k, "text/calendar" );
724                                         break;
725                                 case 'current-user-principal':
726                                         $prop->NewElement("current-user-principal", $request->current_user_principal_xml);
727                                         break;
728                                 case 'displayname':
729                                         $prop->NewElement($k, $displayname );
730                                         break;
731                                 case 'resourcetype':
732                                         $prop->NewElement($k); // Just an empty resourcetype for a non-collection.
733                                         break;
734                                 case 'getetag':
735                                         $prop->NewElement($k,  '"'.$dav_etag_nam.'"' );
736                                         break;
737                                 case '"current-user-privilege-set"':
738                                         $prop->NewElement($k, privileges($request->permissions) );
739                                         break;
740                                 case 'SOME-DENIED-PROPERTY':  /** indicating the style for future expansion */
741                                         $denied[] = $v;
742                                         break;
743                                 default:
744                                         dbg_error_log( 'REPORT', "Request for unsupported property '%s' of calendar item.", $v );
745                                         $unsupported[] = $v;
746                }                                                                                                                                       
747        }   
748
749        $status = new XMLElement("status", "HTTP/1.1 200 OK" );
750        $propstat = new XMLElement( "propstat", array( $prop, $status) );
751        $href = new XMLElement("href", $url );                           
752        $elements = array($href,$propstat);                             
753
754        if ( count($denied) > 0 ) {
755                $status = new XMLElement("status", "HTTP/1.1 403 Forbidden" );
756                $noprop = new XMLElement("prop");                             
757                foreach( $denied AS $k => $v ) {                             
758                $noprop->NewElement( strtolower($v) );                       
759        }                                                                     
760        $elements[] = new XMLElement( "propstat", array( $noprop, $status) );
761        }                                                                             
762
763  $response = new XMLElement( "response", $elements );
764
765  return $response;
766}
767
768
769/**
770* Return XML for a single component from the DB
771*
772* @param array $properties The properties for this component
773* @param string $item The DB row data for this component
774*
775* @return string An XML document which is the response for the component
776*/
777
778function component_to_xml( $properties, $item ) {
779  global $session, $c, $request, $reply;
780
781  dbg_error_log("REPORT","Building XML Response for item '%s'", $item->dav_name );
782
783  $denied = array();
784  $unsupported = array();
785  $caldav_data = $item->caldav_data;
786  $displayname = preg_replace( '{^.*/}', '', $item->dav_name );
787  $type = 'unknown';
788  $contenttype = 'text/plain';
789  switch( $item->caldav_type ) {
790    case 'VJOURNAL':
791    case 'VEVENT':
792    case 'VTODO':
793      $displayname = $item->summary;
794      $type = 'calendar';
795      $contenttype = 'text/calendar';
796      break;
797
798    case 'VCARD':
799      $displayname = $item->fn;
800      $type = 'vcard';
801      $contenttype = 'text/x-vcard';
802      break;
803  }
804  if ( isset($properties['calendar-data']) || isset($properties['displayname']) ) {
805    if ( !$request->AllowedTo('all') && $session->user_no != $item->user_no ){
806      // the user is not admin / owner of this calendarlooking at his calendar and can not admin the other cal
807      /** @todo We should examine the ORGANIZER and ATTENDEE fields in the event.  If this person is there then they should see this */
808      if ( $type == 'calendar' && $item->class == 'CONFIDENTIAL' || !$request->AllowedTo('read') ) {
809        $ical = new iCalComponent( $caldav_data );
810        $resources = $ical->GetComponents('VTIMEZONE',false);
811        $first = $resources[0];
812
813        // if the event is confidential we fake one that just says "Busy"
814        $confidential = new iCalComponent();
815        $confidential->SetType($first->GetType());
816        $confidential->AddProperty( 'SUMMARY', translate('Busy') );
817        $confidential->AddProperty( 'CLASS', 'CONFIDENTIAL' );
818        $confidential->SetProperties( $first->GetProperties('DTSTART'), 'DTSTART' );
819        $confidential->SetProperties( $first->GetProperties('RRULE'), 'RRULE' );
820        $confidential->SetProperties( $first->GetProperties('DURATION'), 'DURATION' );
821        $confidential->SetProperties( $first->GetProperties('DTEND'), 'DTEND' );
822        $confidential->SetProperties( $first->GetProperties('UID'), 'UID' );
823        $ical->SetComponents(array($confidential),$confidential->GetType());
824
825        $caldav_data = $ical->Render();
826        $displayname = translate('Busy');
827      }
828    }
829  }
830
831  $url = ConstructURL($item->dav_name);
832
833  $prop = new XMLElement("prop");
834  foreach( $properties AS $k => $v ) {
835    switch( $k ) {
836      case 'getcontentlength':
837        $contentlength = strlen($caldav_data);
838        $prop->NewElement($k, $contentlength );
839        break;
840      case 'calendar-data':
841        if ( $type == 'calendar' ) $reply->CalDAVElement($prop, $k, $caldav_data );
842        else $unsupported[] = $k;
843        break;
844      case 'address-data':
845        if ( $type == 'vcard' ) $reply->CardDAVElement($prop, $k, $caldav_data );
846        else $unsupported[] = $k;
847        break;
848      case 'getcontenttype':
849        $prop->NewElement($k, $contenttype );
850        break;
851      case 'current-user-principal':
852        $prop->NewElement("current-user-principal", $request->current_user_principal_xml);
853        break;
854      case 'displayname':
855        $prop->NewElement($k, $displayname );
856        break;
857      case 'resourcetype':
858        $prop->NewElement($k); // Just an empty resourcetype for a non-collection.
859        break;
860      case 'getetag':
861        $prop->NewElement($k, '"'.$item->dav_etag.'"' );
862        break;
863      case '"current-user-privilege-set"':
864        $prop->NewElement($k, privileges($request->permissions) );
865        break;
866      case 'SOME-DENIED-PROPERTY':  /** indicating the style for future expansion */
867        $denied[] = $k;
868        break;
869      default:
870        dbg_error_log( 'REPORT', "Request for unsupported property '%s' of calendar item.", $v );
871        $unsupported[] = $k;
872    }
873  }
874  $status = new XMLElement("status", "HTTP/1.1 200 OK" );
875
876  $propstat = new XMLElement( "propstat", array( $prop, $status) );
877  $href = new XMLElement("href", $url );
878  $elements = array($href,$propstat);
879
880  if ( count($denied) > 0 ) {
881    $status = new XMLElement("status", "HTTP/1.1 403 Forbidden" );
882    $noprop = new XMLElement("prop");
883    foreach( $denied AS $k => $v ) {
884      $noprop->NewElement( strtolower($v) );
885    }
886    $elements[] = new XMLElement( "propstat", array( $noprop, $status) );
887  }
888
889  if ( count($unsupported) > 0 ) {
890    $status = new XMLElement("status", "HTTP/1.1 404 Not Found" );
891    $noprop = new XMLElement("prop");
892    foreach( $unsupported AS $k => $v ) {
893      $noprop->NewElement( strtolower($v) );
894    }
895    $elements[] = new XMLElement( "propstat", array( $noprop, $status) );
896  }
897
898  $response = new XMLElement( "response", $elements );
899
900  return $response;
901}
902
903if ( $xmltree->GetTag() == "urn:ietf:params:xml:ns:caldav:calendar-query" ) {
904  $calquery = $xmltree->GetPath("/urn:ietf:params:xml:ns:caldav:calendar-query/*");
905  include("caldav-REPORT-calquery.php");
906}
907elseif ( $xmltree->GetTag() == "urn:ietf:params:xml:ns:caldav:calendar-multiget" ) {
908  $mode = 'caldav';
909  $qry_content = $xmltree->GetContent('urn:ietf:params:xml:ns:caldav:calendar-multiget');
910  include("caldav-REPORT-multiget.php");
911}
912elseif ( $xmltree->GetTag() == "urn:ietf:params:xml:ns:carddav:addressbook-multiget" ) {
913  $mode = 'carddav';
914  $qry_content = $xmltree->GetContent('urn:ietf:params:xml:ns:carddav:addressbook-multiget');
915  include("caldav-REPORT-multiget.php");
916}
917elseif ( $xmltree->GetTag() == "urn:ietf:params:xml:ns:carddav:addressbook-query" ) {
918  $cardquery = $xmltree->GetPath("/urn:ietf:params:xml:ns:carddav:addressbook-query/*");
919  include("caldav-REPORT-cardquery.php");
920}
921else {
922  $request->PreconditionFailed( 403, 'DAV::supported-report', sprintf( '"%s" is not a supported report type') );
923}
924
925function converte_semana($sema){                           
926        $retorna = "BYDAY=";                               
927        $param = 1;                                       
928        while( $param <= 64 ){                             
929                $numero = $sema & $param;                 
930                if ( $numero != 0 ){                       
931                        switch ($numero){                 
932                                case 1:                   
933                                        $retorna .= "SU,";
934                                        break;             
935                                case 2:
936                                        $retorna .= "MO,";
937                                        break;
938                                case 4:
939                                        $retorna .= "TU,";
940                                        break;
941                                case 8:
942                                        $retorna .= "WE,";
943                                        break;
944                                case 16:
945                                        $retorna .= "TH,";
946                                        break;
947                                case 32:
948                                        $retorna .= "FR,";
949                                        break;
950                                case 64:
951                                        $retorna .= "SA";
952                                        break;
953                                default:
954                                        continue;
955                        }
956                }
957                $param = $param * 2;
958        }
959        $nova = substr($retorna, 0, -1);
960        return $nova;
961}
962
963function dataTzParaSegundos($datatz){
964        $HorarioTimeZone = new DateTimeZone(date_default_timezone_get());
965        $HorarioTime = new DateTime("now", $HorarioTimeZone);
966        return mktime(  substr("$datatz", 9,2),//hora
967        substr("$datatz", 11,2),//min
968        substr("$datatz", 13,2),//segundos
969        substr("$datatz", 4,2),//mes
970        substr("$datatz", 6,2),//dia
971        substr("$datatz", 0,4)) + $HorarioTimeZone->getoffset($HorarioTime);//ano
972}
973
974function dataSegundosParaT($dataseg, $opcao = 0){
975        if ($opcao!=1){
976                $teste = getdate($dataseg);
977                return date("Ymd\THis",$teste[0]);
978        }
979        date_default_timezone_set('UTC');
980        $data_nova = date("Ymd\THis",$dataseg);
981        date_default_timezone_set('America/Sao_Paulo');
982        $HorarioTimeZone = new DateTimeZone(date_default_timezone_get());
983        $HorarioTime = new DateTime($data_nova, $HorarioTimeZone);
984        //$teste = getdate($dataseg - $HorarioTimeZone->getoffset($HorarioTime));
985        //date_default_timezone_set('UTC');
986        //$retorna = date("Ymd\THis\Z",$dataseg);
987        $teste = getdate($dataseg - $HorarioTimeZone->getoffset($HorarioTime));
988        return date("Ymd\THis\Z",$teste[0]);
989}
990
Note: See TracBrowser for help on using the repository browser.