diff options
Diffstat (limited to 'includes/specials/SpecialMovepage.php')
-rw-r--r-- | includes/specials/SpecialMovepage.php | 138 |
1 files changed, 100 insertions, 38 deletions
diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php index 8fcf33a9..02197b19 100644 --- a/includes/specials/SpecialMovepage.php +++ b/includes/specials/SpecialMovepage.php @@ -17,7 +17,9 @@ function wfSpecialMovepage( $par = null ) { } $target = isset( $par ) ? $par : $wgRequest->getVal( 'target' ); - $oldTitleText = $wgRequest->getText( 'wpOldTitle', $target ); + + // Yes, the use of getVal() and getText() is wanted, see bug 20365 + $oldTitleText = $wgRequest->getVal( 'wpOldTitle', $target ); $newTitleText = $wgRequest->getText( 'wpNewTitle' ); $oldTitle = Title::newFromText( $oldTitleText ); @@ -56,12 +58,12 @@ function wfSpecialMovepage( $par = null ) { class MovePageForm { var $oldTitle, $newTitle; # Objects var $reason; # Text input - var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect; # Checks + var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared; # Checks private $watch = false; function __construct( $oldTitle, $newTitle ) { - global $wgRequest; + global $wgRequest, $wgUser; $target = isset($par) ? $par : $wgRequest->getVal( 'target' ); $this->oldTitle = $oldTitle; $this->newTitle = $newTitle; @@ -77,7 +79,8 @@ class MovePageForm { } $this->moveSubpages = $wgRequest->getBool( 'wpMovesubpages', false ); $this->deleteAndMove = $wgRequest->getBool( 'wpDeleteAndMove' ) && $wgRequest->getBool( 'wpConfirm' ); - $this->watch = $wgRequest->getCheck( 'wpWatch' ); + $this->moveOverShared = $wgRequest->getBool( 'wpMoveOverSharedFile', false ); + $this->watch = $wgRequest->getCheck( 'wpWatch' ) && $wgUser->isLoggedIn(); } /** @@ -87,11 +90,11 @@ class MovePageForm { * OutputPage::wrapWikiMsg(). */ function showForm( $err ) { - global $wgOut, $wgUser, $wgFixDoubleRedirects; + global $wgOut, $wgUser, $wgContLang, $wgFixDoubleRedirects; $skin = $wgUser->getSkin(); - $oldTitleLink = $skin->makeLinkObj( $this->oldTitle ); + $oldTitleLink = $skin->link( $this->oldTitle ); $wgOut->setPagetitle( wfMsg( 'move-page', $this->oldTitle->getPrefixedText() ) ); $wgOut->setSubtitle( wfMsg( 'move-page-backlink', $oldTitleLink ) ); @@ -128,12 +131,21 @@ class MovePageForm { </tr>"; $err = ''; } else { + if ($this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) { + $wgOut->wrapWikiMsg( "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>", 'moveuserpage-warning' ); + } $wgOut->addWikiMsg( 'movepagetext' ); $movepagebtn = wfMsg( 'movepagebtn' ); $submitVar = 'wpMove'; $confirm = false; } + if ( !empty($err) && $err[0] == 'file-exists-sharedrepo' && $wgUser->isAllowed( 'reupload-shared' ) ) { + $wgOut->addWikiMsg( 'move-over-sharedrepo', $newTitle->getPrefixedText() ); + $submitVar = 'wpMoveOverSharedFile'; + $err = ''; + } + $oldTalk = $this->oldTitle->getTalkPage(); $considerTalk = ( !$this->oldTitle->isTalkPage() && $oldTalk->exists() ); @@ -166,6 +178,22 @@ class MovePageForm { } } + if ( $this->oldTitle->isProtected( 'move' ) ) { + # Is the title semi-protected? + if ( $this->oldTitle->isSemiProtected( 'move' ) ) { + $noticeMsg = 'semiprotectedpagemovewarning'; + $classes[] = 'mw-textarea-sprotected'; + } else { + # Then it must be protected based on static groups (regular) + $noticeMsg = 'protectedpagemovewarning'; + $classes[] = 'mw-textarea-protected'; + } + $wgOut->addHTML( "<div class='mw-warning-with-logexcerpt'>\n" ); + $wgOut->addWikiMsg( $noticeMsg ); + LogEventsList::showLogExtract( $wgOut, 'protect', $this->oldTitle->getPrefixedText(), '', array( 'lim' => 1 ) ); + $wgOut->addHTML( "</div>\n" ); + } + $wgOut->addHTML( Xml::openElement( 'form', array( 'method' => 'post', 'action' => $titleObj->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) . Xml::openElement( 'fieldset' ) . @@ -184,7 +212,7 @@ class MovePageForm { Xml::label( wfMsg( 'newtitle' ), 'wpNewTitle' ) . "</td> <td class='mw-input'>" . - Xml::input( 'wpNewTitle', 40, $newTitle->getPrefixedText(), array( 'type' => 'text', 'id' => 'wpNewTitle' ) ) . + Xml::input( 'wpNewTitle', 40, $wgContLang->recodeForEdit( $newTitle->getPrefixedText() ), array( 'type' => 'text', 'id' => 'wpNewTitle' ) ) . Xml::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) . "</td> </tr> @@ -193,7 +221,8 @@ class MovePageForm { Xml::label( wfMsg( 'movereason' ), 'wpReason' ) . "</td> <td class='mw-input'>" . - Xml::tags( 'textarea', array( 'name' => 'wpReason', 'id' => 'wpReason', 'cols' => 60, 'rows' => 2 ), htmlspecialchars( $this->reason ) ) . + Html::element( 'textarea', array( 'name' => 'wpReason', 'id' => 'wpReason', 'cols' => 60, 'rows' => 2, + 'maxlength' => 200 ), $this->reason ) . "</td> </tr>" ); @@ -242,34 +271,43 @@ class MovePageForm { <tr> <td></td> <td class=\"mw-input\">" . - Xml::checkLabel( wfMsgExt( + Xml::check( + 'wpMovesubpages', + # Don't check the box if we only have talk subpages to + # move and we aren't moving the talk page. + $this->moveSubpages && ($this->oldTitle->hasSubpages() || $this->moveTalk), + array( 'id' => 'wpMovesubpages' ) + ) . ' ' . + Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ), + wfMsgExt( ( $this->oldTitle->hasSubpages() ? 'move-subpages' : 'move-talk-subpages' ), - array( 'parsemag' ), + array( 'parseinline' ), $wgLang->formatNum( $wgMaximumMovedPages ), # $2 to allow use of PLURAL in message. $wgMaximumMovedPages - ), - 'wpMovesubpages', 'wpMovesubpages', - # Don't check the box if we only have talk subpages to - # move and we aren't moving the talk page. - $this->moveSubpages && ($this->oldTitle->hasSubpages() || $this->moveTalk) + ) ) . "</td> </tr>" ); } - $watchChecked = $this->watch || $wgUser->getBoolOption( 'watchmoves' ) - || $this->oldTitle->userIsWatching(); - $wgOut->addHTML( " + $watchChecked = $wgUser->isLoggedIn() && ($this->watch || $wgUser->getBoolOption( 'watchmoves' ) + || $this->oldTitle->userIsWatching()); + # Don't allow watching if user is not logged in + if( $wgUser->isLoggedIn() ) { + $wgOut->addHTML( " <tr> <td></td> <td class='mw-input'>" . Xml::checkLabel( wfMsg( 'move-watch' ), 'wpWatch', 'watch', $watchChecked ) . "</td> - </tr> + </tr>"); + } + + $wgOut->addHTML( " {$confirm} <tr> <td> </td> @@ -329,12 +367,24 @@ class MovePageForm { return; } + # Show a warning if the target file exists on a shared repo + if ( $nt->getNamespace() == NS_FILE + && !( $this->moveOverShared && $wgUser->isAllowed( 'reupload-shared' ) ) + && !RepoGroup::singleton()->getLocalRepo()->findFile( $nt ) + && wfFindFile( $nt ) ) + { + $this->showForm( array('file-exists-sharedrepo') ); + return; + + } + if ( $wgUser->isAllowed( 'suppressredirect' ) ) { $createRedirect = $this->leaveRedirect; } else { $createRedirect = true; } + # Do the actual move. $error = $ot->moveTo( $nt, true, $this->reason, $createRedirect ); if ( $error !== true ) { # FIXME: show all the errors in a list, not just the first one @@ -393,7 +443,7 @@ class MovePageForm { ) ) ) { $conds = array( - 'page_title LIKE '.$dbr->addQuotes( $dbr->escapeLike( $ot->getDBkey() ) . '/%' ) + 'page_title' . $dbr->buildLike( $ot->getDBkey() . '/', $dbr->anyString() ) .' OR page_title = ' . $dbr->addQuotes( $ot->getDBkey() ) ); $conds['page_namespace'] = array(); @@ -406,7 +456,7 @@ class MovePageForm { } elseif( $this->moveTalk ) { $conds = array( 'page_namespace' => $ot->getTalkPage()->getNamespace(), - 'page_title' => $ot->getDBKey() + 'page_title' => $ot->getDBkey() ); } else { # Skip the query @@ -428,15 +478,15 @@ class MovePageForm { $skin = $wgUser->getSkin(); $count = 1; foreach( $extraPages as $oldSubpage ) { - if( $oldSubpage->getArticleId() == $ot->getArticleId() ) { + if( $ot->equals( $oldSubpage ) ) { # Already did this one. continue; } $newPageName = preg_replace( - '#^'.preg_quote( $ot->getDBKey(), '#' ).'#', - $nt->getDBKey(), - $oldSubpage->getDBKey() + '#^'.preg_quote( $ot->getDBkey(), '#' ).'#', + StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234 + $oldSubpage->getDBkey() ); if( $oldSubpage->isTalkPage() ) { $newNs = $nt->getTalkPage()->getNamespace(); @@ -447,7 +497,7 @@ class MovePageForm { # be longer than 255 characters. $newSubpage = Title::makeTitleSafe( $newNs, $newPageName ); if( !$newSubpage ) { - $oldLink = $skin->makeKnownLinkObj( $oldSubpage ); + $oldLink = $skin->linkKnown( $oldSubpage ); $extraOutput []= wfMsgHtml( 'movepage-page-unmoved', $oldLink, htmlspecialchars(Title::makeName( $newNs, $newPageName ))); continue; @@ -455,7 +505,7 @@ class MovePageForm { # This was copy-pasted from Renameuser, bleh. if ( $newSubpage->exists() && !$oldSubpage->isValidMoveTarget( $newSubpage ) ) { - $link = $skin->makeKnownLinkObj( $newSubpage ); + $link = $skin->linkKnown( $newSubpage ); $extraOutput []= wfMsgHtml( 'movepage-page-exists', $link ); } else { $success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect ); @@ -463,21 +513,26 @@ class MovePageForm { if ( $this->fixRedirects ) { DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage ); } - $oldLink = $skin->makeKnownLinkObj( $oldSubpage, '', 'redirect=no' ); - $newLink = $skin->makeKnownLinkObj( $newSubpage ); + $oldLink = $skin->linkKnown( + $oldSubpage, + null, + array(), + array( 'redirect' => 'no' ) + ); + $newLink = $skin->linkKnown( $newSubpage ); $extraOutput []= wfMsgHtml( 'movepage-page-moved', $oldLink, $newLink ); + ++$count; + if( $count >= $wgMaximumMovedPages ) { + $extraOutput []= wfMsgExt( 'movepage-max-pages', array( 'parsemag', 'escape' ), $wgLang->formatNum( $wgMaximumMovedPages ) ); + break; + } } else { - $oldLink = $skin->makeKnownLinkObj( $oldSubpage ); - $newLink = $skin->makeLinkObj( $newSubpage ); + $oldLink = $skin->linkKnown( $oldSubpage ); + $newLink = $skin->link( $newSubpage ); $extraOutput []= wfMsgHtml( 'movepage-page-unmoved', $oldLink, $newLink ); } } - ++$count; - if( $count >= $wgMaximumMovedPages ) { - $extraOutput []= wfMsgExt( 'movepage-max-pages', array( 'parsemag', 'escape' ), $wgLang->formatNum( $wgMaximumMovedPages ) ); - break; - } } if( $extraOutput !== array() ) { @@ -485,17 +540,24 @@ class MovePageForm { } # Deal with watches (we don't watch subpages) - if( $this->watch ) { + if( $this->watch && $wgUser->isLoggedIn() ) { $wgUser->addWatch( $ot ); $wgUser->addWatch( $nt ); } else { $wgUser->removeWatch( $ot ); $wgUser->removeWatch( $nt ); } + + # Re-clear the file redirect cache, which may have been polluted by + # parsing in messages above. See CR r56745. + # FIXME: needs a more robust solution inside FileRepo. + if( $ot->getNamespace() == NS_FILE ) { + RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $ot ); + } } function showLogFragment( $title, &$out ) { - $out->addHTML( Xml::element( 'h2', NULL, LogPage::logName( 'move' ) ) ); + $out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'move' ) ) ); LogEventsList::showLogExtract( $out, 'move', $title->getPrefixedText() ); } |