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

Revision 7660, 16.3 KB checked in by cristiano, 11 years ago (diff)

Ticket #3239 - Inconsistência na importação de eventos com repetição

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