diff options
Diffstat (limited to 'includes/api/ApiImport.php')
-rw-r--r-- | includes/api/ApiImport.php | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php new file mode 100644 index 00000000..4b1518bb --- /dev/null +++ b/includes/api/ApiImport.php @@ -0,0 +1,179 @@ +<?php + +/* + * Created on Feb 4, 2009 + * + * API for MediaWiki 1.8+ + * + * Copyright (C) 2009 Roan Kattouw <Firstname>.<Lastname>@home.nl + * + * 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., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +if (!defined('MEDIAWIKI')) { + // Eclipse helper - will be ignored in production + require_once ('ApiBase.php'); +} + +/** + * API module that imports an XML file like Special:Import does + * + * @ingroup API + */ +class ApiImport extends ApiBase { + + public function __construct($main, $action) { + parent :: __construct($main, $action); + } + + public function execute() { + global $wgUser; + if(!$wgUser->isAllowed('import')) + $this->dieUsageMsg(array('cantimport')); + $params = $this->extractRequestParams(); + if(!isset($params['token'])) + $this->dieUsageMsg(array('missingparam', 'token')); + if(!$wgUser->matchEditToken($params['token'])) + $this->dieUsageMsg(array('sessionfailure')); + + $source = null; + $isUpload = false; + if(isset($params['interwikisource'])) + { + if(!isset($params['interwikipage'])) + $this->dieUsageMsg(array('missingparam', 'interwikipage')); + $source = ImportStreamSource::newFromInterwiki( + $params['interwikisource'], + $params['interwikipage'], + $params['fullhistory'], + $params['templates']); + } + else + { + $isUpload = true; + if(!$wgUser->isAllowed('importupload')) + $this->dieUsageMsg(array('cantimport-upload')); + $source = ImportStreamSource::newFromUpload('xml'); + } + if($source instanceof WikiErrorMsg) + $this->dieUsageMsg(array_merge( + array($source->getMessageKey()), + $source->getMessageArgs())); + else if(WikiError::isError($source)) + // This shouldn't happen + $this->dieUsageMsg(array('import-unknownerror', $source->getMessage())); + + $importer = new WikiImporter($source); + if(isset($params['namespace'])) + $importer->setTargetNamespace($params['namespace']); + $reporter = new ApiImportReporter($importer, $isUpload, + $params['interwikisource'], + $params['summary']); + + $result = $importer->doImport(); + if($result instanceof WikiXmlError) + $this->dieUsageMsg(array('import-xml-error', + $result->mLine, + $result->mColumn, + $result->mByte . $result->mContext, + xml_error_string($result->mXmlError))); + else if(WikiError::isError($result)) + // This shouldn't happen + $this->dieUsageMsg(array('import-unknownerror', $result->getMessage())); + $resultData = $reporter->getData(); + $this->getResult()->setIndexedTagName($resultData, 'page'); + $this->getResult()->addValue(null, $this->getModuleName(), $resultData); + } + + public function mustBePosted() { return true; } + + public function isWriteMode() { + return true; + } + + public function getAllowedParams() { + global $wgImportSources; + return array ( + 'token' => null, + 'summary' => null, + 'xml' => null, + 'interwikisource' => array( + ApiBase :: PARAM_TYPE => $wgImportSources + ), + 'interwikipage' => null, + 'fullhistory' => false, + 'templates' => false, + 'namespace' => array( + ApiBase :: PARAM_TYPE => 'namespace' + ) + ); + } + + public function getParamDescription() { + return array ( + 'token' => 'Import token obtained through prop=info', + 'summary' => 'Import summary', + 'xml' => 'Uploaded XML file', + 'interwikisource' => 'For interwiki imports: wiki to import from', + 'interwikipage' => 'For interwiki imports: page to import', + 'fullhistory' => 'For interwiki imports: import the full history, not just the current version', + 'templates' => 'For interwiki imports: import all included templates as well', + 'namespace' => 'For interwiki imports: import to this namespace', + ); + } + + public function getDescription() { + return array ( + 'Import a page from another wiki, or an XML file' + ); + } + + protected function getExamples() { + return array( + 'Import [[meta:Help:Parserfunctions]] to namespace 100 with full history:', + ' api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&namespace=100&fullhistory&token=123ABC', + ); + } + + public function getVersion() { + return __CLASS__ . ': $Id: ApiImport.php 48091 2009-03-06 13:49:44Z catrope $'; + } +} + +/** + * Import reporter for the API + * @ingroup API + */ +class ApiImportReporter extends ImportReporter { + private $mResultArr = array(); + + function reportPage($title, $origTitle, $revisionCount, $successCount) + { + // Add a result entry + $r = array(); + ApiQueryBase::addTitleInfo($r, $title); + $r['revisions'] = intval($successCount); + $this->mResultArr[] = $r; + + // Piggyback on the parent to do the logging + parent::reportPage($title, $origTitle, $revisionCount, $successCount); + } + + function getData() + { + return $this->mResultArr; + } +} |