xref: /plugin/davcal/helper.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
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