+ }
+ }
+
+ public static function suppressUserName( $name, $userId ) {
+ $op = '|'; // bitwise OR
+ return self::setUsernameBitfields( $name, $userId, $op );
+ }
+
+ public static function unsuppressUserName( $name, $userId ) {
+ $op = '&'; // bitwise AND
+ return self::setUsernameBitfields( $name, $userId, $op );
+ }
+
+ private static function setUsernameBitfields( $name, $userId, $op ) {
+ if( $op !== '|' && $op !== '&' )
+ return false; // sanity check
+ $dbw = wfGetDB( DB_MASTER );
+ $delUser = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+ $delAction = LogPage::DELETED_ACTION | Revision::DELETED_RESTRICTED;
+ # Normalize user name
+ $userTitle = Title::makeTitleSafe( NS_USER, $name );
+ $userDbKey = $userTitle->getDBKey();
+ # To suppress, we OR the current bitfields with Revision::DELETED_USER
+ # to put a 1 in the username *_deleted bit. To unsuppress we AND the
+ # current bitfields with the inverse of Revision::DELETED_USER. The
+ # username bit is made to 0 (x & 0 = 0), while others are unchanged (x & 1 = x).
+ # The same goes for the sysop-restricted *_deleted bit.
+ if( $op == '&' ) {
+ $delUser = "~{$delUser}";
+ $delAction = "~{$delAction}";
+ }
+ # Hide name from live edits
+ $dbw->update( 'revision', array("rev_deleted = rev_deleted $op $delUser"),
+ array('rev_user' => $userId), __METHOD__ );
+ # Hide name from deleted edits
+ $dbw->update( 'archive', array("ar_deleted = ar_deleted $op $delUser"),
+ array('ar_user_text' => $name), __METHOD__ );
+ # Hide name from logs
+ $dbw->update( 'logging', array("log_deleted = log_deleted $op $delUser"),
+ array('log_user' => $userId, "log_type != 'suppress'"), __METHOD__ );
+ $dbw->update( 'logging', array("log_deleted = log_deleted $op $delAction"),
+ array('log_namespace' => NS_USER, 'log_title' => $userDbKey,
+ "log_type != 'suppress'"), __METHOD__ );
+ # Hide name from RC
+ $dbw->update( 'recentchanges', array("rc_deleted = rc_deleted $op $delUser"),
+ array('rc_user_text' => $name), __METHOD__ );
+ # Hide name from live images
+ $dbw->update( 'oldimage', array("oi_deleted = oi_deleted $op $delUser"),
+ array('oi_user_text' => $name), __METHOD__ );
+ # Hide name from deleted images
+ # WMF - schema change pending
+ # $dbw->update( 'filearchive', array("fa_deleted = fa_deleted $op $delUser"),
+ # array('fa_user_text' => $name), __METHOD__ );
+ # Done!
+ return true;