source: sandbox/2.4.2-expresso1/prototype/modules/calendar/interceptors/DAViCalAdapter.php @ 6528

Revision 6528, 15.8 KB checked in by gustavo, 12 years ago (diff)

Ticket #2766 - Merge do branch das novas funcionalidaes para o trunk

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']))); 
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        $user =  Controller::find(array('concept' => 'user' , 'service' => 'OpenLDAP' ),false,array('filter' => array('=','uid',$params['owner']))); 
218        $params['owner'] = $user[0]['id'];
219       
220        self::initSessionVars(array('user' => array('uidNumber' => $params['owner'] )));
221
222        //Busca as Agendas do usuario
223        $sig = Controller::find(array('concept' => 'calendarSignature'), array('user','calendar'), array('filter' => array( '=' , 'user' , $params['owner'])));
224       
225        //TODO: RESGATAR AGENDA
226        foreach ($sig as $i => $v)
227        { 
228          $cal =  Controller::read(array('concept' => 'calendar' , 'id' => $v['calendar'] ), array('location'));     
229          if($cal['location'] === $params['calendarName'] )
230              $params['calendar'] = $v['calendar'];
231        }
232        if(isset($params['calendar']))
233        {
234            require_once ROOTPATH.'/plugins/icalcreator/iCalUtilityFunctions.class.php';
235            require_once ROOTPATH.'/plugins/icalcreator/iCalcreator.class.php';
236           
237            $vcalendar = new icalCreator( );
238            $vcalendar->parse($data);
239            $vcalendar->sort();
240            $toDelete = array();
241           
242            while ($component = $vcalendar->getComponent())
243            {
244                switch (strtoupper($component->objName)) {
245                    case 'VEVENT':
246                        $toDelete[] = $component->getProperty( 'uid' , false , false );
247                        break;
248                   case 'VTIMEZONE':
249                        break;
250                }
251            }
252           
253            self::$deleted = $toDelete;
254           
255            foreach ($toDelete as $v)
256            {
257                 $even = Controller::find(array('concept' => 'schedulable') , false , array ( 'filter' => array('AND', array('=' , 'uid' , $v ), array('=' , 'calendar' , $params['calendar']))) );           
258                 if(is_array($even) && count($even) > 0 )
259                       Controller::delete(array('concept' => 'schedulable' , 'id' => $even[0]['id']));
260            }
261       }
262    }
263   
264    static function move($origem , $destino , $owner)
265    { 
266        $user =  Controller::find(array('concept' => 'user' , 'service' => 'OpenLDAP' ),false,array('filter' => array('=','uid',$owner))); 
267        $owner = $user[0]['id'];
268       
269        self::initSessionVars(array('user' => array('uidNumber' => $owner)));
270
271        //Busca as Agendas do usuario
272        $sig = Controller::find(array('concept' => 'calendarSignature'), array('user','calendar'), array('filter' => array('AND',array( '=' , 'user' , $params['owner']),array( '=' , 'isOwner' , '1')   )));
273       
274        //TODO: RESGATAR AGENDA
275        foreach ($sig as $i => $v)
276        {
277          $cal =  Controller::read(array('concept' => 'calendar' , 'id' => $v['calendar'] ), array('local'));
278          if($cal['local'] == $origem )
279            Controller::update (array('concept' => 'calendar' , 'id' => $v['calendar'] ), array('local' => $destino));
280        }
281    }
282   
283    static function format($data , $params = false)
284    {       
285        return  Controller::format( array( 'service' => 'iCal' ) , $data , $params);     
286    }
287     
288    static function deleteEvent($data , $params = false)
289    {   
290            $event = Controller::read( array( 'concept' => 'schedulable' , 'id' => $data ) , array('uid') );
291           
292            if(!is_array(self::$deleted) || !in_array($event['uid'], self::$deleted))
293                self::deleteIcal($event['uid'] , array('uid' => $event['uid'] , 'location' => $params['location'] ));
294
295    }
296   
297    static function putIcal($data , $params = false)
298    { 
299      ob_start();
300      require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
301      $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/'.$params['location'].'/', Config::me( 'uid' ), Config::me( 'password' ) );
302      $cal->DoPUTRequest( Config::service( 'CalDAV' , 'url' ).'/'.$params['location'].'/'.$params['uid'].'.ics', $data  ); 
303      ob_end_clean();
304    }
305   
306    static function deleteIcal($data , $params = false)
307    {
308       ob_start();
309       require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
310       $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/'.$params['location'].'/', Config::me( 'uid' ), Config::me( 'password' ));
311       $cal->DoDELETERequest( Config::service( 'CalDAV' , 'url' ).'/'.$params['location'].'/'.$data.'.ics' );
312       ob_end_clean();
313    }
314     
315    static function rmcalendar($data , $params = false)
316    {
317       ob_start();
318       require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';       
319       $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/', Config::me( 'uid' ), Config::me( 'password' ));
320       $cal->DoDELETERequest(Config::service( 'CalDAV' , 'url' ).'/'.Config::me( 'uid' ).'/'.$data.'/');
321       ob_end_clean();
322    }
323   
324    static function mvcalendar($origem , $destination)
325    {
326       ob_start();
327       require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
328       $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/'.Config::me( 'uid' ).'/', Config::me( 'uid' ), Config::me( 'password' ));       
329       $cal->DoMOVERequest( $origem.'/' , $destination.'/' );
330       ob_end_clean();
331    }
332   
333    static function findCalendars()
334    {
335       ob_start();
336       require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
337       $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/', Config::me( 'uid' ), Config::me( 'password' ));       
338       ob_end_clean();
339       return $cal->FindCalendars();
340    }
341   
342    static function mkcalendar($location , $name, $description )
343    {   
344        ob_start();
345        require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
346        $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/', Config::me( 'uid' ), Config::me( 'password' ));
347 
348        $xml ="<?xml version=\"1.0\" encoding=\"utf-8\" ?>
349     
350                    <C:mkcalendar xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">
351                     <D:set>
352                       <D:prop>
353                         <D:displayname>$name</D:displayname>
354                         <C:calendar-description xml:lang=\"en\">$description</C:calendar-description>
355                         <C:supported-calendar-component-set>
356                           <C:comp name=\"VEVENT\"/>
357                         </C:supported-calendar-component-set>     
358                       </D:prop>
359                     </D:set>
360                   </C:mkcalendar>";
361         
362         
363        $cal->DoXMLRequest('MKCALENDAR', $xml, Config::service( 'CalDAV' , 'url' ).'/'.$location.'/');
364        ob_end_clean();
365    }
366   
367    static function importCollection ($url , $calendar)
368    {
369        ob_start();
370        require_once ROOTPATH.'/plugins/davicalCliente/caldav-client-v2.php';
371        $cal = new CalDAVClient( Config::service( 'CalDAV' , 'url' ).'/', Config::me( 'uid' ), Config::me( 'password' ));
372         
373        $events = $cal->GetCollectionETags($url) ;
374        $args = array();
375        foreach ($events as $ie => $ve)
376        {
377            $cal->DoGETRequest($ie);
378            $sync =  Controller::parse( array( 'service' => 'iCal' ) , $cal->GetResponseBody() , array('calendar' => $calendar , 'owner' => Config::me( 'uidNumber' )));
379           
380            if( is_array( $sync ) )
381                $args = array_merge( $args , $sync );
382        }
383       
384        include ROOTPATH.'/Sync.php';
385        ob_end_clean();
386    }
387   
388}
389
390?>
Note: See TracBrowser for help on using the repository browser.