[pLog-svn] r6088 - plog/branches/lifetype-1.2/class/security

mark at devel.lifetype.net mark at devel.lifetype.net
Thu Nov 29 00:52:47 EST 2007


Author: mark
Date: 2007-11-29 00:52:47 -0500 (Thu, 29 Nov 2007)
New Revision: 6088

Modified:
   plog/branches/lifetype-1.2/class/security/pipeline.class.php
Log:
Fixed a the famous "pipeline run twice" bug http://bugs.lifetype.net/view.php?id=616 .

I change the strategy of filters process. I only run the un-executed filters in 2nd for-loop.

Modified: plog/branches/lifetype-1.2/class/security/pipeline.class.php
===================================================================
--- plog/branches/lifetype-1.2/class/security/pipeline.class.php	2007-11-28 20:30:55 UTC (rev 6087)
+++ plog/branches/lifetype-1.2/class/security/pipeline.class.php	2007-11-29 05:52:47 UTC (rev 6088)
@@ -3,19 +3,19 @@
     /**
      * \defgroup Security
      *
-     * The Security module provides a basic implementation of a generic Pipeline to which we can 
+     * The Security module provides a basic implementation of a generic Pipeline to which we can
      * register "filters", which wil carry out specific actions. Any of the filters can interrupt the
      * processing, depending on the logic of the filter. Please see the Pipeline class for more information.
      */
 
 
-    
+
     lt_include( PLOG_CLASS_PATH."class/config/config.class.php" );
-    
+
     /**
      * global array used to hold the list of filters that we're going to use in the pipeline.
      * Now again, more than ever, wish that PHP4 had support for static attributes at the class
-     * level... 
+     * level...
      */
     $_pLogPipelineRegisteredFilters = array();
 
@@ -35,7 +35,7 @@
      * The out of the box implementation of the Pipeline comes with a null filter (a filter that does nothing -- go figure :))
      * and a filter that implements a Bayesian filter for advanced spam protection. See the BayesianFilter class for more information.
      */
-    class Pipeline  
+    class Pipeline
     {
 
         /**
@@ -49,7 +49,7 @@
          * that is currently processing the incoming request
          */
         var $_blogInfo;
-        
+
         /**
          * variable to hold the final result of executing the pipeline
          */
@@ -64,14 +64,14 @@
          */
         function Pipeline( $httpRequest, $blogInfo = null )
         {
-            
 
+
             $this->_httpRequest = $httpRequest;
             $this->_blogInfo    = $blogInfo;
-            
+
             $this->_registerDefaultFilters();;
         }
-        
+
         /**
          * Method that takes care of registering the default filters used in the pipeline.
          *
@@ -88,10 +88,10 @@
             $this->registerFilter( "NullPipelineFilter" );
             $this->registerFilter( "CommentFilter" );
             $this->registerFilter( "BayesianFilter" );
-            
+
             return true;
         }
-        
+
         /**
          * Static method that registers a filter externally
          *
@@ -102,11 +102,11 @@
         function registerFilter( $filterClass )
         {
             global $_pLogPipelineRegisteredFilters;
-            
+
             if( !is_array($_pLogPipelineRegisteredFilters))     // make sure that we have an array...
                 $_pLogPipelineRegisteredFilters = Array();
-                
-            $_pLogPipelineRegisteredFilters["$filterClass"] =  $filterClass;
+
+            $_pLogPipelineRegisteredFilters["$filterClass"] = false;
         }
 
         /**
@@ -117,8 +117,8 @@
         {
             lt_include( PLOG_CLASS_PATH . 'class/security/pipelinerequest.class.php' );
             lt_include( PLOG_CLASS_PATH . 'class/security/pipelineresult.class.php' );
-            global $_pLogPipelineRegisteredFilters;        
-        
+            global $_pLogPipelineRegisteredFilters;
+
             // check if the pipeline is enabled
             $config =& Config::getConfig();
             if( $config->getValue( "security_pipeline_enabled" ) == false ) {
@@ -130,41 +130,48 @@
             $this->_result = new PipelineResult( true );
 
             // if enabled, then check all the filters
-            foreach( $_pLogPipelineRegisteredFilters as $filterClass ) {
+            foreach( $_pLogPipelineRegisteredFilters as $filterClass => $executed ) {
                 // create an instance of the filter
                 $pipelineRequest = new PipelineRequest( $this->_httpRequest, $this->_blogInfo );
                 $filter = new $filterClass( $pipelineRequest );
-                // and execute it...            
+                // and execute it...
                 $result = $filter->filter();
+				// and cahge the executed flag to ture
+				$_pLogPipelineRegisteredFilters["$filterClass"] = true;
                 // if there was an error, we better say so now
                 // and quite, making sure that we're keeping the
                 // error code
-                 
+
                 // Save off the result
 				$this->_result = $result;
-                    
-                if( !$result->isValid()) { 
+
+                if( !$result->isValid()) {
                     // break out of this loop
                     break;
                 }
             }
-    
+
             // If one of the filters returns that this was not a valid result
             if ( !$this->_result->isValid() ) {
-                // Now rerun through all of the filters so they can clean up 
+                // Now rerun through all of the filters so they can clean up
                 // if they have saved anything persistantly
-                // This also gives filters a chance to do anything else they 
+                // This also gives filters a chance to do anything else they
                 // want to do (i.e. report ip address to dns blacklist)
-    
-                foreach( $_pLogPipelineRegisteredFilters as $filterClass ) {
-                    // create an instance of the filter
-                    $pipelineRequest = new PipelineRequest( $this->_httpRequest, 
-                                                            $this->_blogInfo, 
-                                                            true );
-                    $filter = new $filterClass( $pipelineRequest );
-                    // and execute it...            
-                    $result = $filter->filter();
-                    // if there was an error, we want to keep going
+
+                foreach( $_pLogPipelineRegisteredFilters as $filterClass => $executed ) {
+                    // We just need to run the unexecuted filters
+                    if( !$executed ) {
+                        // create an instance of the filter
+                        $pipelineRequest = new PipelineRequest( $this->_httpRequest,
+                                                                $this->_blogInfo,
+                                                                true );
+                        $filter = new $filterClass( $pipelineRequest );
+                        // and execute it...
+                        $result = $filter->filter();
+        				// and cahge the executed flag to ture
+        				$_pLogPipelineRegisteredFilters["$filterClass"] = true;
+                        // if there was an error, we want to keep going
+                    }
                 }
             }
 



More information about the pLog-svn mailing list