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



                 



                            
     
















































































                                                                                                          
 

                                                        
 


























                                                                                   
 


























                                                                                          
 






















                                                                                   
 




















                                                                                   
 






















                                                                                     
 

























                                                                                     
 











                                                               
 














                                                                                   
 











                                                               
 












                                                                                   
 







                                                               
 












                                                                                   
 







                                                               
 












                                                                                   
 






















































































                                                                              

                               




                                                        




                                 




                                                        

     
 
<?php

class Pbs_Filter{

  private $db = null;
  private $membership;
  
  public function evaluate()
    {
      $this->db = Zend_Db_Table::getDefaultAdapter();
        $db = $this->db;  
    $debuglevel = 3;
    
    $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']);
        
      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'";
      }
      $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);
    }
}
?>