00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00080 class t3lib_matchCondition {
00081 var $matchAlternative=array();
00082 var $matchAll=0;
00083
00084 var $altRootLine=array();
00085 var $hookObjectsArr = array();
00086
00092 function __construct() {
00093 global $TYPO3_CONF_VARS;
00094
00095
00096
00097
00098 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['matchConditionClass'])) {
00099 foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['matchConditionClass'] as $classRef) {
00100 $this->hookObjectsArr[] = &t3lib_div::getUserObj($classRef, '');
00101 }
00102 }
00103 }
00104
00110 function t3lib_matchCondition() {
00111 $this->__construct();
00112 }
00113
00120 function match($condition_line) {
00121 if ($this->matchAll) {
00122 return true;
00123 }
00124 if (count($this->matchAlternative)) {
00125 return in_array($condition_line, $this->matchAlternative);
00126 }
00127
00128
00129 $insideSqrBrackets = substr(trim($condition_line), 1, strlen($condition_line) - 2);
00130 $insideSqrBrackets = preg_replace('/\]\s*OR\s*\[/i', ']||[', $insideSqrBrackets);
00131 $insideSqrBrackets = preg_replace('/\]\s*AND\s*\[/i', ']&&[', $insideSqrBrackets);
00132
00133
00134 $orParts = preg_split('/\]\s*(\|\|){0,1}\s*\[/',$insideSqrBrackets);
00135
00136 foreach ($orParts as $partString) {
00137 $matches = false;
00138
00139
00140 $andParts = preg_split('/\]\s*&&\s*\[/',$partString);
00141 foreach ($andParts as $condStr) {
00142 $matches = $this->evalConditionStr($condStr);
00143 if ($matches===false) {
00144 break;
00145 }
00146 }
00147
00148 if ($matches===true) {
00149 break;
00150 }
00151 }
00152
00153 return $matches;
00154 }
00155
00156
00165 function evalConditionStr($string) {
00166 if (!is_array($this->altRootLine)) {
00167 $this->altRootLine = array();
00168 }
00169 list($key, $value) = explode('=', $string, 2);
00170 $key = trim($key);
00171 if (stristr(',browser,version,system,useragent,', ",$key,")) {
00172 $browserInfo = $this->browserInfo(t3lib_div::getIndpEnv('HTTP_USER_AGENT'));
00173 }
00174 $value = trim($value);
00175 switch ($key) {
00176 case 'browser':
00177 $values = explode(',',$value);
00178 while(list(,$test)=each($values)) {
00179 if (strstr($browserInfo['browser'].$browserInfo['version'],trim($test))) {
00180 return true;
00181 }
00182 }
00183 break;
00184 case 'version':
00185 $values = explode(',',$value);
00186 while(list(,$test)=each($values)) {
00187 $test = trim($test);
00188 if (strlen($test)) {
00189 if (strcspn($test,'=<>')==0) {
00190 switch(substr($test,0,1)) {
00191 case '=':
00192 if (doubleval(substr($test,1))==$browserInfo['version']) return true;
00193 break;
00194 case '<':
00195 if (doubleval(substr($test,1))>$browserInfo['version']) return true;
00196 break;
00197 case '>':
00198 if (doubleval(substr($test,1))<$browserInfo['version']) return true;
00199 break;
00200 }
00201 } else {
00202 if (strpos(' '.$browserInfo['version'],$test)==1) {return true;}
00203 }
00204 }
00205 }
00206 break;
00207 case 'system':
00208 $values = explode(',',$value);
00209 while(list(,$test)=each($values)) {
00210 $test = trim($test);
00211 if (strlen($test)) {
00212 if (strpos(' '.$browserInfo['system'],$test)==1) {return true;}
00213 }
00214 }
00215 break;
00216 case 'device':
00217 $values = explode(',',$value);
00218 if (!isset($this->deviceInfo)) {
00219 $this->deviceInfo = $this->whichDevice(t3lib_div::getIndpEnv('HTTP_USER_AGENT'));
00220 }
00221 while(list(,$test)=each($values)) {
00222 $test = trim($test);
00223 if (strlen($test)) {
00224 if ($this->deviceInfo==$test) {return true;}
00225 }
00226 }
00227 break;
00228 case 'useragent':
00229 $test = trim($value);
00230 if (strlen($test)) {
00231 return $this->matchWild($browserInfo['useragent'],$test);
00232 }
00233 break;
00234 case 'language':
00235 $values = explode(',',$value);
00236 while(list(,$test)=each($values)) {
00237 $test = trim($test);
00238 if (strlen($test)) {
00239 if (preg_match('/^\*.+\*$/',$test)) {
00240 $allLanguages = split('[,;]',t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE'));
00241 if (in_array(substr($test,1,-1), $allLanguages)) {return true;}
00242 } else {
00243 if (t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE') == $test) {return true;}
00244 }
00245 }
00246 }
00247 break;
00248 case 'IP':
00249 if (t3lib_div::cmpIP(t3lib_div::getIndpEnv('REMOTE_ADDR'), $value)) {return true;}
00250 break;
00251 case 'hostname':
00252 if (t3lib_div::cmpFQDN(t3lib_div::getIndpEnv('REMOTE_ADDR'), $value)) {return true;}
00253 break;
00254
00255 case 'hour':
00256 case 'minute':
00257 case 'dayofweek':
00258 case 'dayofmonth':
00259 case 'month':
00260 $theEvalTime = $GLOBALS['SIM_EXEC_TIME'];
00261 switch($key) {
00262 case 'hour': $theTestValue = date('H',$theEvalTime); break;
00263 case 'minute': $theTestValue = date('i',$theEvalTime); break;
00264 case 'dayofweek': $theTestValue = date('w',$theEvalTime); break;
00265 case 'dayofmonth': $theTestValue = date('d',$theEvalTime); break;
00266 case 'month': $theTestValue = date('m',$theEvalTime); break;
00267 }
00268 $theTestValue = intval($theTestValue);
00269
00270 $values = explode(',',$value);
00271 reset($values);
00272 while(list(,$test)=each($values)) {
00273 $test = trim($test);
00274 if (t3lib_div::testInt($test)) {$test='='.$test;}
00275 if (strlen($test)) {
00276 if ($this->testNumber($test,$theTestValue)) {return true;}
00277 }
00278 }
00279 break;
00280 case 'usergroup':
00281 if ($GLOBALS['TSFE']->gr_list!='0,-1') {
00282 $values = explode(',',$value);
00283 while(list(,$test)=each($values)) {
00284 $test = trim($test);
00285 if (strlen($test)) {
00286 if ($test=='*' || t3lib_div::inList($GLOBALS['TSFE']->gr_list,$test)) {return true;}
00287 }
00288 }
00289 }
00290 break;
00291 case 'loginUser':
00292 if ($GLOBALS['TSFE']->loginUser) {
00293 $values = explode(',',$value);
00294 while(list(,$test)=each($values)) {
00295 $test = trim($test);
00296 if (strlen($test)) {
00297 if ($test=='*' || !strcmp($GLOBALS['TSFE']->fe_user->user['uid'],$test)) {return true;}
00298 }
00299 }
00300 }
00301 break;
00302 case 'globalVar':
00303 $values = explode(',',$value);
00304 while(list(,$test)=each($values)) {
00305 $test = trim($test);
00306 if (strlen($test)) {
00307 $point = strcspn($test,'=<>');
00308 $theVarName = substr($test,0,$point);
00309 $nv = $this->getGP_ENV_TSFE(trim($theVarName));
00310 $testValue = substr($test,$point);
00311
00312 if ($this->testNumber($testValue,$nv)) {return true;}
00313 }
00314 }
00315 break;
00316 case 'globalString':
00317 $values = explode(',',$value);
00318 while(list(,$test)=each($values)) {
00319 $test = trim($test);
00320 if (strlen($test)) {
00321 $point = strcspn($test,'=');
00322 $theVarName = substr($test,0,$point);
00323 $nv = $this->getGP_ENV_TSFE(trim($theVarName));
00324 $testValue = substr($test,$point+1);
00325
00326 if ($this->matchWild($nv,trim($testValue))) {return true;}
00327 }
00328 }
00329 break;
00330 case 'treeLevel':
00331 $values = explode(',',$value);
00332 $theRootLine = is_array($GLOBALS['TSFE']->tmpl->rootLine) ? $GLOBALS['TSFE']->tmpl->rootLine : $this->altRootLine;
00333 $theRLC = count($theRootLine)-1;
00334 while(list(,$test)=each($values)) {
00335 $test = trim($test);
00336 if ($test==$theRLC) { return true; }
00337 }
00338 break;
00339 case 'PIDupinRootline':
00340 case 'PIDinRootline':
00341 $values = explode(',',$value);
00342 if (($key=='PIDinRootline') || (!in_array($GLOBALS['TSFE']->id,$values))) {
00343 $theRootLine = is_array($GLOBALS['TSFE']->tmpl->rootLine) ? $GLOBALS['TSFE']->tmpl->rootLine : $this->altRootLine;
00344 reset($values);
00345 while(list(,$test)=each($values)) {
00346 $test = trim($test);
00347 reset($theRootLine);
00348 while(list($rl_key,$rl_dat)=each($theRootLine)) {
00349 if ($rl_dat['uid']==$test) { return true; }
00350 }
00351 }
00352 }
00353 break;
00354 case 'compatVersion':
00355 { return t3lib_div::compat_version($value); }
00356 break;
00357 case 'userFunc':
00358 $values = split('\(|\)',$value);
00359 $funcName=trim($values[0]);
00360 $funcValue = t3lib_div::trimExplode(',',$values[1]);
00361 $pre = $GLOBALS['TSFE']->TYPO3_CONF_VARS['FE']['userFuncClassPrefix'];
00362 if ($pre &&
00363 !t3lib_div::isFirstPartOfStr(trim($funcName),$pre) &&
00364 !t3lib_div::isFirstPartOfStr(trim($funcName),'tx_')
00365 ) {
00366 if (is_object($GLOBALS['TT'])) $GLOBALS['TT']->setTSlogMessage('Match condition: Function "'.$funcName.'" was not prepended with "'.$pre.'"',3);
00367 return false;
00368 }
00369 if (function_exists($funcName) && call_user_func($funcName, $funcValue[0])) {
00370 return true;
00371 }
00372 break;
00373 }
00374
00375
00376 return false;
00377 }
00378
00386 function testNumber($test,$value) {
00387 $test = trim($test);
00388 switch(substr($test,0,1)) {
00389 case '<':
00390 if (doubleval(substr($test,1))>$value) return true;
00391 break;
00392 case '>':
00393 if (doubleval(substr($test,1))<$value) return true;
00394 break;
00395 default:
00396 if (trim(substr($test,1))==$value) return true;
00397 break;
00398 }
00399
00400 return false;
00401 }
00402
00410 function matchWild($haystack,$needle) {
00411 if ($needle && $haystack) {
00412 if (preg_match('/^\/.+\/$/', $needle)) {
00413 $regex = $needle;
00414 } else {
00415 $needle = str_replace(array('*','?'), array('###MANY###','###ONE###'), $needle);
00416 $regex = '/^'.preg_quote($needle,'/').'$/';
00417 $regex = str_replace(array('###MANY###','###ONE###'), array('.*','.'), $regex);
00418 }
00419
00420 if (preg_match($regex, $haystack)) return true;
00421 }
00422
00423 return false;
00424 }
00425
00434 function whichDevice($useragent) {
00435 foreach($this->hookObjectsArr as $hookObj) {
00436 if (method_exists($hookObj, 'whichDevice')) {
00437 $result = $hookObj->whichDevice($useragent);
00438 if (strlen($result)) {
00439 return $result;
00440 }
00441 }
00442 }
00443
00444
00445 if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['devices_class'])) {
00446 foreach($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['devices_class'] as $_classRef) {
00447 $_procObj = &t3lib_div::getUserObj($_classRef);
00448 return $_procObj->whichDevice_ext($useragent);
00449 }
00450 }
00451
00452
00453 $agent=strtolower(trim($useragent));
00454
00455 if( strstr($agent, 'avantgo')) {
00456 return 'pda';
00457 }
00458
00459
00460 $browser=substr($agent,0,4);
00461 $wapviwer=substr(stristr($agent,'wap'),0,3);
00462 if( $wapviwer=='wap' ||
00463 $browser=='noki' ||
00464 $browser== 'eric' ||
00465 $browser== 'r380' ||
00466 $browser== 'up.b' ||
00467 $browser== 'winw' ||
00468 $browser== 'wapa') {
00469 return 'wap';
00470 }
00471
00472
00473 if( strstr($agent, 'g.r.a.b.') ||
00474 strstr($agent, 'utilmind httpget') ||
00475 strstr($agent, 'webcapture') ||
00476 strstr($agent, 'teleport') ||
00477 strstr($agent, 'webcopier')) {
00478 return 'grabber';
00479 }
00480
00481
00482 if( strstr($agent, 'crawler') ||
00483 strstr($agent, 'spider') ||
00484 strstr($agent, 'googlebot') ||
00485 strstr($agent, 'searchbot') ||
00486 strstr($agent, 'infoseek') ||
00487 strstr($agent, 'altavista') ||
00488 strstr($agent, 'diibot')) {
00489 return 'robot';
00490 }
00491
00492 }
00493
00503 function browserInfo($useragent) {
00504 foreach($this->hookObjectsArr as $hookObj) {
00505 if (method_exists($hookObj, 'browserInfo')) {
00506 $result = $hookObj->browserInfo($useragent);
00507 if (strlen($result)) {
00508 return $result;
00509 }
00510 }
00511 }
00512
00513 $useragent = trim($useragent);
00514 $browserInfo=Array();
00515 $browserInfo['useragent']=$useragent;
00516 if ($useragent) {
00517
00518 if (strstr($useragent,'MSIE')) {
00519 $browserInfo['browser']='msie';
00520 } elseif(strstr($useragent,'Konqueror')) {
00521 $browserInfo['browser']='konqueror';
00522 } elseif(strstr($useragent,'Opera')) {
00523 $browserInfo['browser']='opera';
00524 } elseif(strstr($useragent,'Lynx')) {
00525 $browserInfo['browser']='lynx';
00526 } elseif(strstr($useragent,'PHP')) {
00527 $browserInfo['browser']='php';
00528 } elseif(strstr($useragent,'AvantGo')) {
00529 $browserInfo['browser']='avantgo';
00530 } elseif(strstr($useragent,'WebCapture')) {
00531 $browserInfo['browser']='acrobat';
00532 } elseif(strstr($useragent,'IBrowse')) {
00533 $browserInfo['browser']='ibrowse';
00534 } elseif(strstr($useragent,'Teleport')) {
00535 $browserInfo['browser']='teleport';
00536 } elseif(strstr($useragent,'Mozilla')) {
00537 $browserInfo['browser']='netscape';
00538 } else {
00539 $browserInfo['browser']='unknown';
00540 }
00541
00542 switch($browserInfo['browser']) {
00543 case 'netscape':
00544 $browserInfo['version'] = $this->browserInfo_version(substr($useragent,8));
00545 if (strstr($useragent,'Netscape6')) {$browserInfo['version']=6;}
00546 break;
00547 case 'msie':
00548 $tmp = strstr($useragent,'MSIE');
00549 $browserInfo['version'] = $this->browserInfo_version(substr($tmp,4));
00550 break;
00551 case 'opera':
00552 $tmp = strstr($useragent,'Opera');
00553 $browserInfo['version'] = $this->browserInfo_version(substr($tmp,5));
00554 break;
00555 case 'lynx':
00556 $tmp = strstr($useragent,'Lynx/');
00557 $browserInfo['version'] = $this->browserInfo_version(substr($tmp,5));
00558 break;
00559 case 'php':
00560 $tmp = strstr($useragent,'PHP/');
00561 $browserInfo['version'] = $this->browserInfo_version(substr($tmp,4));
00562 break;
00563 case 'avantgo':
00564 $tmp = strstr($useragent,'AvantGo');
00565 $browserInfo['version'] = $this->browserInfo_version(substr($tmp,7));
00566 break;
00567 case 'acrobat':
00568 $tmp = strstr($useragent,'WebCapture');
00569 $browserInfo['version'] = $this->browserInfo_version(substr($tmp,10));
00570 break;
00571 case 'ibrowse':
00572 $tmp = strstr($useragent,'IBrowse/');
00573 $browserInfo['version'] = $this->browserInfo_version(substr($tmp,8));
00574 break;
00575 case 'konqueror':
00576 $tmp = strstr($useragent,'Konqueror/');
00577 $browserInfo['version'] = $this->browserInfo_version(substr($tmp,10));
00578 break;
00579 }
00580
00581 $browserInfo['system']='';
00582 if (strstr($useragent,'Win')) {
00583
00584 if (strstr($useragent,'Win98') || strstr($useragent,'Windows 98')) {
00585 $browserInfo['system']='win98';
00586 } elseif (strstr($useragent,'Win95') || strstr($useragent,'Windows 95')) {
00587 $browserInfo['system']='win95';
00588 } elseif (strstr($useragent,'WinNT') || strstr($useragent,'Windows NT')) {
00589 $browserInfo['system']='winNT';
00590 } elseif (strstr($useragent,'Win16') || strstr($useragent,'Windows 311')) {
00591 $browserInfo['system']='win311';
00592 }
00593 } elseif (strstr($useragent,'Mac')) {
00594 $browserInfo['system']='mac';
00595
00596 } elseif (strstr($useragent,'Linux')) {
00597 $browserInfo['system']='linux';
00598 } elseif (strstr($useragent,'SGI') && strstr($useragent,' IRIX ')) {
00599 $browserInfo['system']='unix_sgi';
00600 } elseif (strstr($useragent,' SunOS ')) {
00601 $browserInfo['system']='unix_sun';
00602 } elseif (strstr($useragent,' HP-UX ')) {
00603 $browserInfo['system']='unix_hp';
00604 }
00605 }
00606
00607 return $browserInfo;
00608 }
00609
00616 function browserInfo_version($tmp) {
00617 return doubleval(preg_replace('/^[^0-9]*/','',$tmp));
00618 }
00619
00629 function getGlobal($var, $source=NULL) {
00630 $vars = explode('|',$var);
00631 $c = count($vars);
00632 $k = trim($vars[0]);
00633 $theVar = isset($source) ? $source[$k] : $GLOBALS[$k];
00634
00635 for ($a=1;$a<$c;$a++) {
00636 if (!isset($theVar)) { break; }
00637
00638 $key = trim($vars[$a]);
00639 if (is_object($theVar)) {
00640 $theVar = $theVar->$key;
00641 } elseif (is_array($theVar)) {
00642 $theVar = $theVar[$key];
00643 } else {
00644 return '';
00645 }
00646 }
00647
00648 if (!is_array($theVar) && !is_object($theVar)) {
00649 return $theVar;
00650 } else {
00651 return '';
00652 }
00653 }
00654
00663 function getGP_ENV_TSFE($var) {
00664 $vars = explode(':',$var,2);
00665 if (count($vars)==1) {
00666 $val = $this->getGlobal($var);
00667 } else {
00668 $splitAgain=explode('|',$vars[1],2);
00669 $k=trim($splitAgain[0]);
00670 if ($k) {
00671 switch((string)trim($vars[0])) {
00672 case 'GP':
00673 $val = t3lib_div::_GP($k);
00674 break;
00675 case 'TSFE':
00676 $val = $this->getGlobal('TSFE|'.$vars[1]);
00677 $splitAgain=0;
00678 break;
00679 case 'ENV':
00680 $val = getenv($k);
00681 break;
00682 case 'IENV':
00683 $val = t3lib_div::getIndpEnv($k);
00684 break;
00685 case 'LIT':
00686 { return trim($vars[1]); }
00687 break;
00688 }
00689
00690 if (count($splitAgain)>1) {
00691 if (is_array($val) && trim($splitAgain[1])) {
00692 $val=$this->getGlobal($splitAgain[1],$val);
00693 } else {
00694 $val='';
00695 }
00696 }
00697 }
00698 }
00699 return $val;
00700 }
00701 }
00702
00703
00704 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_matchcondition.php']) {
00705 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_matchcondition.php']);
00706 }
00707 ?>