Viewing File: /home/omtekel/www/wp-content/upgrade/backup/api.tar
ApiQueryTags.php 0000666 00000011516 15133500660 0007642 0 ustar 00 <?php
/**
* Copyright © 2009
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
use MediaWiki\ChangeTags\ChangeTagsStore;
use Wikimedia\ParamValidator\ParamValidator;
use Wikimedia\ParamValidator\TypeDef\IntegerDef;
/**
* Query module to enumerate change tags.
*
* @ingroup API
*/
class ApiQueryTags extends ApiQueryBase {
private ChangeTagsStore $changeTagsStore;
public function __construct( ApiQuery $query, $moduleName, ChangeTagsStore $changeTagsStore ) {
parent::__construct( $query, $moduleName, 'tg' );
$this->changeTagsStore = $changeTagsStore;
}
public function execute() {
$params = $this->extractRequestParams();
$prop = array_fill_keys( $params['prop'], true );
$fld_displayname = isset( $prop['displayname'] );
$fld_description = isset( $prop['description'] );
$fld_hitcount = isset( $prop['hitcount'] );
$fld_defined = isset( $prop['defined'] );
$fld_source = isset( $prop['source'] );
$fld_active = isset( $prop['active'] );
$limit = $params['limit'];
$result = $this->getResult();
$softwareDefinedTags = array_fill_keys( $this->changeTagsStore->listSoftwareDefinedTags(), 0 );
$explicitlyDefinedTags = array_fill_keys( $this->changeTagsStore->listExplicitlyDefinedTags(), 0 );
$softwareActivatedTags = array_fill_keys( $this->changeTagsStore->listSoftwareActivatedTags(), 0 );
$tagHitcounts = array_merge(
$softwareDefinedTags,
$explicitlyDefinedTags,
$this->changeTagsStore->tagUsageStatistics()
);
$tags = array_keys( $tagHitcounts );
# Fetch defined tags that aren't past the continuation
if ( $params['continue'] !== null ) {
$cont = $params['continue'];
$tags = array_filter( $tags, static function ( $v ) use ( $cont ) {
return $v >= $cont;
} );
}
# Now make sure the array is sorted for proper continuation
sort( $tags );
$count = 0;
foreach ( $tags as $tagName ) {
if ( ++$count > $limit ) {
$this->setContinueEnumParameter( 'continue', $tagName );
break;
}
$tag = [];
$tag['name'] = $tagName;
if ( $fld_displayname ) {
$tag['displayname'] = ChangeTags::tagDescription( $tagName, $this );
}
if ( $fld_description ) {
$msg = $this->msg( "tag-$tagName-description" );
$tag['description'] = $msg->exists() ? $msg->text() : '';
}
if ( $fld_hitcount ) {
$tag['hitcount'] = (int)$tagHitcounts[$tagName];
}
$isSoftware = isset( $softwareDefinedTags[$tagName] );
$isExplicit = isset( $explicitlyDefinedTags[$tagName] );
if ( $fld_defined ) {
$tag['defined'] = $isSoftware || $isExplicit;
}
if ( $fld_source ) {
$tag['source'] = [];
if ( $isSoftware ) {
// TODO: Can we change this to 'software'?
$tag['source'][] = 'extension';
}
if ( $isExplicit ) {
$tag['source'][] = 'manual';
}
}
if ( $fld_active ) {
$tag['active'] = $isExplicit || isset( $softwareActivatedTags[$tagName] );
}
$fit = $result->addValue( [ 'query', $this->getModuleName() ], null, $tag );
if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $tagName );
break;
}
}
$result->addIndexedTagName( [ 'query', $this->getModuleName() ], 'tag' );
}
public function getCacheMode( $params ) {
return 'public';
}
public function getAllowedParams() {
return [
'continue' => [
ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
],
'limit' => [
ParamValidator::PARAM_DEFAULT => 10,
ParamValidator::PARAM_TYPE => 'limit',
IntegerDef::PARAM_MIN => 1,
IntegerDef::PARAM_MAX => ApiBase::LIMIT_BIG1,
IntegerDef::PARAM_MAX2 => ApiBase::LIMIT_BIG2
],
'prop' => [
ParamValidator::PARAM_DEFAULT => '',
ParamValidator::PARAM_TYPE => [
'displayname',
'description',
'hitcount',
'defined',
'source',
'active',
],
ParamValidator::PARAM_ISMULTI => true,
ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
]
];
}
protected function getExamplesMessages() {
return [
'action=query&list=tags&tgprop=displayname|description|hitcount|defined'
=> 'apihelp-query+tags-example-simple',
];
}
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tags';
}
}
ApiManageTags.php 0000666 00000010623 15133500660 0007723 0 ustar 00 <?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
use Wikimedia\ParamValidator\ParamValidator;
/**
* @ingroup API
* @since 1.25
*/
class ApiManageTags extends ApiBase {
public function execute() {
$params = $this->extractRequestParams();
$authority = $this->getAuthority();
// make sure the user is allowed
if ( $params['operation'] !== 'delete'
&& !$authority->isAllowed( 'managechangetags' )
) {
$this->dieWithError( 'tags-manage-no-permission', 'permissiondenied' );
} elseif ( !$authority->isAllowed( 'deletechangetags' ) ) {
$this->dieWithError( 'tags-delete-no-permission', 'permissiondenied' );
}
// Check if user can add the log entry tags which were requested
if ( $params['tags'] ) {
$ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $authority );
if ( !$ableToTag->isOK() ) {
$this->dieStatus( $ableToTag );
}
}
$result = $this->getResult();
$tag = $params['tag'];
$reason = $params['reason'];
$ignoreWarnings = $params['ignorewarnings'];
$tags = $params['tags'] ?: [];
switch ( $params['operation'] ) {
case 'create':
$status = ChangeTags::createTagWithChecks( $tag, $reason, $authority, $ignoreWarnings, $tags );
break;
case 'delete':
$status = ChangeTags::deleteTagWithChecks( $tag, $reason, $authority, $ignoreWarnings, $tags );
break;
case 'activate':
$status = ChangeTags::activateTagWithChecks( $tag, $reason, $authority, $ignoreWarnings, $tags );
break;
case 'deactivate':
$status = ChangeTags::deactivateTagWithChecks( $tag, $reason, $authority, $ignoreWarnings, $tags );
break;
default:
// unreachable
throw new UnexpectedValueException( 'invalid operation' );
}
if ( !$status->isOK() ) {
$this->dieStatus( $status );
}
$ret = [
'operation' => $params['operation'],
'tag' => $params['tag'],
];
if ( !$status->isGood() ) {
$ret['warnings'] = $this->getErrorFormatter()->arrayFromStatus( $status, 'warning' );
}
$ret['success'] = $status->value !== null;
if ( $ret['success'] ) {
$ret['logid'] = $status->value;
}
$result->addValue( null, $this->getModuleName(), $ret );
}
public function mustBePosted() {
return true;
}
public function isWriteMode() {
return true;
}
public function getAllowedParams() {
return [
'operation' => [
ParamValidator::PARAM_TYPE => [ 'create', 'delete', 'activate', 'deactivate' ],
ParamValidator::PARAM_REQUIRED => true,
ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
],
'tag' => [
ParamValidator::PARAM_TYPE => 'string',
ParamValidator::PARAM_REQUIRED => true,
],
'reason' => [
ParamValidator::PARAM_TYPE => 'string',
ParamValidator::PARAM_DEFAULT => '',
],
'ignorewarnings' => [
ParamValidator::PARAM_TYPE => 'boolean',
ParamValidator::PARAM_DEFAULT => false,
],
'tags' => [
ParamValidator::PARAM_TYPE => 'tags',
ParamValidator::PARAM_ISMULTI => true,
],
];
}
public function needsToken() {
return 'csrf';
}
protected function getExamplesMessages() {
return [
'action=managetags&operation=create&tag=spam&reason=For+use+in+edit+patrolling&token=123ABC'
=> 'apihelp-managetags-example-create',
'action=managetags&operation=delete&tag=vandlaism&reason=Misspelt&token=123ABC'
=> 'apihelp-managetags-example-delete',
'action=managetags&operation=activate&tag=spam&reason=For+use+in+edit+patrolling&token=123ABC'
=> 'apihelp-managetags-example-activate',
'action=managetags&operation=deactivate&tag=spam&reason=No+longer+required&token=123ABC'
=> 'apihelp-managetags-example-deactivate',
];
}
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tag_management';
}
}
Hook/ApiQueryWatchlistExtractOutputDataHook.php 0000666 00000001516 15133500660 0015774 0 ustar 00 <?php
namespace MediaWiki\Api\Hook;
use ApiQueryWatchlist;
use WatchedItem;
/**
* This is a hook handler interface, see docs/Hooks.md.
* Use the hook name "ApiQueryWatchlistExtractOutputData" to register handlers implementing this interface.
*
* @stable to implement
* @ingroup Hooks
*/
interface ApiQueryWatchlistExtractOutputDataHook {
/**
* Use this hook to extract row data for ApiQueryWatchlist.
*
* @since 1.35
*
* @param ApiQueryWatchlist $module
* @param WatchedItem $watchedItem
* @param array $recentChangeInfo Array of recent change info data
* @param array &$vals Associative array of data to be output for the row
* @return bool|void True or no return value to continue or false to abort
*/
public function onApiQueryWatchlistExtractOutputData( $module, $watchedItem,
$recentChangeInfo, &$vals
);
}
Hook/ApiQueryTokensRegisterTypesHook.php 0000666 00000001433 15133500660 0014457 0 ustar 00 <?php
namespace MediaWiki\Api\Hook;
/**
* This is a hook handler interface, see docs/Hooks.md.
* Use the hook name "ApiQueryTokensRegisterTypes" to register handlers implementing this interface.
*
* @stable to implement
* @ingroup Hooks
*/
interface ApiQueryTokensRegisterTypesHook {
/**
* Use this hook to add additional token types to action=query&meta=tokens.
* Note that most modules will probably be able to use the CSRF token
* instead of creating their own token types.
*
* @since 1.35
*
* @param array &$salts [ type => salt to pass to User::getEditToken(), or array of salt
* and key to pass to Session::getToken() ]
* @return bool|void True or no return value to continue or false to abort
*/
public function onApiQueryTokensRegisterTypes( &$salts );
}
ApiTag.php 0000666 00000016530 15133500660 0006432 0 ustar 00 <?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
use MediaWiki\ChangeTags\ChangeTagsStore;
use MediaWiki\Revision\RevisionStore;
use Wikimedia\ParamValidator\ParamValidator;
use Wikimedia\Rdbms\IConnectionProvider;
use Wikimedia\Rdbms\IDatabase;
/**
* @ingroup API
* @since 1.25
*/
class ApiTag extends ApiBase {
use ApiBlockInfoTrait;
private IDatabase $dbr;
private RevisionStore $revisionStore;
private ChangeTagsStore $changeTagsStore;
/**
* @param ApiMain $main
* @param string $action
* @param IConnectionProvider $dbProvider
* @param RevisionStore $revisionStore
* @param ChangeTagsStore $changeTagsStore
*/
public function __construct(
ApiMain $main,
$action,
IConnectionProvider $dbProvider,
RevisionStore $revisionStore,
ChangeTagsStore $changeTagsStore
) {
parent::__construct( $main, $action );
$this->dbr = $dbProvider->getReplicaDatabase();
$this->revisionStore = $revisionStore;
$this->changeTagsStore = $changeTagsStore;
}
public function execute() {
$params = $this->extractRequestParams();
$user = $this->getUser();
// make sure the user is allowed
$this->checkUserRightsAny( 'changetags' );
// Fail early if the user is sitewide blocked.
$block = $user->getBlock();
if ( $block && $block->isSitewide() ) {
$this->dieBlocked( $block );
}
// Check if user can add tags
if ( $params['tags'] ) {
$ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $this->getAuthority() );
if ( !$ableToTag->isOK() ) {
$this->dieStatus( $ableToTag );
}
}
// validate and process each revid, rcid and logid
$this->requireAtLeastOneParameter( $params, 'revid', 'rcid', 'logid' );
$ret = [];
if ( $params['revid'] ) {
foreach ( $params['revid'] as $id ) {
$ret[] = $this->processIndividual( 'revid', $params, $id );
}
}
if ( $params['rcid'] ) {
foreach ( $params['rcid'] as $id ) {
$ret[] = $this->processIndividual( 'rcid', $params, $id );
}
}
if ( $params['logid'] ) {
foreach ( $params['logid'] as $id ) {
$ret[] = $this->processIndividual( 'logid', $params, $id );
}
}
ApiResult::setIndexedTagName( $ret, 'result' );
$this->getResult()->addValue( null, $this->getModuleName(), $ret );
}
protected function validateLogId( $logid ) {
$result = $this->dbr->newSelectQueryBuilder()
->select( 'log_id' )
->from( 'logging' )
->where( [ 'log_id' => $logid ] )
->caller( __METHOD__ )->fetchField();
return (bool)$result;
}
protected function processIndividual( $type, $params, $id ) {
$user = $this->getUser();
$idResult = [ $type => $id ];
// validate the ID
$valid = false;
switch ( $type ) {
case 'rcid':
$valid = RecentChange::newFromId( $id );
// TODO: replace use of PermissionManager
if ( $valid && $this->getPermissionManager()->isBlockedFrom( $user, $valid->getTitle() ) ) {
$idResult['status'] = 'error';
// @phan-suppress-next-line PhanTypeMismatchArgument
$idResult += $this->getErrorFormatter()->formatMessage( ApiMessage::create(
'apierror-blocked',
'blocked',
// @phan-suppress-next-line PhanTypeMismatchArgumentNullable Block is checked and not null
[ 'blockinfo' => $this->getBlockDetails( $user->getBlock() ) ]
) );
return $idResult;
}
break;
case 'revid':
$valid = $this->revisionStore->getRevisionById( $id );
// TODO: replace use of PermissionManager
if (
$valid &&
$this->getPermissionManager()->isBlockedFrom( $user, $valid->getPageAsLinkTarget() )
) {
$idResult['status'] = 'error';
// @phan-suppress-next-line PhanTypeMismatchArgument
$idResult += $this->getErrorFormatter()->formatMessage( ApiMessage::create(
'apierror-blocked',
'blocked',
// @phan-suppress-next-line PhanTypeMismatchArgumentNullable Block is checked and not null
[ 'blockinfo' => $this->getBlockDetails( $user->getBlock() ) ]
) );
return $idResult;
}
break;
case 'logid':
$valid = $this->validateLogId( $id );
break;
}
if ( !$valid ) {
$idResult['status'] = 'error';
// Messages: apierror-nosuchrcid apierror-nosuchrevid apierror-nosuchlogid
$idResult += $this->getErrorFormatter()->formatMessage( [ "apierror-nosuch$type", $id ] );
return $idResult;
}
$status = ChangeTags::updateTagsWithChecks( $params['add'],
$params['remove'],
( $type === 'rcid' ? $id : null ),
( $type === 'revid' ? $id : null ),
( $type === 'logid' ? $id : null ),
null,
$params['reason'],
$this->getAuthority()
);
if ( !$status->isOK() ) {
if ( $status->hasMessage( 'actionthrottledtext' ) ) {
$idResult['status'] = 'skipped';
} else {
$idResult['status'] = 'failure';
$idResult['errors'] = $this->getErrorFormatter()->arrayFromStatus( $status, 'error' );
}
} else {
$idResult['status'] = 'success';
if ( $status->value->logId === null ) {
$idResult['noop'] = true;
} else {
$idResult['actionlogid'] = $status->value->logId;
$idResult['added'] = $status->value->addedTags;
ApiResult::setIndexedTagName( $idResult['added'], 't' );
$idResult['removed'] = $status->value->removedTags;
ApiResult::setIndexedTagName( $idResult['removed'], 't' );
if ( $params['tags'] ) {
$this->changeTagsStore->addTags( $params['tags'], null, null, $status->value->logId );
}
}
}
return $idResult;
}
public function mustBePosted() {
return true;
}
public function isWriteMode() {
return true;
}
public function getAllowedParams() {
return [
'rcid' => [
ParamValidator::PARAM_TYPE => 'integer',
ParamValidator::PARAM_ISMULTI => true,
],
'revid' => [
ParamValidator::PARAM_TYPE => 'integer',
ParamValidator::PARAM_ISMULTI => true,
],
'logid' => [
ParamValidator::PARAM_TYPE => 'integer',
ParamValidator::PARAM_ISMULTI => true,
],
'add' => [
ParamValidator::PARAM_TYPE => 'tags',
ParamValidator::PARAM_ISMULTI => true,
],
'remove' => [
ParamValidator::PARAM_TYPE => 'string',
ParamValidator::PARAM_ISMULTI => true,
],
'reason' => [
ParamValidator::PARAM_TYPE => 'string',
ParamValidator::PARAM_DEFAULT => '',
],
'tags' => [
ParamValidator::PARAM_TYPE => 'tags',
ParamValidator::PARAM_ISMULTI => true,
],
];
}
public function needsToken() {
return 'csrf';
}
protected function getExamplesMessages() {
return [
'action=tag&revid=123&add=vandalism&token=123ABC'
=> 'apihelp-tag-example-rev',
'action=tag&logid=123&remove=spam&reason=Wrongly+applied&token=123ABC'
=> 'apihelp-tag-example-log',
];
}
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tag';
}
}
Back to Directory
File Manager