1 <?php
2 
3 /**
4  * DokuWiki DAVCal PlugIn - Ajax component
5  */
6 
7 class action_plugin_davcal_ajax extends DokuWiki_Action_Plugin {
8 
9     /**
10      * @var helper_plugin_davcal
11      */
12     private $hlp = null;
13 
14     function __construct() {
15         $this->hlp =& plugin_load('helper','davcal');
16     }
17 
18     function register(Doku_Event_Handler $controller) {
19         $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_unknown');
20     }
21 
22     function handle_ajax_call_unknown(&$event, $param) {
23       if($event->data != 'plugin_davcal') return;
24 
25       $event->preventDefault();
26       $event->stopPropagation();
27       global $INPUT;
28 
29       $action = trim($INPUT->post->str('action'));
30       $id = trim($INPUT->post->str('id'));
31       $page = trim($INPUT->post->str('page'));
32       $params = $INPUT->post->arr('params');
33       if(isset($_SERVER['REMOTE_USER']) && !is_null($_SERVER['REMOTE_USER']))
34         $user = $_SERVER['REMOTE_USER'];
35       else
36         $user = null;
37       $write = false;
38 
39       if(!checkSecurityToken())
40       {
41           echo "CSRF Attack.";
42           return;
43       }
44 
45       $data = array();
46 
47       $data['result'] = false;
48       $data['html'] = $this->getLang('unknown_error');
49 
50       // Check if we have access to the calendar ($id is given by parameters,
51       // that's not necessarily the page we come from)
52 
53       $acl = $this->hlp->checkCalendarPermission($id);
54       if($acl > AUTH_READ)
55       {
56           $write = true;
57       }
58       elseif($acl < AUTH_READ)
59       {
60           $data['result'] = false;
61           $data['html'] = $this->getLang('no_permission');
62           // Set to an invalid action in order to just return the result
63           $action = 'invalid';
64       }
65 
66       // Retrieve the calendar pages based on the meta data
67       $calendarPages = $this->hlp->getCalendarPagesByMeta($page);
68       if($calendarPages === false)
69       {
70           $calendarPages = array($page => null);
71       }
72 
73       // Parse the requested action
74       switch($action)
75       {
76           // Add a new Event
77           case 'newEvent':
78               if($write)
79               {
80                   $res = $this->hlp->addCalendarEntryToCalendarForPage($id, $user, $params);
81                   if($res === true)
82                   {
83                     $data['result'] = true;
84                     $data['html'] = $this->getLang('event_added');
85                   }
86                   else
87                   {
88                     $data['result'] = false;
89                     $data['html'] = $this->getLang('unknown_error');
90                   }
91               }
92               else
93               {
94                   $data['result'] = false;
95                   $data['html'] = $this->getLang('no_permission');
96               }
97           break;
98           // Retrieve existing Events
99           case 'getEvents':
100               $startDate = $INPUT->post->str('start');
101               $endDate = $INPUT->post->str('end');
102               $timezone = $INPUT->post->str('timezone');
103               $data = array();
104               foreach($calendarPages as $calPage => $color)
105               {
106                   $data = array_merge($data, $this->hlp->getEventsWithinDateRange($calPage,
107                                       $user, $startDate, $endDate, $timezone, $color));
108               }
109           break;
110           // Edit an event
111           case 'editEvent':
112               if($write)
113               {
114                   $res = $this->hlp->editCalendarEntryForPage($id, $user, $params);
115                   if($res === true)
116                   {
117                     $data['result'] = true;
118                     $data['html'] = $this->getLang('event_edited');
119                   }
120                   else
121                   {
122                     $data['result'] = false;
123                     $data['html'] = $this->getLang('unknown_error');
124                   }
125               }
126               else
127               {
128                   $data['result'] = false;
129                   $data['html'] = $this->getLang('no_permission');
130               }
131           break;
132           // Delete an Event
133           case 'deleteEvent':
134               if($write)
135               {
136                   $res = $this->hlp->deleteCalendarEntryForPage($id, $params);
137                   if($res === true)
138                   {
139                     $data['result'] = true;
140                     $data['html'] = $this->getLang('event_deleted');
141                   }
142                   else
143                   {
144                     $data['result'] = false;
145                     $data['html'] = $this->getLang('unknown_error');
146                   }
147               }
148               else
149               {
150                   $data['result'] = false;
151                   $data['html'] = $this->getLang('no_permission');
152               }
153           break;
154           // Get personal settings
155           case 'getSettings':
156               $data['result'] = true;
157               $data['settings'] = $this->hlp->getPersonalSettings($user);
158               $data['settings']['calids'] = $this->hlp->getCalendarMapForIDs($calendarPages);
159               $data['settings']['readonly'] = !$write;
160               $data['settings']['syncurl'] = $this->hlp->getSyncUrlForPage($page, $user);
161               $data['settings']['privateurl'] = $this->hlp->getPrivateURLForPage($page);
162               $data['settings']['principalurl'] = $this->hlp->getPrincipalUrlForUser($user);
163               $data['settings']['meta'] = $this->hlp->getCalendarMetaForPage($page);
164           break;
165           // Save personal settings
166           case 'saveSettings':
167               $settings = array();
168               $settings['weeknumbers'] = $params['weeknumbers'];
169               $settings['timezone'] = $params['timezone'];
170               $settings['workweek'] = $params['workweek'];
171               $settings['monday'] = $params['monday'];
172               $settings['timeformat'] = $params['timeformat'];
173               if($this->hlp->savePersonalSettings($settings, $user))
174               {
175                   $data['result'] = true;
176                   $data['html'] = $this->getLang('settings_saved');
177               }
178               else
179               {
180                   $data['result'] = false;
181                   $data['html'] = $this->getLang('error_saving');
182               }
183           break;
184       }
185 
186       // If we are still here, JSON output is requested
187 
188       //set content type
189       header('Content-Type: application/json');
190       echo json_encode($data);
191     }
192 
193 }
194