<?php
class Pbs_Filter {
private $db = null;
private $membership;
public function evaluate() {
$this->db = Zend_Db_Table::getDefaultAdapter();
$db = $this->db;
$debuglevel = 0;
$userIDsNamespace = Zend_Session::namespaceGet('userIDs');
$membershipMapper = new Application_Model_MembershipMapper();
$this->membership = new Application_Model_Membership();
if(isset($userIDsNamespace['membershipID'])) {
$membershipMapper->find($userIDsNamespace['membershipID'], $this->membership);
} else {
$this->membership->setID(null);
}
// For Testing Filters
$testFilter = (isset($_POST['submit'])) ? true : false;
if($testFilter) {
$ipAdress = $_POST['ip'];
$macAdress = $_POST['mac'];
$poolID = $_POST['poolID'];
$bootisoID = $_POST['bootisoID'];
$membershipID = $_POST['membershipID'];
$groupID = $_POST['groupID'];
$time = ($_POST['time']);
$clientID = $_POST['clientID'];
$weekday = $_POST['weekday'];
$date = $_POST['date'];
print_a('Input',
array('ipAdress' => $ipAdress,
'macAdress' => $macAdress,
'poolID' => $poolID,
'bootisoID' => $bootisoID,
'membershipID' => $membershipID,
'groupID' => $groupID,
'time' => $time." - ".date('d.m.Y H:i:s', $time),
'clientID' => $clientID,
'hardwarehash' => $hardwarehash,
'weekday' => $weekday,
'date' => $date));
}
try {
$set = array();
$session = new Application_Model_Session();
$sessionmapper = new Application_Model_SessionMapper();
$sessionarray = $sessionmapper->findBy(array('alphasessionID' => $_SESSION['alphasessionID']), true);
$session->setOptions($sessionarray[0]);
if (isset($sessionarray['sessionID'])) {
$session->setID($sessionarray['sessionID']);
}
if(!isset($userIDsNamespace['membershipID'])) {
$bootisoMapper = new Application_Model_BootIsoMapper();
$bootiso = new Application_Model_BootIso();
$bootisoMapper->find($session->getBootisoID(), $bootiso);
$groupID = $bootiso->getGroupID();
} else {
$groupID = $userIDsNamespace['groupID'];
}
#########################################################
// IP Adress
$filtertypID = 1;
// get it from session_table with session_id from the session
if(!$testFilter) {
$ipAdress = $session->getIp();
}
$ipAdress = str_replace(".", "", $this->fillIP($ipAdress));
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
REPLACE(fe.filtervalue,'.','') <= '".$ipAdress."' AND
'".$ipAdress."' <= REPLACE(fe.filtervalue2,'.','') AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
if($debuglevel >= 3 )
{ print_a('ipAdress', $result, $set[$filtertypID]); }
#########################################################
// Mac range
$filtertypID = 2;
// get it from session_table with session_id from the session
if(!$testFilter) {
$client = new Application_Model_Client();
$clientmapper = new Application_Model_ClientMapper();
$clientmapper->find($session->getClientID(), $client);
$macAdress = $client->getMacadress();
}
try {
$macAdress = $this->fillMac($macAdress);
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue <= '".$macAdress."' AND
'".$macAdress."' <= fe.filtervalue2 AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('macAdress', $result, $set[$filtertypID]); }
#########################################################
// PoolID
$filtertypID = 3;
// get PoolID from client_ID from session_id from the session
if(!$testFilter) {
$poolentry = new Application_Model_PoolEntries();
$poolentrymapper = new Application_Model_PoolEntriesMapper();
$poolentry = $poolentrymapper->findby(array('clientID' => $client->getID()), true);
@$poolentry = $poolentry[0];
$poolID = $poolentry['poolID'];
}
try {
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue = ".$poolID." AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
if(count($result) > 0) {
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('poolID', $result, $set[$filtertypID]); }
#########################################################
// ClientID
$filtertypID = 8;
// get client_ID from session_id from the session
if(!$testFilter) {
$clientID = $session->getClientID();
}
try {
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue = ".$clientID." AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('clientID', $result, $set[$filtertypID]); }
#########################################################
// BootIsoID
$filtertypID = 4;
// get BootIsoID from client_ID from session_id from the session
if(!$testFilter) {
$bootisoID = $session->getBootisoID();
}
try {
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue = ".$bootisoID." AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('bootisoID', $result, $set[$filtertypID]); }
#########################################################
// MembershipID
$filtertypID = 5;
if($this->membership->getID() != null) {
if(!$testFilter) {
// get membership from the session
//TODO: GET MEMBERSHIP from SESSION
$membershipID = $this->membership->getID();
}
try {
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue = ".$membershipID." AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('membership', $result, $set[$filtertypID]); }
}
#########################################################
// GroupID
$filtertypID = 6;
if($this->membership->getID() != null) {
if(!$testFilter) {
// get membership from the session
$membergroupID = $this->membership->getGroupID();
}
}
if(isset($membergroupID)) {
try {
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue = ".$membergroupID." AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('groupID', $result, $set[$filtertypID]); }
}
#########################################################
// Time
$filtertypID = 7;
if(!$testFilter) {
$nowShort = date("H:i");
} else {
$nowShort = date("H:i", $time);
}
$nowShort = str_replace(":", "", $nowShort);
try {
$stmt = $db->query('SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = '.$filtertypID.' AND
REPLACE(fe.filtervalue,":","") <= '.$nowShort.' AND
REPLACE(fe.filtervalue2,":","") >= '.$nowShort." AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('time', $result, $set[$filtertypID]); }
#########################################################
// Hardwarehash
$filtertypID = 9;
if(!$testFilter) {
// get hardwarehash from session
$client = new Application_Model_Client();
$clientmapper = new Application_Model_ClientMapper();
$clientmapper->find($session->getClientID(), $client);
$hardwarehash = $client->getHardwarehash();
}
try {
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue = ".$hardwarehash." AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('hardwarehash', $result, $set[$filtertypID]); }
#########################################################
// weekday
$filtertypID = 10;
if(!$testFilter) {
$weekday = date('N');
}
try {
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue <= ".$weekday." AND
".$weekday." <= fe.filtervalue2 AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('weekday', $result, $set[$filtertypID]); }
#########################################################
// date
$filtertypID = 11;
if(!$testFilter) {
$date = strtotime(date('d.m.Y'));
}
try {
$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE
fe.filtertypeID = ".$filtertypID." AND
fe.filtervalue <= ".$date." AND
".$date." <= fe.filtervalue2 AND
fe.filterID = f.filterID AND
f.groupID = '".$groupID."'");
$result = $stmt->fetchAll();
foreach($result as $r) {
$set[$filtertypID][] = $r['filterID'];
}
} catch(Exception $e) {}
if($debuglevel >= 3)
{ print_a('date', $result, $set[$filtertypID], $date); }
########################################
$result = array();
// ErgebnisSet auswerten
if($debuglevel >= 2)
{ print_a('the result sets of the filtertypes', $set); }
// Merging of the resultsets of the filter
$kk = array();
foreach($set as $myset) {
$kk = array_merge($kk, $myset);
}
$set = $kk;
// counting how often a filter is evaluated at database
$a = array();
foreach($set as $k => $s) {
@$a[$s] += 1;
}
if($debuglevel >= 2)
{ print_a('Übereinstimmungen pro Filter', $a); }
// Get the number of filtertypes every filter has
$stmt = $db->query(
"SELECT f.filterID,SUM(num) as num FROM (
SELECT *, '1' as num
FROM pbs_filterentries
GROUP BY filterID, filtertypeID
) d RIGHT OUTER JOIN pbs_filter f ON d.filterID = f.filterID
WHERE groupID = '".$groupID."' GROUP BY d.filterID");
$resultset = $stmt->fetchAll();
foreach($resultset as $d) {
if($d['num'] == NULL) {
$d['num'] = 0;
// write filter with empty filterrules in resultset
$result[] = $d['filterID'];
}
$database[$d['filterID']] = $d['num'];
}
if($debuglevel >= 2)
{ print_a('Anzahl Filterentries in Datenbank', $database); }
// remove all filters from resultset, which to few filtertypes satisfied
foreach($a as $i => $b) {
if($a[$i] < $database[$i]) {
unset($a[$i]);
} else {
$result[] = $i;
}
}
if($debuglevel >= 1)
{ print_a('Valid Filters', $result); }
// now selecting the filter with the highest priority
$query = 'SELECT filterID, bootmenuID, priority
FROM pbs_filter WHERE ';
foreach($result as $e) {
$queryTmp[] = "filterID = '$e'";
}
if (!empty($queryTmp)) {
$query .= implode(" OR ", $queryTmp);
}
$query .= 'ORDER BY priority DESC LIMIT 0,1';
$bootmenuID = 'null';
try {
$stmt = $db->query($query);
$resultset = $stmt->fetchAll();
$bootmenuID = $resultset[0]['bootmenuID'];
} catch(Exception $e) {
}
if($bootmenuID != 'null') {
$bm = new Application_Model_BootMenu();
$bmmapper = new Application_Model_BootMenuMapper();
$bmmapper->find($bootmenuID, $bm);
return $bootmenuID;
} else {
return null;
}
} catch (Zend_Exception $e) {
echo "class: ".get_class($e)."<br>\n";
echo "Error message 2: " . $e->getMessage() . "\n";
}
}
private function fillIP($ip) {
$ar = explode(".", $ip);
$representation = array();
foreach($ar as $part) {
$representation[] = sprintf("%03s", $part);
}
return implode(".", $representation);
}
private function fillMac($ip) {
$ar = explode(":", $ip);
$representation = array();
foreach($ar as $part) {
$representation[] = sprintf("%02s", $part);
}
return implode(":", $representation);
}
}
?>