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