summaryrefslogblamecommitdiffstats
path: root/library/Pbs/Filter.php
blob: d1b33d7cdd39dcaac82da698215585254161f19a (plain) (tree)
1
     
























































                                                                                                           


                                                    
















































































































































































































































































































































                                                                                           


                                             
                                                   

























                                                           
     

                                         
 




                                                 
     

                                         
 
  
<?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);
  }
}
?>