diff --git a/AbuseFilter.class.php b/AbuseFilter.class.php index ce8752bec..826cde3c5 100644 --- a/AbuseFilter.class.php +++ b/AbuseFilter.class.php @@ -336,14 +336,15 @@ class AbuseFilter { return htmlspecialchars( self::evaluateExpression( $expr ) ); } - public static function checkConditions( $conds, $vars, $ignoreError = true ) { + public static function checkConditions( $conds, $vars, $ignoreError = true, + $keepVars = 'resetvars' ) { global $wgAbuseFilterParserClass; static $parser; wfProfileIn( __METHOD__ ); - if ( is_null($parser) ) { + if ( is_null($parser) || $keepVars == 'resetvars' ) { $parser = new $wgAbuseFilterParserClass; $parser->setVars( $vars ); @@ -388,7 +389,8 @@ class AbuseFilter { // Check conditions... $pattern = trim($row->af_pattern); - if ( self::checkConditions( $pattern, $vars ) ) { + if ( self::checkConditions( $pattern, $vars, true /* ignore errors */, + 'keepvars' ) ) { // Record match. $filter_matched[$row->af_id] = true; } else { diff --git a/AbuseFilter.i18n.php b/AbuseFilter.i18n.php index 7a40dd944..d535d84cf 100644 --- a/AbuseFilter.i18n.php +++ b/AbuseFilter.i18n.php @@ -118,6 +118,7 @@ Filter description: $7 ($8) ($9)', 'abusefilter-tools' => 'Abuse filter tools', 'abusefilter-loglink' => 'View the abuse log', 'abusefilter-return' => 'Return to filter management', + 'abusefilter-status-global' => 'Global', // Options form 'abusefilter-list-options' => 'Options', @@ -204,6 +205,7 @@ Please ask a user with permission to add restricted actions to make the change f 'abusefilter-edit-revert' => 'Revert actions taken by this filter', 'abusefilter-edit-tools' => 'Tools:', 'abusefilter-edit-test-link' => 'Test this filter against recent edits', + 'abusefilter-edit-global' => 'Apply this filter globally', // Filter editing helpers 'abusefilter-edit-builder-select' => 'Select an option to add it at the cursor', diff --git a/AbuseFilter.php b/AbuseFilter.php index ba8bc1ab6..d7d06b1a6 100644 --- a/AbuseFilter.php +++ b/AbuseFilter.php @@ -107,3 +107,8 @@ $wgAbuseFilterRestrictedActions = array( 'block', 'degroup' ); $wgAbuseFilterUDPPrefix = 'abusefilter:'; $wgAbuseFilterUDPAddress = null; $wgAbuseFilterUDPPort = null; + +// Centralised filters +$wgAbuseFilterCentralDB = null; +$wgAbuseFilterIsCentral = false; + diff --git a/Views/AbuseFilterViewEdit.php b/Views/AbuseFilterViewEdit.php index fd885a207..16b8d47d1 100644 --- a/Views/AbuseFilterViewEdit.php +++ b/Views/AbuseFilterViewEdit.php @@ -280,6 +280,10 @@ class AbuseFilterViewEdit extends AbuseFilterView { // Build checkboxen $checkboxes = array( 'hidden', 'enabled', 'deleted' ); $flags = ''; + + global $wgAbuseFilterIsCentral; + if ($wgAbuseFilterIsCentral) + $checkboxes[] = 'global'; if (isset($row->af_throttled) && $row->af_throttled) { global $wgAbuseFilterEmergencyDisableThreshold; @@ -582,6 +586,7 @@ class AbuseFilterViewEdit extends AbuseFilterView { $obj->af_pattern = ''; $obj->af_enabled = 1; $obj->af_hidden = 0; + $obj->af_global = 0; return array( $obj, array() ); } @@ -641,6 +646,8 @@ class AbuseFilterViewEdit extends AbuseFilterView { $row->af_deleted = $wgRequest->getBool( 'wpFilterDeleted' ); $row->af_enabled = $wgRequest->getBool( 'wpFilterEnabled' ) && !$row->af_deleted; $row->af_hidden = $wgRequest->getBool( 'wpFilterHidden' ); + global $wgAbuseFilterIsCentral; + $row->af_global = $wgRequest->getBool( 'wpFilterGlobal' ) && $wgAbuseFilterIsCentral; // Actions global $wgAbuseFilterAvailableActions; diff --git a/Views/AbuseFilterViewList.php b/Views/AbuseFilterViewList.php index 0bf3f7dbb..5fed5f7d7 100644 --- a/Views/AbuseFilterViewList.php +++ b/Views/AbuseFilterViewList.php @@ -153,7 +153,9 @@ class AbuseFilterPager extends TablePager { 'tables' => array('abuse_filter', 'abuse_filter_action'), 'fields' => array( 'af_id', - '(af_enabled | af_deleted << 1) AS status', + 'af_enabled', + 'af_deleted', + 'af_global', 'af_public_comments', 'af_hidden', 'af_hit_count', @@ -220,12 +222,19 @@ class AbuseFilterPager extends TablePager { } return htmlspecialchars( implode( ', ', $displayActions ) ); case 'status': - if ($value & 2) - return wfMsgExt( 'abusefilter-deleted', 'parseinline' ); - elseif ($value & 1) - return wfMsgExt( 'abusefilter-enabled', 'parseinline' ); + $statuses = array(); + if ($row->af_deleted) + $statuses[] = wfMsgExt( 'abusefilter-deleted', 'parseinline' ); + elseif ($row->af_enabled) + $statuses[] = wfMsgExt( 'abusefilter-enabled', 'parseinline' ); else - return wfMsgExt( 'abusefilter-disabled', 'parseinline' ); + $statuses[] = wfMsgExt( 'abusefilter-disabled', 'parseinline' ); + + global $wgAbuseFilterIsCentral; + if ($row->af_global && $wgAbuseFilterIsCentral) + $statuses[] = wfMsgExt( 'abusefilter-status-global', 'parseinline' ); + + return $wgLang->semicolonList( $statuses ); case 'af_hidden': $msg = $value ? 'abusefilter-hidden' : 'abusefilter-unhidden'; return wfMsgExt( $msg, 'parseinline' );