Project

General

Profile

Bug #21478 ยป 0012488.patch

Administrator Admin, 2009-11-06 10:49

View differences:

tests/t3lib/t3lib_matchcondition_testcase.php (Arbeitskopie)
* @return void
* @test
*/
public function browserInfoHookIsCalled() {
public function deprecatedBrowserInfoHookIsCalled() {
$classRef = uniqid('tx_browserInfoHook');
$browserInfoHookMock = $this->getMock($classRef, array('browserInfo'));
$browserInfoHookMock->expects($this->atLeastOnce())->method('browserInfo');
......
* @return void
* @test
*/
public function whichDeviceHookIsCalled() {
public function deprecatedWhichDeviceHookIsCalled() {
$classRef = uniqid('tx_whichDeviceHook');
$whichDeviceHookMock = $this->getMock($classRef, array('whichDevice'));
$whichDeviceHookMock->expects($this->atLeastOnce())->method('whichDevice');
t3lib/class.t3lib_matchcondition.php (Arbeitskopie)
* @subpackage t3lib
* @see t3lib_TStemplate::matching(), t3lib_TStemplate::generateConfig()
*/
class t3lib_matchCondition {
class t3lib_matchCondition extends t3lib_matchCondition_frontend {
var $matchAlternative=array(); // If this array has elements, the matching returns true if a whole "matchline" is found in the array!
var $matchAll=0; // If set all is matched!
......
* Constructor for this class
*
* @return void
* @deprecated since TYPO3 4.3, will be removed in TYPO3 4.5 - The functionality was moved to t3lib_matchCondition_frontend
*/
function __construct() {
global $TYPO3_CONF_VARS;
t3lib_div::logDeprecatedFunction();
// Usage (ext_localconf.php):
// $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['matchConditionClass'][] =
// 'EXT:my_ext/class.browserinfo.php:MyBrowserInfoClass';
if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['matchConditionClass'])) {
foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['matchConditionClass'] as $classRef) {
$this->hookObjectsArr[] = t3lib_div::getUserObj($classRef, '');
}
}
parent::__construct();
}
/**
* Constructor for this class
*
* @return void
*/
function t3lib_matchCondition() {
$this->__construct();
}
/**
* Matching TS condition
*
* @param string Line to match
......
*/
function match($condition_line) {
if ($this->matchAll) {
return true;
parent::setSimulateMatchResult(true);
}
if (count($this->matchAlternative)) {
return in_array($condition_line, $this->matchAlternative);
parent::setSimulateMatchConditions($this->matchAlternative);
}
// Getting the value from inside of the wrapping square brackets of the condition line:
$insideSqrBrackets = substr(trim($condition_line), 1, strlen($condition_line) - 2);
$insideSqrBrackets = preg_replace('/\]\s*OR\s*\[/i', ']||[', $insideSqrBrackets);
$insideSqrBrackets = preg_replace('/\]\s*AND\s*\[/i', ']&&[', $insideSqrBrackets);
// The "weak" operator "||" (OR) takes precedence: backwards compatible, [XYZ][ZYX] does still work as OR
$orParts = preg_split('/\]\s*(\|\|){0,1}\s*\[/',$insideSqrBrackets);
foreach ($orParts as $partString) {
$matches = false;
// Splits by the "&&" (AND) operator:
$andParts = preg_split('/\]\s*&&\s*\[/',$partString);
foreach ($andParts as $condStr) {
$matches = $this->evalConditionStr($condStr);
if ($matches===false) {
break; // only true AND true = true, so we have to break here
}
}
if ($matches===true) {
break; // true OR false = true, so we break if we have a positive result
}
}
return $matches;
return parent::match($condition_line);
}
......
* @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=292&cHash=c6c7d43d2f
*/
function evalConditionStr($string) {
if (!is_array($this->altRootLine)) {
$this->altRootLine = array();
}
list($key, $value) = explode('=', $string, 2);
$key = trim($key);
$value = trim($value);
if (t3lib_div::inList('browser,version,system,useragent', strtolower($key))) {
$browserInfo = $this->browserInfo(t3lib_div::getIndpEnv('HTTP_USER_AGENT'));
}
switch ($key) {
case 'browser':
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
if (strpos($browserInfo['browser'] . $browserInfo['version'], $test) !== false) {
return true;
}
}
break;
case 'version':
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
if (strcspn($test, '=<>') == 0) {
switch (substr($test, 0, 1)) {
case '=':
if (doubleval(substr($test, 1)) == $browserInfo['version']) {
return true;
}
break;
case '<':
if (doubleval(substr($test, 1)) > $browserInfo['version']) {
return true;
}
break;
case '>':
if (doubleval(substr($test, 1)) < $browserInfo['version']) {
return true;
}
break;
}
} else {
if (strpos(' ' . $browserInfo['version'], $test) == 1) {
return true;
}
}
}
break;
case 'system':
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
if (strpos(' ' . $browserInfo['system'], $test) == 1) {
return true;
}
}
break;
case 'device':
if (!isset($this->deviceInfo)) {
$this->deviceInfo = $this->whichDevice(t3lib_div::getIndpEnv('HTTP_USER_AGENT'));
}
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
if ($this->deviceInfo == $test) {
return true;
}
}
break;
case 'useragent':
$test = trim($value);
if (strlen($test)) {
return $this->matchWild($browserInfo['useragent'], $test);
}
break;
case 'language':
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
if (preg_match('/^\*.+\*$/', $test)) {
$allLanguages = preg_split('/[,;]/', t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE'));
if (in_array(substr($test, 1, -1), $allLanguages)) {
return true;
}
} else if (t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE') == $test) {
return true;
}
}
break;
case 'IP':
if (t3lib_div::cmpIP(t3lib_div::getIndpEnv('REMOTE_ADDR'), $value)) {
return true;
}
break;
case 'hostname':
if (t3lib_div::cmpFQDN(t3lib_div::getIndpEnv('REMOTE_ADDR'), $value)) {
return true;
}
break;
// hour, minute, dayofweek, dayofmonth, month, year, julianday
case 'hour':
case 'minute':
case 'month':
case 'year':
case 'dayofweek':
case 'dayofmonth':
case 'dayofyear':
$theEvalTime = $GLOBALS['SIM_EXEC_TIME']; // In order to simulate time properly in templates.
switch($key) {
case 'hour': $theTestValue = date('H', $theEvalTime); break;
case 'minute': $theTestValue = date('i', $theEvalTime); break;
case 'month': $theTestValue = date('m', $theEvalTime); break;
case 'year': $theTestValue = date('Y', $theEvalTime); break;
case 'dayofweek': $theTestValue = date('w', $theEvalTime); break;
case 'dayofmonth': $theTestValue = date('d', $theEvalTime); break;
case 'dayofyear': $theTestValue = date('z', $theEvalTime); break;
}
$theTestValue = intval($theTestValue);
// comp
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
if (t3lib_div::testInt($test)) {
$test = '=' . $test;
}
if ($this->testNumber($test, $theTestValue)) {
return true;
}
}
break;
case 'usergroup':
if ($GLOBALS['TSFE']->gr_list != '0,-1') { // '0,-1' is the default usergroups when not logged in!
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
if ($test == '*' || t3lib_div::inList($GLOBALS['TSFE']->gr_list, $test)) {
return true;
}
}
}
break;
case 'loginUser':
if ($GLOBALS['TSFE']->loginUser) {
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
if ($test == '*' || !strcmp($GLOBALS['TSFE']->fe_user->user['uid'], $test)) {
return true;
}
}
}
break;
case 'globalVar':
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
$point = strcspn($test, '!=<>');
$theVarName = substr($test, 0, $point);
$nv = $this->getGP_ENV_TSFE(trim($theVarName));
$testValue = substr($test, $point);
if ($this->testNumber($testValue, $nv)) {
return true;
}
}
break;
case 'globalString':
$values = t3lib_div::trimExplode(',', $value, true);
foreach ($values as $test) {
$point = strcspn($test, '=');
$theVarName = substr($test, 0, $point);
$nv = $this->getGP_ENV_TSFE(trim($theVarName));
$testValue = substr($test, $point+1);
if ($this->matchWild($nv, trim($testValue))) {
return true;
}
}
break;
case 'treeLevel':
$values = t3lib_div::trimExplode(',', $value, true);
$theRootLine = is_array($GLOBALS['TSFE']->tmpl->rootLine) ? $GLOBALS['TSFE']->tmpl->rootLine : $this->altRootLine;
$treeLevel = count($theRootLine)-1;
foreach ($values as $test) {
if ($test == $treeLevel) {
return true;
}
}
break;
case 'PIDupinRootline':
case 'PIDinRootline':
$values = t3lib_div::trimExplode(',', $value, true);
if (($key=='PIDinRootline') || (!in_array($GLOBALS['TSFE']->id, $values))) {
$theRootLine = is_array($GLOBALS['TSFE']->tmpl->rootLine) ? $GLOBALS['TSFE']->tmpl->rootLine : $this->altRootLine;
foreach ($values as $test) {
foreach ($theRootLine as $rl_dat) {
if ($rl_dat['uid'] == $test) {
return true;
}
}
}
}
break;
case 'compatVersion':
return t3lib_div::compat_version($value);
break;
case 'userFunc':
$values = preg_split('/\(|\)/', $value);
$funcName = trim($values[0]);
$funcValue = t3lib_div::trimExplode(',', $values[1]);
$pre = $GLOBALS['TSFE']->TYPO3_CONF_VARS['FE']['userFuncClassPrefix'];
if ($pre &&
!t3lib_div::isFirstPartOfStr(trim($funcName),$pre) &&
!t3lib_div::isFirstPartOfStr(trim($funcName),'tx_')
) {
if (is_object($GLOBALS['TT'])) $GLOBALS['TT']->setTSlogMessage('Match condition: Function "'.$funcName.'" was not prepended with "'.$pre.'"',3);
return false;
}
if (function_exists($funcName) && call_user_func($funcName, $funcValue[0])) {
return true;
}
break;
}
return false;
return parent::evaluateCondition($string);
}
/**
......
* @return boolean If $value is "50" and $test is "< 123" then it will return true.
*/
function testNumber($test, $leftValue) {
if (preg_match('/^(!?=+|<=?|>=?)\s*([^\s]*)\s*$/', $test, $matches)) {
$operator = $matches[1];
$rightValue = $matches[2];
switch ($operator) {
case '>=':
return ($leftValue >= doubleval($rightValue));
break;
case '<=':
return ($leftValue <= doubleval($rightValue));
break;
case '!=':
return ($leftValue != doubleval($rightValue));
break;
case '<':
return ($leftValue < doubleval($rightValue));
break;
case '>':
return ($leftValue > doubleval($rightValue));
break;
default:
// nothing valid found except '=', use '='
return ($leftValue == trim($rightValue));
break;
}
}
return false;
return parent::compareNumber($test, $leftValue);
}
/**
......
* @return boolean Returns true if $needle matches or is found in (according to wildcards) in $haystack. Eg. if $haystack is "Netscape 6.5" and $needle is "Net*" or "Net*ape" then it returns true.
*/
function matchWild($haystack, $needle) {
$result = false;
if ($needle) {
if (preg_match('/^\/.+\/$/', $needle)) {
// Regular expression, only "//" is allowed as delimiter
$regex = $needle;
} else {
$needle = str_replace(array('*', '?'), array('###MANY###', '###ONE###'), $needle);
$regex = '/^' . preg_quote($needle, '/') . '$/';
// Replace the marker with .* to match anything (wildcard)
$regex = str_replace(array('###MANY###', '###ONE###'), array('.*' , '.'), $regex);
}
$result = (boolean)preg_match($regex, (string)$haystack);
}
return $result;
return parent::searchStringWildcard($haystack, $needle);
}
/**
......
* @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=296&cHash=a8ae66c7d6
*/
function whichDevice($useragent) {
foreach($this->hookObjectsArr as $hookObj) {
if (method_exists($hookObj, 'whichDevice')) {
$result = $hookObj->whichDevice($useragent);
if (strlen($result)) {
return $result;
}
}
}
// deprecated, see above
if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['devices_class'])) {
foreach($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['devices_class'] as $_classRef) {
$_procObj = t3lib_div::getUserObj($_classRef);
return $_procObj->whichDevice_ext($useragent);
}
}
//
$deviceType = t3lib_utility_Client::getDeviceType($useragent);
return $deviceType;
return parent::getDeviceType($useragent);
}
/**
......
* @see match()
*/
function browserInfo($useragent) {
foreach($this->hookObjectsArr as $hookObj) {
if (method_exists($hookObj, 'browserInfo')) {
$result = $hookObj->browserInfo($useragent);
if (strlen($result)) {
return $result;
}
}
}
$browserInfo = t3lib_utility_Client::getBrowserInfo($useragent);
return $browserInfo;
return parent::getBrowserInfo($useragent);
}
/**
......
* @access private
*/
function getGlobal($var, $source=NULL) {
$vars = explode('|',$var);
$c = count($vars);
$k = trim($vars[0]);
$theVar = isset($source) ? $source[$k] : $GLOBALS[$k];
for ($a=1;$a<$c;$a++) {
if (!isset($theVar)) { break; }
$key = trim($vars[$a]);
if (is_object($theVar)) {
$theVar = $theVar->$key;
} elseif (is_array($theVar)) {
$theVar = $theVar[$key];
} else {
return '';
}
}
if (!is_array($theVar) && !is_object($theVar)) {
return $theVar;
} else {
return '';
}
return parent::getGlobal($var, $source);
}
/**
......
* @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=311&cHash=487cbd5cdf
*/
function getGP_ENV_TSFE($var) {
$vars = explode(':',$var,2);
if (count($vars)==1) {
$val = $this->getGlobal($var);
} else {
$splitAgain=explode('|',$vars[1],2);
$k=trim($splitAgain[0]);
if ($k) {
switch((string)trim($vars[0])) {
case 'GP':
$val = t3lib_div::_GP($k);
break;
case 'TSFE':
$val = $this->getGlobal('TSFE|'.$vars[1]);
$splitAgain=0; // getGlobal resolves all parts of the key, so no further splitting is needed
break;
case 'ENV':
$val = getenv($k);
break;
case 'IENV':
$val = t3lib_div::getIndpEnv($k);
break;
case 'LIT':
{ return trim($vars[1]); } // return litteral value...
break;
}
// If array:
if (count($splitAgain)>1) {
if (is_array($val) && trim($splitAgain[1])) {
$val=$this->getGlobal($splitAgain[1],$val);
} else {
$val='';
}
}
}
}
return $val;
return parent::getVariable($var);
}
}
    (1-1/1)