mediawiki-extensions-AbuseF.../includes/Hooks/AbuseFilterHookRunner.php
Daimona Eaytoy 4c06dd52c8 Replace $wgAbuseFilterRestrictions with more specific variables
So that sysadmins can further customize the extension. It was also wrong
to use the same variable for many different things.

Note that there's no associated patch in wmf-config because we use the
defaults. However, before merging this patch, please recheck that
AbuseFilterRestrictions and AbuseFilterDisallowGlobalLocalBlocks aren't
used there (https://codesearch.wmflabs.org/operations/?q=AbuseFilterDisallowGlobalLocalBlocks%7CAbuseFilterRestrictions&i=nope&files=&repos=)

Bug: T175221
Change-Id: I7581b3ee6d9d11a6cf1599b8ff874e8c3d54adf4
2020-10-22 13:38:59 +00:00

302 lines
8.4 KiB
PHP

<?php
namespace MediaWiki\Extension\AbuseFilter\Hooks;
use AbuseFilterVariableHolder;
use Content;
use MediaWiki\HookContainer\HookContainer;
use MediaWiki\MediaWikiServices;
use RecentChange;
use Title;
use User;
/**
* Handle running AbuseFilter's hooks
* @author DannyS712
*/
class AbuseFilterHookRunner implements
AbuseFilterAlterVariablesHook,
AbuseFilterBuilderHook,
AbuseFilterComputeVariableHook,
AbuseFilterContentToStringHook,
AbuseFilterDeprecatedVariablesHook,
AbuseFilterFilterActionHook,
AbuseFilterGenerateGenericVarsHook,
AbuseFilterGenerateTitleVarsHook,
AbuseFilterGenerateUserVarsHook,
AbuseFilterInterceptVariableHook,
AbuseFilterShouldFilterActionHook,
AbuseFilterGetDangerousActionsHook
{
/** @var HookContainer */
private $hookContainer;
/**
* @param HookContainer $hookContainer
*/
public function __construct( HookContainer $hookContainer ) {
$this->hookContainer = $hookContainer;
}
/**
* Convenience getter for static contexts
*
* See also core's Hooks::runner
*
* @return AbuseFilterHookRunner
*/
public static function getRunner() : AbuseFilterHookRunner {
return new AbuseFilterHookRunner(
MediaWikiServices::getInstance()->getHookContainer()
);
}
/**
* Hook runner for the `AbuseFilter-builder` hook
*
* Allows overwriting of the builder values returned by AbuseFilter::getBuilderValues
*
* @param array &$realValues Builder values
* @return bool|void
*/
public function onAbuseFilterBuilder( array &$realValues ) {
return $this->hookContainer->run(
'AbuseFilter-builder',
[ &$realValues ]
);
}
/**
* Hook runner for the `AbuseFilter-deprecatedVariables` hook
*
* Allows adding deprecated variables. If a filter uses an old variable, the parser
* will automatically translate it to the new one.
*
* @param array &$deprecatedVariables deprecated variables, syntax: [ 'old_name' => 'new_name' ]
* @return bool|void
*/
public function onAbuseFilterDeprecatedVariables( array &$deprecatedVariables ) {
return $this->hookContainer->run(
'AbuseFilter-deprecatedVariables',
[ &$deprecatedVariables ]
);
}
/**
* Hook runner for the `AbuseFilter-computeVariable` hook
*
* Like AbuseFilter-interceptVariable but called if the requested method wasn't found.
* Return true to indicate that the method is known to the hook and was computed successful.
*
* @param string $method Method to generate the variable
* @param AbuseFilterVariableHolder $vars
* @param array $parameters Parameters with data to compute the value
* @param ?string &$result Result of the computation
* @return bool|void
*/
public function onAbuseFilterComputeVariable(
string $method,
AbuseFilterVariableHolder $vars,
array $parameters,
?string &$result
) {
return $this->hookContainer->run(
'AbuseFilter-computeVariable',
[ $method, $vars, $parameters, &$result ]
);
}
/**
* Hook runner for the `AbuseFilter-contentToString` hook
*
* Called when converting a Content object to a string to which
* filters can be applied. If the hook function returns true, Content::getTextForSearchIndex()
* will be used for non-text content.
*
* @param Content $content
* @param ?string &$text
* @return bool|void
*/
public function onAbuseFilterContentToString(
Content $content,
?string &$text
) {
return $this->hookContainer->run(
'AbuseFilter-contentToString',
[ $content, &$text ]
);
}
/**
* Hook runner for the `AbuseFilter-filterAction` hook
*
* DEPRECATED! Use AbuseFilterAlterVariables instead.
*
* Allows overwriting of abusefilter variables in AbuseFilter::filterAction just before they're
* checked against filters. Note that you may specify custom variables in a saner way using other hooks:
* AbuseFilter-generateTitleVars, AbuseFilter-generateUserVars and AbuseFilter-generateGenericVars.
*
* @param AbuseFilterVariableHolder &$vars
* @param Title $title
* @return bool|void
*/
public function onAbuseFilterFilterAction(
AbuseFilterVariableHolder &$vars,
Title $title
) {
return $this->hookContainer->run(
'AbuseFilter-filterAction',
[ &$vars, $title ]
);
}
/**
* Hook runner for the `AbuseFilterAlterVariables` hook
*
* Allows overwriting of abusefilter variables just before they're
* checked against filters. Note that you may specify custom variables in a saner way using other hooks:
* AbuseFilter-generateTitleVars, AbuseFilter-generateUserVars and AbuseFilter-generateGenericVars.
*
* @param AbuseFilterVariableHolder &$vars
* @param Title $title Title object target of the action
* @param User $user User object performer of the action
* @return bool|void
*/
public function onAbuseFilterAlterVariables(
AbuseFilterVariableHolder &$vars,
Title $title,
User $user
) {
return $this->hookContainer->run(
'AbuseFilterAlterVariables',
[ &$vars, $title, $user ]
);
}
/**
* Hook runner for the `AbuseFilter-generateTitleVars` hook
*
* Allows altering the variables generated for a title
*
* @param AbuseFilterVariableHolder $vars
* @param Title $title
* @param string $prefix Variable name prefix
* @param ?RecentChange $rc If the variables should be generated for an RC entry,
* this is the entry. Null if it's for the current action being filtered.
* @return bool|void
*/
public function onAbuseFilterGenerateTitleVars(
AbuseFilterVariableHolder $vars,
Title $title,
string $prefix,
?RecentChange $rc
) {
return $this->hookContainer->run(
'AbuseFilter-generateTitleVars',
[ $vars, $title, $prefix, $rc ]
);
}
/**
* Hook runner for the `AbuseFilter-generateUserVars` hook
*
* Allows altering the variables generated for a specific user
*
* @param AbuseFilterVariableHolder $vars
* @param User $user
* @param ?RecentChange $rc If the variables should be generated for an RC entry,
* this is the entry. Null if it's for the current action being filtered.
* @return bool|void
*/
public function onAbuseFilterGenerateUserVars(
AbuseFilterVariableHolder $vars,
User $user,
?RecentChange $rc
) {
return $this->hookContainer->run(
'AbuseFilter-generateUserVars',
[ $vars, $user, $rc ]
);
}
/**
* Hook runner for the `AbuseFilter-generateGenericVars` hook
*
* Allows altering generic variables, i.e. independent from page and user
*
* @param AbuseFilterVariableHolder $vars
* @param ?RecentChange $rc If the variables should be generated for an RC entry,
* this is the entry. Null if it's for the current action being filtered.
* @return bool|void
*/
public function onAbuseFilterGenerateGenericVars(
AbuseFilterVariableHolder $vars,
?RecentChange $rc
) {
return $this->hookContainer->run(
'AbuseFilter-generateGenericVars',
[ $vars, $rc ]
);
}
/**
* Hook runner for the `AbuseFilter-interceptVariable` hook
*
* Called before a variable is set in AFComputedVariable::compute to be able to set
* it before the core code runs. Return false to make the function return right after.
*
* @param string $method Method to generate the variable
* @param AbuseFilterVariableHolder $vars
* @param array $parameters Parameters with data to compute the value
* @param mixed &$result Result of the computation
* @return bool|void
*/
public function onAbuseFilterInterceptVariable(
string $method,
AbuseFilterVariableHolder $vars,
array $parameters,
&$result
) {
return $this->hookContainer->run(
'AbuseFilter-interceptVariable',
[ $method, $vars, $parameters, &$result ]
);
}
/**
* Hook runner for the `AbuseFilterShouldFilterAction` hook
*
* Called before filtering an action. If the current action should not be filtered,
* return false and add a useful reason to $skipReasons.
*
* @param AbuseFilterVariableHolder $vars
* @param Title $title Title object target of the action
* @param User $user User object performer of the action
* @param array &$skipReasons Array of reasons why the action should be skipped
* @return bool|void
*/
public function onAbuseFilterShouldFilterAction(
AbuseFilterVariableHolder $vars,
Title $title,
User $user,
array &$skipReasons
) {
return $this->hookContainer->run(
'AbuseFilterShouldFilterAction',
[ $vars, $title, $user, &$skipReasons ]
);
}
/**
* @inheritDoc
*/
public function onAbuseFilterGetDangerousActions( array &$actions ) : void {
$this->hookContainer->run(
'AbuseFilterGetDangerousActions',
[ &$actions ],
[ 'abortable' => false ]
);
}
}