mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/AbuseFilter.git
synced 2024-11-13 17:27:20 +00:00
1973ea6714
* Update rules list view to show global rules toggle, global rules * Update rule processing to get global rules from memcache, if no rule exists, get them from the central database and store them in memcache * Delete global rule key whenever global rules are updated * Add filtering for log by wiki on the central database, updated table definitions to add index on afl_wiki * Add global $wgAbuseFilterDisallowGlobalLocalBlocks so local wikis can prevent global rules from locally blocking, removing or revoking permissions. * patchset 13: Include recommendations from Tim. Add db updates to LoadExtensionSchemaUpdates hook. * patchset 14: forgot to add new files Change-Id: Id69a9d603f9679f838e8691c651a3e9d8461b422
186 lines
8 KiB
PHP
186 lines
8 KiB
PHP
<?php
|
||
if ( !defined( 'MEDIAWIKI' ) ) {
|
||
die();
|
||
}
|
||
|
||
/**
|
||
* Automatically applies heuristics to edits.
|
||
*
|
||
* @file
|
||
* @ingroup Extensions
|
||
* @author Andrew Garrett <andrew@epstone.net>
|
||
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
|
||
* Includes GFDL-licensed images retrieved from http://commons.wikimedia.org/wiki/File:Yes_check.svg
|
||
* and http://commons.wikimedia.org/wiki/File:Red_x.svg -- both have been downsampled and converted to PNG.
|
||
* @link http://www.mediawiki.org/wiki/Extension:AbuseFilter Documentation
|
||
*/
|
||
|
||
$wgExtensionCredits['antispam'][] = array(
|
||
'path' => __FILE__,
|
||
'name' => 'Abuse Filter',
|
||
'author' => array( 'Andrew Garrett', 'River Tarnell', 'Victor Vasiliev' ),
|
||
'descriptionmsg' => 'abusefilter-desc',
|
||
'url' => 'https://www.mediawiki.org/wiki/Extension:AbuseFilter',
|
||
);
|
||
|
||
$dir = dirname( __FILE__ );
|
||
$wgExtensionMessagesFiles['AbuseFilter'] = "$dir/AbuseFilter.i18n.php";
|
||
$wgExtensionMessagesFiles['AbuseFilterAliases'] = "$dir/AbuseFilter.alias.php";
|
||
|
||
$wgAutoloadClasses['AbuseFilter'] = "$dir/AbuseFilter.class.php";
|
||
$wgAutoloadClasses['AbuseFilterParser'] = "$dir/AbuseFilter.parser.php";
|
||
$wgAutoloadClasses['AbuseFilterHooks'] = "$dir/AbuseFilter.hooks.php";
|
||
$wgAutoloadClasses['SpecialAbuseLog'] = "$dir/special/SpecialAbuseLog.php";
|
||
$wgAutoloadClasses['SpecialAbuseFilter'] = "$dir/special/SpecialAbuseFilter.php";
|
||
$wgAutoloadClasses['AbuseLogHitFormatter'] = "$dir/AbuseLogHitFormatter.php";
|
||
|
||
$wgAutoloadClasses['AbuseFilterViewList'] = "$dir/Views/AbuseFilterViewList.php";
|
||
$wgAutoloadClasses['AbuseFilterView'] = "$dir/Views/AbuseFilterView.php";
|
||
$wgAutoloadClasses['AbuseFilterViewEdit'] = "$dir/Views/AbuseFilterViewEdit.php";
|
||
$wgAutoloadClasses['AbuseFilterViewTools'] = "$dir/Views/AbuseFilterViewTools.php";
|
||
$wgAutoloadClasses['AbuseFilterViewHistory'] = "$dir/Views/AbuseFilterViewHistory.php";
|
||
$wgAutoloadClasses['AbuseFilterViewRevert'] = "$dir/Views/AbuseFilterViewRevert.php";
|
||
$wgAutoloadClasses['AbuseFilterViewTestBatch'] = "$dir/Views/AbuseFilterViewTestBatch.php";
|
||
$wgAutoloadClasses['AbuseFilterViewExamine'] = "$dir/Views/AbuseFilterViewExamine.php";
|
||
$wgAutoloadClasses['AbuseFilterChangesList'] = "$dir/Views/AbuseFilterViewExamine.php";
|
||
$wgAutoloadClasses['AbuseFilterViewDiff'] = "$dir/Views/AbuseFilterViewDiff.php";
|
||
$wgAutoloadClasses['AbuseFilterViewImport'] = "$dir/Views/AbuseFilterViewImport.php";
|
||
|
||
$wgAutoloadClasses['AbuseFilterVariableHolder'] = "$dir/AbuseFilterVariableHolder.php";
|
||
$wgAutoloadClasses['AFComputedVariable'] = "$dir/AbuseFilterVariableHolder.php";
|
||
$wgAutoloadClasses['AFPData'] = "$dir/AbuseFilter.parser.php";
|
||
|
||
$wgSpecialPages['AbuseLog'] = 'SpecialAbuseLog';
|
||
$wgSpecialPages['AbuseFilter'] = 'SpecialAbuseFilter';
|
||
$wgSpecialPageGroups['AbuseLog'] = 'changes';
|
||
$wgSpecialPageGroups['AbuseFilter'] = 'wiki';
|
||
|
||
$wgAutoloadClasses['ApiQueryAbuseLog'] = "$dir/api/ApiQueryAbuseLog.php";
|
||
$wgAPIListModules['abuselog'] = 'ApiQueryAbuseLog';
|
||
$wgAutoloadClasses['ApiQueryAbuseFilters'] = "$dir/api/ApiQueryAbuseFilters.php";
|
||
$wgAPIListModules['abusefilters'] = 'ApiQueryAbuseFilters';
|
||
$wgAutoloadClasses['ApiAbuseFilterCheckSyntax'] = "$dir/api/ApiAbuseFilterCheckSyntax.php";
|
||
$wgAPIModules['abusefilterchecksyntax'] = 'ApiAbuseFilterCheckSyntax';
|
||
$wgAutoloadClasses['ApiAbuseFilterEvalExpression'] = "$dir/api/ApiAbuseFilterEvalExpression.php";
|
||
$wgAPIModules['abusefilterevalexpression'] = 'ApiAbuseFilterEvalExpression';
|
||
$wgAutoloadClasses['ApiAbuseFilterUnblockAutopromote'] = "$dir/api/ApiAbuseFilterUnblockAutopromote.php";
|
||
$wgAPIModules['abusefilterunblockautopromote'] = 'ApiAbuseFilterUnblockAutopromote';
|
||
$wgAutoloadClasses['ApiAbuseFilterCheckMatch'] = "$dir/api/ApiAbuseFilterCheckMatch.php";
|
||
$wgAPIModules['abusefiltercheckmatch'] = 'ApiAbuseFilterCheckMatch';
|
||
|
||
$wgHooks['EditFilterMerged'][] = 'AbuseFilterHooks::onEditFilterMerged';
|
||
$wgHooks['GetAutoPromoteGroups'][] = 'AbuseFilterHooks::onGetAutoPromoteGroups';
|
||
$wgHooks['AbortMove'][] = 'AbuseFilterHooks::onAbortMove';
|
||
$wgHooks['AbortNewAccount'][] = 'AbuseFilterHooks::onAbortNewAccount';
|
||
$wgHooks['ArticleDelete'][] = 'AbuseFilterHooks::onArticleDelete';
|
||
$wgHooks['RecentChange_save'][] = 'AbuseFilterHooks::onRecentChangeSave';
|
||
$wgHooks['ListDefinedTags'][] = 'AbuseFilterHooks::onListDefinedTags';
|
||
$wgHooks['LoadExtensionSchemaUpdates'][] = 'AbuseFilterHooks::onLoadExtensionSchemaUpdates';
|
||
$wgHooks['ContributionsToolLinks'][] = 'AbuseFilterHooks::onContributionsToolLinks';
|
||
$wgHooks['UploadVerification'][] = 'AbuseFilterHooks::onUploadVerification';
|
||
$wgHooks['MakeGlobalVariablesScript'][] = 'AbuseFilterHooks::onMakeGlobalVariablesScript';
|
||
$wgHooks['ArticleSaveComplete'][] = 'AbuseFilterHooks::onArticleSaveComplete';
|
||
|
||
$wgAvailableRights[] = 'abusefilter-modify';
|
||
$wgAvailableRights[] = 'abusefilter-log-detail';
|
||
$wgAvailableRights[] = 'abusefilter-view';
|
||
$wgAvailableRights[] = 'abusefilter-log';
|
||
$wgAvailableRights[] = 'abusefilter-private';
|
||
$wgAvailableRights[] = 'abusefilter-modify-restricted';
|
||
$wgAvailableRights[] = 'abusefilter-revert';
|
||
$wgAvailableRights[] = 'abusefilter-view-private';
|
||
$wgAvailableRights[] = 'abusefilter-log-private';
|
||
$wgAvailableRights[] = 'abusefilter-hidden-log';
|
||
$wgAvailableRights[] = 'abusefilter-hide-log';
|
||
|
||
$wgLogTypes[] = 'abusefilter';
|
||
$wgLogNames['abusefilter'] = 'abusefilter-log-name';
|
||
$wgLogHeaders['abusefilter'] = 'abusefilter-log-header';
|
||
$wgLogActionsHandlers['abusefilter/modify'] = array( 'AbuseFilter', 'modifyActionText' );
|
||
$wgLogActionsHandlers['abusefilter/hit'] = 'AbuseLogHitFormatter';
|
||
$wgLogActions['suppress/hide-afl'] = 'abusefilter-logentry-suppress';
|
||
$wgLogActions['suppress/unhide-afl'] = 'abusefilter-logentry-unsuppress';
|
||
|
||
$commonModuleInfo = array(
|
||
'localBasePath' => dirname( __FILE__ ) . '/modules',
|
||
'remoteExtPath' => 'AbuseFilter/modules',
|
||
);
|
||
|
||
$wgResourceModules['ext.abuseFilter'] = array(
|
||
'styles' => 'ext.abuseFilter.css',
|
||
) + $commonModuleInfo;
|
||
|
||
$wgResourceModules['ext.abuseFilter.edit'] = array(
|
||
'scripts' => 'ext.abuseFilter.edit.js',
|
||
'messages' => array(
|
||
'abusefilter-edit-syntaxok',
|
||
'abusefilter-edit-syntaxerr',
|
||
'unknown-error',
|
||
),
|
||
'dependencies' => array(
|
||
'jquery.textSelection',
|
||
'jquery.spinner',
|
||
),
|
||
) + $commonModuleInfo;
|
||
|
||
$wgResourceModules['ext.abuseFilter.tools'] = array(
|
||
'scripts' => 'ext.abuseFilter.tools.js',
|
||
'messages' => array(
|
||
'abusefilter-reautoconfirm-notallowed',
|
||
'abusefilter-reautoconfirm-none',
|
||
'abusefilter-reautoconfirm-done',
|
||
),
|
||
'dependencies' => array(
|
||
'jquery.spinner'
|
||
),
|
||
) + $commonModuleInfo;
|
||
|
||
$wgResourceModules['ext.abuseFilter.examine'] = array(
|
||
'scripts' => 'ext.abuseFilter.examine.js',
|
||
'messages' => array(
|
||
'abusefilter-examine-match',
|
||
'abusefilter-examine-nomatch',
|
||
'abusefilter-examine-syntaxerror',
|
||
'abusefilter-examine-notfound',
|
||
),
|
||
) + $commonModuleInfo;
|
||
|
||
$wgAbuseFilterAvailableActions = array( 'flag', 'throttle', 'warn', 'disallow', 'blockautopromote', 'block', 'degroup', 'tag' );
|
||
|
||
$wgAbuseFilterConditionLimit = 1000;
|
||
|
||
// Disable filters if they match more than X edits, constituting more than Y% of the last Z edits, if they have been changed in the last S seconds
|
||
$wgAbuseFilterEmergencyDisableThreshold = 0.05;
|
||
$wgAbuseFilterEmergencyDisableCount = 2;
|
||
$wgAbuseFilterEmergencyDisableAge = 86400; // One day.
|
||
|
||
// Abuse filter parser class
|
||
$wgAbuseFilterParserClass = 'AbuseFilterParser';
|
||
|
||
$wgAbuseFilterRestrictedActions = array( 'block', 'degroup' );
|
||
|
||
// Abuse filter hit notification (available options: rc, udp, rcandudp)
|
||
$wgAbuseFilterNotifications = false;
|
||
|
||
// Centralised filters
|
||
$wgAbuseFilterCentralDB = null;
|
||
$wgAbuseFilterIsCentral = false;
|
||
|
||
// Disallow Centralised filters from taking actions that locally
|
||
// block, remove from groups, or revoke permissions
|
||
$wgAbuseFilterDisallowGlobalLocalBlocks = false;
|
||
|
||
// Block duration
|
||
$wgAbuseFilterBlockDuration = 'indefinite';
|
||
|
||
// Callback functions for custom actions
|
||
$wgAbuseFilterCustomActionsHandlers = array();
|
||
|
||
// Valid "filter groups" – used for applying edit filters to certain types of actions
|
||
$wgAbuseFilterValidGroups = array('default');
|
||
|
||
// Default warning messages, per filter group
|
||
$wgAbuseFilterDefaultWarningMessage = array(
|
||
'default' => 'abusefilter-warning',
|
||
);
|