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