source: trunk/prototype/modules/calendar/interceptors/DAViCalAdapter.php @ 6010

Revision 6010, 15.7 KB checked in by cristiano, 12 years ago (diff)

Ticket #2640 - Compatibilidade de acl com clientes externos e davical

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