diff options
author | Dreamy Jazz <wpgbrown@wikimedia.org> | 2024-04-05 16:33:24 +0100 |
---|---|---|
committer | Dreamy Jazz <wpgbrown@wikimedia.org> | 2024-04-05 16:56:04 +0100 |
commit | eabb13833f8237bcd1ea89c8e0834da8d9ccf9f1 (patch) | |
tree | 4aeaf53c96ed212743a7ef52f3c9a048f649465e /includes/api | |
parent | 40f4502e9c093d70c20194a4750be8569ab82bdc (diff) | |
download | mediawikicore-eabb13833f8237bcd1ea89c8e0834da8d9ccf9f1.tar.gz mediawikicore-eabb13833f8237bcd1ea89c8e0834da8d9ccf9f1.zip |
Define ApiQuery::isWriteMode
Why:
* ApiQueryBase subclasses may define a ::isWriteMode override, as
the API call may need to write to the DB.
** This is the case for the CheckUser extension, where the
'checkuser' API creates a log entry that allows users to audit
usage of the API.
* ApiQuery currently does not define a implementation of
::isWriteMode, which means that the definitions by any class
that extends ApiQueryBase currently do nothing.
* ApiQuery::isWriteMode should be defined and work in a similar
way to ApiQuery::isReadMode, so that subclasses of ApiQueryBase
can have their definitions of ::isWriteMode respected.
What:
* Define ApiQuery::isWriteMode in a similar way to how ApiQuery
::isReadMode is written, but also inspecting the modules that
are used through the 'list' and 'prop' params.
* Add tests for ApiQuery::isWriteMode.
Bug: T361951
Change-Id: Idf1c8f95df58a861404e0c89507c885ec4554793
Diffstat (limited to 'includes/api')
-rw-r--r-- | includes/api/ApiQuery.php | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index b818f49a2dbe..7eff88de99b3 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -992,6 +992,22 @@ class ApiQuery extends ApiBase { return false; } + public function isWriteMode() { + // Ask each module if it requires write mode. If any require write mode this returns true. + $modules = []; + $this->mParams = $this->extractRequestParams(); + $this->instantiateModules( $modules, 'list' ); + $this->instantiateModules( $modules, 'meta' ); + $this->instantiateModules( $modules, 'prop' ); + foreach ( $modules as $module ) { + if ( $module->isWriteMode() ) { + return true; + } + } + + return false; + } + protected function getExamplesMessages() { $title = Title::newMainPage()->getPrefixedText(); $mp = rawurlencode( $title ); |