diff --git a/api/ApiAbuseFilterCheckMatch.php b/api/ApiAbuseFilterCheckMatch.php index d13e48c4a..8f704feea 100644 --- a/api/ApiAbuseFilterCheckMatch.php +++ b/api/ApiAbuseFilterCheckMatch.php @@ -7,7 +7,11 @@ class ApiAbuseFilterCheckMatch extends ApiBase { // "Anti-DoS" if ( !$this->getUser()->isAllowed( 'abusefilter-modify' ) ) { - $this->dieUsage( 'You don\'t have permission to test abuse filters', 'permissiondenied' ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( 'apierror-abusefilter-canttest', 'permissiondenied' ); + } else { + $this->dieUsage( 'You don\'t have permission to test abuse filters', 'permissiondenied' ); + } } $vars = null; @@ -27,7 +31,11 @@ class ApiAbuseFilterCheckMatch extends ApiBase { ); if ( !$row ) { - $this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( [ 'apierror-nosuchrcid', $params['rcid'] ] ); + } else { + $this->dieUsageMsg( [ 'nosuchrcid', $params['rcid'] ] ); + } } $vars = AbuseFilter::getVarsFromRCRow( $row ); @@ -41,17 +49,25 @@ class ApiAbuseFilterCheckMatch extends ApiBase { ); if ( !$row ) { - $this->dieUsage( - "There is no abuselog entry with the id ``{$params['logid']}''", - 'nosuchlogid' - ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( [ 'apierror-abusefilter-nosuchlogid', $params['logid'] ], 'nosuchlogid' ); + } else { + $this->dieUsage( + "There is no abuselog entry with the id ``{$params['logid']}''", + 'nosuchlogid' + ); + } } $vars = AbuseFilter::loadVarDump( $row->afl_var_dump ); } if ( AbuseFilter::checkSyntax( $params[ 'filter' ] ) !== true ) { - $this->dieUsage( 'The filter has invalid syntax', 'badsyntax' ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( 'apierror-abusefilter-badsyntax', 'badsyntax' ); + } else { + $this->dieUsage( 'The filter has invalid syntax', 'badsyntax' ); + } } $result = array( diff --git a/api/ApiAbuseFilterCheckSyntax.php b/api/ApiAbuseFilterCheckSyntax.php index dfb8274dd..4f04a589d 100644 --- a/api/ApiAbuseFilterCheckSyntax.php +++ b/api/ApiAbuseFilterCheckSyntax.php @@ -5,10 +5,14 @@ class ApiAbuseFilterCheckSyntax extends ApiBase { public function execute() { // "Anti-DoS" if ( !$this->getUser()->isAllowed( 'abusefilter-modify' ) ) { - $this->dieUsage( - 'You don\'t have permission to check syntax of abuse filters', - 'permissiondenied' - ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( 'apierror-abusefilter-cantcheck', 'permissiondenied' ); + } else { + $this->dieUsage( + 'You don\'t have permission to check syntax of abuse filters', + 'permissiondenied' + ); + } } $params = $this->extractRequestParams(); diff --git a/api/ApiAbuseFilterUnblockAutopromote.php b/api/ApiAbuseFilterUnblockAutopromote.php index 81557472e..04cc945a1 100644 --- a/api/ApiAbuseFilterUnblockAutopromote.php +++ b/api/ApiAbuseFilterUnblockAutopromote.php @@ -2,25 +2,42 @@ class ApiAbuseFilterUnblockAutopromote extends ApiBase { public function execute() { - if ( !$this->getUser()->isAllowed( 'abusefilter-modify' ) ) { - $this->dieUsage( 'You do not have permissions to unblock autopromotion', 'permissiondenied' ); + if ( is_callable( [ $this, 'checkUserRightsAny' ] ) ) { + $this->checkUserRightsAny( 'abusefilter-modify' ); + } else { + if ( !$this->getUser()->isAllowed( 'abusefilter-modify' ) ) { + $this->dieUsage( 'You do not have permissions to unblock autopromotion', 'permissiondenied' ); + } } $params = $this->extractRequestParams(); $user = User::newFromName( $params['user'] ); if ( $user === false ) { - // Oh god this is so bad but this message uses GENDER - $msg = wfMessage( 'abusefilter-reautoconfirm-none', $params['user'] )->text(); - $this->dieUsage( $msg, 'notsuspended' ); + $encParamName = $this->encodeParamName( 'user' ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( + [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $param['user'] ) ], + "baduser_{$encParamName}" + ); + } else { + $this->dieUsage( + "Invalid value '{$param['user']}' for user parameter $encParamName", + "baduser_{$encParamName}" + ); + } } $key = AbuseFilter::autoPromoteBlockKey( $user ); $stash = ObjectCache::getMainStashInstance(); if ( !$stash->get( $key ) ) { - // Same as above :( - $msg = wfMessage( 'abusefilter-reautoconfirm-none', $params['user'] )->text(); - $this->dieUsage( $msg, 'notsuspended' ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( [ 'abusefilter-reautoconfirm-none', $user->getName() ], 'notsuspended' ); + } else { + $msg = wfMessage( 'abusefilter-reautoconfirm-none', $user->getName() ) + ->inLanguage( 'en' )->useDatabase( false )->text(); + $this->dieUsage( $msg, 'notsuspended' ); + } } $stash->delete( $key ); @@ -40,6 +57,7 @@ class ApiAbuseFilterUnblockAutopromote extends ApiBase { public function getAllowedParams() { return array( 'user' => array( + ApiBase::PARAM_TYPE => 'user', ApiBase::PARAM_REQUIRED => true ), 'token' => null, diff --git a/api/ApiQueryAbuseFilters.php b/api/ApiQueryAbuseFilters.php index 239ea41fb..d8e390b9b 100644 --- a/api/ApiQueryAbuseFilters.php +++ b/api/ApiQueryAbuseFilters.php @@ -36,8 +36,12 @@ class ApiQueryAbuseFilters extends ApiQueryBase { public function execute() { $user = $this->getUser(); - if ( !$user->isAllowed( 'abusefilter-view' ) ) { - $this->dieUsage( 'You don\'t have permission to view abuse filters', 'permissiondenied' ); + if ( is_callable( [ $this, 'checkUserRightsAny' ] ) ) { + $this->checkUserRightsAny( 'abusefilter-view' ); + } else { + if ( !$user->isAllowed( 'abusefilter-view' ) ) { + $this->dieUsage( 'You don\'t have permission to view abuse filters', 'permissiondenied' ); + } } $params = $this->extractRequestParams(); @@ -79,12 +83,14 @@ class ApiQueryAbuseFilters extends ApiQueryBase { /* Check for conflicting parameters. */ if ( ( isset( $show['enabled'] ) && isset( $show['!enabled'] ) ) - || ( isset( $show['deleted'] ) && isset( $show['!deleted'] ) ) - || ( isset( $show['private'] ) && isset( $show['!private'] ) ) ) { - $this->dieUsage( - 'Incorrect parameter - mutually exclusive values may not be supplied', - 'show' - ); + || ( isset( $show['deleted'] ) && isset( $show['!deleted'] ) ) + || ( isset( $show['private'] ) && isset( $show['!private'] ) ) + ) { + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( 'apierror-show' ); + } else { + $this->dieUsageMsg( 'show' ); + } } $this->addWhereIf( 'af_enabled = 0', isset( $show['!enabled'] ) ); diff --git a/api/ApiQueryAbuseLog.php b/api/ApiQueryAbuseLog.php index c7fb112c1..2941e5b0f 100644 --- a/api/ApiQueryAbuseLog.php +++ b/api/ApiQueryAbuseLog.php @@ -39,7 +39,11 @@ class ApiQueryAbuseLog extends ApiQueryBase { $errors = $this->getTitle()->getUserPermissionsErrors( 'abusefilter-log', $user, true, array( 'ns-specialprotected' ) ); if ( count( $errors ) ) { - $this->dieUsageMsg( $errors[0] ); + if ( is_callable( [ $this, 'errorArrayToStatus' ] ) ) { + $this->dieStatus( $this->errorArrayToStatus( $errors ) ); + } else { + $this->dieUsageMsg( $errors[0] ); + } return; } @@ -58,14 +62,23 @@ class ApiQueryAbuseLog extends ApiQueryBase { $fld_hidden = isset( $prop['hidden'] ); $fld_revid = isset( $prop['revid'] ); - if ( $fld_ip && !$user->isAllowed( 'abusefilter-private' ) ) { - $this->dieUsage( 'You don\'t have permission to view IP addresses', 'permissiondenied' ); - } - if ( $fld_details && !$user->isAllowed( 'abusefilter-log-detail' ) ) { - $this->dieUsage( - 'You don\'t have permission to view detailed abuse log entries', - 'permissiondenied' - ); + if ( is_callable( [ $this, 'checkUserRightsAny' ] ) ) { + if ( $fld_ip ) { + $this->checkUserRightsAny( 'abusefilter-private' ); + } + if ( $fld_details ) { + $this->checkUserRightsAny( 'abusefilter-log-detail' ); + } + } else { + if ( $fld_ip && !$user->isAllowed( 'abusefilter-private' ) ) { + $this->dieUsage( 'You don\'t have permission to view IP addresses', 'permissiondenied' ); + } + if ( $fld_details && !$user->isAllowed( 'abusefilter-log-detail' ) ) { + $this->dieUsage( + 'You don\'t have permission to view detailed abuse log entries', + 'permissiondenied' + ); + } } // Match permissions for viewing events on private filters to SpecialAbuseLog (bug 42814) if ( $params['filter'] && @@ -77,10 +90,16 @@ class ApiQueryAbuseLog extends ApiQueryBase { } foreach ( $params['filter'] as $filter ) { if ( AbuseFilter::filterHidden( $filter ) ) { - $this->dieUsage( - 'You don\'t have permission to view log entries for private filters', - 'permissiondenied' - ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( + [ 'apierror-permissiondenied', $this->msg( 'action-abusefilter-log-private' ) ] + ); + } else { + $this->dieUsage( + 'You don\'t have permission to view log entries for private filters', + 'permissiondenied' + ); + } } } } @@ -145,7 +164,11 @@ class ApiQueryAbuseLog extends ApiQueryBase { if ( !is_null( $title ) ) { $titleObj = Title::newFromText( $title ); if ( is_null( $titleObj ) ) { - $this->dieUsageMsg( array( 'invalidtitle', $title ) ); + if ( is_callable( [ $this, 'dieWithError' ] ) ) { + $this->dieWithError( array( 'apierror-invalidtitle', wfEscapeWikiText( $title ) ) ); + } else { + $this->dieUsageMsg( array( 'invalidtitle', $title ) ); + } } $this->addWhereFld( 'afl_namespace', $titleObj->getNamespace() ); $this->addWhereFld( 'afl_title', $titleObj->getDBkey() ); diff --git a/i18n/en.json b/i18n/en.json index 96579989f..080466318 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -39,6 +39,7 @@ "action-abusefilter-modify-restricted": "modify abuse filters with restricted actions", "action-abusefilter-revert": "revert all changes by a given abuse filter", "action-abusefilter-view-private": "view abuse filters marked as private", + "action-abusefilter-log-private": "view logs of abuse filters marked as private", "abusefilter-log": "Abuse filter log", "abusefilter-log-summary": "This log shows a list of all actions caught by the filters.", "abusefilter-log-search": "Search the abuse log", @@ -438,5 +439,9 @@ "apihelp-query+abuselog-param-limit": "The maximum amount of entries to list.", "apihelp-query+abuselog-param-prop": "Which properties to get.", "apihelp-query+abuselog-example-1": "Show recent log entries", - "apihelp-query+abuselog-example-2": "Show recent log entries for [[API]]" + "apihelp-query+abuselog-example-2": "Show recent log entries for [[API]]", + "apierror-abusefilter-canttest": "You don't have permission to test abuse filters.", + "apierror-abusefilter-cantcheck": "You don't have permission to check syntax of abuse filters.", + "apierror-abusefilter-nosuchlogid": "There is no abuselog entry with the id $1.", + "apierror-abusefilter-badsyntax": "The filter has invalid syntax." } diff --git a/i18n/qqq.json b/i18n/qqq.json index 0b60ff1c4..1a72108e9 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -70,6 +70,7 @@ "action-abusefilter-modify-restricted": "{{doc-action|abusefilter-modify-restricted}}", "action-abusefilter-revert": "{{doc-action|abusefilter-revert}}", "action-abusefilter-view-private": "{{doc-action|abusefilter-view-private}}", + "action-abusefilter-log-private": "{{doc-action|abusefilter-log-private}}", "abusefilter-log": "Caption of [[Special:AbuseLog]]", "abusefilter-log-summary": "This message is displayed at the top of the log overview page for extension AbuseFilter.", "abusefilter-log-search": "Caption of a fieldset for filter definition on [[Special:AbuseLog]]", @@ -417,5 +418,9 @@ "apihelp-query+abuselog-param-limit": "{{doc-apihelp-param|query+abuselog|limit}}", "apihelp-query+abuselog-param-prop": "{{doc-apihelp-param|query+abuselog|prop}}", "apihelp-query+abuselog-example-1": "{{doc-apihelp-example|query+abuselog}}", - "apihelp-query+abuselog-example-2": "{{doc-apihelp-example|query+abuselog}}" + "apihelp-query+abuselog-example-2": "{{doc-apihelp-example|query+abuselog}}", + "apierror-abusefilter-badsyntax": "{{doc-apierror}}", + "apierror-abusefilter-cantcheck": "{{doc-apierror}}", + "apierror-abusefilter-canttest": "{{doc-apierror}}", + "apierror-abusefilter-nosuchlogid": "{{doc-apierror}}\n\nParameters:\n* $1 - AbuseFilter log ID number." }