1<?php
2
3
4/**
5  * SquirrelMail Shared Calendar Plugin
6  * Copyright (C) 2004-2005 Paul Lesneiwski <pdontthink@angrynerds.com>
7  * This program is licensed under GPL. See COPYING for details
8  *
9  */
10
11
12
13define('SM_PATH','../../');
14
15
16
17include_once(SM_PATH . 'include/validate.php');
18include_once(SM_PATH . 'plugins/calendar/functions.php');
19include_once(SM_PATH . 'plugins/calendar/url_validator.php');
20include_once(SM_PATH . 'plugins/calendar/interface/list_calendars.php');
21include_once(SM_PATH . 'plugins/calendar/interface/edit_calendar.php');
22include_once(SM_PATH . 'plugins/calendar/interface/add_new_personal_calendar.php');
23
24
25
26   // include compatibility plugin
27   //
28   if (defined('SM_PATH'))
29      include_once(SM_PATH . 'plugins/compatibility/functions.php');
30   else if (file_exists('../plugins/compatibility/functions.php'))
31      include_once('../plugins/compatibility/functions.php');
32   else if (file_exists('./plugins/compatibility/functions.php'))
33      include_once('./plugins/compatibility/functions.php');
34
35
36
37global $username, $domain, $data_dir, $color, $migrateOldCalendarData;
38$errorMessages = array();
39$messages = array();
40
41
42
43// export calendar if needed
44//
45sqgetGlobalVar('exportCalID', $exportCalID, SQ_FORM);
46if (!empty($exportCalID))
47{
48
49   if (!sqgetGlobalVar('MSicalLineDelim', $MSicalLineDelim, SQ_FORM))
50      $MSicalLineDelim = 0;
51   $icalLineDelim = '';
52   if ($MSicalLineDelim) $icalLineDelim = MICROSOFT_ICAL_LINE_DELIM;
53   include_once(SM_PATH . 'plugins/calendar/download.php');
54   download_calendar($exportCalID, FALSE, $icalLineDelim);
55
56}
57
58
59
60bindtextdomain('calendar', SM_PATH . 'locale');
61textdomain('calendar');
62
63
64
65// get external calendar links if given
66//
67sqgetGlobalVar('externalCalURI', $externalCalURI, SQ_FORM);
68if (!empty($externalCalURI))
69{
70
71   sqgetGlobalVar('externalCalName', $externalCalName, SQ_FORM);
72
73
74   // validate URI
75   //
76   $result = _ValURL($externalCalURI, array('Require'=>array('Server'=>TRUE, 'TLD'=>TRUE), 'Forbid'=>array(), 'AssumeProtocol' => 'http', 'AllowBracks' => true));
77   if ($result['Result'] == 'OK')
78   {
79      $externalCalURI = $result['Value'];
80      $cal = loadExternalCalendar($externalCalURI);
81      if ($cal === FALSE)
82         $errorMessages[] = _("Could not load external calendar") . ': ' . $externalCalURI;
83      else
84      {
85         $externalCalName = trim($externalCalName);
86         if (!empty($externalCalName))
87         {
88            $externalName = $externalCalName;
89            $cal->setName($externalCalName);
90
91            // need to correct the cached version to use overridden name
92            //
93            global $externalCalendars;
94            sqgetGlobalVar('externalCalendars', $externalCalendars, SQ_SESSION);
95            $externalCalendars[$cal->getID()] = serialize($cal);
96            sqsession_register($externalCalendars, 'externalCalendars');
97
98         }
99         else
100            $externalName = $cal->getName();
101         $externalID = $cal->getID();
102         $external_calendars = getPref($data_dir, $username, 'external_calendars', '');
103
104
105         // make sure we don't already have this calendar in user prefs
106         //
107         if (loadExternalCalendarFromUserPrefs($cal->getID()) === FALSE)
108         {
109            if (!empty($external_calendars)) $external_calendars .= '||||';
110            $external_calendars .= $externalID . '^^^^' . $externalName . '^^^^' . $externalCalURI;
111            setPref($data_dir, $username, 'external_calendars', $external_calendars);
112         }
113      }
114   }
115   else
116      $errorMessages[] = _("Could not load external calendar; bad address") . ': ' . $externalCalURI;
117
118}
119
120
121
122// remove calendar (external or personal) if needed
123//
124sqgetGlobalVar('removeCalID', $removeCalID, SQ_FORM);
125if (!empty($removeCalID))
126{
127
128   $cal = get_calendar($removeCalID);
129   if ($cal->isExternal())
130      removeExternalCalendarFromUserPrefs($removeCalID);
131   else if ($cal->getCalendarType() == SM_CAL_TYPE_PERSONAL)
132//TODO: don't we want to confirm first?
133      delete_calendar($removeCalID);
134
135}
136
137
138
139// prepare to migrate old calendar data
140//
141if ($migrateOldCalendarData)
142{
143   $todaysYear = date('Y');
144   $oldFilename = getHashedFile($username, $data_dir, "$username.$todaysYear.cal");
145}
146
147
148// get uploaded calendar if given
149//
150// get global variables for versions of PHP < 4.1
151//
152if (!compatibility_check_php_version(4, 1))
153{
154   global $HTTP_POST_FILES;
155   $_FILES = $HTTP_POST_FILES;
156}
157
158$calContentArray = array();
159
160if (!empty($_FILES['uploadCalFile']))
161{
162
163   // if possible, remove any path info from beginning of
164   // file name and a file extension too, if present
165   //
166   preg_match('/.*[\/\\\](.+)/', $_FILES['uploadCalFile']['name'], $matches);
167   if (!empty($matches[1]))
168      $fileName = $matches[1];
169   else
170      $fileName = $_FILES['uploadCalFile']['name'];
171   preg_match('/(.+)\.\w+/', $fileName, $matches);
172   if (!empty($matches[1]))
173      $fileName = $matches[1];
174
175
176   $calContentArray = file($_FILES['uploadCalFile']['tmp_name']);
177   $cal = Calendar::getCalendarFromICal($calContentArray, $fileName, $fileName);
178}
179
180
181// migrate old calendar data if necessary
182//
183else if ($migrateOldCalendarData && file_exists($oldFilename))
184{
185
186   $script = SM_PATH . 'plugins/calendar/scripts/convert_cal_to_ical.pl';
187   if (file_exists($script))
188   {
189
190      if(is_executable($script))
191      {
192
193         $messages[] = _("Converting old calendar. . .");
194         //$calContent = `$script $oldFilename 2>&1`;
195         //$calContentArray = explode("\n", $calContent);
196         $cmd = "$script $oldFilename 2>&1";
197         $lastOutputLine = exec($cmd, $calContentArray, $retVal);
198
199         if ($retVal)
200         {
201            $messages[] = sprintf(_("Problem converting old calendar; please contact your administrator (%s)"), $retVal);
202            $calContentArray = array();
203
204            global $cal_debug;
205            if ($cal_debug)
206               sm_print_r($cmd, $lastOutputLine, $calContentArray);
207         }
208         else
209         {
210
211            $cal = Calendar::getCalendarFromICal($calContentArray);
212
213
214            // Rename the file so that we don't convert it more than once
215            //
216            $newFilename = $oldFilename . '.bak';
217            if (!rename($oldFilename, $newFilename))
218               $messages[] = sprintf(_("Can't rename %s to %s"), $oldFilename, $newFilename);
219
220            // now we need to set some of the variables that
221            // would come through on a calendar upload
222            //
223            if (!check_php_version(4,1))
224            {
225               global $HTTP_POST_VARS;
226               $_POST = &$HTTP_POST_VARS;
227            }
228            $_POST['synchCal'] = 'YES';
229               $_POST['calID'] = 'personal';
230
231         }
232
233      }
234      else
235         $messages[] = sprintf(_("Problem converting old calendar; please contact your administrator (cannot execute %s)"), $script);
236
237   }
238   else
239      $messages[] = sprintf(_("Can't find old personal calendar: %s"), $script);
240
241}
242
243
244// now store the uploaded or converted calendar
245//
246if (!empty($calContentArray))
247{
248
249   $cal->setType(SM_CAL_TYPE_PERSONAL);
250   $cal->remove_user($username);
251   $cal->add_user($username, SM_CAL_ACCESS_LEVEL_OWNER);
252
253
254   // synch/merge events in uploaded calendar with another cal
255   //
256   sqgetGlobalVar('synchCal', $synchCal, SQ_FORM);
257   sqgetGlobalVar('calID', $synchCalID, SQ_FORM);
258   if (!empty($synchCal) && $synchCal == 'YES' && !empty($synchCalID))
259   {
260      if ($synchCalID == 'auto')
261      {
262         $external_list = get_all_external_calendars();
263         $shared_list = get_all_accessible_calendars($username, $domain);
264         $public_list = get_all_public_calendars();
265         $calList = array_merge($shared_list, $public_list, $external_list);
266
267         foreach ($calList as $c)
268         {
269
270            if (($c->isOwner($username) || $c->canWrite($username))
271             && $c->getID() == $cal->getID())
272            {
273               $synchCalID = $cal->getID();
274               break;
275            }
276         }
277      }
278      $personalCalID = get_personal_cal_id($username, $domain);
279      if ($synchCalID == 'personal'
280       || ($synchCalID == 'auto'
281        && $cal->getID() == $personalCalID))
282         $synchCalID = $personalCalID;
283
284
285      // if no match was found for auto-detect, just add new cal
286      //
287      if ($synchCalID == 'auto')
288      {
289         create_calendar($cal);
290         $cal->saveEvents(TRUE);
291      }
292
293
294      // otherwise, synch!
295      //
296      else
297      {
298         $synchCal = get_calendar($synchCalID);
299         $synchCal->addEvents($cal->getEvents(), $cal->getID());
300//LEFT OFF HERE - test merge/synch some more
301         $messages[] = sprintf(_("Successfully merged calendar into \"%s\""), $synchCal->getName());
302      }
303
304   }
305
306
307   // create additional personal calendar
308   //
309   else
310   {
311
312      // check if there is already a calendar with the same ID
313      //
314      if (get_calendar($cal->getID(), TRUE) !== FALSE)
315         $errorMessages[] = _("You already have a calendar with the same ID.  Are you sure you don't want to merge/synch the calendar you are uploading?");
316
317
318      // no?  it's OK to add the new calendar
319      //
320      else
321      {
322         create_calendar($cal);
323         $cal->saveEvents(TRUE);
324      }
325
326   }
327
328//LEFT OFF HERE: upload a file that already has an ID field (for the cal... but heck, actually, try events too) in it and make sure ours doesn't ignore it and use one of its own auto-generated IDs!  if that works ok, the following line can be deleted
329   /////////if (!empty($correctID)) $cal->setID($correctID);
330
331//LEFT OFF HERE: need a "remove" link for these imported calendars!(done)  does it mean that we can get rid of the delete functionality on the admin page?  is the admin page becoming obsolete?(although delete links for shared cals currently aren't displayed on cal list page even for admin)  maybe so.  then the users page is the only admin page you need
332
333}
334// in case we allow URI imports:
335//sqgetGlobalVar('uploadCalURI', $uploadCalURI, SQ_FORM);
336
337
338
339// add new personal calendar
340//
341$addNewPersonalError = FALSE;
342sqgetGlobalVar('addPersonalCalendar', $addPersonalCalendar, SQ_FORM);
343if (!empty($addPersonalCalendar) && $addPersonalCalendar == 'YES')
344{
345
346   sqgetGlobalVar('calName', $calName, SQ_FORM);
347   $calName = trim($calName);
348   if (!empty($calName))
349   {
350
351      // create new empty calendar
352      //
353      $cal = new Calendar('', 0, '', '', SM_CAL_TYPE_PERSONAL, $calName,
354                          $username, gmdate('Ymd\THis\Z'), '', '',
355                          array($username));
356      create_calendar($cal);
357
358
359      // problems?
360      //
361      if (FALSE)
362      {
363         $errorMessages[] = 'Problem creating new calendar';
364         $addNewPersonalError = TRUE;
365      }
366
367   }
368
369}
370
371
372
373// edit calendar
374//
375sqgetGlobalVar('editCalID', $editCalID, SQ_FORM);
376if (!empty($editCalID))
377{
378
379   $cal = get_calendar($editCalID);
380   if ($cal->isOwner($username) || $cal->canWrite($username) || $cal->isExternal())
381   {
382
383      sqgetGlobalVar('calName', $calName, SQ_FORM);
384      $calName = trim($calName);
385      if (!empty($calName))
386         $cal->setName($calName);
387
388
389      if ($cal->isExternal())
390      {
391
392         // just need to recache with new name and change user prefs
393         //
394         global $externalCalendars;
395         sqgetGlobalVar('externalCalendars', $externalCalendars, SQ_SESSION);
396         $externalCalendars[$cal->getID()] = serialize($cal);
397         sqsession_register($externalCalendars, 'externalCalendars');
398
399
400         $external_calendars = getPref($data_dir, $username, 'external_calendars', '');
401         $new_external_list = '';
402         $first = TRUE;
403
404         $externalCals = explode('||||', $external_calendars);
405         foreach ($externalCals as $externalCal)
406         {
407            if (empty($externalCal)) continue;
408
409            list($id, $name, $uri) = explode('^^^^', $externalCal);
410
411            if ($id == $cal->getID())
412            {
413               $name = $cal->getName();
414            }
415
416            if (!$first) $new_external_list .= '||||';
417
418            $new_external_list .= "$id^^^^$name^^^^$uri";
419
420            $first = FALSE;
421         }
422
423         setPref($data_dir, $username, 'external_calendars', $new_external_list);
424
425      }
426
427
428      else
429      {
430//TODO: if we edit other parts of the calendar here, be sure only to allow
431//      editing of most other fields when this is NOT an external calendar!!
432//  (do other editing here)
433
434         // now increment calendar sequence and re-save calendar
435         //
436         $cal->incrementSequence();
437         $cal->setLastUpdator($username);
438         $cal->setLastUpdateDate(gmdate('Ymd\THis\Z'));
439         update_calendar($cal);
440
441      }
442
443   }
444
445}
446
447
448
449bindtextdomain('squirrelmail', SM_PATH . 'locale');
450textdomain('squirrelmail');
451
452
453displayPageHeader($color, "None");
454
455
456
457sqgetGlobalVar('startEditCalID', $startEditCalID, SQ_FORM);
458sqgetGlobalVar('startAddPersonalCalendar', $startAddPersonalCalendar, SQ_FORM);
459
460
461
462// go add new personal calendar
463//
464if ($addNewPersonalError ||
465 (!empty($startAddPersonalCalendar) && $startAddPersonalCalendar == 'YES'))
466{
467
468   add_new_personal_calendar($color, $errorMessages);
469
470}
471
472
473
474// go rename calendar
475//
476else if (!empty($startEditCalID))
477{
478
479   edit_calendar($color, get_calendar($startEditCalID), $errorMessages);
480
481}
482
483
484
485// show regular list calendars page
486else
487{
488
489   $external_list = get_all_external_calendars();
490   $shared_list = get_all_accessible_calendars($username, $domain);
491   $public_list = get_all_public_calendars();
492   $calList = array_merge($shared_list, $public_list, $external_list);
493   usort($calList, 'calendar_sort');
494
495   display_calendar_list($color, $calList, $errorMessages, $messages);
496
497}
498
499
500?>
501