source: branches/2.4/prototype/modules/calendar/interceptors/DAViCalAdapter.php @ 6995

Revision 6995, 16.4 KB checked in by eduardow, 12 years ago (diff)

Ticket #3002 - Eventos não são deletados apartir do CalDav?.

Line 
1<?php
2require_once ROOTPATH.'/modules/calendar/constants.php';
3use prototype\api\Config as Config;
4
5class DAViCalAdapter {
6   
7    static $deleted;
8   
9    static function initSessionVars($vars)
10    {       
11        session_start();
12        $_SESSION['wallet'] = $vars;
13        $_SESSION['config']['expressoCalendar']['useCaldav'] = FALSE;
14        $_SESSION['flags']['currentapp'] = 'expressoCalendar';
15        Config::regSet( 'noAlarm' , true );
16    }
17
18    /**
19    *
20    * @license    http://www.gnu.org/copyleft/gpl.html GPL
21    * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
22    * @sponsor    Caixa Econômica Federal
23    * @author     Cristiano Corrêa Schmidt
24    * @return     void
25    * @access     public
26    */ 
27    public function createCalendarToSchedulable(&$uri , &$result , &$data , $original)
28    {                 
29        foreach ($data as $i => $concept)
30        {
31            if($concept['concept'] === 'calendarToSchedulable')
32            {
33                if(Config::module('useCaldav' , 'expressoCalendar'))
34                {     
35                    ob_start();
36                    $calendarToschedulable = Controller::read( array( 'concept' => 'calendarToSchedulable' , 'id' => $concept['id'] ));
37                    if($calendarToschedulable)
38                    {
39                        $schedulable = Controller::read( array( 'concept' => 'schedulable' , 'id' => $calendarToschedulable['schedulable'] ) , null , array('deepness' => '2') );
40                        $calendar =  Controller::read( array( 'concept' => 'calendar' , 'id' => $calendarToschedulable['calendar'] ),array('timezone','name','location'));
41                        $ical = Controller::format( array( 'service' => 'iCal' ) , array($schedulable) , array('defaultTZI' => $calendar['timezone']));         
42                        DAViCalAdapter::putIcal($ical , array('uid' => $schedulable['uid'] , 'location' => $calendar['location'] ));
43                    }
44                    ob_end_clean();
45                }
46            }
47           
48        }
49    }
50   
51    public function createCollectionACL(&$uri ,&$params , &$criteria , $original)
52    {     
53        if( Config::module('useCaldav' , 'expressoCalendar') )
54    {
55        $calendar = Controller::read( array( 'concept' => 'calendar' , 'id' => $params['calendar'] ));
56       
57        if($params['user'] !== '0')
58        {
59        $user = Controller::read( array( 'concept' => 'user' , 'id' => $params['user'] ));
60        $xmUser =   '<D:href>'.Config::service( 'CalDAV' , 'url' ).'/'.$user['uid'].'/</D:href>';
61        }
62        else
63        $xmUser =   '<D:authenticated/>';
64
65        $xml ="<?xml version=\"1.0\" encoding=\"utf-8\" ?>
66           <D:acl xmlns:D=\"DAV:\">
67             <D:ace>
68               <D:principal>
69            ".$xmUser."
70               </D:principal>
71               <D:grant>
72            ".self::acltToXML($params['acl'])."
73               </D:grant>
74             </D:ace>
75            </D:acl>"; 
76       
77        ob_start();
78        require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
79        $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/'.$calendar['location'].'/', Config::me( 'uid' ), Config::me( 'password' ));
80        $cal->DoXMLRequest('ACL', $xml);
81            self::setReadCurrentUserPrivilege(Config::service( 'CalDAV' , 'url' ).'/'.substr($calendar['location'] , 0 , (strpos (  $calendar['location'] ,  '/'  ) + 1 ) ));
82        ob_end_clean();
83    }
84    }
85   
86    public function updateCollectionACL(&$uri ,&$params , &$criteria , $original)
87    {     
88        if( Config::module('useCaldav' , 'expressoCalendar') )
89    {   
90        $permision = Controller::read( array( 'concept' => 'calendarToPermission' , 'id' => $params['id'] ));
91        $calendar = Controller::read( array( 'concept' => 'calendar' , 'id' => $permision['calendar'] ));
92       
93        if($permision['user'] !== '0')
94        {
95        $user = Controller::read( array( 'concept' => 'user' , 'id' => $permision['user'] ));
96        $xmUser =   '<D:href>'.Config::service( 'CalDAV' , 'url' ).'/'.$user['uid'].'/</D:href>';
97        }
98        else
99        $xmUser =   '<D:authenticated/>';
100
101        $xml ="<?xml version=\"1.0\" encoding=\"utf-8\" ?>
102               <D:acl xmlns:D=\"DAV:\">
103             <D:ace>
104               <D:principal>
105                ".$xmUser."
106               </D:principal>
107               <D:grant>
108                ".self::acltToXML($params['acl'])."
109               </D:grant>
110             </D:ace>
111            </D:acl>";
112       
113        ob_start();
114        require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
115        $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/'.$calendar['location'].'/', Config::me( 'uid' ), Config::me( 'password' ));
116            $cal->DoXMLRequest('ACL', $xml);
117            self::setReadCurrentUserPrivilege(Config::service( 'CalDAV' , 'url' ).'/'.substr($calendar['location'] ,  0 ,(strpos (  $calendar['location'] ,  '/'  ) + 1 ) ));
118        ob_end_clean();
119       
120    }
121    }
122   
123   
124    private static function setReadCurrentUserPrivilege( $principalURL )
125    {
126        //Compatibilidade com o Thundebird e outros Clientes externos.
127        //Esses clientes nescessitam ter acesso para ler suas permissões no nivel de prinvcipal
128       
129        $xml ="<?xml version=\"1.0\" encoding=\"utf-8\" ?>
130               <D:acl xmlns:D=\"DAV:\">
131             <D:ace>
132               <D:principal>
133                <D:authenticated />
134               </D:principal>
135               <D:grant>
136                <D:privilege><D:read-current-user-privilege-set/></D:privilege>
137               </D:grant>
138             </D:ace>
139            </D:acl>";
140        ob_start();
141        require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
142        $cal = new CalDAVClient( $principalURL , Config::me( 'uid' ) , Config::me( 'password' ) );
143        $cal->DoXMLRequest('ACL', $xml); 
144        ob_end_clean(); 
145    }
146   
147    private static function acltToXML($acls)
148    {
149    $array = array();
150    $acls = str_split($acls);
151   
152    foreach ($acls as &$acl)
153        switch ($acl)
154        {
155        case CALENDAR_ACL_WRITE:
156            $array[] = "<D:privilege><D:bind/></D:privilege>";
157            $array[] = "<D:privilege><D:write-properties/></D:privilege>";
158            $array[] = "<D:privilege><D:write-content/></D:privilege>";
159            $array[] = "<D:privilege><D:unlock/></D:privilege>";
160            $array[] = "<D:privilege><D:schedule-deliver/></D:privilege>";
161            $array[] = "<D:privilege><D:schedule-send/></D:privilege>";
162            break;
163        case CALENDAR_ACL_READ:
164            $array[] = "<D:privilege><D:read /></D:privilege>";
165            $array[] = "<D:privilege><D:schedule-query-freebusy /></D:privilege>";
166            $array[] = "<D:privilege><D:read-free-busy /></D:privilege>";
167            break;
168        case CALENDAR_ACL_REMOVE:
169            $array[] = "<D:privilege><D:unbind/></D:privilege>";
170            break;
171        case CALENDAR_ACL_SHARED:
172            $array[] = "<D:privilege><D:write-acl/></D:privilege>";
173            $array[] = "<D:privilege><D:read-acl/></D:privilege>";
174            $array[] = "<D:privilege><D:read-current-user-privilege-set/></D:privilege>";
175            break;
176        case CALENDAR_ACL_BUSY:
177            $array[] = "<D:privilege><D:schedule-query-freebusy/></D:privilege>";
178            $array[] = "<D:privilege><D:read-free-busy/></D:privilege>";
179            break;
180        }     
181    return implode("\n", $array);
182    }
183   
184    static function import($data , $params = false)
185    {                 
186        $user =  Controller::find(array('concept' => 'user' , 'service' => 'OpenLDAP' ),false,array('filter' => array('=','uid',$params['owner']) , 'notExternal' => true)); 
187        $params['owner'] = $user[0]['id'];
188       
189        self::initSessionVars(array('user' => array('uidNumber' => $params['owner'] )));
190       
191        //Busca as Agendas do usuario
192        $sig = Controller::find(array('concept' => 'calendarSignature'), array('user','calendar'), array('filter' => array( '=' , 'user' , $params['owner'])));
193       
194        //TODO: RESGATAR AGENDA
195        foreach ($sig as $i => $v)
196        {
197          $cal =  Controller::read(array('concept' => 'calendar' , 'id' => $v['calendar'] ), array('location', 'timezone'));     
198          if($cal['location'] === $params['calendarName'] )
199          {             
200              $params['calendar'] = $v['calendar'];
201              $params['calendar_timezone'] = $cal['timezone'];
202          }
203        }
204       
205        if(isset($params['calendar']))
206        { 
207            $args =  Controller::parse( array( 'service' => 'iCal' ) , $data , $params);
208            ob_start();                     
209            include ROOTPATH.'/Sync.php';
210            ob_end_clean();
211        }
212       
213    }
214   
215    static function delete($data , $params = false)
216    {   
217
218        $user =  Controller::find(array('concept' => 'user' , 'service' => 'OpenLDAP' ),false,array('filter' => array('=','uid',$params['owner']) , 'notExternal' => true));
219
220        $params['owner'] = $user[0]['id'];
221       
222        self::initSessionVars(array('user' => array('uidNumber' => $params['owner'] )));
223
224        //Busca as Agendas do usuario
225        $sig = Controller::find(array('concept' => 'calendarSignature'), array('user','calendar'), array('filter' => array( '=' , 'user' , $params['owner'])));
226       
227        //TODO: RESGATAR AGENDA
228        foreach ($sig as $i => $v)
229        { 
230          $cal =  Controller::read(array('concept' => 'calendar' , 'id' => $v['calendar'] ), array('location'));     
231          if($cal['location'] === $params['calendarName'] )
232              $params['calendar'] = $v['calendar'];
233        }
234        if(isset($params['calendar']))
235        {
236            require_once ROOTPATH.'/plugins/icalcreator/iCalUtilityFunctions.class.php';
237            require_once ROOTPATH.'/plugins/icalcreator/iCalcreator.class.php';
238           
239            $vcalendar = new icalCreator( );
240            $vcalendar->parse($data);
241            $vcalendar->sort();
242            $toDelete = array();
243           
244            while ($component = $vcalendar->getComponent())
245            {
246                switch (strtoupper($component->objName)) {
247                    case 'VEVENT':
248                        $toDelete[] = $component->getProperty( 'uid' , false , false );
249                        break;
250                   case 'VTIMEZONE':
251                        break;
252                }
253            }
254           
255            self::$deleted = $toDelete;
256           
257            foreach ($toDelete as $v)
258            {
259                 $even = Controller::find(array('concept' => 'schedulable') , false , array ( 'filter' => array('AND', array('=' , 'calendar' , $params['calendar']) , array('=' , 'uid' , $v ) ) ) );           
260                 if(is_array($even) && count($even) > 0 )
261                       Controller::delete(array('concept' => 'schedulable' , 'id' => $even[0]['id']));
262            }
263       }
264    }
265   
266    static function move($origem , $destino , $owner)
267    { 
268        $user =  Controller::find(array('concept' => 'user' , 'service' => 'OpenLDAP' ),false,array('filter' => array('=','uid',$owner) , 'notExternal' => true)); 
269        $owner = $user[0]['id'];
270       
271        self::initSessionVars(array('user' => array('uidNumber' => $owner)));
272
273        //Busca as Agendas do usuario
274        $sig = Controller::find(array('concept' => 'calendarSignature'), array('user','calendar'), array('filter' => array('AND',array( '=' , 'user' , $params['owner']),array( '=' , 'isOwner' , '1')   )));
275       
276        //TODO: RESGATAR AGENDA
277        foreach ($sig as $i => $v)
278        {
279          $cal =  Controller::read(array('concept' => 'calendar' , 'id' => $v['calendar'] ), array('local'));
280          if($cal['local'] == $origem )
281            Controller::update (array('concept' => 'calendar' , 'id' => $v['calendar'] ), array('local' => $destino));
282        }
283    }
284   
285    static function format($data , $params = false)
286    {       
287        return  Controller::format( array( 'service' => 'iCal' ) , $data , $params);     
288    }
289     
290    static function deleteEvent($data , $params = false)
291    {   
292            $event = Controller::read( array( 'concept' => 'schedulable' , 'id' => $data ) , array('uid') );
293           
294            if(!is_array(self::$deleted) || !in_array($event['uid'], self::$deleted))
295                self::deleteIcal($event['uid'] , array('uid' => $event['uid'] , 'location' => $params['location'] ));
296
297    }
298   
299    static function putIcal($data , $params = false)
300    { 
301      ob_start();
302      require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
303      $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/'.$params['location'].'/', Config::me( 'uid' ), Config::me( 'password' ) );
304      $cal->DoPUTRequest( Config::service( 'CalDAV' , 'url' ).'/'.$params['location'].'/'.$params['uid'].'.ics', $data  ); 
305      ob_end_clean();
306    }
307   
308    static function deleteIcal($data , $params = false)
309    {
310       ob_start();
311       require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
312       $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/'.$params['location'].'/', Config::me( 'uid' ), Config::me( 'password' ));
313       $cal->DoDELETERequest( Config::service( 'CalDAV' , 'url' ).'/'.$params['location'].'/'.$data.'.ics' );
314       ob_end_clean();
315    }
316     
317    static function rmcalendar($data , $params = false)
318    {
319       ob_start();
320       require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';       
321       $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/', Config::me( 'uid' ), Config::me( 'password' ));
322       $cal->DoDELETERequest(Config::service( 'CalDAV' , 'url' ).'/'.Config::me( 'uid' ).'/'.$data.'/');
323       ob_end_clean();
324    }
325   
326    static function mvcalendar($origem , $destination)
327    {
328       ob_start();
329       require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
330       $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/'.Config::me( 'uid' ).'/', Config::me( 'uid' ), Config::me( 'password' ));       
331       $cal->DoMOVERequest( $origem.'/' , $destination.'/' );
332       ob_end_clean();
333    }
334   
335    static function findCalendars()
336    {
337       ob_start();
338       require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
339       $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/', Config::me( 'uid' ), Config::me( 'password' ));       
340       ob_end_clean();
341       return $cal->FindCalendars();
342    }
343   
344    static function mkcalendar($location , $name, $description )
345    {   
346        ob_start();
347        require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
348        $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/', Config::me( 'uid' ), Config::me( 'password' ));
349 
350        $xml ="<?xml version=\"1.0\" encoding=\"utf-8\" ?>
351     
352                    <C:mkcalendar xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">
353                     <D:set>
354                       <D:prop>
355                         <D:displayname>$name</D:displayname>
356                         <C:calendar-description xml:lang=\"en\">$description</C:calendar-description>
357                         <C:supported-calendar-component-set>
358                           <C:comp name=\"VEVENT\"/>
359                         </C:supported-calendar-component-set>     
360                       </D:prop>
361                     </D:set>
362                   </C:mkcalendar>";
363         
364         
365        $cal->DoXMLRequest('MKCALENDAR', $xml, Config::service( 'CalDAV' , 'url' ).'/'.$location.'/');
366        ob_end_clean();
367    }
368   
369    static function importCollection ($url , $calendar)
370    {
371        ob_start();
372        require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
373        $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/', Config::me( 'uid' ), Config::me( 'password' ));
374         
375        $events = $cal->GetCollectionETags($url) ;
376        $args = array();
377        foreach ($events as $ie => $ve)
378        {
379            $cal->DoGETRequest($ie);
380            $sync =  Controller::parse( array( 'service' => 'iCal' ) , $cal->GetResponseBody() , array('calendar' => $calendar , 'owner' => Config::me( 'uidNumber' )));
381           
382            if( is_array( $sync ) )
383                $args = array_merge( $args , $sync );
384        }
385       
386        include ROOTPATH.'/Sync.php';
387        ob_end_clean();
388    }
389   
390}
391
392?>
Note: See TracBrowser for help on using the repository browser.