| [ Index ] |
PHP Cross Reference of MyBB 1.6.7 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * MyBB 1.6 4 * Copyright 2010 MyBB Group, All Rights Reserved 5 * 6 * Website: http://mybb.com 7 * License: http://mybb.com/about/license 8 * 9 * $Id: event.php 5730 2011-12-11 07:23:23Z ralgith $ 10 */ 11 12 // Disallow direct access to this file for security reasons 13 if(!defined("IN_MYBB")) 14 { 15 die("Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined."); 16 } 17 18 /** 19 * Event handling class, provides common structure to handle event data. 20 * 21 */ 22 class EventDataHandler extends DataHandler 23 { 24 /** 25 * The language file used in the data handler. 26 * 27 * @var string 28 */ 29 public $language_file = 'datahandler_event'; 30 31 /** 32 * The prefix for the language variables used in the data handler. 33 * 34 * @var string 35 */ 36 public $language_prefix = 'eventdata'; 37 38 /** 39 * Array of data inserted in to an event. 40 * 41 * @var array 42 */ 43 public $event_insert_data = array(); 44 45 /** 46 * Array of data used to update an event. 47 * 48 * @var array 49 */ 50 public $event_update_data = array(); 51 52 /** 53 * Event ID currently being manipulated by the datahandlers. 54 */ 55 public $eid = 0; 56 57 /** 58 * Verifies if an event name is valid or not and attempts to fix it 59 * 60 * @return boolean True if valid, false if invalid. 61 */ 62 function verify_name() 63 { 64 $name = &$this->data['name']; 65 $name = trim($name); 66 if(!$name) 67 { 68 $this->set_error("missing_name"); 69 return false; 70 } 71 return true; 72 } 73 74 /** 75 * Verifies if an event description is valid or not and attempts to fix it 76 * 77 * @return boolean True if valid, false if invalid. 78 */ 79 function verify_description() 80 { 81 $description = &$this->data['description']; 82 $description = trim($description); 83 if(!$description) 84 { 85 $this->set_error("missing_description"); 86 return false; 87 } 88 return true; 89 } 90 91 /** 92 * Verifies if an event date is valid or not and attempts to fix it 93 * 94 * @return boolean True if valid, false if invalid. 95 */ 96 function verify_date() 97 { 98 $event = &$this->data; 99 100 // All types of events require a start date 101 if(!$event['start_date']['day'] || !$event['start_date']['month'] || !$event['start_date']['year']) 102 { 103 $this->set_error("invalid_start_date"); 104 return false; 105 } 106 107 if($event['start_date']['day'] > date("t", mktime(0, 0, 0, $event['start_date']['month'], 1, $event['start_date']['year']))) 108 { 109 $this->set_error("invalid_start_date"); 110 return false; 111 } 112 113 // Calendar events can only be within the next 5 years 114 if($event['start_date']['year'] > date("Y") + 5) 115 { 116 $this->set_error("invalid_start_year"); 117 return false; 118 } 119 120 //Check to see if the month is within 1 and 12 121 if($event['start_date']['month'] > 12 || $event['start_date']['month'] < 1) 122 { 123 $this->set_error("invalid_start_month"); 124 return false; 125 } 126 127 // For ranged events, we check the end date & times too 128 if($event['type'] == "ranged") 129 { 130 if(!$event['end_date']['day'] || !$event['end_date']['month'] || !$event['end_date']['year']) 131 { 132 $this->set_error("invalid_end_date"); 133 return false; 134 } 135 136 if($event['end_date']['day'] > date("t", mktime(0, 0, 0, $event['end_date']['month'], 1, $event['end_date']['year']))) 137 { 138 $this->set_error("invalid_end_date"); 139 return false; 140 } 141 142 // Calendar events can only be within the next 5 years 143 if($event['end_date']['year'] > date("Y") + 5) 144 { 145 $this->set_error("invalid_end_year"); 146 return false; 147 } 148 149 //Check to see if the month is within 1 and 12 150 if($event['end_date']['month'] > 12 || $event['end_date']['month'] < 1) 151 { 152 $this->set_error("invalid_end_month"); 153 return false; 154 } 155 156 // Validate time input 157 if($event['start_date']['time'] || $event['end_date']['time']) 158 { 159 if(($event['start_date']['time'] && !$event['end_date']['time']) || ($event['end_date']['time'] && !$event['start_date']['time'])) 160 { 161 $this->set_error("cant_specify_one_time"); 162 return false; 163 } 164 165 // Begin start time validation 166 $start_time = $this->verify_time($event['start_date']['time']); 167 if(!is_array($start_time)) 168 { 169 $this->set_error("start_time_invalid"); 170 return false; 171 } 172 173 // End time validation 174 $end_time = $this->verify_time($event['end_date']['time']); 175 if(!is_array($end_time)) 176 { 177 $this->set_error("end_time_invalid"); 178 return false; 179 } 180 $event['usingtime'] = 1; 181 } 182 else 183 { 184 $start_time = array("hour" => 0, "min" => 0); 185 $end_time = array("hour" => 23, "min" => 59); 186 $event['usingtime'] = 0; 187 } 188 } 189 190 if(array_key_exists('timezone', $event)) 191 { 192 $event['timezone'] = floatval($event['timezone']); 193 if($event['timezone'] > 12 || $event['timezone'] < -12) 194 { 195 $this->set_error("invalid_timezone"); 196 return false; 197 } 198 $start_time['hour'] -= $event['timezone']; 199 $end_time['hour'] -= $event['timezone']; 200 } 201 202 $start_timestamp = gmmktime($start_time['hour'], $start_time['min'], 0, $event['start_date']['month'], $event['start_date']['day'], $event['start_date']['year']); 203 204 if($event['type'] == "ranged") 205 { 206 $end_timestamp = gmmktime($end_time['hour'], $end_time['min'], 0, $event['end_date']['month'], $event['end_date']['day'], $event['end_date']['year']); 207 208 if($end_timestamp <= $start_timestamp) 209 { 210 $this->set_error("end_in_past"); 211 return false; 212 } 213 } 214 215 // Save our time stamps for saving 216 $event['starttime'] = $start_timestamp; 217 $event['endtime'] = $end_timestamp; 218 219 return true; 220 } 221 222 function verify_time($time) 223 { 224 preg_match('#^(0?[1-9]|1[012])\s?([:\.]?)\s?([0-5][0-9])?(\s?[ap]m)|([01][0-9]|2[0-3])\s?([:\.])\s?([0-5][0-9])$#i', $time, $matches); 225 if(count($matches) == 0) 226 { 227 return false; 228 } 229 230 // 24h time 231 if(count($matches) == 8) 232 { 233 $hour = $matches[5]; 234 $min = $matches[7]; 235 } 236 // 12 hour time 237 else 238 { 239 $hour = $matches[1]; 240 $min = intval($matches[3]); 241 $matches[4] = trim($matches[4]); 242 if(my_strtolower($matches[4]) == "pm" && $hour != 12) 243 { 244 $hour += 12; 245 } 246 else if(my_strtolower($matches[4]) == "am" && $hour == 12) 247 { 248 $hour = 0; 249 } 250 } 251 return array("hour" => $hour, "min" => $min); 252 } 253 254 function verify_repeats() 255 { 256 global $mybb; 257 $event = &$this->data; 258 259 if(!is_array($event['repeats']) || !$event['repeats']['repeats']) 260 { 261 return true; 262 } 263 264 if(!$event['endtime']) 265 { 266 $this->set_error("only_ranged_events_repeat"); 267 return false; 268 } 269 270 switch($event['repeats']['repeats']) 271 { 272 case 1: 273 $event['repeats']['days'] = intval($event['repeats']['days']); 274 if($event['repeats']['days'] <= 0) 275 { 276 $this->set_error("invalid_repeat_day_interval"); 277 return false; 278 } 279 case 2: 280 break; 281 case 3: 282 $event['repeats']['weeks'] = intval($event['repeats']['weeks']); 283 if($event['repeats']['weeks'] <= 0) 284 { 285 $this->set_error("invalid_repeat_week_interval"); 286 return false; 287 } 288 if(count($event['repeats']['days']) == 0) 289 { 290 $this->set_error("invalid_repeat_weekly_days"); 291 return false; 292 } 293 asort($event['repeats']['days']); 294 break; 295 case 4: 296 if($event['repeats']['day']) 297 { 298 $event['repeats']['day'] = intval($event['repeats']['day']); 299 if($event['repeats']['day'] <= 0 || $event['repeats']['day'] > 31) 300 { 301 $this->set_error("invalid_repeat_day_interval"); 302 return false; 303 } 304 } 305 else 306 { 307 if($event['repeats']['occurance'] != "last") 308 { 309 $event['repeats']['occurance'] = intval($event['repeats']['occurance']); 310 } 311 $event['repeats']['weekday'] = intval($event['repeats']['weekday']); 312 } 313 $event['repeats']['months'] = intval($event['repeats']['months']); 314 if($event['repeats']['months'] <= 0 || $event['repeats']['months'] > 12) 315 { 316 $this->set_error("invalid_repeat_month_interval"); 317 return false; 318 } 319 break; 320 case 5: 321 if($event['repeats']['day']) 322 { 323 $event['repeats']['day'] = intval($event['repeats']['day']); 324 if($event['repeats']['day'] <= 0 || $event['repeats']['day'] > 31) 325 { 326 $this->set_error("invalid_repeat_day_interval"); 327 return false; 328 } 329 } 330 else 331 { 332 if($event['repeats']['occurance'] != "last") 333 { 334 $event['repeats']['occurance'] = intval($event['repeats']['occurance']); 335 } 336 $event['repeats']['weekday'] = intval($event['repeats']['weekday']); 337 } 338 $event['repeats']['month'] = intval($event['repeats']['month']); 339 if($event['repeats']['month'] <= 0 || $event['repeats']['month'] > 12) 340 { 341 $this->set_error("invalid_repeat_month_interval"); 342 return false; 343 } 344 $event['repeats']['years'] = intval($event['repeats']['years']); 345 if($event['repeats']['years'] <= 0 || $event['repeats']['years'] > 4) 346 { 347 $this->set_error("invalid_repeat_year_interval"); 348 return false; 349 } 350 break; 351 default: 352 $event['repeats'] = array(); 353 } 354 require_once MYBB_ROOT."inc/functions_calendar.php"; 355 $event['starttime_user'] = $event['starttime']; 356 $event['endtime_user'] = $event['endtime']; 357 $next_occurance = fetch_next_occurance($event, array('start' => $event['starttime'], 'end' => $event['endtime']), $event['starttime'], true); 358 if($next_occurance > $event['endtime']) 359 { 360 $this->set_error("event_wont_occur"); 361 return false; 362 } 363 return true; 364 } 365 366 /** 367 * Validate an event. 368 * 369 * @param array The event data array. 370 */ 371 function validate_event() 372 { 373 global $plugins; 374 375 $event = &$this->data; 376 377 if($this->method == "insert" || array_key_exists('name', $event)) 378 { 379 $this->verify_name(); 380 } 381 382 if($this->method == "insert" || array_key_exists('description', $event)) 383 { 384 $this->verify_description(); 385 } 386 387 if($this->method == "insert" || array_key_exists('start_date', $event) || array_key_exists('end_date', $event)) 388 { 389 $this->verify_date(); 390 } 391 392 if(($this->method == "insert" && $event['endtime']) || array_key_exists('repeats', $event)) 393 { 394 $this->verify_repeats(); 395 } 396 397 $plugins->run_hooks("datahandler_event_validate", $this); 398 399 // We are done validating, return. 400 $this->set_validated(true); 401 if(count($this->get_errors()) > 0) 402 { 403 return false; 404 } 405 else 406 { 407 return true; 408 } 409 } 410 411 /** 412 * Insert an event into the database. 413 * 414 * @param array The array of event data. 415 * @return array Array of new event details, eid and private. 416 */ 417 function insert_event() 418 { 419 global $db, $mybb, $plugins; 420 421 // Yes, validating is required. 422 if(!$this->get_validated()) 423 { 424 die("The event needs to be validated before inserting it into the DB."); 425 } 426 427 if(count($this->get_errors()) > 0) 428 { 429 die("The event is not valid."); 430 } 431 432 $event = &$this->data; 433 434 $query = $db->simple_select("calendars", "*", "cid='".intval($event['cid'])."'"); 435 $calendar_moderation = $db->fetch_field($query, "moderation"); 436 if($calendar_moderation == 1 && intval($event['private']) != 1) 437 { 438 $visible = 0; 439 if($event['uid'] == $mybb->user['uid']) 440 { 441 $calendar_permissions = get_calendar_permissions($event['cid']); 442 if($calendar_permissions['canbypasseventmod'] == 1) 443 { 444 $visible = 1; 445 } 446 } 447 } 448 else 449 { 450 $visible = 1; 451 } 452 453 // Prepare an array for insertion into the database. 454 $this->event_insert_data = array( 455 'cid' => intval($event['cid']), 456 'uid' => intval($event['uid']), 457 'name' => $db->escape_string($event['name']), 458 'description' => $db->escape_string($event['description']), 459 'visible' => $visible, 460 'private' => intval($event['private']), 461 'dateline' => TIME_NOW, 462 'starttime' => intval($event['starttime']), 463 'endtime' => intval($event['endtime']), 464 'timezone' => $db->escape_string(floatval($event['timezone'])), 465 'ignoretimezone' => intval($event['ignoretimezone']), 466 'usingtime' => intval($event['usingtime']), 467 'repeats' => $db->escape_string(serialize($event['repeats'])) 468 ); 469 470 $plugins->run_hooks("datahandler_event_insert", $this); 471 472 $this->eid = $db->insert_query("events", $this->event_insert_data); 473 474 // Return the event's eid and whether or not it is private. 475 return array( 476 'eid' => $this->eid, 477 'private' => $event['private'], 478 'visible' => $visible 479 ); 480 } 481 482 /** 483 * Updates an event that is already in the database. 484 * 485 * @param array The event data array. 486 */ 487 function update_event() 488 { 489 global $db, $plugins; 490 491 // Yes, validating is required. 492 if(!$this->get_validated()) 493 { 494 die("The event needs to be validated before inserting it into the DB."); 495 } 496 497 if(count($this->get_errors()) > 0) 498 { 499 die("The event is not valid."); 500 } 501 502 $event = &$this->data; 503 504 $this->eid = $event['eid']; 505 506 if(isset($event['cid'])) 507 { 508 $this->event_update_data['cid'] = $db->escape_string($event['cid']); 509 } 510 511 if(isset($event['name'])) 512 { 513 $this->event_update_data['name'] = $db->escape_string($event['name']); 514 } 515 516 if(isset($event['description'])) 517 { 518 $this->event_update_data['description'] = $db->escape_string($event['description']); 519 } 520 521 if(isset($event['starttime'])) 522 { 523 $this->event_update_data['starttime'] = intval($event['starttime']); 524 $this->event_update_data['usingtime'] = intval($event['usingtime']); 525 } 526 527 if(isset($event['endtime'])) 528 { 529 $this->event_update_data['endtime'] = intval($event['endtime']); 530 $this->event_update_data['usingtime'] = intval($event['usingtime']); 531 } 532 else 533 { 534 $this->event_update_data['endtime'] = 0; 535 $this->event_update_data['usingtime'] = 0; 536 } 537 538 if(isset($event['repeats'])) 539 { 540 if(!empty($event['repeats'])) 541 { 542 $event['repeats'] = serialize($event['repeats']); 543 } 544 $this->event_update_data['repeats'] = $db->escape_string($event['repeats']); 545 } 546 547 if(isset($event['timezone'])) 548 { 549 $this->event_update_data['timezone'] = $db->escape_string(floatval($event['timezone'])); 550 } 551 552 if(isset($event['ignoretimezone'])) 553 { 554 $this->event_update_data['ignoretimezone'] = intval($event['ignoretimezone']); 555 } 556 557 if(isset($event['private'])) 558 { 559 $this->event_update_data['private'] = intval($event['private']); 560 } 561 562 if(isset($event['visible'])) 563 { 564 $this->event_update_data['visible'] = $db->escape_string($event['visible']); 565 } 566 567 if(isset($event['uid'])) 568 { 569 $this->event_update_data['uid'] = intval($event['uid']); 570 } 571 572 $plugins->run_hooks("datahandler_event_update", $this); 573 574 $db->update_query("events", $this->event_update_data, "eid='".intval($event['eid'])."'"); 575 576 // Return the event's eid and whether or not it is private. 577 return array( 578 'eid' => $event['eid'], 579 'private' => $event['private'] 580 ); 581 } 582 } 583 584 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Sat Mar 31 17:55:03 2012 | Cross-referenced by PHPXref 0.7.1 |