From eabb13833f8237bcd1ea89c8e0834da8d9ccf9f1 Mon Sep 17 00:00:00 2001 From: Dreamy Jazz Date: Fri, 5 Apr 2024 16:33:24 +0100 Subject: 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 --- includes/api/ApiQuery.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'includes/api') 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 ); -- cgit v1.2.3