PHPIDS
Current file: /home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Filter/Storage.php
Legend: executed not executed dead code

  Coverage
  Classes Methods Lines
Total
100.00 %100.00%
100.00% 1 / 1
100.00 %100.00%
100.00% 7 / 7
84.96 %84.96%
84.96% 113 / 133
 
IDS_Filter_Storage
100.00 %100.00%
100.00% 1 / 1
100.00 %100.00%
100.00% 7 / 7
84.96 %84.96%
84.96% 113 / 133
 public function __construct(IDS_Init $init)
100.00 %100.00%
100.00% 1 / 1
86.36 %86.36%
86.36% 19 / 22
 public function setFilterSet($filterSet)
100.00 %100.00%
100.00% 1 / 1
100.00 %100.00%
100.00% 4 / 4
 public function getFilterSet()
100.00 %100.00%
100.00% 1 / 1
100.00 %100.00%
100.00% 1 / 1
 public function addFilter(IDS_Filter $filter)
100.00 %100.00%
100.00% 1 / 1
100.00 %100.00%
100.00% 2 / 2
 private function _isCached()
100.00 %100.00%
100.00% 1 / 1
100.00 %100.00%
100.00% 7 / 7
 public function getFilterFromXML()
100.00 %100.00%
100.00% 1 / 1
89.80 %89.80%
89.80% 44 / 49
 public function getFilterFromJson()
