[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/extensions/Renameuser/specials/ -> SpecialRenameuser.php (source)

   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>&#160;
  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>&#160;
 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>&#160;
 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>&#160;
 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  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1