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