Api: inject AbuseFilterPermissionManager where needed

Some of these api modules still retrieve other services
statically, this patch is focused just on injecting the
permission manager and setting up DI

Bug: T259960
Change-Id: Ic5196f230d68604fdf321f705377a1e6e1e2efca
This commit is contained in:
DannyS712 2021-03-25 03:48:03 +00:00
parent e616e5b71c
commit 1bd0b02441
7 changed files with 150 additions and 27 deletions

View file

@ -120,15 +120,45 @@
"abusefilterprivatedetails": "abusefilter-privatedetails-log"
},
"APIModules": {
"abusefilterchecksyntax": "MediaWiki\\Extension\\AbuseFilter\\Api\\CheckSyntax",
"abusefilterevalexpression": "MediaWiki\\Extension\\AbuseFilter\\Api\\EvalExpression",
"abusefilterchecksyntax": {
"class": "MediaWiki\\Extension\\AbuseFilter\\Api\\CheckSyntax",
"services": [
"AbuseFilterPermissionManager"
]
},
"abusefilterevalexpression": {
"class": "MediaWiki\\Extension\\AbuseFilter\\Api\\EvalExpression",
"services": [
"AbuseFilterPermissionManager"
]
},
"abusefilterunblockautopromote": "MediaWiki\\Extension\\AbuseFilter\\Api\\UnblockAutopromote",
"abusefiltercheckmatch": "MediaWiki\\Extension\\AbuseFilter\\Api\\CheckMatch",
"abuselogprivatedetails": "MediaWiki\\Extension\\AbuseFilter\\Api\\AbuseLogPrivateDetails"
"abusefiltercheckmatch": {
"class": "MediaWiki\\Extension\\AbuseFilter\\Api\\CheckMatch",
"services": [
"AbuseFilterPermissionManager"
]
},
"abuselogprivatedetails": {
"class": "MediaWiki\\Extension\\AbuseFilter\\Api\\AbuseLogPrivateDetails",
"services": [
"AbuseFilterPermissionManager"
]
}
},
"APIListModules": {
"abuselog": "MediaWiki\\Extension\\AbuseFilter\\Api\\QueryAbuseLog",
"abusefilters": "MediaWiki\\Extension\\AbuseFilter\\Api\\QueryAbuseFilters"
"abuselog": {
"class": "MediaWiki\\Extension\\AbuseFilter\\Api\\QueryAbuseLog",
"services": [
"AbuseFilterPermissionManager"
]
},
"abusefilters": {
"class": "MediaWiki\\Extension\\AbuseFilter\\Api\\QueryAbuseFilters",
"services": [
"AbuseFilterPermissionManager"
]
}
},
"MessagesDirs": {
"AbuseFilter": [

View file

@ -19,7 +19,8 @@
namespace MediaWiki\Extension\AbuseFilter\Api;
use ApiBase;
use MediaWiki\Extension\AbuseFilter\AbuseFilterServices;
use ApiMain;
use MediaWiki\Extension\AbuseFilter\AbuseFilterPermissionManager;
use MediaWiki\Extension\AbuseFilter\Special\SpecialAbuseLog;
/**
@ -29,6 +30,24 @@ use MediaWiki\Extension\AbuseFilter\Special\SpecialAbuseLog;
* @ingroup Extensions
*/
class AbuseLogPrivateDetails extends ApiBase {
/** @var AbuseFilterPermissionManager */
private $afPermManager;
/**
* @param ApiMain $main
* @param string $action
* @param AbuseFilterPermissionManager $afPermManager
*/
public function __construct(
ApiMain $main,
$action,
AbuseFilterPermissionManager $afPermManager
) {
parent::__construct( $main, $action );
$this->afPermManager = $afPermManager;
}
/**
* @codeCoverageIgnore Merely declarative
* @inheritDoc
@ -58,9 +77,8 @@ class AbuseLogPrivateDetails extends ApiBase {
*/
public function execute() {
$user = $this->getUser();
$afPermManager = AbuseFilterServices::getPermissionManager();
if ( !$afPermManager->canSeePrivateDetails( $user ) ) {
if ( !$this->afPermManager->canSeePrivateDetails( $user ) ) {
$this->dieWithError( 'abusefilter-log-cannot-see-privatedetails' );
}
$params = $this->extractRequestParams();

View file

@ -3,11 +3,13 @@
namespace MediaWiki\Extension\AbuseFilter\Api;
use ApiBase;
use ApiMain;
use ApiResult;
use FormatJson;
use LogEventsList;
use LogicException;
use LogPage;
use MediaWiki\Extension\AbuseFilter\AbuseFilterPermissionManager;
use MediaWiki\Extension\AbuseFilter\AbuseFilterServices;
use MediaWiki\Extension\AbuseFilter\Special\SpecialAbuseLog;
use MediaWiki\Extension\AbuseFilter\Variables\VariableHolder;
@ -15,17 +17,34 @@ use MediaWiki\Revision\RevisionRecord;
use RecentChange;
class CheckMatch extends ApiBase {
/** @var AbuseFilterPermissionManager */
private $afPermManager;
/**
* @param ApiMain $main
* @param string $action
* @param AbuseFilterPermissionManager $afPermManager
*/
public function __construct(
ApiMain $main,
$action,
AbuseFilterPermissionManager $afPermManager
) {
parent::__construct( $main, $action );
$this->afPermManager = $afPermManager;
}
/**
* @inheritDoc
*/
public function execute() {
$afPermManager = AbuseFilterServices::getPermissionManager();
$user = $this->getUser();
$params = $this->extractRequestParams();
$this->requireOnlyOneParameter( $params, 'vars', 'rcid', 'logid' );
// "Anti-DoS"
if ( !$afPermManager->canUseTestTools( $this->getUser() ) ) {
if ( !$this->afPermManager->canUseTestTools( $this->getUser() ) ) {
$this->dieWithError( 'apierror-abusefilter-canttest', 'permissiondenied' );
}
@ -75,7 +94,7 @@ class CheckMatch extends ApiBase {
$this->dieWithError( [ 'apierror-abusefilter-nosuchlogid', $params['logid'] ], 'nosuchlogid' );
}
if ( !$afPermManager->canSeeHiddenLogEntries( $user ) && SpecialAbuseLog::isHidden( $row ) ) {
if ( !$this->afPermManager->canSeeHiddenLogEntries( $user ) && SpecialAbuseLog::isHidden( $row ) ) {
// T223654 - Same check as in SpecialAbuseLog. Both the visibility of the AbuseLog entry
// and the corresponding revision are checked.
$this->dieWithError( 'apierror-permissiondenied-generic', 'deletedabuselog' );

View file

@ -3,19 +3,37 @@
namespace MediaWiki\Extension\AbuseFilter\Api;
use ApiBase;
use ApiMain;
use MediaWiki\Extension\AbuseFilter\AbuseFilterPermissionManager;
use MediaWiki\Extension\AbuseFilter\AbuseFilterServices;
use MediaWiki\Extension\AbuseFilter\Parser\AFPUserVisibleException;
class CheckSyntax extends ApiBase {
/** @var AbuseFilterPermissionManager */
private $afPermManager;
/**
* @param ApiMain $main
* @param string $action
* @param AbuseFilterPermissionManager $afPermManager
*/
public function __construct(
ApiMain $main,
$action,
AbuseFilterPermissionManager $afPermManager
) {
parent::__construct( $main, $action );
$this->afPermManager = $afPermManager;
}
/**
* @inheritDoc
*/
public function execute() {
$afPermManager = AbuseFilterServices::getPermissionManager();
// "Anti-DoS"
if ( !$afPermManager->canUseTestTools( $this->getUser() )
&& !$afPermManager->canEdit( $this->getUser() )
if ( !$this->afPermManager->canUseTestTools( $this->getUser() )
&& !$this->afPermManager->canEdit( $this->getUser() )
) {
$this->dieWithError( 'apierror-abusefilter-cantcheck', 'permissiondenied' );
}

View file

@ -3,19 +3,38 @@
namespace MediaWiki\Extension\AbuseFilter\Api;
use ApiBase;
use ApiMain;
use ApiResult;
use MediaWiki\Extension\AbuseFilter\AbuseFilterPermissionManager;
use MediaWiki\Extension\AbuseFilter\AbuseFilterServices;
use MediaWiki\Extension\AbuseFilter\Variables\VariablesFormatter;
use Status;
class EvalExpression extends ApiBase {
/** @var AbuseFilterPermissionManager */
private $afPermManager;
/**
* @param ApiMain $main
* @param string $action
* @param AbuseFilterPermissionManager $afPermManager
*/
public function __construct(
ApiMain $main,
$action,
AbuseFilterPermissionManager $afPermManager
) {
parent::__construct( $main, $action );
$this->afPermManager = $afPermManager;
}
/**
* @inheritDoc
*/
public function execute() {
$afPermManager = AbuseFilterServices::getPermissionManager();
// "Anti-DoS"
if ( !$afPermManager->canUseTestTools( $this->getUser() ) ) {
if ( !$this->afPermManager->canUseTestTools( $this->getUser() ) ) {
$this->dieWithError( 'apierror-abusefilter-canteval', 'permissiondenied' );
}

View file

@ -28,7 +28,7 @@ namespace MediaWiki\Extension\AbuseFilter\Api;
use ApiBase;
use ApiQuery;
use ApiQueryBase;
use MediaWiki\Extension\AbuseFilter\AbuseFilterServices;
use MediaWiki\Extension\AbuseFilter\AbuseFilterPermissionManager;
use MWTimestamp;
/**
@ -38,12 +38,22 @@ use MWTimestamp;
* @ingroup Extensions
*/
class QueryAbuseFilters extends ApiQueryBase {
/** @var AbuseFilterPermissionManager */
private $afPermManager;
/**
* @param ApiQuery $query
* @param string $moduleName
* @param AbuseFilterPermissionManager $afPermManager
*/
public function __construct( ApiQuery $query, $moduleName ) {
public function __construct(
ApiQuery $query,
$moduleName,
AbuseFilterPermissionManager $afPermManager
) {
parent::__construct( $query, $moduleName, 'abf' );
$this->afPermManager = $afPermManager;
}
/**
@ -51,7 +61,6 @@ class QueryAbuseFilters extends ApiQueryBase {
*/
public function execute() {
$user = $this->getUser();
$afPermManager = AbuseFilterServices::getPermissionManager();
$this->checkUserRightsAny( 'abusefilter-view' );
$params = $this->extractRequestParams();
@ -109,7 +118,7 @@ class QueryAbuseFilters extends ApiQueryBase {
$res = $this->select( __METHOD__ );
$showhidden = $afPermManager->canViewPrivateFilters( $user );
$showhidden = $this->afPermManager->canViewPrivateFilters( $user );
$count = 0;
foreach ( $res as $row ) {

View file

@ -30,6 +30,7 @@ use ApiQuery;
use ApiQueryBase;
use InvalidArgumentException;
use MediaWiki\Extension\AbuseFilter\AbuseFilter;
use MediaWiki\Extension\AbuseFilter\AbuseFilterPermissionManager;
use MediaWiki\Extension\AbuseFilter\AbuseFilterServices;
use MediaWiki\Extension\AbuseFilter\CentralDBNotAvailableException;
use MediaWiki\Extension\AbuseFilter\Filter\FilterNotFoundException;
@ -48,19 +49,28 @@ use Wikimedia\IPUtils;
* @ingroup Extensions
*/
class QueryAbuseLog extends ApiQueryBase {
/** @var AbuseFilterPermissionManager */
private $afPermManager;
/**
* @param ApiQuery $query
* @param string $moduleName
* @param AbuseFilterPermissionManager $afPermManager
*/
public function __construct( ApiQuery $query, $moduleName ) {
public function __construct(
ApiQuery $query,
$moduleName,
AbuseFilterPermissionManager $afPermManager
) {
parent::__construct( $query, $moduleName, 'afl' );
$this->afPermManager = $afPermManager;
}
/**
* @inheritDoc
*/
public function execute() {
$afPermManager = AbuseFilterServices::getPermissionManager();
$lookup = AbuseFilterServices::getFilterLookup();
$aflFilterMigrationStage = $this->getConfig()->get( 'AbuseFilterAflFilterMigrationStage' );
@ -107,7 +117,7 @@ class QueryAbuseLog extends ApiQueryBase {
continue;
}
}
if ( !$afPermManager->canViewPrivateFiltersLogs( $user ) ) {
if ( !$this->afPermManager->canViewPrivateFiltersLogs( $user ) ) {
foreach ( $searchFilters as [ $filterID, $global ] ) {
try {
$isHidden = $lookup->getFilter( $filterID, $global )->isHidden();
@ -196,7 +206,7 @@ class QueryAbuseLog extends ApiQueryBase {
}
}
$this->addWhereIf( [ 'afl_deleted' => 0 ], !$afPermManager->canSeeHiddenLogEntries( $user ) );
$this->addWhereIf( [ 'afl_deleted' => 0 ], !$this->afPermManager->canSeeHiddenLogEntries( $user ) );
if ( $searchFilters ) {
$conds = [];
@ -260,7 +270,7 @@ class QueryAbuseLog extends ApiQueryBase {
break;
}
$hidden = SpecialAbuseLog::isHidden( $row );
if ( $hidden === true && !$afPermManager->canSeeHiddenLogEntries( $user ) ) {
if ( $hidden === true && !$this->afPermManager->canSeeHiddenLogEntries( $user ) ) {
continue;
}
if ( $hidden === 'implicit' ) {
@ -282,7 +292,7 @@ class QueryAbuseLog extends ApiQueryBase {
$fullName = $row->afl_filter;
}
$isHidden = $lookup->getFilter( $filterID, $global )->isHidden();
$canSeeDetails = $afPermManager->canSeeLogDetailsForFilter( $user, $isHidden );
$canSeeDetails = $this->afPermManager->canSeeLogDetailsForFilter( $user, $isHidden );
$entry = [];
if ( $fld_ids ) {