[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * Special page that allows authorised users to rename 5 * user accounts 6 */ 7 class SpecialRenameuser extends SpecialPage { 8 public function __construct() { 9 parent::__construct( 'Renameuser', 'renameuser' ); 10 } 11 12 /** 13 * Show the special page 14 * 15 * @param mixed $par Parameter passed to the page 16 * @throws UserBlockedError|PermissionsError 17 * @return void 18 */ 19 public function execute( $par ) { 20 global $wgContLang, $wgCapitalLinks; 21 22 $this->setHeaders(); 23 24 $out = $this->getOutput(); 25 $out->addWikiMsg( 'renameuser-summary' ); 26 27 $user = $this->getUser(); 28 if ( !$user->isAllowed( 'renameuser' ) ) { 29 throw new PermissionsError( 'renameuser' ); 30 } 31 32 if ( wfReadOnly() ) { 33 $out->readOnlyPage(); 34 return; 35 } 36 37 if( $user->isBlocked() ){ 38 throw new UserBlockedError( $this->getUser()->mBlock ); 39 } 40 41 $request = $this->getRequest(); 42 $showBlockLog = $request->getBool( 'submit-showBlockLog' ); 43 $oldnamePar = trim( str_replace( '_', ' ', $request->getText( 'oldusername', $par ) ) ); 44 $oldusername = Title::makeTitle( NS_USER, $oldnamePar ); 45 // Force uppercase of newusername, otherwise wikis with wgCapitalLinks=false can create lc usernames 46 $newusername = Title::makeTitleSafe( NS_USER, $wgContLang->ucfirst( $request->getText( 'newusername' ) ) ); 47 $oun = is_object( $oldusername ) ? $oldusername->getText() : ''; 48 $nun = is_object( $newusername ) ? $newusername->getText() : ''; 49 $token = $user->getEditToken(); 50 $reason = $request->getText( 'reason' ); 51 52 $move_checked = $request->getBool( 'movepages', !$request->wasPosted()); 53 $suppress_checked = $request->getCheck( 'suppressredirect' ); 54 55 $warnings = array(); 56 if ( $oun && $nun && !$request->getCheck( 'confirmaction' ) ) { 57 wfRunHooks( 'RenameUserWarning', array( $oun, $nun, &$warnings ) ); 58 } 59 60 $out->addHTML( 61 Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getPageTitle()->getLocalUrl(), 'id' => 'renameuser' ) ) . 62 Xml::openElement( 'fieldset' ) . 63 Xml::element( 'legend', null, $this->msg( 'renameuser' )->text() ) . 64 Xml::openElement( 'table', array( 'id' => 'mw-renameuser-table' ) ) . 65 "<tr> 66 <td class='mw-label'>" . 67 Xml::label( $this->msg( 'renameuserold' )->text(), 'oldusername' ) . 68 "</td> 69 <td class='mw-input'>" . 70 Xml::input( 'oldusername', 20, $oun, array( 'type' => 'text', 'tabindex' => '1' ) ) . ' ' . 71 "</td> 72 </tr> 73 <tr> 74 <td class='mw-label'>" . 75 Xml::label( $this->msg( 'renameusernew' )->text(), 'newusername' ) . 76 "</td> 77 <td class='mw-input'>" . 78 Xml::input( 'newusername', 20, $nun, array( 'type' => 'text', 'tabindex' => '2' ) ) . 79 "</td> 80 </tr> 81 <tr> 82 <td class='mw-label'>" . 83 Xml::label( $this->msg( 'renameuserreason' )->text(), 'reason' ) . 84 "</td> 85 <td class='mw-input'>" . 86 Xml::input( 'reason', 40, $reason, array( 'type' => 'text', 'tabindex' => '3', 'maxlength' => 255 ) ) . 87 "</td> 88 </tr>" 89 ); 90 if ( $user->isAllowed( 'move' ) ) { 91 $out->addHTML( " 92 <tr> 93 <td>  94 </td> 95 <td class='mw-input'>" . 96 Xml::checkLabel( $this->msg( 'renameusermove' )->text(), 'movepages', 'movepages', 97 $move_checked, array( 'tabindex' => '4' ) ) . 98 "</td> 99 </tr>" 100 ); 101 102 if ( $user->isAllowed( 'suppressredirect' ) ) { 103 $out->addHTML( " 104 <tr> 105 <td>  106 </td> 107 <td class='mw-input'>" . 108 Xml::checkLabel( 109 $this->msg( 'renameusersuppress' )->text(), 110 'suppressredirect', 111 'suppressredirect', 112 $suppress_checked, 113 array( 'tabindex' => '5' ) 114 ) . 115 "</td> 116 </tr>" 117 ); 118 } 119 } 120 if ( $warnings ) { 121 $warningsHtml = array(); 122 foreach ( $warnings as $warning ) { 123 $warningsHtml[] = is_array( $warning ) ? 124 $this->msg( $warning[0] )->rawParams( array_slice( $warning, 1 ) )->escaped() : 125 $this->msg( $warning )->escaped(); 126 } 127 128 $out->addHTML( " 129 <tr> 130 <td class='mw-label'>" . $this->msg( 'renameuserwarnings' )->escaped() . " 131 </td> 132 <td class='mw-input'>" . 133 '<ul style="color: red; font-weight: bold"><li>' . 134 implode( '</li><li>', $warningsHtml ) . '</li></ul>' . 135 "</td> 136 </tr>" 137 ); 138 $out->addHTML( " 139 <tr> 140 <td>  141 </td> 142 <td class='mw-input'>" . 143 Xml::checkLabel( 144 $this->msg( 'renameuserconfirm' )->text(), 145 'confirmaction', 146 'confirmaction', 147 false, 148 array( 'tabindex' => '6' ) 149 ) . 150 "</td> 151 </tr>" 152 ); 153 } 154 $out->addHTML( " 155 <tr> 156 <td>  157 </td> 158 <td class='mw-submit'>" . 159 Xml::submitButton( 160 $this->msg( 'renameusersubmit' )->text(), 161 array( 162 'name' => 'submit', 163 'tabindex' => '7', 164 'id' => 'submit' 165 ) 166 ) . 167 ' ' . 168 Xml::submitButton( 169 $this->msg( 'renameuser-submit-blocklog' )->text(), 170 array ( 171 'name' => 'submit-showBlockLog', 172 'id' => 'submit-showBlockLog', 173 'tabindex' => '8' 174 ) 175 ) . 176 "</td> 177 </tr>" . 178 Xml::closeElement( 'table' ) . 179 Xml::closeElement( 'fieldset' ) . 180 Html::hidden( 'token', $token ) . 181 Xml::closeElement( 'form' ) . "\n" 182 ); 183 184 // Show block log if requested 185 if ( $showBlockLog && is_object( $oldusername ) ) { 186 $this->showLogExtract( $oldusername, 'block', $out ) ; 187 return; 188 } 189 190 if ( $request->getText( 'token' ) === '' ) { 191 # They probably haven't even submitted the form, so don't go further. 192 return; 193 } elseif ( $warnings ) { 194 # Let user read warnings 195 return; 196 } elseif ( !$request->wasPosted() || !$user->matchEditToken( $request->getVal( 'token' ) ) ) { 197 $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 'renameuser-error-request' ); 198 return; 199 } elseif ( !is_object( $oldusername ) ) { 200 $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 201 array( 'renameusererrorinvalid', $request->getText( 'oldusername' ) ) ); 202 return; 203 } elseif ( !is_object( $newusername ) ) { 204 $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 205 array( 'renameusererrorinvalid', $request->getText( 'newusername' ) ) ); 206 return; 207 } elseif ( $oldusername->getText() == $newusername->getText() ) { 208 $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 'renameuser-error-same-user' ); 209 return; 210 } 211 212 // Suppress username validation of old username 213 $olduser = User::newFromName( $oldusername->getText(), false ); 214 $newuser = User::newFromName( $newusername->getText(), 'creatable' ); 215 216 // It won't be an object if for instance "|" is supplied as a value 217 if ( !is_object( $olduser ) ) { 218 $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 219 array( 'renameusererrorinvalid', $oldusername->getText() ) ); 220 return; 221 } 222 if ( !is_object( $newuser ) || !User::isCreatableName( $newuser->getName() ) ) { 223 $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 224 array( 'renameusererrorinvalid', $newusername->getText() ) ); 225 return; 226 } 227 228 // Check for the existence of lowercase oldusername in database. 229 // Until r19631 it was possible to rename a user to a name with first character as lowercase 230 if ( $oldusername->getText() !== $wgContLang->ucfirst( $oldusername->getText() ) ) { 231 // oldusername was entered as lowercase -> check for existence in table 'user' 232 $dbr = wfGetDB( DB_SLAVE ); 233 $uid = $dbr->selectField( 'user', 'user_id', 234 array( 'user_name' => $oldusername->getText() ), 235 __METHOD__ ); 236 if ( $uid === false ) { 237 if ( !$wgCapitalLinks ) { 238 $uid = 0; // We are on a lowercase wiki but lowercase username does not exists 239 } else { 240 // We are on a standard uppercase wiki, use normal 241 $uid = $olduser->idForName(); 242 $oldusername = Title::makeTitleSafe( NS_USER, $olduser->getName() ); 243 } 244 } 245 } else { 246 // oldusername was entered as upperase -> standard procedure 247 $uid = $olduser->idForName(); 248 } 249 250 if ( $uid == 0 ) { 251 $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 252 array( 'renameusererrordoesnotexist', $oldusername->getText() ) ); 253 return; 254 } 255 256 if ( $newuser->idForName() != 0 ) { 257 $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 258 array( 'renameusererrorexists', $newusername->getText() ) ); 259 return; 260 } 261 262 // Always get the edits count, it will be used for the log message 263 $contribs = $olduser->getEditCount(); 264 265 // Give other affected extensions a chance to validate or abort 266 if ( !wfRunHooks( 'RenameUserAbort', array( $uid, $oldusername->getText(), $newusername->getText() ) ) ) { 267 return; 268 } 269 270 // Do the heavy lifting... 271 $rename = new RenameuserSQL( $oldusername->getText(), $newusername->getText(), $uid ); 272 if ( !$rename->rename() ) { 273 return; 274 } 275 276 // If this user is renaming his/herself, make sure that Title::moveTo() 277 // doesn't make a bunch of null move edits under the old name! 278 if ( $user->getId() == $uid ) { 279 $user->setName( $newusername->getText() ); 280 } 281 282 // Log this rename, updated to 1.19+ Log form. 283 // https://www.mediawiki.org/wiki/Logging_to_Special:Log 284 $logEntry = new ManualLogEntry( 'renameuser', 'renameuser' ); 285 $logEntry->setPerformer( $this->getUser() ); 286 $logEntry->setTarget( $oldusername ); 287 $logEntry->setComment( $reason ); 288 $logEntry->setParameters( array( 289 '4::olduser' => $oldusername->getText(), 290 '5::newuser' => $newusername->getText(), 291 '6::edits' => $contribs 292 ) ); 293 $logid = $logEntry->insert(); 294 $logEntry->publish( $logid ); 295 296 // Move any user pages 297 if ( $request->getCheck( 'movepages' ) && $user->isAllowed( 'move' ) ) { 298 $dbr = wfGetDB( DB_SLAVE ); 299 300 $pages = $dbr->select( 301 'page', 302 array( 'page_namespace', 'page_title' ), 303 array( 304 'page_namespace IN (' . NS_USER . ',' . NS_USER_TALK . ')', 305 '(page_title ' . $dbr->buildLike( $oldusername->getDBkey() . '/', $dbr->anyString() ) . 306 ' OR page_title = ' . $dbr->addQuotes( $oldusername->getDBkey() ) . ')' 307 ), 308 __METHOD__ 309 ); 310 311 $suppressRedirect = false; 312 313 if ( $request->getCheck( 'suppressredirect' ) && $user->isAllowed( 'suppressredirect' ) ) { 314 $suppressRedirect = true; 315 } 316 317 $output = ''; 318 foreach ( $pages as $row ) { 319 $oldPage = Title::makeTitleSafe( $row->page_namespace, $row->page_title ); 320 $newPage = Title::makeTitleSafe( $row->page_namespace, 321 preg_replace( '!^[^/]+!', $newusername->getDBkey(), $row->page_title ) ); 322 # Do not autodelete or anything, title must not exist 323 if ( $newPage->exists() && !$oldPage->isValidMoveTarget( $newPage ) ) { 324 $link = Linker::linkKnown( $newPage ); 325 $output .= Html::rawElement( 326 'li', 327 array( 'class' => 'mw-renameuser-pe' ), 328 wfMessage( 'renameuser-page-exists' )->rawParams( $link )->escaped() 329 ); 330 } else { 331 $success = $oldPage->moveTo( 332 $newPage, 333 false, 334 wfMessage( 335 'renameuser-move-log', 336 $oldusername->getText(), 337 $newusername->getText() )->inContentLanguage()->text(), 338 !$suppressRedirect 339 ); 340 if ( $success === true ) { 341 # oldPage is not known in case of redirect suppression 342 $oldLink = Linker::link( $oldPage, null, array(), array( 'redirect' => 'no' ) ); 343 344 # newPage is always known because the move was successful 345 $newLink = Linker::linkKnown( $newPage ); 346 347 $output .= Html::rawElement( 348 'li', 349 array( 'class' => 'mw-renameuser-pm' ), 350 wfMessage( 'renameuser-page-moved' )->rawParams( $oldLink, $newLink )->escaped() 351 ); 352 } else { 353 $oldLink = Linker::linkKnown( $oldPage ); 354 $newLink = Linker::link( $newPage ); 355 $output .= Html::rawElement( 356 'li', array( 'class' => 'mw-renameuser-pu' ), 357 wfMessage( 'renameuser-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped() 358 ); 359 } 360 } 361 } 362 if ( $output ) { 363 $out->addHTML( Html::rawElement( 'ul', array(), $output ) ); 364 } 365 } 366 367 // Output success message stuff :) 368 $out->wrapWikiMsg( "<div class=\"successbox\">$1</div><br style=\"clear:both\" />", 369 array( 'renameusersuccess', $oldusername->getText(), $newusername->getText() ) ); 370 } 371 372 /** 373 * @param $username Title 374 * @param $type 375 * @param $out OutputPage 376 */ 377 function showLogExtract( $username, $type, &$out ) { 378 # Show relevant lines from the logs: 379 $logPage = new LogPage( $type ); 380 $out->addHTML( Xml::element( 'h2', null, $logPage->getName()->text() ) . "\n" ); 381 LogEventsList::showLogExtract( $out, $type, $username->getPrefixedText() ); 382 } 383 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |