1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler/** 3*a1a3b679SAndreas Boehler * Helper Class for the tagrevisions plugin 4*a1a3b679SAndreas Boehler * This helper does the actual work. 5*a1a3b679SAndreas Boehler * 6*a1a3b679SAndreas Boehler * Configurable in DokuWiki's configuration 7*a1a3b679SAndreas Boehler */ 8*a1a3b679SAndreas Boehler 9*a1a3b679SAndreas Boehler// must be run within Dokuwiki 10*a1a3b679SAndreas Boehlerif(!defined('DOKU_INC')) die(); 11*a1a3b679SAndreas Boehler 12*a1a3b679SAndreas Boehlerclass helper_plugin_davcal extends DokuWiki_Plugin { 13*a1a3b679SAndreas Boehler 14*a1a3b679SAndreas Boehler protected $sqlite = null; 15*a1a3b679SAndreas Boehler 16*a1a3b679SAndreas Boehler /** 17*a1a3b679SAndreas Boehler * Constructor to load the configuration 18*a1a3b679SAndreas Boehler */ 19*a1a3b679SAndreas Boehler public function helper_plugin_davcal() { 20*a1a3b679SAndreas Boehler $this->sqlite =& plugin_load('helper', 'sqlite'); 21*a1a3b679SAndreas Boehler if(!$this->sqlite) 22*a1a3b679SAndreas Boehler { 23*a1a3b679SAndreas Boehler msg('This plugin requires the sqlite plugin. Please install it.'); 24*a1a3b679SAndreas Boehler return; 25*a1a3b679SAndreas Boehler } 26*a1a3b679SAndreas Boehler 27*a1a3b679SAndreas Boehler if(!$this->sqlite->init('davcal', DOKU_PLUGIN.'davcal/db/')) 28*a1a3b679SAndreas Boehler { 29*a1a3b679SAndreas Boehler return; 30*a1a3b679SAndreas Boehler } 31*a1a3b679SAndreas Boehler } 32*a1a3b679SAndreas Boehler 33*a1a3b679SAndreas Boehler public function setCalendarNameForPage($name, $description, $id = null, $userid = null) 34*a1a3b679SAndreas Boehler { 35*a1a3b679SAndreas Boehler if(is_null($id)) 36*a1a3b679SAndreas Boehler { 37*a1a3b679SAndreas Boehler global $ID; 38*a1a3b679SAndreas Boehler $id = $ID; 39*a1a3b679SAndreas Boehler } 40*a1a3b679SAndreas Boehler if(is_null($userid)) 41*a1a3b679SAndreas Boehler $userid = $_SERVER['REMOTE_USER']; 42*a1a3b679SAndreas Boehler $calid = $this->getCalendarIdForPage($id); 43*a1a3b679SAndreas Boehler if($calid === false) 44*a1a3b679SAndreas Boehler return $this->createCalendarForPage($name, $description, $id, $userid); 45*a1a3b679SAndreas Boehler 46*a1a3b679SAndreas Boehler // Update the calendar name here 47*a1a3b679SAndreas Boehler 48*a1a3b679SAndreas Boehler } 49*a1a3b679SAndreas Boehler 50*a1a3b679SAndreas Boehler public function getCalendarIdForPage($id = null) 51*a1a3b679SAndreas Boehler { 52*a1a3b679SAndreas Boehler if(is_null($id)) 53*a1a3b679SAndreas Boehler { 54*a1a3b679SAndreas Boehler global $ID; 55*a1a3b679SAndreas Boehler $id = $ID; 56*a1a3b679SAndreas Boehler } 57*a1a3b679SAndreas Boehler 58*a1a3b679SAndreas Boehler $query = "SELECT calid FROM pagetocalendarmapping WHERE page=".$this->sqlite->quote_string($id); 59*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 60*a1a3b679SAndreas Boehler $row = $this->sqlite->res2row($res); 61*a1a3b679SAndreas Boehler if(isset($row['calid'])) 62*a1a3b679SAndreas Boehler return $row['calid']; 63*a1a3b679SAndreas Boehler else 64*a1a3b679SAndreas Boehler return false; 65*a1a3b679SAndreas Boehler } 66*a1a3b679SAndreas Boehler 67*a1a3b679SAndreas Boehler public function getCalendarIdToPageMapping() 68*a1a3b679SAndreas Boehler { 69*a1a3b679SAndreas Boehler $query = "SELECT calid, page FROM pagetocalendarmapping"; 70*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 71*a1a3b679SAndreas Boehler $arr = $this->sqlite->res2arr($res); 72*a1a3b679SAndreas Boehler return $arr; 73*a1a3b679SAndreas Boehler } 74*a1a3b679SAndreas Boehler 75*a1a3b679SAndreas Boehler public function getCalendarIdsForUser($principalUri) 76*a1a3b679SAndreas Boehler { 77*a1a3b679SAndreas Boehler $user = explode('/', $principalUri); 78*a1a3b679SAndreas Boehler $user = end($user); 79*a1a3b679SAndreas Boehler $mapping = $this->getCalendarIdToPageMapping(); 80*a1a3b679SAndreas Boehler $calids = array(); 81*a1a3b679SAndreas Boehler foreach($mapping as $row) 82*a1a3b679SAndreas Boehler { 83*a1a3b679SAndreas Boehler $id = $row['calid']; 84*a1a3b679SAndreas Boehler $page = $row['page']; 85*a1a3b679SAndreas Boehler $acl = auth_quickaclcheck($page); 86*a1a3b679SAndreas Boehler if($acl >= AUTH_READ) 87*a1a3b679SAndreas Boehler { 88*a1a3b679SAndreas Boehler $write = $acl > AUTH_READ; 89*a1a3b679SAndreas Boehler $calids[$id] = array('readonly' => !$write); 90*a1a3b679SAndreas Boehler } 91*a1a3b679SAndreas Boehler } 92*a1a3b679SAndreas Boehler return $calids; 93*a1a3b679SAndreas Boehler } 94*a1a3b679SAndreas Boehler 95*a1a3b679SAndreas Boehler public function createCalendarForPage($name, $description, $id = null, $userid = null) 96*a1a3b679SAndreas Boehler { 97*a1a3b679SAndreas Boehler if(is_null($id)) 98*a1a3b679SAndreas Boehler { 99*a1a3b679SAndreas Boehler global $ID; 100*a1a3b679SAndreas Boehler $id = $ID; 101*a1a3b679SAndreas Boehler } 102*a1a3b679SAndreas Boehler if(is_null($userid)) 103*a1a3b679SAndreas Boehler $userid = $_SERVER['REMOTE_USER']; 104*a1a3b679SAndreas Boehler $values = array('principals/'.$userid, 105*a1a3b679SAndreas Boehler $name, 106*a1a3b679SAndreas Boehler str_replace(array('/', ' ', ':'), '_', $id), 107*a1a3b679SAndreas Boehler $description, 108*a1a3b679SAndreas Boehler 'VEVENT,VTODO', 109*a1a3b679SAndreas Boehler 0); 110*a1a3b679SAndreas Boehler $query = "INSERT INTO calendars (principaluri, displayname, uri, description, components, transparent) VALUES (".$this->sqlite->quote_and_join($values, ',').");"; 111*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 112*a1a3b679SAndreas Boehler $query = "SELECT id FROM calendars WHERE principaluri=".$this->sqlite->quote_string($values[0])." AND ". 113*a1a3b679SAndreas Boehler "displayname=".$this->sqlite->quote_string($values[1])." AND ". 114*a1a3b679SAndreas Boehler "uri=".$this->sqlite->quote_string($values[2])." AND ". 115*a1a3b679SAndreas Boehler "description=".$this->sqlite->quote_string($values[3]); 116*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 117*a1a3b679SAndreas Boehler $row = $this->sqlite->res2row($res); 118*a1a3b679SAndreas Boehler if(isset($row['id'])) 119*a1a3b679SAndreas Boehler { 120*a1a3b679SAndreas Boehler $values = array($id, $row['id']); 121*a1a3b679SAndreas Boehler $query = "INSERT INTO pagetocalendarmapping (page, calid) VALUES (".$this->sqlite->quote_and_join($values, ',').")"; 122*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 123*a1a3b679SAndreas Boehler return true; 124*a1a3b679SAndreas Boehler } 125*a1a3b679SAndreas Boehler 126*a1a3b679SAndreas Boehler return false; 127*a1a3b679SAndreas Boehler } 128*a1a3b679SAndreas Boehler 129*a1a3b679SAndreas Boehler public function addCalendarEntryToCalendarForPage($id, $user, $params) 130*a1a3b679SAndreas Boehler { 131*a1a3b679SAndreas Boehler require_once('vendor/autoload.php'); 132*a1a3b679SAndreas Boehler $vcalendar = new \Sabre\VObject\Component\VCalendar(); 133*a1a3b679SAndreas Boehler $event = $vcalendar->add('VEVENT'); 134*a1a3b679SAndreas Boehler $event->summary = $params['eventname']; 135*a1a3b679SAndreas Boehler $dtStart = new \DateTime($params['eventfrom'], new \DateTimeZone('Europe/Vienna')); // FIXME: Timezone 136*a1a3b679SAndreas Boehler $dtEnd = new \DateTime($params['eventto'], new \DateTimeZone('Europe/Vienna')); // FIXME: Timezone 137*a1a3b679SAndreas Boehler $event->DTSTART = $dtStart; 138*a1a3b679SAndreas Boehler $event->DTEND = $dtEnd; 139*a1a3b679SAndreas Boehler $calid = $this->getCalendarIdForPage($id); 140*a1a3b679SAndreas Boehler $uri = uniqid('dokuwiki-').'.ics'; 141*a1a3b679SAndreas Boehler $now = new DateTime(); 142*a1a3b679SAndreas Boehler $eventStr = $vcalendar->serialize(); 143*a1a3b679SAndreas Boehler 144*a1a3b679SAndreas Boehler $values = array($calid, 145*a1a3b679SAndreas Boehler $uri, 146*a1a3b679SAndreas Boehler $eventStr, 147*a1a3b679SAndreas Boehler $now->getTimestamp(), 148*a1a3b679SAndreas Boehler 'VEVENT', 149*a1a3b679SAndreas Boehler $event->DTSTART->getDateTime()->getTimeStamp(), 150*a1a3b679SAndreas Boehler $event->DTEND->getDateTime()->getTimeStamp(), 151*a1a3b679SAndreas Boehler strlen($eventStr), 152*a1a3b679SAndreas Boehler md5($eventStr), 153*a1a3b679SAndreas Boehler uniqid() 154*a1a3b679SAndreas Boehler ); 155*a1a3b679SAndreas Boehler 156*a1a3b679SAndreas Boehler $query = "INSERT INTO calendarobjects (calendarid, uri, calendardata, lastmodified, componenttype, firstoccurence, lastoccurence, size, etag, uid) VALUES (".$this->sqlite->quote_and_join($values, ',').")"; 157*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 158*a1a3b679SAndreas Boehler return true; 159*a1a3b679SAndreas Boehler } 160*a1a3b679SAndreas Boehler 161*a1a3b679SAndreas Boehler public function getEventsWithinDateRange($id, $user, $startDate, $endDate) 162*a1a3b679SAndreas Boehler { 163*a1a3b679SAndreas Boehler $data = array(); 164*a1a3b679SAndreas Boehler require_once('vendor/autoload.php'); 165*a1a3b679SAndreas Boehler $calid = $this->getCalendarIdForPage($id); 166*a1a3b679SAndreas Boehler $startTs = new \DateTime($startDate); 167*a1a3b679SAndreas Boehler $endTs = new \DateTime($endDate); 168*a1a3b679SAndreas Boehler $query = "SELECT calendardata, componenttype, uid FROM calendarobjects WHERE calendarid=". 169*a1a3b679SAndreas Boehler $this->sqlite->quote_string($calid)." AND firstoccurence > ". 170*a1a3b679SAndreas Boehler $this->sqlite->quote_string($startTs->getTimestamp())." AND firstoccurence < ". 171*a1a3b679SAndreas Boehler $this->sqlite->quote_string($endTs->getTimestamp()); 172*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 173*a1a3b679SAndreas Boehler $arr = $this->sqlite->res2arr($res); 174*a1a3b679SAndreas Boehler foreach($arr as $row) 175*a1a3b679SAndreas Boehler { 176*a1a3b679SAndreas Boehler if(isset($row['calendardata'])) 177*a1a3b679SAndreas Boehler { 178*a1a3b679SAndreas Boehler $vcal = \Sabre\VObject\Reader::read($row['calendardata']); 179*a1a3b679SAndreas Boehler $start = $vcal->VEVENT->DTSTART->getDateTime(); 180*a1a3b679SAndreas Boehler $end = $vcal->VEVENT->DTEND->getDateTime(); 181*a1a3b679SAndreas Boehler $summary = (string)$vcal->VEVENT->summary; 182*a1a3b679SAndreas Boehler $data[] = array("title" => $summary, "start" => $start->format(\DateTime::W3C), 183*a1a3b679SAndreas Boehler "end" => $end->format(\DateTime::W3C), 184*a1a3b679SAndreas Boehler "id" => $row['uid']); 185*a1a3b679SAndreas Boehler } 186*a1a3b679SAndreas Boehler } 187*a1a3b679SAndreas Boehler return $data; 188*a1a3b679SAndreas Boehler } 189*a1a3b679SAndreas Boehler 190*a1a3b679SAndreas Boehler public function getEventWithUid($uid) 191*a1a3b679SAndreas Boehler { 192*a1a3b679SAndreas Boehler $query = "SELECT calendardata, componenttype FROM calendarobjects WHERE uid=". 193*a1a3b679SAndreas Boehler $this->sqlite->quote_string($uid); 194*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 195*a1a3b679SAndreas Boehler $row = $this->sqlite->res2row($res); 196*a1a3b679SAndreas Boehler return $row; 197*a1a3b679SAndreas Boehler } 198*a1a3b679SAndreas Boehler 199*a1a3b679SAndreas Boehler public function editCalendarEntryForPage($id, $user, $params) 200*a1a3b679SAndreas Boehler { 201*a1a3b679SAndreas Boehler $event = $this->getEventWithUid($params['uid']); 202*a1a3b679SAndreas Boehler require_once('vendor/autoload.php'); 203*a1a3b679SAndreas Boehler if(!isset($event['calendardata'])) 204*a1a3b679SAndreas Boehler return false; 205*a1a3b679SAndreas Boehler $vcal = \Sabre\VObject\Reader::read($event['calendardata']); 206*a1a3b679SAndreas Boehler $vcal->VEVENT->summary = $params['eventname']; 207*a1a3b679SAndreas Boehler $dtStart = new \DateTime($params['eventfrom'], new \DateTimeZone('Europe/Vienna')); // FIXME: Timezone 208*a1a3b679SAndreas Boehler $dtEnd = new \DateTime($params['eventto'], new \DateTimeZone('Europe/Vienna')); // FIXME: Timezone 209*a1a3b679SAndreas Boehler $vcal->VEVENT->DTSTART = $dtStart; 210*a1a3b679SAndreas Boehler $vcal->VEVENT->DTEND = $dtEnd; 211*a1a3b679SAndreas Boehler $now = new DateTime(); 212*a1a3b679SAndreas Boehler $eventStr = $vcal->serialize(); 213*a1a3b679SAndreas Boehler 214*a1a3b679SAndreas Boehler $query = "UPDATE calendarobjects SET calendardata=".$this->sqlite->quote_string($eventStr). 215*a1a3b679SAndreas Boehler ", lastmodified=".$this->sqlite->quote_string($now->getTimestamp()). 216*a1a3b679SAndreas Boehler ", firstoccurence=".$this->sqlite->quote_string($dtStart->getTimestamp()). 217*a1a3b679SAndreas Boehler ", lastoccurence=".$this->sqlite->quote_string($dtEnd->getTimestamp()). 218*a1a3b679SAndreas Boehler ", size=".strlen($eventStr). 219*a1a3b679SAndreas Boehler ", etag=".$this->sqlite->quote_string(md5($eventStr)). 220*a1a3b679SAndreas Boehler " WHERE uid=".$this->sqlite->quote_string($params['uid']); 221*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 222*a1a3b679SAndreas Boehler return true; 223*a1a3b679SAndreas Boehler } 224*a1a3b679SAndreas Boehler 225*a1a3b679SAndreas Boehler public function deleteCalendarEntryForPage($id, $params) 226*a1a3b679SAndreas Boehler { 227*a1a3b679SAndreas Boehler $uid = $params['uid']; 228*a1a3b679SAndreas Boehler $query = "DELETE FROM calendarobjects WHERE uid=".$this->sqlite->quote_string($uid); 229*a1a3b679SAndreas Boehler $res = $this->sqlite->query($query); 230*a1a3b679SAndreas Boehler return true; 231*a1a3b679SAndreas Boehler } 232*a1a3b679SAndreas Boehler 233*a1a3b679SAndreas Boehler} 234