/condition_plugin_custom_tester.php * MUST implements this class * * To add a custom test in condition_plugin_custom_tester you just have to add a method like : * * function test_dummy($b, &$bug, $lop=false) { if($lop) return array(); return true; } * this test will react to of * * or * * function test_IP($b, &$bug, $lop=false) { * if($lop) return array('\=\=?', 'eq', '\!\=', 'neq?', '\~\='); // pcre regexp list of allowed test operators * $ip = clientIP(true); * if(!$b['test'] || ($b['test'] == '') || !$b['value'] || ($b['value'] == '') || ($ip == '0.0.0.0')) { * $bug = true; * return false; * } * switch($b['test']) { * case '=' : * case 'eq' : * case '==' : * return ($ip == $b['value']); break; * case '!=' : * case 'ne' : * case 'neq' : * return ($ip != $b['value']); break; * case '~=' : // such new test operators must be added in syntax.php * return (strpos($ip, $b['value']) !== false); break; * default: // non allowed operators for the test must lead to a bug flag raise * $bug = true; * return false; * } * } * this test will react to */ class condition_plugin_base_tester { function __construct() {} // Wrapper for all tests function run($b, &$bug) { if(method_exists($this, 'test_'.$b['key'])) { return call_user_func(array($this, 'test_'.$b['key']), $b, $bug); } $bug = true; return false; } // Get allowed keys function getkeys() { $keys = array(); foreach(get_class_methods($this) as $m) { if(preg_match('`^test_(.+)$`', $m, $r)) $keys[] = $r[1]; } return $keys; } // Get test operators function getops() { $ops = array(); foreach($this->getkeys() as $m) $ops = array_merge($ops, call_user_func(array($this, 'test_'.$m), null, $dummy, true)); return array_unique($ops); } // Tests follows // ------------- // user based tests function test_user($b, &$bug, $lop=false) { if($lop) return array('\=\=?', 'eq', '\!\=', 'neq?'); $rh = isset($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'] : ''; if(!$b['test'] || ($b['test'] == '')) return ($rh && ($rh != '')); switch($b['test']) { case '=' : case 'eq' : case '==' : return $rh == $b['value']; break; case '!=' : case 'ne' : case 'neq' : return $rh != $b['value']; break; default: $bug = true; return false; } } function test_group($b, &$bug, $lop=false) { if($lop) return array('\=\=?', 'eq', '\!\=', 'neq?'); global $INFO; $grps = isset($INFO['userinfo']) ? $INFO['userinfo']['grps'] : array(); if(!$b['test'] || ($b['test'] == '')) return (count($grps) != 0); switch($b['test']) { case '=' : case 'eq' : case '==' : if(!$b['value'] || ($b['value'] == '')) return (count($grps) == 0); return in_array($b['value'], $grps); break; case '!=' : case 'ne' : case 'neq' : if(!$b['value'] || ($b['value'] == '')) return (count($grps) != 0); return !in_array($b['value'], $grps); break; default: $bug = true; return false; } } // namespace based tests function test_nsread($b, &$bug, $lop=false) { if($lop) return array('\=\=?', 'eq', '\!\=', 'neq?'); if(!$b['test'] || ($b['test'] == '')) { $bug = true; return false; } if(!$b['value'] || ($b['value'] == '')) $b['value'] = '.'; switch($b['test']) { case '=' : case 'eq' : case '==' : return (auth_quickaclcheck($b['value']) >= AUTH_READ); break; case '!=' : case 'ne' : case 'neq' : return (auth_quickaclcheck($b['value']) < AUTH_READ); break; default: $bug = true; return false; } } function test_nsedit($b, &$bug, $lop=false) { if($lop) return array('\=\=?', 'eq', '\!\=', 'neq?'); if(!$b['test'] || ($b['test'] == '')) { $bug = true; return false; } if(!$b['value'] || ($b['value'] == '')) $b['value'] = '.'; switch($b['test']) { case '=' : case 'eq' : case '==' : return (auth_quickaclcheck($b['value']) >= AUTH_EDIT); break; case '!=' : case 'ne' : case 'neq' : return (auth_quickaclcheck($b['value']) < AUTH_EDIT); break; default: $bug = true; return false; } } // time based tests function test_time($b, &$bug, $lop=false) { if($lop) return array('\=\=?', 'eq', '\!\=', 'neq?', '\<\=?', 'lt', '\>\=?', 'gt'); global $INFO; if(!$b['test'] || ($b['test'] == '') || !$b['value'] || ($b['value'] == '')) { $bug = true; return false; } switch($b['test']) { case '=' : case 'eq' : case '==' : return $this->_bt_cmptimeandstr($b['value']); break; case '!=' : case 'ne' : case 'neq' : return !$this->_bt_cmptimeandstr($b['value']); break; case '<' : case 'lt' : $t = time(); return ($t < $this->_bt_strtotime($b['value'], $t)); break; case '>' : case 'gt' : $t = time(); return ($t > $this->_bt_strtotime($b['value'], $t)); break; case '<=' : $t = time(); return ($t <= $this->_bt_strtotime($b['value'], $t)); break; case '>=' : $t = time(); return ($t >= $this->_bt_strtotime($b['value'], $t)); break; default: $bug = true; return false; } } function _bt_strtotime($value, $default) { if(preg_match('`^([0-9]{4})(-|/)([0-9]{2})(-|/)([0-9]{2})(\s+([0-9]{2}):([0-9]{2})(:([0-9]{2}))?)?$`', $value, $reg)) $value = mktime($reg[7], $reg[8], $reg[10], $reg[3], $reg[5], $reg[1]); // YYYY(-|/)MM(-|/)DD (HH:II(:SS)?)? if(preg_match('`^(([0-9]{2}):([0-9]{2})(:([0-9]{2}))?\s+)?([0-9]{4})(-|/)([0-9]{2})(-|/)([0-9]{2})$`', $value, $reg)) $value = mktime($reg[2], $reg[3], $reg[5], $reg[8], $reg[10], $reg[6]); // (HH:II(:SS)?)? YYYY(-|/)MM(-|/)DD if(preg_match('`^([0-9]{2})(-|/)([0-9]{2})(-|/)([0-9]{4})(\s+([0-9]{2}):([0-9]{2})(:([0-9]{2}))?)?$`', $value, $reg)) $value = mktime($reg[7], $reg[8], $reg[10], $reg[3], $reg[1], $reg[5]); // DD(-|/)MM(-|/)YYYY (HH:II(:SS)?)? if(preg_match('`^(([0-9]{2}):([0-9]{2})(:([0-9]{2}))?\s+)?([0-9]{2})(-|/)([0-9]{2})(-|/)([0-9]{4})$`', $value, $reg)) $value = mktime($reg[2], $reg[3], $reg[5], $reg[8], $reg[6], $reg[10]); // (HH:II(:SS)?)? DD(-|/)MM(-|/)YYYY if(!is_numeric($value)) $value = $default; return $value; } function _bt_cmptimeandstr($str) { $matched = false; $t = time(); $time = array('y' => date('Y', $t), 'm' => date('m', $t), 'd' => date('d', $t), 'h' => date('H', $t), 'i' => date('i', $t), 's' => date('s', $t)); $d = array('y' => '', 'm' => '', 'd' => '', 'h' => '', 'i' => '', 's' => ''); // full date y, m and d, time is optionnal if(preg_match('`^([0-9]{4})(-|/)([0-9]{2})(-|/)([0-9]{2})(\s+([0-9]{2}):([0-9]{2})(:([0-9]{2}))?)?$`', $str, $reg)) { $d = array('y' => $reg[1], 'm' => $reg[3], 'd' => $reg[5], 'h' => $reg[7], 'i' => $reg[8], 's' => $reg[10]); // YYYY(-|/)MM(-|/)DD (HH:II(:SS)?)? $matched = true; } if(preg_match('`^(([0-9]{2}):([0-9]{2})(:([0-9]{2}))?\s+)?([0-9]{4})(-|/)([0-9]{2})(-|/)([0-9]{2})$`', $str, $reg)) { $d = array('y' => $reg[6], 'm' => $reg[8], 'd' => $reg[10], 'h' => $reg[2], 'i' => $reg[3], 's' => $reg[5]); // (HH:II(:SS)?)? YYYY(-|/)MM(-|/)DD $matched = true; } if(preg_match('`^([0-9]{2})(-|/)([0-9]{2})(-|/)([0-9]{4})(\s+([0-9]{2}):([0-9]{2})(:([0-9]{2}))?)?$`', $str, $reg)) { $d = array('y' => $reg[5], 'm' => $reg[3], 'd' => $reg[1], 'h' => $reg[7], 'i' => $reg[8], 's' => $reg[10]); // DD(-|/)MM(-|/)YYYY (HH:II(:SS)?)? $matched = true; } if(preg_match('`^(([0-9]{2}):([0-9]{2})(:([0-9]{2}))?\s+)?([0-9]{2})(-|/)([0-9]{2})(-|/)([0-9]{4})$`', $str, $reg)) { $d = array('y' => $reg[10], 'm' => $reg[8], 'd' => $reg[6], 'h' => $reg[2], 'i' => $reg[3], 's' => $reg[5]); // (HH:II(:SS)?)? DD(-|/)MM(-|/)YYYY $matched = true; } // only month and year if(preg_match('`^([0-9]{2})(-|/)([0-9]{4})$`', $str, $reg)) { $d = array('y' => $reg[3], 'm' => $reg[1], 'd' => '', 'h' => '', 'i' => '', 's' => ''); $matched = true; } if(preg_match('`^([0-9]{4})(-|/)([0-9]{2})$`', $str, $reg)) { $d = array('y' => $reg[1], 'm' => $reg[3], 'd' => '', 'h' => '', 'i' => '', 's' => ''); $matched = true; } // only year if(preg_match('`^([0-9]{4})$`', $str, $reg)) { $d = array('y' => $reg[1], 'm' => '', 'd' => '', 'h' => '', 'i' => '', 's' => ''); $matched = true; } // full time hours, minutes (opt) and seconds (opt) // 11 : 11h // 11:30 : 11h30min // 11:30:27 : 11h30min27sec if(preg_match('`^([0-9]{2})(:([0-9]{2})(:([0-9]{2}))?)?$`', $str, $reg)) { $d = array('y' => '', 'm' => '', 'd' => '', 'h' => $reg[7], 'i' => $reg[8], 's' => $reg[10]); // YYYY(-|/)MM(-|/)DD (HH:II(:SS)?)? $matched = true; } // custom datetime format : (XX(XX)?i\s?)+ if(preg_match('`^[0-9]{2}([0-9]{2})?\s?[ymdhis](\s?[0-9]{2}([0-9]{2})?\s?[ymdhis])*$`', $str, $reg)) { while(preg_match('`^(([0-9]{2}([0-9]{2})?)\s?([ymdhis]))`', $str, $reg)) { $v = $reg[2]; $i = $reg[4]; $str = substr($str, strlen($reg[1])); if(($i != 'y') || (strlen($v) == 4)) $d[$i] = $v; } $matched = true; } if(!$matched) return false; $same = true; foreach($time as $k => $v) if(($d[$k] != '') && ($d[$k] != $v)) $same = false; return $same; } // test IP function test_IP($b, &$bug, $lop=false) { if($lop) return array('\=\=?', 'eq', '\!\=', 'neq?', '\~\='); $ip = clientIP(true); if(!$b['test'] || ($b['test'] == '') || !$b['value'] || ($b['value'] == '') || ($ip == '0.0.0.0')) { $bug = true; return false; } switch($b['test']) { case '=' : case 'eq' : case '==' : return ($ip == $b['value']); break; case '!=' : case 'ne' : case 'neq' : return ($ip != $b['value']); break; case '~=' : return (strpos($ip, $b['value']) !== false); break; default: $bug = true; return false; } } } ?>