xref: /plugin/davcal/action/ajax.php (revision fa1e98226fb2a4b98e758e7778be2d53d6b9d6b0)
1a1a3b679SAndreas Boehler<?php
2a1a3b679SAndreas Boehler
3cb71a62aSAndreas Boehler/**
4cb71a62aSAndreas Boehler * DokuWiki DAVCal PlugIn - Ajax component
5cb71a62aSAndreas Boehler */
6cb71a62aSAndreas Boehler
7a1a3b679SAndreas Boehlerclass action_plugin_davcal_ajax extends DokuWiki_Action_Plugin {
8a1a3b679SAndreas Boehler
9a1a3b679SAndreas Boehler    /**
10cb71a62aSAndreas Boehler     * @var helper_plugin_davcal
11a1a3b679SAndreas Boehler     */
12a1a3b679SAndreas Boehler    private $hlp = null;
13a1a3b679SAndreas Boehler
14a1a3b679SAndreas Boehler    function __construct() {
15a1a3b679SAndreas Boehler        $this->hlp =& plugin_load('helper','davcal');
16a1a3b679SAndreas Boehler    }
17a1a3b679SAndreas Boehler
18a1a3b679SAndreas Boehler    function register(Doku_Event_Handler $controller) {
19a1a3b679SAndreas Boehler        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_unknown');
20a1a3b679SAndreas Boehler    }
21a1a3b679SAndreas Boehler
22a1a3b679SAndreas Boehler    function handle_ajax_call_unknown(&$event, $param) {
23a1a3b679SAndreas Boehler      if($event->data != 'plugin_davcal') return;
24a1a3b679SAndreas Boehler
25a1a3b679SAndreas Boehler      $event->preventDefault();
26a1a3b679SAndreas Boehler      $event->stopPropagation();
27a1a3b679SAndreas Boehler      global $INPUT;
28a1a3b679SAndreas Boehler
29a1a3b679SAndreas Boehler      $action = trim($INPUT->post->str('action'));
30a1a3b679SAndreas Boehler      $id = trim($INPUT->post->str('id'));
31f3942fbbSAndreas Boehler      $page = trim($INPUT->post->str('page'));
32a1a3b679SAndreas Boehler      $params = $INPUT->post->arr('params');
3334a47953SAndreas Boehler      if(isset($_SERVER['REMOTE_USER']) && !is_null($_SERVER['REMOTE_USER']))
34a1a3b679SAndreas Boehler        $user = $_SERVER['REMOTE_USER'];
3534a47953SAndreas Boehler      else
3634a47953SAndreas Boehler        $user = null;
37a1a3b679SAndreas Boehler      $write = false;
38a1a3b679SAndreas Boehler
39daa99e9eSAndreas Boehler      if(!checkSecurityToken())
40daa99e9eSAndreas Boehler      {
41daa99e9eSAndreas Boehler          echo "CSRF Attack.";
42daa99e9eSAndreas Boehler          return;
43daa99e9eSAndreas Boehler      }
44daa99e9eSAndreas Boehler
45a1a3b679SAndreas Boehler      $data = array();
46a1a3b679SAndreas Boehler
47a1a3b679SAndreas Boehler      $data['result'] = false;
48a1a3b679SAndreas Boehler      $data['html'] = $this->getLang('unknown_error');
49a1a3b679SAndreas Boehler
50cb71a62aSAndreas Boehler      // Check if we have access to the calendar ($id is given by parameters,
51cb71a62aSAndreas Boehler      // that's not necessarily the page we come from)
52d71c9934SAndreas Boehler
53d71c9934SAndreas Boehler      $acl = $this->hlp->checkCalendarPermission($id);
54a1a3b679SAndreas Boehler      if($acl > AUTH_READ)
55a1a3b679SAndreas Boehler      {
56a1a3b679SAndreas Boehler          $write = true;
57a1a3b679SAndreas Boehler      }
58ed764890SAndreas Boehler      elseif($acl < AUTH_READ)
59ed764890SAndreas Boehler      {
60ed764890SAndreas Boehler          $data['result'] = false;
61ed764890SAndreas Boehler          $data['html'] = $this->getLang('no_permission');
62ed764890SAndreas Boehler          // Set to an invalid action in order to just return the result
63ed764890SAndreas Boehler          $action = 'invalid';
64ed764890SAndreas Boehler      }
65a1a3b679SAndreas Boehler
66185e2535SAndreas Boehler      // Retrieve the calendar pages based on the meta data
67f3942fbbSAndreas Boehler      $calendarPages = $this->hlp->getCalendarPagesByMeta($page);
68185e2535SAndreas Boehler      if($calendarPages === false)
69185e2535SAndreas Boehler      {
704a2bf5eeSAndreas Boehler          $calendarPages = array($page => null);
71185e2535SAndreas Boehler      }
72185e2535SAndreas Boehler
73cb71a62aSAndreas Boehler      // Parse the requested action
74a1a3b679SAndreas Boehler      switch($action)
75a1a3b679SAndreas Boehler      {
76cb71a62aSAndreas Boehler          // Add a new Event
77a1a3b679SAndreas Boehler          case 'newEvent':
78a1a3b679SAndreas Boehler              if($write)
79a1a3b679SAndreas Boehler              {
80809cb0faSAndreas Boehler                  $res = $this->hlp->addCalendarEntryToCalendarForPage($id, $user, $params);
81809cb0faSAndreas Boehler                  if($res === true)
82809cb0faSAndreas Boehler                  {
83a1a3b679SAndreas Boehler                    $data['result'] = true;
84a1a3b679SAndreas Boehler                    $data['html'] = $this->getLang('event_added');
85809cb0faSAndreas Boehler                  }
86809cb0faSAndreas Boehler                  else
87809cb0faSAndreas Boehler                  {
88809cb0faSAndreas Boehler                    $data['result'] = false;
89809cb0faSAndreas Boehler                    $data['html'] = $this->getLang('unknown_error');
90809cb0faSAndreas Boehler                  }
91a1a3b679SAndreas Boehler              }
92a1a3b679SAndreas Boehler              else
93a1a3b679SAndreas Boehler              {
94a1a3b679SAndreas Boehler                  $data['result'] = false;
95a1a3b679SAndreas Boehler                  $data['html'] = $this->getLang('no_permission');
96a1a3b679SAndreas Boehler              }
97a1a3b679SAndreas Boehler          break;
98cb71a62aSAndreas Boehler          // Retrieve existing Events
99a1a3b679SAndreas Boehler          case 'getEvents':
100a1a3b679SAndreas Boehler              $startDate = $INPUT->post->str('start');
101a1a3b679SAndreas Boehler              $endDate = $INPUT->post->str('end');
10282a48dfbSAndreas Boehler              $timezone = $INPUT->post->str('timezone');
103185e2535SAndreas Boehler              $data = array();
1044a2bf5eeSAndreas Boehler              foreach($calendarPages as $calPage => $color)
105185e2535SAndreas Boehler              {
106f3942fbbSAndreas Boehler                  $data = array_merge($data, $this->hlp->getEventsWithinDateRange($calPage,
1074a2bf5eeSAndreas Boehler                                      $user, $startDate, $endDate, $timezone, $color));
108185e2535SAndreas Boehler              }
109a1a3b679SAndreas Boehler          break;
110cb71a62aSAndreas Boehler          // Edit an event
111a1a3b679SAndreas Boehler          case 'editEvent':
112a1a3b679SAndreas Boehler              if($write)
113a1a3b679SAndreas Boehler              {
114809cb0faSAndreas Boehler                  $res = $this->hlp->editCalendarEntryForPage($id, $user, $params);
115809cb0faSAndreas Boehler                  if($res === true)
116809cb0faSAndreas Boehler                  {
117a1a3b679SAndreas Boehler                    $data['result'] = true;
118a1a3b679SAndreas Boehler                    $data['html'] = $this->getLang('event_edited');
119809cb0faSAndreas Boehler                  }
120809cb0faSAndreas Boehler                  else
121809cb0faSAndreas Boehler                  {
122809cb0faSAndreas Boehler                    $data['result'] = false;
123809cb0faSAndreas Boehler                    $data['html'] = $this->getLang('unknown_error');
124809cb0faSAndreas Boehler                  }
125a1a3b679SAndreas Boehler              }
126a1a3b679SAndreas Boehler              else
127a1a3b679SAndreas Boehler              {
128a1a3b679SAndreas Boehler                  $data['result'] = false;
129a1a3b679SAndreas Boehler                  $data['html'] = $this->getLang('no_permission');
130a1a3b679SAndreas Boehler              }
131a1a3b679SAndreas Boehler          break;
132cb71a62aSAndreas Boehler          // Delete an Event
133a1a3b679SAndreas Boehler          case 'deleteEvent':
134a1a3b679SAndreas Boehler              if($write)
135a1a3b679SAndreas Boehler              {
136809cb0faSAndreas Boehler                  $res = $this->hlp->deleteCalendarEntryForPage($id, $params);
137809cb0faSAndreas Boehler                  if($res === true)
138809cb0faSAndreas Boehler                  {
139a1a3b679SAndreas Boehler                    $data['result'] = true;
140a1a3b679SAndreas Boehler                    $data['html'] = $this->getLang('event_deleted');
141809cb0faSAndreas Boehler                  }
142809cb0faSAndreas Boehler                  else
143809cb0faSAndreas Boehler                  {
144809cb0faSAndreas Boehler                    $data['result'] = false;
145809cb0faSAndreas Boehler                    $data['html'] = $this->getLang('unknown_error');
146809cb0faSAndreas Boehler                  }
147a1a3b679SAndreas Boehler              }
148a1a3b679SAndreas Boehler              else
149a1a3b679SAndreas Boehler              {
150a1a3b679SAndreas Boehler                  $data['result'] = false;
151a1a3b679SAndreas Boehler                  $data['html'] = $this->getLang('no_permission');
152a1a3b679SAndreas Boehler              }
153a1a3b679SAndreas Boehler          break;
154cb71a62aSAndreas Boehler          // Get personal settings
155a495d34cSAndreas Boehler          case 'getSettings':
156a495d34cSAndreas Boehler              $data['result'] = true;
157a495d34cSAndreas Boehler              $data['settings'] = $this->hlp->getPersonalSettings($user);
158185e2535SAndreas Boehler              $data['settings']['calids'] = $this->hlp->getCalendarMapForIDs($calendarPages);
15973b331a3SAndreas Boehler              $data['settings']['readonly'] = !$write;
160f3942fbbSAndreas Boehler              $data['settings']['syncurl'] = $this->hlp->getSyncUrlForPage($page, $user);
161f3942fbbSAndreas Boehler              $data['settings']['privateurl'] = $this->hlp->getPrivateURLForPage($page);
162e86c8dd3SAndreas Boehler              $data['settings']['principalurl'] = $this->hlp->getPrincipalUrlForUser($user);
163f3942fbbSAndreas Boehler              $data['settings']['meta'] = $this->hlp->getCalendarMetaForPage($page);
164a495d34cSAndreas Boehler          break;
165cb71a62aSAndreas Boehler          // Save personal settings
166a495d34cSAndreas Boehler          case 'saveSettings':
167a495d34cSAndreas Boehler              $settings = array();
168a495d34cSAndreas Boehler              $settings['weeknumbers'] = $params['weeknumbers'];
169a495d34cSAndreas Boehler              $settings['timezone'] = $params['timezone'];
170a495d34cSAndreas Boehler              $settings['workweek'] = $params['workweek'];
171185e2535SAndreas Boehler              $settings['monday'] = $params['monday'];
1721d5bdcd0SAndreas Boehler              $settings['timeformat'] = $params['timeformat'];
173a495d34cSAndreas Boehler              if($this->hlp->savePersonalSettings($settings, $user))
174a495d34cSAndreas Boehler              {
175a495d34cSAndreas Boehler                  $data['result'] = true;
176a495d34cSAndreas Boehler                  $data['html'] = $this->getLang('settings_saved');
177a495d34cSAndreas Boehler              }
178a495d34cSAndreas Boehler              else
179a495d34cSAndreas Boehler              {
180a495d34cSAndreas Boehler                  $data['result'] = false;
181a495d34cSAndreas Boehler                  $data['html'] = $this->getLang('error_saving');
182a495d34cSAndreas Boehler              }
183a495d34cSAndreas Boehler          break;
184a1a3b679SAndreas Boehler      }
185a1a3b679SAndreas Boehler
186a1a3b679SAndreas Boehler      // If we are still here, JSON output is requested
187a1a3b679SAndreas Boehler
188a1a3b679SAndreas Boehler      //set content type
189a1a3b679SAndreas Boehler      header('Content-Type: application/json');
190*fa1e9822SGerrit Uitslag      echo json_encode($data);
191a1a3b679SAndreas Boehler    }
192a1a3b679SAndreas Boehler
193a1a3b679SAndreas Boehler}
194