100.00 %100.00%
100.00% 1 / 1
75.00 %75.00%
75.00% 36 / 48


       1                 : <?php                                                                          
       2                 :                                                                                
       3                 : /**                                                                            
       4                 :  * PHPIDS                                                                      
       5                 :  *                                                                             
       6                 :  * Requirements: PHP5, SimpleXML                                               
       7                 :  *                                                                             
       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                        
       9                 :  *                                                                             
      10                 :  * PHPIDS is free software; you can redistribute it and/or modify              
      11                 :  * it under the terms of the GNU Lesser General Public License as published by 
      12                 :  * the Free Software Foundation, version 3 of the License, or                  
      13                 :  * (at your option) any later version.                                         
      14                 :  *                                                                             
      15                 :  * PHPIDS is distributed in the hope that it will be useful,                   
      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of              
      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                
      18                 :  * GNU Lesser General Public License for more details.                         
      19                 :  *                                                                             
      20                 :  * You should have received a copy of the GNU Lesser General Public License    
      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.              
      22                 :  *                                                                             
      23                 :  * PHP version 5.1.6+                                                          
      24                 :  *                                                                             
      25                 :  * @category Security                                                          
      26                 :  * @package  PHPIDS                                                            
      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                       
      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                             
      29                 :  * @author   Lars Strojny <lars@strojny.net>                                   
      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                        
      31                 :  * @link     http://php-ids.org/                                               
      32                 :  */                                                                            
      33                 :                                                                                
      34                 : /**                                                                            
      35                 :  * Filter Storage                                                              
      36                 :  *                                                                             
      37                 :  * This class provides various default functions for gathering filter patterns 
      38                 :  * to be used later on by the detection mechanism. You might extend this class 
      39                 :  * to your requirements.                                                       
      40                 :  *                                                                             
      41                 :  * @category  Security                                                         
      42                 :  * @package   PHPIDS                                                           
      43                 :  * @author    Christian Matthies <ch0012@gmail.com>                            
      44                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                      
      45                 :  * @author    Lars Strojny <lars@strojny.net>                                  
      46                 :  * @copyright 2007 The PHPIDS Group                                            
      47                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                       
      48                 :  * @version   Release: $Id:Storage.php 517 2007-09-15 15:04:13Z mario $        
      49                 :  * @link      http://php-ids.org/                                              
      50                 :  */                                                                            
      51                 : class IDS_Filter_Storage                                                       
      52                 : {                                                                              
      53                 :                                                                                
      54                 :     /**                                                                        
      55                 :      * Filter source file                                                      
      56                 :      *                                                                         
      57                 :      * @var string                                                             
      58                 :      */                                                                        
      59                 :     protected $source = null;                                                  
      60                 :                                                                                
      61                 :     /**                                                                        
      62                 :      * Holds caching settings                                                  
      63                 :      *                                                                         
      64                 :      * @var array                                                              
      65                 :      */                                                                        
      66                 :     protected $cacheSettings = null;                                           
      67                 :                                                                                
      68                 :     /**                                                                        
      69                 :      * Cache container                                                         
      70                 :      *                                                                         
      71                 :      * @var object IDS_Caching wrapper                                         
      72                 :      */                                                                        
      73                 :     protected $cache = null;                                                   
      74                 :                                                                                
      75                 :     /**                                                                        
      76                 :      * Filter container                                                        
      77                 :      *                                                                         
      78                 :      * @var array                                                              
      79                 :      */                                                                        
      80                 :     protected $filterSet = array();                                            
      81                 :                                                                                
      82                 :     /**                                                                        
      83                 :      * Constructor                                                             
      84                 :      *                                                                         
      85                 :      * Loads filters based on provided IDS_Init settings.                      
      86                 :      *                                                                         
      87                 :      * @param object $init IDS_Init instance                                   
      88                 :      *                                                                         
      89                 :      * @throws Exception if unsupported filter type is given                   
      90                 :      * @return void                                                            
      91                 :      */                                                                        
      92                 :     public final function __construct(IDS_Init $init)                          
      93                 :     {                                                                          
      94              42 :         if ($init->config) {                                                   
      95                 :                                                                                
      96              42 :             $caching = isset($init->config['Caching']['caching']) ?            
      97              42 :                 $init->config['Caching']['caching'] : 'none';                  
      98                 :                                                                                
      99              42 :             $type         = $init->config['General']['filter_type'];           
     100              42 :             $this->source = $init->getBasePath()                               
     101              42 :                 . $init->config['General']['filter_path'];                     
     102                 :                                                                                
     103              42 :             if ($caching && $caching != 'none') {                              
     104              42 :                 $this->cacheSettings = $init->config['Caching'];               
     105              42 :                 include_once 'IDS/Caching/Factory.php';                        
     106              42 :                 $this->cache = IDS_Caching::factory($init, 'storage');         
     107              42 :             }                                                                  
     108                 :                                                                                
     109                 :             switch ($type) {                                                   
     110              42 :             case 'xml' :                                                       
     111              41 :                 $this->getFilterFromXML();                                     
     112              41 :                 break;                                                         
     113               1 :             case 'json' :                                                      
     114               1 :                 $this->getFilterFromJson();                                    
     115               1 :                 break;                                                         
     116               0 :             default :                                                          
     117               0 :                 throw new Exception('Unsupported filter type.');               
     118               0 :             }                                                                  
     119              42 :         }                                                                      
     120              42 :     }                                                                          
     121                 :                                                                                
     122                 :     /**                                                                        
     123                 :      * Sets the filter array                                                   
     124                 :      *                                                                         
     125                 :      * @param array $filterSet array containing multiple IDS_Filter instances  
     126                 :      *                                                                         
     127                 :      * @return object $this                                                    
     128                 :      */                                                                        
     129                 :     public final function setFilterSet($filterSet)                             
     130                 :     {                                                                          
     131               1 :         foreach ($filterSet as $filter) {                                      
     132               1 :             $this->addFilter($filter);                                         
     133               1 :         }                                                                      
     134                 :                                                                                
     135               1 :         return $this;                                                          
     136                 :     }                                                                          
     137                 :                                                                                
     138                 :     /**                                                                        
     139                 :      * Returns registered filters                                              
     140                 :      *                                                                         
     141                 :      * @return array                                                           
     142                 :      */                                                                        
     143                 :     public final function getFilterSet()                                       
     144                 :     {                                                                          
     145              35 :         return $this->filterSet;                                               
     146                 :     }                                                                          
     147                 :                                                                                
     148                 :     /**                                                                        
     149                 :      * Adds a filter                                                           
     150                 :      *                                                                         
     151                 :      * @param object $filter IDS_Filter instance                               
     152                 :      *                                                                         
     153                 :      * @return object $this                                                    
     154                 :      */                                                                        
     155                 :     public final function addFilter(IDS_Filter $filter)                        
     156                 :     {                                                                          
     157              42 :         $this->filterSet[] = $filter;                                          
     158              42 :         return $this;                                                          
     159                 :     }                                                                          
     160                 :                                                                                
     161                 :     /**                                                                        
     162                 :      * Checks if any filters are cached                                        
     163                 :      *                                                                         
     164                 :      * @return mixed $filters cached filters or false                          
     165                 :      */                                                                        
     166                 :     private function _isCached()                                               
     167                 :     {                                                                          
     168              42 :         $filters = false;                                                      
     169                 :                                                                                
     170              42 :         if ($this->cacheSettings) {                                            
     171                 :                                                                                
     172              42 :             if ($this->cache) {                                                
     173              42 :                 $filters = $this->cache->getCache();                           
     174              42 :             }                                                                  
     175              42 :         }                                                                      
     176                 :                                                                                
     177              42 :         return $filters;                                                       
     178                 :     }                                                                          
     179                 :                                                                                
     180                 :     /**                                                                        
     181                 :      * Loads filters from XML using SimpleXML                                  
     182                 :      *                                                                         
     183                 :      * This function parses the provided source file and stores the result.    
     184                 :      * If caching mode is enabled the result will be cached to increase        
     185                 :      * the performance.                                                        
     186                 :      *                                                                         
     187                 :      * @throws Exception if problems with fetching the XML data occur          
     188                 :      * @return object $this                                                    
     189                 :      */                                                                        
     190                 :     public function getFilterFromXML()                                         
     191                 :     {                                                                          
     192                 :                                                                                
     193              41 :         if (extension_loaded('SimpleXML')) {                                   
     194                 :                                                                                
     195                 :             /*                                                                 
     196                 :              * See if filters are already available in the cache               
     197                 :              */                                                                
     198              41 :             $filters = $this->_isCached();                                     
     199                 :                                                                                
     200                 :             /*                                                                 
     201                 :              * If they aren't, parse the source file                           
     202                 :              */                                                                
     203              41 :             if (!$filters) {                                                   
     204               1 :                 if (file_exists($this->source)) {                              
     205               1 :                     if (LIBXML_VERSION >= 20621) {                             
     206               1 :                         $filters = simplexml_load_file($this->source,          
     207               1 :                                                        null,                   
     208               1 :                                                        LIBXML_COMPACT);        
     209               1 :                     } else {                                                   
     210               0 :                         $filters = simplexml_load_file($this->source);         
     211                 :                     }                                                          
     212               1 :                 }                                                              
     213               1 :             }                                                                  
     214                 :                                                                                
     215                 :             /*                                                                 
     216                 :              * In case we still don't have any filters loaded and exception    
     217                 :              * will be thrown                                                  
     218                 :              */                                                                
     219              41 :             if (empty($filters)) {                                             
     220               0 :                 throw new Exception(                                           
     221                 :                     'XML data could not be loaded.' .                          
     222                 :                         ' Make sure you specified the correct path.'           
     223               0 :                 );                                                             
     224                 :             }                                                                  
     225                 :                                                                                
     226                 :             /*                                                                 
     227                 :              * Now the storage will be filled with IDS_Filter objects          
     228                 :              */                                                                
     229              41 :             $data    = array();                                                
     230              41 :             $nocache = $filters instanceof SimpleXMLElement;                   
     231              41 :             $filters = $nocache ? $filters->filter : $filters;                 
     232                 :                                                                                
     233              41 :             include_once 'IDS/Filter.php';                                     
     234                 :                                                                                
     235              41 :             foreach ($filters as $filter) {                                    
     236                 :                                                                                
     237              41 :                 $id          = $nocache ? (string) $filter->id :               
     238              41 :                     $filter['id'];                                             
     239              41 :                 $rule        = $nocache ? (string) $filter->rule :             
     240              41 :                     $filter['rule'];                                           
     241              41 :                 $impact      = $nocache ? (string) $filter->impact :           
     242              41 :                     $filter['impact'];                                         
     243              41 :                 $tags        = $nocache ? array_values((array) $filter->tags) :
     244              41 :                     $filter['tags'];                                           
     245              41 :                 $description = $nocache ? (string) $filter->description :      
     246              41 :                     $filter['description'];                                    
     247                 :                                                                                
     248              41 :                 $this->addFilter(new IDS_Filter($id,                           
     249              41 :                                                 $rule,                         
     250              41 :                                                 $description,                  
     251              41 :                                                 (array) $tags[0],              
     252              41 :                                                 (int) $impact));               
     253                 :                                                                                
     254              41 :                 $data[] = array(                                               
     255              41 :                     'id'          => $id,                                      
     256              41 :                     'rule'        => $rule,                                    
     257              41 :                     'impact'      => $impact,                                  
     258              41 :                     'tags'        => $tags,                                    
     259                 :                     'description' => $description                              
     260              41 :                 );                                                             
     261              41 :             }                                                                  
     262                 :                                                                                
     263                 :             /*                                                                 
     264                 :              * If caching is enabled, the fetched data will be cached          
     265                 :              */                                                                
     266              41 :             if ($this->cacheSettings) {                                        
     267                 :                                                                                
     268              41 :                 $this->cache->setCache($data);                                 
     269              41 :             }                                                                  
     270                 :                                                                                
     271              41 :         } else {                                                               
     272               0 :             throw new Exception(                                               
     273                 :                 'SimpleXML not loaded.'                                        
     274               0 :             );                                                                 
     275                 :         }                                                                      
     276                 :                                                                                
     277              41 :         return $this;                                                          
     278                 :     }                                                                          
     279                 :                                                                                
     280                 :     /**                                                                        
     281                 :      * Loads filters from Json file using ext/Json                             
     282                 :      *                                                                         
     283                 :      * This function parses the provided source file and stores the result.    
     284                 :      * If caching mode is enabled the result will be cached to increase        
     285                 :      * the performance.                                                        
     286                 :      *                                                                         
     287                 :      * @throws Exception if problems with fetching the JSON data occur         
     288                 :      * @return object $this                                                    
     289                 :      */                                                                        
     290                 :     public function getFilterFromJson()                                        
     291                 :     {                                                                          
     292                 :                                                                                
     293               1 :         if (extension_loaded('Json')) {                                        
     294                 :                                                                                
     295                 :             /*                                                                 
     296                 :              * See if filters are already available in the cache               
     297                 :              */                                                                
     298               1 :             $filters = $this->_isCached();                                     
     299                 :                                                                                
     300                 :             /*                                                                 
     301                 :              * If they aren't, parse the source file                           
     302                 :              */                                                                
     303               1 :             if (!$filters) {                                                   
     304               0 :                 if (file_exists($this->source)) {                              
     305               0 :                     @set_magic_quotes_runtime(0);                              
     306               0 :                     $content = file_get_contents($this->source);               
     307               0 :                     $filters = json_decode($content);                          
     308               0 :                 } else {                                                       
     309               0 :                     throw new Exception(                                       
     310                 :                         'JSON data could not be loaded.' .                     
     311                 :                             ' Make sure you specified the correct path.'       
     312               0 :                     );                                                         
     313                 :                 }                                                              
     314               0 :             }                                                                  
     315                 :                                                                                
     316               1 :             if (!$filters) {                                                   
     317               0 :                 throw new Exception(                                           
     318                 :                     'JSON data could not be loaded.' .                         
     319                 :                         ' Make sure you specified the correct path.'           
     320               0 :                 );                                                             
     321                 :             }                                                                  
     322                 :                                                                                
     323                 :             /*                                                                 
     324                 :              * Now the storage will be filled with IDS_Filter objects          
     325                 :              */                                                                
     326               1 :             $data    = array();                                                
     327               1 :             $nocache = !is_array($filters);                                    
     328               1 :             $filters = $nocache ? $filters->filters->filter : $filters;        
     329                 :                                                                                
     330               1 :             include_once 'IDS/Filter.php';                                     
     331                 :                                                                                
     332               1 :             foreach ($filters as $filter) {                                    
     333                 :                                                                                
     334               1 :                 $id          = $nocache ? (string) $filter->id :               
     335               1 :                     $filter['id'];                                             
     336               1 :                 $rule        = $nocache ? (string) $filter->rule :             
     337               1 :                     $filter['rule'];                                           
     338               1 :                 $impact      = $nocache ? (string) $filter->impact :           
     339               1 :                     $filter['impact'];                                         
     340               1 :                 $tags        = $nocache ? array_values((array) $filter->tags) :
     341               1 :                     $filter['tags'];                                           
     342               1 :                 $description = $nocache ? (string) $filter->description :      
     343               1 :                     $filter['description'];                                    
     344                 :                                                                                
     345               1 :                 $this->addFilter(new IDS_Filter($id,                           
     346               1 :                                                 $rule,                         
     347               1 :                                                 $description,                  
     348               1 :                                                 (array) $tags[0],              
     349               1 :                                                 (int) $impact));               
     350                 :                                                                                
     351               1 :                 $data[] = array(                                               
     352               1 :                     'id'          => $id,                                      
     353               1 :                     'rule'        => $rule,                                    
     354               1 :                     'impact'      => $impact,                                  
     355               1 :                     'tags'        => $tags,                                    
     356                 :                     'description' => $description                              
     357               1 :                 );                                                             
     358               1 :             }                                                                  
     359                 :                                                                                
     360                 :             /*                                                                 
     361                 :              * If caching is enabled, the fetched data will be cached          
     362                 :              */                                                                
     363               1 :             if ($this->cacheSettings) {                                        
     364               1 :                 $this->cache->setCache($data);                                 
     365               1 :             }                                                                  
     366                 :                                                                                
     367               1 :         } else {                                                               
     368               0 :             throw new Exception(                                               
     369                 :                 'ext/json not loaded.'                                         
     370               0 :             );                                                                 
     371                 :         }                                                                      
     372                 :                                                                                
     373               1 :         return $this;                                                          
     374                 :     }                                                                          
     375                 : }                                                                              
     376                 :                                                                                
     377                 : /*                                                                             
     378                 :  * Local variables:                                                            
     379                 :  * tab-width: 4                                                                
     380                 :  * c-basic-offset: 4                                                           
     381                 :  * End:                                                                        
     382                 :  */                                                                            

Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.