Revision: 48563
Author:   werdna
Date:     2009-03-19 02:05:58 +0000 (Thu, 19 Mar 2009)

Log Message:
-----------
Load link vars from DB on edit. Includes some tracking of context, so it knows 
whether to check the DB or the parser.

Modified Paths:
--------------
    trunk/extensions/AbuseFilter/AbuseFilter.class.php
    trunk/extensions/AbuseFilter/AbuseFilterVariableHolder.php

Modified: trunk/extensions/AbuseFilter/AbuseFilter.class.php
===================================================================
--- trunk/extensions/AbuseFilter/AbuseFilter.class.php  2009-03-19 01:09:39 UTC 
(rev 48562)
+++ trunk/extensions/AbuseFilter/AbuseFilter.class.php  2009-03-19 02:05:58 UTC 
(rev 48563)
@@ -97,8 +97,8 @@
                        'article_restrictions_edit' => 'restrictions-edit',
                        'article_restrictions_move' => 'restrictions-move',
                        'article_recent_contributors' => 'recent-contributors',
-                       'old_text' => 'old-text-stripped',
-                       'old_html' => 'old-html',
+#                      'old_text' => 'old-text-stripped', ## Disabled, 
performance
+#                      'old_html' => 'old-html', ## Disabled, performance
                        'old_links' => 'old-links',
                        'minor_edit' => 'minor-edit',
                ),
@@ -342,6 +342,8 @@
                } catch (Exception $excep) {
                        // Sigh.
                        $result = false;
+                       
+                       wfDebugLog( 'AbuseFilter', "AbuseFilter parser error: 
".$excep->getMessage()."\n" );
 
                        if (!$ignoreError) {
                                throw $excep;
@@ -506,6 +508,9 @@
                
                // Add vars from extensions
                wfRunHooks( 'AbuseFilter-filterAction', array( &$vars, $title ) 
);
+               
+               // Set context
+               $vars->setVar( 'context', 'filter' );
 
                $dbr = wfGetDB( DB_SLAVE );
 
@@ -1184,12 +1189,14 @@
        public static function getVarsFromRCRow( $row ) {
                if ($row->rc_this_oldid) {
                        // It's an edit.
-                       return self::getEditVarsFromRCRow( $row );
+                       $vars = self::getEditVarsFromRCRow( $row );
                } elseif ( $row->rc_log_type == 'move' ) {
-                       return self::getMoveVarsFromRCRow( $row );
+                       $vars = self::getMoveVarsFromRCRow( $row );
                } elseif ( $row->rc_log_type == 'newusers' ) {
-                       return self::getCreateVarsFromRCRow( $row );
+                       $vars = self::getCreateVarsFromRCRow( $row );
                }
+               $vars->setVar( 'context', 'generated' );
+               return $vars;
        }
 
        public static function getCreateVarsFromRCRow( $row ) {
@@ -1287,7 +1294,7 @@
                                'title' => $title->getText(),
                                'text-var' => 'new_wikitext'
                        ) );
-               $vars->setLazyLoadVar( 'old_links', 
'links-from-wikitext-nonedit',
+               $vars->setLazyLoadVar( 'old_links', 
'links-from-wikitext-or-database',
                        array(
                                'namespace' => $title->getNamespace(),
                                'title' => $title->getText(),

Modified: trunk/extensions/AbuseFilter/AbuseFilterVariableHolder.php
===================================================================
--- trunk/extensions/AbuseFilter/AbuseFilterVariableHolder.php  2009-03-19 
01:09:39 UTC (rev 48562)
+++ trunk/extensions/AbuseFilter/AbuseFilterVariableHolder.php  2009-03-19 
02:05:58 UTC (rev 48563)
@@ -2,6 +2,7 @@
 
 class AbuseFilterVariableHolder {
        var $mVars = array();
+       static $varBlacklist = array( 'context' );
        
        function setVar( $variable, $datum ) {
                $variable = strtolower( $variable );
@@ -49,13 +50,20 @@
                $this->mVars = array_merge( $this->mVars, $addHolder->mVars );
        }
        
+       function __wakeup() {
+               // Reset the context.
+               $this->setVar( 'context', 'stored' );
+       }
+       
        function exportAllVars() {
                $allVarNames = array_keys( $this->mVars );
                $exported = array();
                
                foreach( $allVarNames as $varName ) {
-                       $exported[$varName] = $this->getVar( $varName 
)->toString();
+                       if (!in_array( $varName, self::$varBlacklist ) )
+                               $exported[$varName] = $this->getVar( $varName 
)->toString();
                }
+               
                return $exported;
        }
        
@@ -121,6 +129,21 @@
                return self::$articleCache["$namespace:$title"];
        }
        
+       static function getLinksFromDB( $article ) {
+               // Stolen from ConfirmEdit
+               $id = $article->getId();
+               if (!$id) return array();
+               
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'externallinks', array( 'el_to' ), 
+                       array( 'el_from' => $id ), __METHOD__ );
+               $links = array();
+               while ( $row = $dbr->fetchObject( $res ) ) {
+                       $links[] = $row->el_to;
+               }
+               return $links;
+       }
+       
        function compute( $vars ) {
                $parameters = $this->mParameters;
                $result = null;
@@ -146,7 +169,8 @@
                                $result = implode( "\n", $interest_lines );
                                break;
                        case 'links-from-wikitext':
-                               $article = self::articleFromTitle( 
$parameters['namespace'], $parameters['title'] );
+                               $article = self::articleFromTitle( 
$parameters['namespace'],
+                                                                               
                        $parameters['title'] );
                                $textVar = $parameters['text-var'];
                                
                                $new_text = $vars->getVar( $textVar 
)->toString();
@@ -154,13 +178,22 @@
                                $links = array_keys( 
$editInfo->output->getExternalLinks() );
                                $result = implode( "\n", $links );
                                break;
-                       case 'links-from-wikitext-nonedit':
-                               $article = self::articleFromTitle( 
$parameters['namespace'], $parameters['title'] );
-                               $textVar = $parameters['text-var'];
+                       case 'links-from-wikitext-or-database':
+                               $article = self::articleFromTitle( 
$parameters['namespace'],
+                                                                               
                        $parameters['title'] );
                                
-                               $wikitext = $vars->getVar( $textVar 
)->toString();
-                               $editInfo = $this->parseNonEditWikitext( 
$wikitext, $article );
-                               $links = array_keys( 
$editInfo->output->getExternalLinks() );
+                               if ($vars->getVar( 'context' )->toString() == 
'filter') {
+                                       $links = $this->getLinksFromDB( 
$article );
+                                       wfDebug( "AbuseFilter: loading old 
links from DB\n" );
+                               } else {                                
+                                       wfDebug( "AbuseFilter: loading old 
links from Parser\n" );
+                                       $textVar = $parameters['text-var'];
+                                       
+                                       $wikitext = $vars->getVar( $textVar 
)->toString();
+                                       $editInfo = 
$this->parseNonEditWikitext( $wikitext, $article );
+                                       $links = array_keys( 
$editInfo->output->getExternalLinks() );
+                               }
+                               
                                $result = implode( "\n", $links );
                                break;
                        case 'link-diff-added':



_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to