* http://www.mediawiki.org/ * * 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 * * @package MediaWiki * @subpackage SpecialPage */ require_once( 'WikiError.php' ); /** * Constructor */ function wfSpecialImport( $page = '' ) { global $wgOut, $wgLang, $wgRequest, $wgTitle; global $wgImportSources; ### # $wgOut->addWikiText( "Special:Import is not ready for this beta release, sorry." ); # return; ### if( $wgRequest->wasPosted() && $wgRequest->getVal( 'action' ) == 'submit') { $importer = new WikiImporter(); switch( $wgRequest->getVal( "source" ) ) { case "upload": $result = $importer->setupFromUpload( "xmlimport" ); break; case "interwiki": $result = $importer->setupFromInterwiki( $wgRequest->getVal( "interwiki" ), $wgRequest->getText( "frompage" ) ); break; default: $result = new WikiError( "Unknown import source type" ); } if( WikiError::isError( $result ) ) { $wgOut->addWikiText( htmlspecialchars( $result->toString() ) ); } else { $importer->setRevisionHandler( "wfImportOldRevision" ); $result = $importer->doImport(); if( WikiError::isError( $result ) ) { $wgOut->addHTML( "
" . wfMsg( "importfailed", htmlspecialchars( $result->toString() ) ) . "
" ); } else { # Success! $wgOut->addHTML( "" . wfMsg( "importsuccess" ) . "
" ); } } } $wgOut->addWikiText( "" . wfMsg( "importtext" ) . "
" ); $action = $wgTitle->escapeLocalUrl( 'action=submit' ); $wgOut->addHTML( " " ); if( !empty( $wgImportSources ) ) { $wgOut->addHTML( " " ); } } function wfImportOldRevision( &$revision ) { $dbw =& wfGetDB( DB_MASTER ); $dbw->deadlockLoop( array( &$revision, 'importOldRevision' ) ); } /** * * @package MediaWiki * @subpackage SpecialPage */ class WikiRevision { var $title = NULL; var $timestamp = "20010115000000"; var $user = 0; var $user_text = ""; var $text = ""; var $comment = ""; function setTitle( $text ) { $this->title = Title::newFromText( $text ); } function setTimestamp( $ts ) { # 2003-08-05T18:30:02Z $this->timestamp = preg_replace( '/^(....)-(..)-(..)T(..):(..):(..)Z$/', '$1$2$3$4$5$6', $ts ); } function setUsername( $user ) { $this->user_text = $user; } function setUserIP( $ip ) { $this->user_text = $ip; } function setText( $text ) { $this->text = $text; } function setComment( $text ) { $this->comment = $text; } function getTitle() { return $this->title; } function getTimestamp() { return $this->timestamp; } function getUser() { return $this->user_text; } function getText() { return $this->text; } function getComment() { return $this->comment; } function importOldRevision() { $fname = "WikiImporter::importOldRevision"; $dbw =& wfGetDB( DB_MASTER ); # Sneak a single revision into place $user = User::newFromName( $this->getUser() ); $article = new Article( $this->title ); $pageId = $article->getId(); if( $pageId == 0 ) { # must create the page... $pageId = $article->insertOn( $dbw ); } # FIXME: Check for exact conflicts # FIXME: Use original rev_id optionally # FIXME: blah blah blah #if( $numrows > 0 ) { # return wfMsg( "importhistoryconflict" ); #} # Insert the row $revision = new Revision( array( 'page' => $pageId, 'text' => $this->getText(), 'comment' => $this->getComment(), 'user' => IntVal( $user->getId() ), 'user_text' => $user->getName(), 'timestamp' => $this->timestamp, 'minor_edit' => 0 ) ); $revId = $revision->insertOn( $dbw ); $article->updateIfNewerOn( $dbw, $revision ); return true; } } /** * * @package MediaWiki * @subpackage SpecialPage */ class WikiImporter { var $mSource = NULL; var $mRevisionHandler = NULL; var $lastfield; function WikiImporter() { $this->setRevisionHandler( array( &$this, "defaultRevisionHandler" ) ); } function throwXmlError( $err ) { $this->debug( "FAILURE: $err" ); } function setupFromFile( $filename ) { $this->mSource = @file_get_contents( $filename ); if( $this->mSource === false ) { return new WikiError( "Couldn't open import file" ); } return true; } function setupFromUpload( $fieldname = "xmlimport" ) { global $wgOut; $upload =& $_FILES[$fieldname]; if( !isset( $upload ) ) { return new WikiErrorMsg( 'importnofile' ); } if( !empty( $upload['error'] ) ) { return new WikiErrorMsg( 'importuploaderror', $upload['error'] ); } $fname = $upload['tmp_name']; if( is_uploaded_file( $fname ) ) { return $this->setupFromFile( $fname ); } else { return new WikiErrorMsg( 'importnofile' ); } } function setupFromURL( $url ) { # fopen-wrappers are normally turned off for security. ini_set( "allow_url_fopen", true ); $ret = $this->setupFromFile( $url ); ini_set( "allow_url_fopen", false ); return $ret; } function setupFromInterwiki( $interwiki, $page ) { $base = Title::getInterwikiLink( $interwiki ); if( empty( $base ) ) { return new WikiError( 'Bad interwiki link' ); } else { $import = wfUrlencode( "Special:Export/$page" ); $url = str_replace( "$1", $import, $base ); $this->notice( "Importing from $url" ); return $this->setupFromURL( $url ); } } # -------------- function doImport() { if( empty( $this->mSource ) ) { return new WikiErrorMsg( "importnotext" ); } $parser = xml_parser_create( "UTF-8" ); # case folding violates XML standard, turn it off xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false ); xml_set_object( $parser, &$this ); xml_set_element_handler( $parser, "in_start", "" ); if( !xml_parse( $parser, $this->mSource, true ) ) { return new WikiXmlError( $parser ); } xml_parser_free( $parser ); return true; } function debug( $data ) { #$this->notice( "DEBUG: $data\n" ); } function notice( $data ) { global $wgCommandLineMode; if( $wgCommandLineMode ) { print "$data\n"; } else { global $wgOut; $wgOut->addHTML( "