]>
Commit | Line | Data |
---|---|---|
59c06b17 CS |
1 | <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); |
2 | /** | |
3 | * CodeIgniter | |
4 | * | |
5 | * An open source application development framework for PHP 5.1.6 or newer | |
6 | * | |
7 | * @package CodeIgniter | |
8 | * @author ExpressionEngine Dev Team | |
9 | * @copyright Copyright (c) 2008 - 2011, EllisLab, Inc. | |
10 | * @license http://codeigniter.com/user_guide/license.html | |
11 | * @link http://codeigniter.com | |
12 | * @since Version 1.0 | |
13 | * @filesource | |
14 | */ | |
15 | ||
16 | // ------------------------------------------------------------------------ | |
17 | ||
18 | /** | |
19 | * User Agent Class | |
20 | * | |
21 | * Identifies the platform, browser, robot, or mobile devise of the browsing agent | |
22 | * | |
23 | * @package CodeIgniter | |
24 | * @subpackage Libraries | |
25 | * @category User Agent | |
26 | * @author ExpressionEngine Dev Team | |
27 | * @link http://codeigniter.com/user_guide/libraries/user_agent.html | |
28 | */ | |
29 | class CI_User_agent { | |
30 | ||
31 | var $agent = NULL; | |
32 | ||
33 | var $is_browser = FALSE; | |
34 | var $is_robot = FALSE; | |
35 | var $is_mobile = FALSE; | |
36 | ||
37 | var $languages = array(); | |
38 | var $charsets = array(); | |
39 | ||
40 | var $platforms = array(); | |
41 | var $browsers = array(); | |
42 | var $mobiles = array(); | |
43 | var $robots = array(); | |
44 | ||
45 | var $platform = ''; | |
46 | var $browser = ''; | |
47 | var $version = ''; | |
48 | var $mobile = ''; | |
49 | var $robot = ''; | |
50 | ||
51 | /** | |
52 | * Constructor | |
53 | * | |
54 | * Sets the User Agent and runs the compilation routine | |
55 | * | |
56 | * @access public | |
57 | * @return void | |
58 | */ | |
59 | public function __construct() | |
60 | { | |
61 | if (isset($_SERVER['HTTP_USER_AGENT'])) | |
62 | { | |
63 | $this->agent = trim($_SERVER['HTTP_USER_AGENT']); | |
64 | } | |
65 | ||
66 | if ( ! is_null($this->agent)) | |
67 | { | |
68 | if ($this->_load_agent_file()) | |
69 | { | |
70 | $this->_compile_data(); | |
71 | } | |
72 | } | |
73 | ||
74 | log_message('debug', "User Agent Class Initialized"); | |
75 | } | |
76 | ||
77 | // -------------------------------------------------------------------- | |
78 | ||
79 | /** | |
80 | * Compile the User Agent Data | |
81 | * | |
82 | * @access private | |
83 | * @return bool | |
84 | */ | |
85 | private function _load_agent_file() | |
86 | { | |
87 | if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php')) | |
88 | { | |
89 | include(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php'); | |
90 | } | |
91 | elseif (is_file(APPPATH.'config/user_agents.php')) | |
92 | { | |
93 | include(APPPATH.'config/user_agents.php'); | |
94 | } | |
95 | else | |
96 | { | |
97 | return FALSE; | |
98 | } | |
99 | ||
100 | $return = FALSE; | |
101 | ||
102 | if (isset($platforms)) | |
103 | { | |
104 | $this->platforms = $platforms; | |
105 | unset($platforms); | |
106 | $return = TRUE; | |
107 | } | |
108 | ||
109 | if (isset($browsers)) | |
110 | { | |
111 | $this->browsers = $browsers; | |
112 | unset($browsers); | |
113 | $return = TRUE; | |
114 | } | |
115 | ||
116 | if (isset($mobiles)) | |
117 | { | |
118 | $this->mobiles = $mobiles; | |
119 | unset($mobiles); | |
120 | $return = TRUE; | |
121 | } | |
122 | ||
123 | if (isset($robots)) | |
124 | { | |
125 | $this->robots = $robots; | |
126 | unset($robots); | |
127 | $return = TRUE; | |
128 | } | |
129 | ||
130 | return $return; | |
131 | } | |
132 | ||
133 | // -------------------------------------------------------------------- | |
134 | ||
135 | /** | |
136 | * Compile the User Agent Data | |
137 | * | |
138 | * @access private | |
139 | * @return bool | |
140 | */ | |
141 | private function _compile_data() | |
142 | { | |
143 | $this->_set_platform(); | |
144 | ||
145 | foreach (array('_set_robot', '_set_browser', '_set_mobile') as $function) | |
146 | { | |
147 | if ($this->$function() === TRUE) | |
148 | { | |
149 | break; | |
150 | } | |
151 | } | |
152 | } | |
153 | ||
154 | // -------------------------------------------------------------------- | |
155 | ||
156 | /** | |
157 | * Set the Platform | |
158 | * | |
159 | * @access private | |
160 | * @return mixed | |
161 | */ | |
162 | private function _set_platform() | |
163 | { | |
164 | if (is_array($this->platforms) AND count($this->platforms) > 0) | |
165 | { | |
166 | foreach ($this->platforms as $key => $val) | |
167 | { | |
168 | if (preg_match("|".preg_quote($key)."|i", $this->agent)) | |
169 | { | |
170 | $this->platform = $val; | |
171 | return TRUE; | |
172 | } | |
173 | } | |
174 | } | |
175 | $this->platform = 'Unknown Platform'; | |
176 | } | |
177 | ||
178 | // -------------------------------------------------------------------- | |
179 | ||
180 | /** | |
181 | * Set the Browser | |
182 | * | |
183 | * @access private | |
184 | * @return bool | |
185 | */ | |
186 | private function _set_browser() | |
187 | { | |
188 | if (is_array($this->browsers) AND count($this->browsers) > 0) | |
189 | { | |
190 | foreach ($this->browsers as $key => $val) | |
191 | { | |
192 | if (preg_match("|".preg_quote($key).".*?([0-9\.]+)|i", $this->agent, $match)) | |
193 | { | |
194 | $this->is_browser = TRUE; | |
195 | $this->version = $match[1]; | |
196 | $this->browser = $val; | |
197 | $this->_set_mobile(); | |
198 | return TRUE; | |
199 | } | |
200 | } | |
201 | } | |
202 | return FALSE; | |
203 | } | |
204 | ||
205 | // -------------------------------------------------------------------- | |
206 | ||
207 | /** | |
208 | * Set the Robot | |
209 | * | |
210 | * @access private | |
211 | * @return bool | |
212 | */ | |
213 | private function _set_robot() | |
214 | { | |
215 | if (is_array($this->robots) AND count($this->robots) > 0) | |
216 | { | |
217 | foreach ($this->robots as $key => $val) | |
218 | { | |
219 | if (preg_match("|".preg_quote($key)."|i", $this->agent)) | |
220 | { | |
221 | $this->is_robot = TRUE; | |
222 | $this->robot = $val; | |
223 | return TRUE; | |
224 | } | |
225 | } | |
226 | } | |
227 | return FALSE; | |
228 | } | |
229 | ||
230 | // -------------------------------------------------------------------- | |
231 | ||
232 | /** | |
233 | * Set the Mobile Device | |
234 | * | |
235 | * @access private | |
236 | * @return bool | |
237 | */ | |
238 | private function _set_mobile() | |
239 | { | |
240 | if (is_array($this->mobiles) AND count($this->mobiles) > 0) | |
241 | { | |
242 | foreach ($this->mobiles as $key => $val) | |
243 | { | |
244 | if (FALSE !== (strpos(strtolower($this->agent), $key))) | |
245 | { | |
246 | $this->is_mobile = TRUE; | |
247 | $this->mobile = $val; | |
248 | return TRUE; | |
249 | } | |
250 | } | |
251 | } | |
252 | return FALSE; | |
253 | } | |
254 | ||
255 | // -------------------------------------------------------------------- | |
256 | ||
257 | /** | |
258 | * Set the accepted languages | |
259 | * | |
260 | * @access private | |
261 | * @return void | |
262 | */ | |
263 | private function _set_languages() | |
264 | { | |
265 | if ((count($this->languages) == 0) AND isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) AND $_SERVER['HTTP_ACCEPT_LANGUAGE'] != '') | |
266 | { | |
267 | $languages = preg_replace('/(;q=[0-9\.]+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_LANGUAGE']))); | |
268 | ||
269 | $this->languages = explode(',', $languages); | |
270 | } | |
271 | ||
272 | if (count($this->languages) == 0) | |
273 | { | |
274 | $this->languages = array('Undefined'); | |
275 | } | |
276 | } | |
277 | ||
278 | // -------------------------------------------------------------------- | |
279 | ||
280 | /** | |
281 | * Set the accepted character sets | |
282 | * | |
283 | * @access private | |
284 | * @return void | |
285 | */ | |
286 | private function _set_charsets() | |
287 | { | |
288 | if ((count($this->charsets) == 0) AND isset($_SERVER['HTTP_ACCEPT_CHARSET']) AND $_SERVER['HTTP_ACCEPT_CHARSET'] != '') | |
289 | { | |
290 | $charsets = preg_replace('/(;q=.+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_CHARSET']))); | |
291 | ||
292 | $this->charsets = explode(',', $charsets); | |
293 | } | |
294 | ||
295 | if (count($this->charsets) == 0) | |
296 | { | |
297 | $this->charsets = array('Undefined'); | |
298 | } | |
299 | } | |
300 | ||
301 | // -------------------------------------------------------------------- | |
302 | ||
303 | /** | |
304 | * Is Browser | |
305 | * | |
306 | * @access public | |
307 | * @return bool | |
308 | */ | |
309 | public function is_browser($key = NULL) | |
310 | { | |
311 | if ( ! $this->is_browser) | |
312 | { | |
313 | return FALSE; | |
314 | } | |
315 | ||
316 | // No need to be specific, it's a browser | |
317 | if ($key === NULL) | |
318 | { | |
319 | return TRUE; | |
320 | } | |
321 | ||
322 | // Check for a specific browser | |
323 | return array_key_exists($key, $this->browsers) AND $this->browser === $this->browsers[$key]; | |
324 | } | |
325 | ||
326 | // -------------------------------------------------------------------- | |
327 | ||
328 | /** | |
329 | * Is Robot | |
330 | * | |
331 | * @access public | |
332 | * @return bool | |
333 | */ | |
334 | public function is_robot($key = NULL) | |
335 | { | |
336 | if ( ! $this->is_robot) | |
337 | { | |
338 | return FALSE; | |
339 | } | |
340 | ||
341 | // No need to be specific, it's a robot | |
342 | if ($key === NULL) | |
343 | { | |
344 | return TRUE; | |
345 | } | |
346 | ||
347 | // Check for a specific robot | |
348 | return array_key_exists($key, $this->robots) AND $this->robot === $this->robots[$key]; | |
349 | } | |
350 | ||
351 | // -------------------------------------------------------------------- | |
352 | ||
353 | /** | |
354 | * Is Mobile | |
355 | * | |
356 | * @access public | |
357 | * @return bool | |
358 | */ | |
359 | public function is_mobile($key = NULL) | |
360 | { | |
361 | if ( ! $this->is_mobile) | |
362 | { | |
363 | return FALSE; | |
364 | } | |
365 | ||
366 | // No need to be specific, it's a mobile | |
367 | if ($key === NULL) | |
368 | { | |
369 | return TRUE; | |
370 | } | |
371 | ||
372 | // Check for a specific robot | |
373 | return array_key_exists($key, $this->mobiles) AND $this->mobile === $this->mobiles[$key]; | |
374 | } | |
375 | ||
376 | // -------------------------------------------------------------------- | |
377 | ||
378 | /** | |
379 | * Is this a referral from another site? | |
380 | * | |
381 | * @access public | |
382 | * @return bool | |
383 | */ | |
384 | public function is_referral() | |
385 | { | |
386 | if ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') | |
387 | { | |
388 | return FALSE; | |
389 | } | |
390 | return TRUE; | |
391 | } | |
392 | ||
393 | // -------------------------------------------------------------------- | |
394 | ||
395 | /** | |
396 | * Agent String | |
397 | * | |
398 | * @access public | |
399 | * @return string | |
400 | */ | |
401 | public function agent_string() | |
402 | { | |
403 | return $this->agent; | |
404 | } | |
405 | ||
406 | // -------------------------------------------------------------------- | |
407 | ||
408 | /** | |
409 | * Get Platform | |
410 | * | |
411 | * @access public | |
412 | * @return string | |
413 | */ | |
414 | public function platform() | |
415 | { | |
416 | return $this->platform; | |
417 | } | |
418 | ||
419 | // -------------------------------------------------------------------- | |
420 | ||
421 | /** | |
422 | * Get Browser Name | |
423 | * | |
424 | * @access public | |
425 | * @return string | |
426 | */ | |
427 | public function browser() | |
428 | { | |
429 | return $this->browser; | |
430 | } | |
431 | ||
432 | // -------------------------------------------------------------------- | |
433 | ||
434 | /** | |
435 | * Get the Browser Version | |
436 | * | |
437 | * @access public | |
438 | * @return string | |
439 | */ | |
440 | public function version() | |
441 | { | |
442 | return $this->version; | |
443 | } | |
444 | ||
445 | // -------------------------------------------------------------------- | |
446 | ||
447 | /** | |
448 | * Get The Robot Name | |
449 | * | |
450 | * @access public | |
451 | * @return string | |
452 | */ | |
453 | public function robot() | |
454 | { | |
455 | return $this->robot; | |
456 | } | |
457 | // -------------------------------------------------------------------- | |
458 | ||
459 | /** | |
460 | * Get the Mobile Device | |
461 | * | |
462 | * @access public | |
463 | * @return string | |
464 | */ | |
465 | public function mobile() | |
466 | { | |
467 | return $this->mobile; | |
468 | } | |
469 | ||
470 | // -------------------------------------------------------------------- | |
471 | ||
472 | /** | |
473 | * Get the referrer | |
474 | * | |
475 | * @access public | |
476 | * @return bool | |
477 | */ | |
478 | public function referrer() | |
479 | { | |
480 | return ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') ? '' : trim($_SERVER['HTTP_REFERER']); | |
481 | } | |
482 | ||
483 | // -------------------------------------------------------------------- | |
484 | ||
485 | /** | |
486 | * Get the accepted languages | |
487 | * | |
488 | * @access public | |
489 | * @return array | |
490 | */ | |
491 | public function languages() | |
492 | { | |
493 | if (count($this->languages) == 0) | |
494 | { | |
495 | $this->_set_languages(); | |
496 | } | |
497 | ||
498 | return $this->languages; | |
499 | } | |
500 | ||
501 | // -------------------------------------------------------------------- | |
502 | ||
503 | /** | |
504 | * Get the accepted Character Sets | |
505 | * | |
506 | * @access public | |
507 | * @return array | |
508 | */ | |
509 | public function charsets() | |
510 | { | |
511 | if (count($this->charsets) == 0) | |
512 | { | |
513 | $this->_set_charsets(); | |
514 | } | |
515 | ||
516 | return $this->charsets; | |
517 | } | |
518 | ||
519 | // -------------------------------------------------------------------- | |
520 | ||
521 | /** | |
522 | * Test for a particular language | |
523 | * | |
524 | * @access public | |
525 | * @return bool | |
526 | */ | |
527 | public function accept_lang($lang = 'en') | |
528 | { | |
529 | return (in_array(strtolower($lang), $this->languages(), TRUE)); | |
530 | } | |
531 | ||
532 | // -------------------------------------------------------------------- | |
533 | ||
534 | /** | |
535 | * Test for a particular character set | |
536 | * | |
537 | * @access public | |
538 | * @return bool | |
539 | */ | |
540 | public function accept_charset($charset = 'utf-8') | |
541 | { | |
542 | return (in_array(strtolower($charset), $this->charsets(), TRUE)); | |
543 | } | |
544 | ||
545 | } | |
546 | ||
547 | ||
548 | /* End of file User_agent.php */ | |
549 | /* Location: ./system/libraries/User_agent.php */ |