vijinho /
kohana2-legacy
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php defined('SYSPATH') or die('No direct access allowed.'); |
||
| 2 | /** |
||
| 3 | * Calendar event observer class. |
||
| 4 | * |
||
| 5 | * $Id: Calendar_Event.php 4129 2009-03-27 17:47:03Z zombor $ |
||
| 6 | * |
||
| 7 | * @package Calendar |
||
| 8 | * @author Kohana Team |
||
| 9 | * @copyright (c) 2007-2008 Kohana Team |
||
| 10 | * @license http://kohanaphp.com/license.html |
||
| 11 | */ |
||
| 12 | class Calendar_Event_Core extends Event_Observer |
||
| 13 | { |
||
| 14 | |||
| 15 | // Boolean conditions |
||
| 16 | protected $booleans = array( |
||
| 17 | 'current', |
||
| 18 | 'weekend', |
||
| 19 | 'first_day', |
||
| 20 | 'last_day', |
||
| 21 | 'last_occurrence', |
||
| 22 | 'easter', |
||
| 23 | ); |
||
| 24 | |||
| 25 | // Rendering conditions |
||
| 26 | protected $conditions = array(); |
||
| 27 | |||
| 28 | // Cell classes |
||
| 29 | protected $classes = array(); |
||
| 30 | |||
| 31 | // Cell output |
||
| 32 | protected $output = ''; |
||
| 33 | |||
| 34 | /** |
||
| 35 | * Adds a condition to the event. The condition can be one of the following: |
||
| 36 | * |
||
| 37 | * timestamp - UNIX timestamp |
||
| 38 | * day - day number (1-31) |
||
| 39 | * week - week number (1-5) |
||
| 40 | * month - month number (1-12) |
||
| 41 | * year - year number (4 digits) |
||
| 42 | * day_of_week - day of week (1-7) |
||
| 43 | * current - active month (boolean) (only show data for the month being rendered) |
||
| 44 | * weekend - weekend day (boolean) |
||
| 45 | * first_day - first day of month (boolean) |
||
| 46 | * last_day - last day of month (boolean) |
||
| 47 | * occurrence - occurrence of the week day (1-5) (use with "day_of_week") |
||
| 48 | * last_occurrence - last occurrence of week day (boolean) (use with "day_of_week") |
||
| 49 | * easter - Easter day (boolean) |
||
| 50 | * callback - callback test (boolean) |
||
| 51 | * |
||
| 52 | * To unset a condition, call condition with a value of NULL. |
||
| 53 | * |
||
| 54 | * @chainable |
||
| 55 | * @param string condition key |
||
| 56 | * @param mixed condition value |
||
| 57 | * @return Calendar_Event_Core |
||
| 58 | */ |
||
| 59 | public function condition($key, $value) |
||
| 60 | { |
||
| 61 | if ($value === null) { |
||
| 62 | unset($this->conditions[$key]); |
||
| 63 | } else { |
||
| 64 | if ($key === 'callback') { |
||
| 65 | // Do nothing |
||
| 66 | } elseif (in_array($key, $this->booleans)) { |
||
| 67 | // Make the value boolean |
||
| 68 | $value = (bool) $value; |
||
| 69 | } else { |
||
| 70 | // Make the value an int |
||
| 71 | $value = (int) $value; |
||
| 72 | } |
||
| 73 | |||
| 74 | $this->conditions[$key] = $value; |
||
| 75 | } |
||
| 76 | |||
| 77 | return $this; |
||
| 78 | } |
||
| 79 | |||
| 80 | /** |
||
| 81 | * Add a CSS class for this event. This can be called multiple times. |
||
| 82 | * |
||
| 83 | * @chainable |
||
| 84 | * @param string CSS class name |
||
| 85 | * @return Calendar_Event_Core |
||
| 86 | */ |
||
| 87 | public function add_class($class) |
||
| 88 | { |
||
| 89 | $this->classes[$class] = $class; |
||
| 90 | |||
| 91 | return $this; |
||
| 92 | } |
||
| 93 | |||
| 94 | /** |
||
| 95 | * Remove a CSS class for this event. This can be called multiple times. |
||
| 96 | * |
||
| 97 | * @chainable |
||
| 98 | * @param string CSS class name |
||
| 99 | * @return Calendar_Event_Core |
||
| 100 | */ |
||
| 101 | public function remove_class($class) |
||
| 102 | { |
||
| 103 | unset($this->classes[$class]); |
||
| 104 | |||
| 105 | return $this; |
||
| 106 | } |
||
| 107 | |||
| 108 | /** |
||
| 109 | * Set HTML output for this event. |
||
| 110 | * |
||
| 111 | * @chainable |
||
| 112 | * @param string HTML output |
||
| 113 | * @return Calendar_Event_Core |
||
| 114 | */ |
||
| 115 | public function output($str) |
||
| 116 | { |
||
| 117 | $this->output = $str; |
||
| 118 | |||
| 119 | return $this; |
||
| 120 | } |
||
| 121 | |||
| 122 | /** |
||
| 123 | * Add a CSS class for this event. This can be called multiple times. |
||
| 124 | * |
||
| 125 | * @chainable |
||
| 126 | * @param string CSS class name |
||
| 127 | * @return false|null |
||
| 128 | */ |
||
| 129 | public function notify($data) |
||
| 130 | { |
||
| 131 | // Split the date and current status |
||
| 132 | list($month, $day, $year, $week, $current) = $data; |
||
| 133 | |||
| 134 | // Get a timestamp for the day |
||
| 135 | $timestamp = mktime(0, 0, 0, $month, $day, $year); |
||
| 136 | |||
| 137 | // Date conditionals |
||
| 138 | $condition = array( |
||
| 139 | 'timestamp' => (int) $timestamp, |
||
| 140 | 'day' => (int) date('j', $timestamp), |
||
| 141 | 'week' => (int) $week, |
||
| 142 | 'month' => (int) date('n', $timestamp), |
||
| 143 | 'year' => (int) date('Y', $timestamp), |
||
| 144 | 'day_of_week' => (int) date('w', $timestamp), |
||
| 145 | 'current' => (bool) $current, |
||
| 146 | ); |
||
| 147 | |||
| 148 | // Tested conditions |
||
| 149 | $tested = array(); |
||
| 150 | |||
| 151 | foreach ($condition as $key => $value) { |
||
| 152 | // Timestamps need to be handled carefully |
||
| 153 | if ($key === 'timestamp' and isset($this->conditions['timestamp'])) { |
||
| 154 | // This adds 23 hours, 59 minutes and 59 seconds to today's timestamp, as 24 hours |
||
| 155 | // is classed as a new day |
||
| 156 | $next_day = $timestamp + 86399; |
||
| 157 | |||
| 158 | if ($this->conditions['timestamp'] < $timestamp or $this->conditions['timestamp'] > $next_day) { |
||
| 159 | return false; |
||
| 160 | } |
||
| 161 | } |
||
| 162 | // Test basic conditions first |
||
| 163 | elseif (isset($this->conditions[$key]) and $this->conditions[$key] !== $value) { |
||
| 164 | return false; |
||
| 165 | } |
||
| 166 | |||
| 167 | // Condition has been tested |
||
| 168 | $tested[$key] = true; |
||
| 169 | } |
||
| 170 | |||
| 171 | if (isset($this->conditions['weekend'])) { |
||
| 172 | // Weekday vs Weekend |
||
| 173 | $condition['weekend'] = ($condition['day_of_week'] === 0 or $condition['day_of_week'] === 6); |
||
| 174 | } |
||
| 175 | |||
| 176 | if (isset($this->conditions['first_day'])) { |
||
| 177 | // First day of month |
||
| 178 | $condition['first_day'] = ($condition['day'] === 1); |
||
| 179 | } |
||
| 180 | |||
| 181 | if (isset($this->conditions['last_day'])) { |
||
| 182 | // Last day of month |
||
| 183 | $condition['last_day'] = ($condition['day'] === (int) date('t', $timestamp)); |
||
| 184 | } |
||
| 185 | |||
| 186 | if (isset($this->conditions['occurrence'])) { |
||
| 187 | // Get the occurance of the current day |
||
| 188 | $condition['occurrence'] = $this->day_occurrence($timestamp); |
||
| 189 | } |
||
| 190 | |||
| 191 | if (isset($this->conditions['last_occurrence'])) { |
||
| 192 | // Test if the next occurance of this date is next month |
||
| 193 | $condition['last_occurrence'] = ((int) date('n', $timestamp + 604800) !== $condition['month']); |
||
| 194 | } |
||
| 195 | |||
| 196 | if (isset($this->conditions['easter'])) { |
||
| 197 | if ($condition['month'] === 3 or $condition['month'] === 4) { |
||
| 198 | // This algorithm is from Practical Astronomy With Your Calculator, 2nd Edition by Peter |
||
| 199 | // Duffett-Smith. It was originally from Butcher's Ecclesiastical Calendar, published in |
||
| 200 | // 1876. This algorithm has also been published in the 1922 book General Astronomy by |
||
| 201 | // Spencer Jones; in The Journal of the British Astronomical Association (Vol.88, page |
||
| 202 | // 91, December 1977); and in Astronomical Algorithms (1991) by Jean Meeus. |
||
| 203 | |||
| 204 | $a = $condition['year'] % 19; |
||
|
0 ignored issues
–
show
|
|||
| 205 | $b = (int) ($condition['year'] / 100); |
||
|
0 ignored issues
–
show
|
|||
| 206 | $c = $condition['year'] % 100; |
||
|
0 ignored issues
–
show
|
|||
| 207 | $d = (int) ($b / 4); |
||
|
0 ignored issues
–
show
|
|||
| 208 | $e = $b % 4; |
||
|
0 ignored issues
–
show
|
|||
| 209 | $f = (int) (($b + 8) / 25); |
||
|
0 ignored issues
–
show
|
|||
| 210 | $g = (int) (($b - $f + 1) / 3); |
||
|
0 ignored issues
–
show
|
|||
| 211 | $h = (19 * $a + $b - $d - $g + 15) % 30; |
||
|
0 ignored issues
–
show
|
|||
| 212 | $i = (int) ($c / 4); |
||
| 213 | $k = $c % 4; |
||
|
0 ignored issues
–
show
|
|||
| 214 | $l = (32 + 2 * $e + 2 * $i - $h - $k) % 7; |
||
|
0 ignored issues
–
show
|
|||
| 215 | $m = (int) (($a + 11 * $h + 22 * $l) / 451); |
||
|
0 ignored issues
–
show
|
|||
| 216 | $p = ($h + $l - 7 * $m + 114) % 31; |
||
|
0 ignored issues
–
show
|
|||
| 217 | |||
| 218 | $month = (int) (($h + $l - 7 * $m + 114) / 31); |
||
| 219 | $day = $p + 1; |
||
| 220 | |||
| 221 | $condition['easter'] = ($condition['month'] === $month and $condition['day'] === $day); |
||
| 222 | } else { |
||
| 223 | // Easter can only happen in March or April |
||
| 224 | $condition['easter'] = false; |
||
| 225 | } |
||
| 226 | } |
||
| 227 | |||
| 228 | if (isset($this->conditions['callback'])) { |
||
| 229 | // Use a callback to determine validity |
||
| 230 | $condition['callback'] = call_user_func($this->conditions['callback'], $condition, $this); |
||
| 231 | } |
||
| 232 | |||
| 233 | $conditions = array_diff_key($this->conditions, $tested); |
||
| 234 | |||
| 235 | foreach ($conditions as $key => $value) { |
||
| 236 | if ($key === 'callback') { |
||
| 237 | // Callbacks are tested on a TRUE/FALSE basis |
||
| 238 | $value = true; |
||
| 239 | } |
||
| 240 | |||
| 241 | // Test advanced conditions |
||
| 242 | if ($condition[$key] !== $value) { |
||
| 243 | return false; |
||
| 244 | } |
||
| 245 | } |
||
| 246 | |||
| 247 | $this->caller->add_data(array( |
||
| 248 | 'classes' => $this->classes, |
||
| 249 | 'output' => $this->output, |
||
| 250 | )); |
||
| 251 | } |
||
| 252 | |||
| 253 | /** |
||
| 254 | * Find the week day occurrence for a specific timestamp. The occurrence is |
||
| 255 | * relative to the current month. For example, the second Saturday of any |
||
| 256 | * given month will return "2" as the occurrence. This is used in combination |
||
| 257 | * with the "occurrence" condition. |
||
| 258 | * |
||
| 259 | * @param integer UNIX timestamp |
||
| 260 | * @param integer $timestamp |
||
| 261 | * @return integer |
||
|
0 ignored issues
–
show
|
|||
| 262 | */ |
||
| 263 | protected function day_occurrence($timestamp) |
||
| 264 | { |
||
| 265 | // Get the current month for the timestamp |
||
| 266 | $month = date('m', $timestamp); |
||
| 267 | |||
| 268 | // Default occurrence is one |
||
| 269 | $occurrence = 1; |
||
| 270 | |||
| 271 | // Reduce the timestamp by one week for each loop. This has the added |
||
| 272 | // benefit of preventing an infinite loop. |
||
| 273 | while ($timestamp -= 604800) { |
||
| 274 | if (date('m', $timestamp) !== $month) { |
||
| 275 | // Once the timestamp has gone into the previous month, the |
||
| 276 | // proper occurrence has been found. |
||
| 277 | return $occurrence; |
||
| 278 | } |
||
| 279 | |||
| 280 | // Increment the occurrence |
||
| 281 | $occurrence++; |
||
| 282 | } |
||
| 283 | } |
||
| 284 | } // End Calendar Event |
||
| 285 |
Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.