summaryrefslogblamecommitdiffstats
path: root/library/Pbs/Filter.php
blob: fefc33183f9561a84b867b6a80a400173f3a01d2 (plain) (tree)
1
2
3
4
5
6
7
8






                            
                                  


                                                       
                                
                

                                                                              

                                                                             

                                                                                                 



                                                       


































                                                                                       
                                                                                                                            
                                                               
                                                                     





                                                                                






                                                                                     


                                                                                                                

                                                                                                                      



                                                                                             



                                                                        
                                             













                                                                                                

                                                                                                           

                                                                                                       


                                                                                             





                                                                                
                                            








                                                                                             
                                                                                                                  
                                                                        




                                                               

                                                                                                           
                                                                                                

                                                                                                                








                                                                                        
                                            









                                                                                 

                                                                                                           
                                                                                                  


                                                                                             






                                                                                
                                            








                                                                                                        

                                                                                                           
                                                                                                   

                                                                                             






                                                                                
                                            



                                                                                 




                                                                                   
                                 
                                    

                                                                                                                   
                                                                                                              

                                                                                                     





                                                                                        
 
                                                    

                                                                                         


                                                                                 

                                                                

                                                                                                
                                 
                                        
                                
                                                  
                                    

                                                                                                                   
                                                                                                               

                                                                                                     





                                                                                        
 
                                                    

                                                                                         



                                                                                 
                                                        

                             
                                                              
                         


                                                                  
        

                                                                                                               

                                                                                                                            
                                                                                                    
                                                                                                        






                                                                                
                                            








                                                                                     
                                                                           


                            

                                                                                                           
                                                                                                      



                                                                                             





                                                                                
                                            








                                                                                        

                                                                                                           

                                                                                                   


                                                                                             





                                                                                
                                            

                                                                                 
                               





                                                      

                                                                                                           

                                                                                                                    


                                                                                             





                                                                                
                                            
                                                                                
                                                                
                                          
                                                

                                                                                                        








                                                                               

                                                  


                                                                            
                                                                         
                                           
                                                                                 


                                                                               

                                                                                                                 

                                                       





                                                                                           
                                                                      


                                                                                       

                                                                                                
                        






                                                           



                                                                 


















                                                                                   
                                                                                                


                                                   






                                                                                   
         




















                                                                          
<?php

class Pbs_Filter{

	private $db = null;
	private $membership;
	
	public function evaluate()
    {
    	$this->db = Zend_Db_Table::getDefaultAdapter();
        $db = $this->db;	
		$debuglevel = 1;
		
		$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]);
			@$session->setID($sessionarray['sessionID']);
			
			$bootisoMapper = new Application_Model_BootisoMapper();
			$bootiso = new Application_Model_BootIso();
			$bootisoMapper->find($session->getBootisoID(),$bootiso);
			$groupID = $bootiso->getGroupID();
			
			#########################################################
			// 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('membership',$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 = date('d.m.Y');
			}

			try{
				$stmt = $db->query("SELECT * FROM pbs_filterentries fe, pbs_filter f WHERE 
								fe.filtertypeID  = ".$filtertypID." AND
								REPLACE(fe.filtervalue,'.','') <= ".$date." AND
								".$date." <= REPLACE(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]);	
			########################################
			$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'";
			}
			$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);
    }
}
?>