xref: /plugin/davcal/action/ajax.php (revision daa99e9e227bc3f23be03d778ce05d72ae8cc254)
1a1a3b679SAndreas Boehler<?php
2a1a3b679SAndreas Boehler
3cb71a62aSAndreas Boehler/**
4cb71a62aSAndreas Boehler * DokuWiki DAVCal PlugIn - Ajax component
5cb71a62aSAndreas Boehler */
6cb71a62aSAndreas Boehler
7a1a3b679SAndreas Boehlerif(!defined('DOKU_INC')) die();
8a1a3b679SAndreas Boehler
9a1a3b679SAndreas Boehlerclass action_plugin_davcal_ajax extends DokuWiki_Action_Plugin {
10a1a3b679SAndreas Boehler
11a1a3b679SAndreas Boehler    /**
12cb71a62aSAndreas Boehler     * @var helper_plugin_davcal
13a1a3b679SAndreas Boehler     */
14a1a3b679SAndreas Boehler    private $hlp = null;
15a1a3b679SAndreas Boehler
16a1a3b679SAndreas Boehler    function __construct() {
17a1a3b679SAndreas Boehler        $this->hlp =& plugin_load('helper','davcal');
18a1a3b679SAndreas Boehler    }
19a1a3b679SAndreas Boehler
20a1a3b679SAndreas Boehler    function register(Doku_Event_Handler $controller) {
21a1a3b679SAndreas Boehler        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_unknown');
22a1a3b679SAndreas Boehler    }
23a1a3b679SAndreas Boehler
24a1a3b679SAndreas Boehler    function handle_ajax_call_unknown(&$event, $param) {
25a1a3b679SAndreas Boehler      if($event->data != 'plugin_davcal') return;
26a1a3b679SAndreas Boehler
27a1a3b679SAndreas Boehler      $event->preventDefault();
28a1a3b679SAndreas Boehler      $event->stopPropagation();
29a1a3b679SAndreas Boehler      global $INPUT;
30a1a3b679SAndreas Boehler
31a1a3b679SAndreas Boehler      $action = trim($INPUT->post->str('action'));
32a1a3b679SAndreas Boehler      $id = trim($INPUT->post->str('id'));
33f3942fbbSAndreas Boehler      $page = trim($INPUT->post->str('page'));
34a1a3b679SAndreas Boehler      $params = $INPUT->post->arr('params');
3534a47953SAndreas Boehler      if(isset($_SERVER['REMOTE_USER']) && !is_null($_SERVER['REMOTE_USER']))
36a1a3b679SAndreas Boehler        $user = $_SERVER['REMOTE_USER'];
3734a47953SAndreas Boehler      else
3834a47953SAndreas Boehler        $user = null;
39a1a3b679SAndreas Boehler      $write = false;
40185e2535SAndreas Boehler      $multi = false;
41a1a3b679SAndreas Boehler
42*daa99e9eSAndreas Boehler      if(!checkSecurityToken())
43*daa99e9eSAndreas Boehler      {
44*daa99e9eSAndreas Boehler          echo "CSRF Attack.";
45*daa99e9eSAndreas Boehler          return;
46*daa99e9eSAndreas Boehler      }
47*daa99e9eSAndreas Boehler
48a1a3b679SAndreas Boehler      $data = array();
49a1a3b679SAndreas Boehler
50a1a3b679SAndreas Boehler      $data['result'] = false;
51a1a3b679SAndreas Boehler      $data['html'] = $this->getLang('unknown_error');
52a1a3b679SAndreas Boehler
53cb71a62aSAndreas Boehler      // Check if we have access to the calendar ($id is given by parameters,
54cb71a62aSAndreas Boehler      // that's not necessarily the page we come from)
55a1a3b679SAndreas Boehler      $acl = auth_quickaclcheck($id);
56a1a3b679SAndreas Boehler      if($acl > AUTH_READ)
57a1a3b679SAndreas Boehler      {
58a1a3b679SAndreas Boehler          $write = true;
59a1a3b679SAndreas Boehler      }
60ed764890SAndreas Boehler      elseif($acl < AUTH_READ)
61ed764890SAndreas Boehler      {
62ed764890SAndreas Boehler          $data['result'] = false;
63ed764890SAndreas Boehler          $data['html'] = $this->getLang('no_permission');
64ed764890SAndreas Boehler          // Set to an invalid action in order to just return the result
65ed764890SAndreas Boehler          $action = 'invalid';
66ed764890SAndreas Boehler      }
67a1a3b679SAndreas Boehler
68185e2535SAndreas Boehler      // Retrieve the calendar pages based on the meta data
69f3942fbbSAndreas Boehler      $calendarPages = $this->hlp->getCalendarPagesByMeta($page);
70185e2535SAndreas Boehler      if($calendarPages === false)
71185e2535SAndreas Boehler      {
724a2bf5eeSAndreas Boehler          $calendarPages = array($page => null);
73185e2535SAndreas Boehler      }
74185e2535SAndreas Boehler      if(count($calendarPages) > 1)
75185e2535SAndreas Boehler        $multi = true;
76185e2535SAndreas Boehler
77cb71a62aSAndreas Boehler      // Parse the requested action
78a1a3b679SAndreas Boehler      switch($action)
79a1a3b679SAndreas Boehler      {
80cb71a62aSAndreas Boehler          // Add a new Event
81a1a3b679SAndreas Boehler          case 'newEvent':
82a1a3b679SAndreas Boehler              if($write)
83a1a3b679SAndreas Boehler              {
84809cb0faSAndreas Boehler                  $res = $this->hlp->addCalendarEntryToCalendarForPage($id, $user, $params);
85809cb0faSAndreas Boehler                  if($res === true)
86809cb0faSAndreas Boehler                  {
87a1a3b679SAndreas Boehler                    $data['result'] = true;
88a1a3b679SAndreas Boehler                    $data['html'] = $this->getLang('event_added');
89809cb0faSAndreas Boehler                  }
90809cb0faSAndreas Boehler                  else
91809cb0faSAndreas Boehler                  {
92809cb0faSAndreas Boehler                    $data['result'] = false;
93809cb0faSAndreas Boehler                    $data['html'] = $this->getLang('unknown_error');
94809cb0faSAndreas Boehler                  }
95a1a3b679SAndreas Boehler              }
96a1a3b679SAndreas Boehler              else
97a1a3b679SAndreas Boehler              {
98a1a3b679SAndreas Boehler                  $data['result'] = false;
99a1a3b679SAndreas Boehler                  $data['html'] = $this->getLang('no_permission');
100a1a3b679SAndreas Boehler              }
101a1a3b679SAndreas Boehler          break;
102cb71a62aSAndreas Boehler          // Retrieve existing Events
103a1a3b679SAndreas Boehler          case 'getEvents':
104a1a3b679SAndreas Boehler              $startDate = $INPUT->post->str('start');
105a1a3b679SAndreas Boehler              $endDate = $INPUT->post->str('end');
10682a48dfbSAndreas Boehler              $timezone = $INPUT->post->str('timezone');
107185e2535SAndreas Boehler              $data = array();
1084a2bf5eeSAndreas Boehler              foreach($calendarPages as $calPage => $color)
109185e2535SAndreas Boehler              {
110f3942fbbSAndreas Boehler                  $data = array_merge($data, $this->hlp->getEventsWithinDateRange($calPage,
1114a2bf5eeSAndreas Boehler                                      $user, $startDate, $endDate, $timezone, $color));
112185e2535SAndreas Boehler              }
113a1a3b679SAndreas Boehler          break;
114cb71a62aSAndreas Boehler          // Edit an event
115a1a3b679SAndreas Boehler          case 'editEvent':
116a1a3b679SAndreas Boehler              if($write)
117a1a3b679SAndreas Boehler              {
118809cb0faSAndreas Boehler                  $res = $this->hlp->editCalendarEntryForPage($id, $user, $params);
119809cb0faSAndreas Boehler                  if($res === true)
120809cb0faSAndreas Boehler                  {
121a1a3b679SAndreas Boehler                    $data['result'] = true;
122a1a3b679SAndreas Boehler                    $data['html'] = $this->getLang('event_edited');
123809cb0faSAndreas Boehler                  }
124809cb0faSAndreas Boehler                  else
125809cb0faSAndreas Boehler                  {
126809cb0faSAndreas Boehler                    $data['result'] = false;
127809cb0faSAndreas Boehler                    $data['html'] = $this->getLang('unknown_error');
128809cb0faSAndreas Boehler                  }
129a1a3b679SAndreas Boehler              }
130a1a3b679SAndreas Boehler              else
131a1a3b679SAndreas Boehler              {
132a1a3b679SAndreas Boehler                  $data['result'] = false;
133a1a3b679SAndreas Boehler                  $data['html'] = $this->getLang('no_permission');
134a1a3b679SAndreas Boehler              }
135a1a3b679SAndreas Boehler          break;
136cb71a62aSAndreas Boehler          // Delete an Event
137a1a3b679SAndreas Boehler          case 'deleteEvent':
138a1a3b679SAndreas Boehler              if($write)
139a1a3b679SAndreas Boehler              {
140809cb0faSAndreas Boehler                  $res = $this->hlp->deleteCalendarEntryForPage($id, $params);
141809cb0faSAndreas Boehler                  if($res === true)
142809cb0faSAndreas Boehler                  {
143a1a3b679SAndreas Boehler                    $data['result'] = true;
144a1a3b679SAndreas Boehler                    $data['html'] = $this->getLang('event_deleted');
145809cb0faSAndreas Boehler                  }
146809cb0faSAndreas Boehler                  else
147809cb0faSAndreas Boehler                  {
148809cb0faSAndreas Boehler                    $data['result'] = false;
149809cb0faSAndreas Boehler                    $data['html'] = $this->getLang('unknown_error');
150809cb0faSAndreas Boehler                  }
151a1a3b679SAndreas Boehler              }
152a1a3b679SAndreas Boehler              else
153a1a3b679SAndreas Boehler              {
154a1a3b679SAndreas Boehler                  $data['result'] = false;
155a1a3b679SAndreas Boehler                  $data['html'] = $this->getLang('no_permission');
156a1a3b679SAndreas Boehler              }
157a1a3b679SAndreas Boehler          break;
158cb71a62aSAndreas Boehler          // Get personal settings
159a495d34cSAndreas Boehler          case 'getSettings':
160a495d34cSAndreas Boehler              $data['result'] = true;
161a495d34cSAndreas Boehler              $data['settings'] = $this->hlp->getPersonalSettings($user);
162185e2535SAndreas Boehler              $data['settings']['multi'] = $multi;
163185e2535SAndreas Boehler              $data['settings']['calids'] = $this->hlp->getCalendarMapForIDs($calendarPages);
16473b331a3SAndreas Boehler              $data['settings']['readonly'] = !$write;
165f3942fbbSAndreas Boehler              $data['settings']['syncurl'] = $this->hlp->getSyncUrlForPage($page, $user);
166f3942fbbSAndreas Boehler              $data['settings']['privateurl'] = $this->hlp->getPrivateURLForPage($page);
167e86c8dd3SAndreas Boehler              $data['settings']['principalurl'] = $this->hlp->getPrincipalUrlForUser($user);
168f3942fbbSAndreas Boehler              $data['settings']['meta'] = $this->hlp->getCalendarMetaForPage($page);
169a495d34cSAndreas Boehler          break;
170cb71a62aSAndreas Boehler          // Save personal settings
171a495d34cSAndreas Boehler          case 'saveSettings':
172a495d34cSAndreas Boehler              $settings = array();
173a495d34cSAndreas Boehler              $settings['weeknumbers'] = $params['weeknumbers'];
174a495d34cSAndreas Boehler              $settings['timezone'] = $params['timezone'];
175a495d34cSAndreas Boehler              $settings['workweek'] = $params['workweek'];
176185e2535SAndreas Boehler              $settings['monday'] = $params['monday'];
1771d5bdcd0SAndreas Boehler              $settings['timeformat'] = $params['timeformat'];
178a495d34cSAndreas Boehler              if($this->hlp->savePersonalSettings($settings, $user))
179a495d34cSAndreas Boehler              {
180a495d34cSAndreas Boehler                  $data['result'] = true;
181a495d34cSAndreas Boehler                  $data['html'] = $this->getLang('settings_saved');
182a495d34cSAndreas Boehler              }
183a495d34cSAndreas Boehler              else
184a495d34cSAndreas Boehler              {
185a495d34cSAndreas Boehler                  $data['result'] = false;
186a495d34cSAndreas Boehler                  $data['html'] = $this->getLang('error_saving');
187a495d34cSAndreas Boehler              }
188a495d34cSAndreas Boehler          break;
189a1a3b679SAndreas Boehler      }
190a1a3b679SAndreas Boehler
191a1a3b679SAndreas Boehler      // If we are still here, JSON output is requested
192a1a3b679SAndreas Boehler
193a1a3b679SAndreas Boehler      //json library of DokuWiki
194a1a3b679SAndreas Boehler      require_once DOKU_INC . 'inc/JSON.php';
195a1a3b679SAndreas Boehler      $json = new JSON();
196a1a3b679SAndreas Boehler
197a1a3b679SAndreas Boehler      //set content type
198a1a3b679SAndreas Boehler      header('Content-Type: application/json');
199a1a3b679SAndreas Boehler      echo $json->encode($data);
200a1a3b679SAndreas Boehler    }
201a1a3b679SAndreas Boehler
202a1a3b679SAndreas Boehler}
203