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