MediaWiki REL1_32
ApiImport.php
Go to the documentation of this file.
1<?php
28class ApiImport extends ApiBase {
29
30 public function execute() {
32
33 $user = $this->getUser();
35
36 $this->requireMaxOneParameter( $params, 'namespace', 'rootpage' );
37
38 $isUpload = false;
39 if ( isset( $params['interwikisource'] ) ) {
40 if ( !$user->isAllowed( 'import' ) ) {
41 $this->dieWithError( 'apierror-cantimport' );
42 }
43 if ( !isset( $params['interwikipage'] ) ) {
44 $this->dieWithError( [ 'apierror-missingparam', 'interwikipage' ] );
45 }
47 $params['interwikisource'],
48 $params['interwikipage'],
49 $params['fullhistory'],
50 $params['templates']
51 );
52 $usernamePrefix = $params['interwikisource'];
53 } else {
54 $isUpload = true;
55 if ( !$user->isAllowed( 'importupload' ) ) {
56 $this->dieWithError( 'apierror-cantimport-upload' );
57 }
59 $usernamePrefix = (string)$params['interwikiprefix'];
60 if ( $usernamePrefix === '' ) {
61 $encParamName = $this->encodeParamName( 'interwikiprefix' );
62 $this->dieWithError( [ 'apierror-missingparam', $encParamName ] );
63 }
64 }
65 if ( !$source->isOK() ) {
66 $this->dieStatus( $source );
67 }
68
69 // Check if user can add the log entry tags which were requested
70 if ( $params['tags'] ) {
71 $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
72 if ( !$ableToTag->isOK() ) {
73 $this->dieStatus( $ableToTag );
74 }
75 }
76
77 $importer = new WikiImporter( $source->value, $this->getConfig() );
78 if ( isset( $params['namespace'] ) ) {
79 $importer->setTargetNamespace( $params['namespace'] );
80 } elseif ( isset( $params['rootpage'] ) ) {
81 $statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
82 if ( !$statusRootPage->isGood() ) {
83 $this->dieStatus( $statusRootPage );
84 }
85 }
86 $importer->setUsernamePrefix( $usernamePrefix, $params['assignknownusers'] );
87 $reporter = new ApiImportReporter(
88 $importer,
89 $isUpload,
90 $params['interwikisource'],
91 $params['summary']
92 );
93 if ( $params['tags'] ) {
94 $reporter->setChangeTags( $params['tags'] );
95 }
96
97 try {
98 $importer->doImport();
99 } catch ( Exception $e ) {
100 $this->dieWithException( $e, [ 'wrap' => 'apierror-import-unknownerror' ] );
101 }
102
103 $resultData = $reporter->getData();
104 $result = $this->getResult();
105 ApiResult::setIndexedTagName( $resultData, 'page' );
106 $result->addValue( null, $this->getModuleName(), $resultData );
107 }
108
116 public function getAllowedImportSources() {
117 $importSources = $this->getConfig()->get( 'ImportSources' );
118 Hooks::run( 'ImportSources', [ &$importSources ] );
119
120 $result = [];
121 foreach ( $importSources as $key => $value ) {
122 if ( is_int( $key ) ) {
123 $result[] = $value;
124 } else {
125 foreach ( $value as $subproject ) {
126 $result[] = "$key:$subproject";
127 }
128 }
129 }
130 return $result;
131 }
132
133 public function mustBePosted() {
134 return true;
135 }
136
137 public function isWriteMode() {
138 return true;
139 }
140
141 public function getAllowedParams() {
142 return [
143 'summary' => null,
144 'xml' => [
145 ApiBase::PARAM_TYPE => 'upload',
146 ],
147 'interwikiprefix' => [
148 ApiBase::PARAM_TYPE => 'string',
149 ],
150 'interwikisource' => [
152 ],
153 'interwikipage' => null,
154 'fullhistory' => false,
155 'templates' => false,
156 'namespace' => [
157 ApiBase::PARAM_TYPE => 'namespace'
158 ],
159 'assignknownusers' => false,
160 'rootpage' => null,
161 'tags' => [
162 ApiBase::PARAM_TYPE => 'tags',
164 ],
165 ];
166 }
167
168 public function needsToken() {
169 return 'csrf';
170 }
171
172 protected function getExamplesMessages() {
173 return [
174 'action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&' .
175 'namespace=100&fullhistory=&token=123ABC'
176 => 'apihelp-import-example-import',
177 ];
178 }
179
180 public function getHelpUrls() {
181 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Import';
182 }
183}
184
190 private $mResultArr = [];
191
200 public function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
201 // Add a result entry
202 $r = [];
203
204 if ( $title === null ) {
205 # Invalid or non-importable title
206 $r['title'] = $pageInfo['title'];
207 $r['invalid'] = true;
208 } else {
209 ApiQueryBase::addTitleInfo( $r, $title );
210 $r['revisions'] = intval( $successCount );
211 }
212
213 $this->mResultArr[] = $r;
214
215 // Piggyback on the parent to do the logging
216 parent::reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo );
217 }
218
219 public function getData() {
220 return $this->mResultArr;
221 }
222}
This abstract class implements many basic API functions, and is the base of all API classes.
Definition ApiBase.php:37
encodeParamName( $paramName)
This method mangles parameter name based on the prefix supplied to the constructor.
Definition ApiBase.php:748
dieWithError( $msg, $code=null, $data=null, $httpCode=null)
Abort execution with an error.
Definition ApiBase.php:1987
const PARAM_TYPE
(string|string[]) Either an array of allowed value strings, or a string type as described below.
Definition ApiBase.php:87
getResult()
Get the result object.
Definition ApiBase.php:659
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user,...
Definition ApiBase.php:770
requireMaxOneParameter( $params, $required)
Die if more than one of a certain set of parameters is set and not false.
Definition ApiBase.php:939
dieWithException( $exception, array $options=[])
Abort execution with an error derived from an exception.
Definition ApiBase.php:1999
getModuleName()
Get the name of the module being executed by this instance.
Definition ApiBase.php:539
dieStatus(StatusValue $status)
Throw an ApiUsageException based on the Status object.
Definition ApiBase.php:2052
useTransactionalTimeLimit()
Call wfTransactionalTimeLimit() if this request was POSTed.
Definition ApiBase.php:1879
const PARAM_ISMULTI
(boolean) Accept multiple pipe-separated values for this parameter (e.g.
Definition ApiBase.php:51
Import reporter for the API.
reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo)
API module that imports an XML file like Special:Import does.
Definition ApiImport.php:28
execute()
Evaluates the parameters, performs the requested query, and sets up the result.
Definition ApiImport.php:30
needsToken()
Returns the token type this module requires in order to execute.
isWriteMode()
Indicates whether this module requires write mode.
getAllowedParams()
Returns an array of allowed parameters (parameter name) => (default value) or (parameter name) => (ar...
mustBePosted()
Indicates whether this module must be called with a POST request.
getAllowedImportSources()
Returns a list of interwiki prefixes corresponding to each defined import source.
getExamplesMessages()
Returns usage examples for this module.
getHelpUrls()
Return links to more detailed help pages about the module.
static addTitleInfo(&$arr, $title, $prefix='')
Add information (title and namespace) about a Title object to a result array.
static setIndexedTagName(array &$arr, $tag)
Set the tag name for numeric-keyed values in XML format.
Reporting callback.
static newFromInterwiki( $interwiki, $page, $history=false, $templates=false, $pageLinkDepth=0)
static newFromUpload( $fieldname="xmlimport")
XML file reader for the page data importer.
namespace being checked & $result
Definition hooks.txt:2385
This code would result in ircNotify being run twice when an article is and once for brion Hooks can return three possible true was required This is the default since MediaWiki *some string
Definition hooks.txt:181
returning false will NOT prevent logging $e
Definition hooks.txt:2226
$source
$params