'disableaccount',
'edit',
'editinterface',
- 'editusercssjs',
+ 'editusercssjs', #deprecated
+ 'editusercss',
+ 'edituserjs',
'hideuser',
'import',
'importupload',
'ipblock-exempt',
'markbotedits',
+ 'mergehistory',
'minoredit',
'move',
'movefile',
var $mFrom;
/**
- * Lazy-initialized variables, invalidated with clearInstanceCache
+ * Lazy-initialized variables, invalidated with clearInstanceCache
*/
- var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mSkin, $mRights,
- $mBlockreason, $mBlock, $mEffectiveGroups, $mBlockedGlobally,
+ var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mRights,
+ $mBlockreason, $mEffectiveGroups, $mBlockedGlobally,
$mLocked, $mHideName, $mOptions;
+ /**
+ * @var Skin
+ */
+ var $mSkin;
+
+ /**
+ * @var Block
+ */
+ var $mBlock;
+
static $idCacheByName = array();
/**
$this->clearInstanceCache( 'defaults' );
}
+ function __toString(){
+ return $this->getName();
+ }
+
/**
* Load the user table data for this object from the source given by mFrom.
*/
return $result;
}
+ /**
+ * Reset the cache used in idFromName(). For use in tests.
+ */
+ public static function resetIdByNameCache() {
+ self::$idCacheByName = array();
+ }
+
/**
* Does the string match an anonymous IPv4 address?
*
return false;
}
- if( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
- wfDebugLog( 'username', __METHOD__ .
- ": '$name' invalid due to wgInvalidUsernameCharacters" );
- return false;
+ // Preg yells if you try to give it an empty string
+ if( $wgInvalidUsernameCharacters !== '' ) {
+ if( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
+ wfDebugLog( 'username', __METHOD__ .
+ ": '$name' invalid due to wgInvalidUsernameCharacters" );
+ return false;
+ }
}
return self::isUsableName( $name );
* Given unvalidated password input, return error message on failure.
*
* @param $password String Desired password
- * @return mixed: true on success, string of error message on failure
+ * @return mixed: true on success, string or array of error message on failure
*/
function getPasswordValidity( $password ) {
global $wgMinimalPasswordLength, $wgContLang;
-
+
static $blockedLogins = array(
'Useruser' => 'Passpass', 'Useruser1' => 'Passpass1', # r75589
'Apitestsysop' => 'testpass', 'Apitestuser' => 'testpass' # r75605
/**
* Does a string look like an e-mail address?
*
- * There used to be a regular expression here, it got removed because it
- * rejected valid addresses. Actually just check if there is '@' somewhere
- * in the given address.
+ * This validates an email address using an HTML5 specification found at:
+ * http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
+ * Which as of 2011-01-24 says:
+ *
+ * A valid e-mail address is a string that matches the ABNF production
+ * 1*( atext / "." ) "@" ldh-str *( "." ldh-str ) where atext is defined
+ * in RFC 5322 section 3.2.3, and ldh-str is defined in RFC 1034 section
+ * 3.5.
*
- * @todo Check for RFC 2822 compilance (bug 959)
+ * This function is an implementation of the specification as requested in
+ * bug 22449.
+ *
+ * Client-side forms will use the same standard validation rules via JS or
+ * HTML 5 validation; additional restrictions can be enforced server-side
+ * by extensions via the 'isValidEmailAddr' hook.
+ *
+ * Note that this validation doesn't 100% match RFC 2822, but is believed
+ * to be liberal enough for wide use. Some invalid addresses will still
+ * pass validation here.
*
* @param $addr String E-mail address
* @return Bool
if( !wfRunHooks( 'isValidEmailAddr', array( $addr, &$result ) ) ) {
return $result;
}
- $rfc5322_atext = "a-z0-9!#$%&'*+-\/=?^_`{|}~" ;
- $rfc1034_ldh_str = "a-z0-9-" ;
+
+ // Please note strings below are enclosed in brackets [], this make the
+ // hyphen "-" a range indicator. Hence it is double backslashed below.
+ // See bug 26948
+ $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~" ;
+ $rfc1034_ldh_str = "a-z0-9\\-" ;
$HTML5_email_regexp = "/
^ # start of string
[$rfc5322_atext\\.]+ # user part which is liberal :p
@ # 'apostrophe'
[$rfc1034_ldh_str]+ # First domain part
- (\\.[$rfc1034_ldh_str]+)+ # Following part prefixed with a dot
+ (\\.[$rfc1034_ldh_str]+)* # Following part prefixed with a dot
$ # End of string
/ix" ; // case Insensitive, eXtended
}
}
- if ( $wgRequest->getCookie( 'UserID' ) !== null ) {
- $sId = intval( $wgRequest->getCookie( 'UserID' ) );
- if( isset( $_SESSION['wsUserID'] ) && $sId != $_SESSION['wsUserID'] ) {
+ $cookieId = $wgRequest->getCookie( 'UserID' );
+ $sessId = $wgRequest->getSessionData( 'wsUserID' );
+
+ if ( $cookieId !== null ) {
+ $sId = intval( $cookieId );
+ if( $sessId !== null && $cookieId != $sessId ) {
$this->loadDefaults(); // Possible collision!
- wfDebugLog( 'loginSessions', "Session user ID ({$_SESSION['wsUserID']}) and
+ wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
cookie user ID ($sId) don't match!" );
return false;
}
- $_SESSION['wsUserID'] = $sId;
- } else if ( isset( $_SESSION['wsUserID'] ) ) {
- if ( $_SESSION['wsUserID'] != 0 ) {
- $sId = $_SESSION['wsUserID'];
- } else {
- $this->loadDefaults();
- return false;
- }
+ $wgRequest->setSessionData( 'wsUserID', $sId );
+ } else if ( $sessId !== null && $sessId != 0 ) {
+ $sId = $sessId;
} else {
$this->loadDefaults();
return false;
}
- if ( isset( $_SESSION['wsUserName'] ) ) {
- $sName = $_SESSION['wsUserName'];
- } else if ( $wgRequest->getCookie('UserName') !== null ) {
- $sName = $wgRequest->getCookie('UserName');
- $_SESSION['wsUserName'] = $sName;
+ if ( $wgRequest->getSessionData( 'wsUserName' ) !== null ) {
+ $sName = $wgRequest->getSessionData( 'wsUserName' );
+ } else if ( $wgRequest->getCookie( 'UserName' ) !== null ) {
+ $sName = $wgRequest->getCookie( 'UserName' );
+ $wgRequest->setSessionData( 'wsUserName', $sName );
} else {
$this->loadDefaults();
return false;
return false;
}
- if ( isset( $_SESSION['wsToken'] ) ) {
- $passwordCorrect = $_SESSION['wsToken'] == $this->mToken;
+ if ( $wgRequest->getSessionData( 'wsToken' ) !== null ) {
+ $passwordCorrect = $this->mToken == $wgRequest->getSessionData( 'wsToken' );
$from = 'session';
} else if ( $wgRequest->getCookie( 'Token' ) !== null ) {
$passwordCorrect = $this->mToken == $wgRequest->getCookie( 'Token' );
}
if ( ( $sName == $this->mName ) && $passwordCorrect ) {
- $_SESSION['wsToken'] = $this->mToken;
+ $wgRequest->setSessionData( 'wsToken', $this->mToken );
wfDebug( "User: logged in from $from\n" );
return true;
} else {
$this->mHideName = 0;
$this->mAllowUsertalk = 0;
- # Check if we are looking at an IP or a logged-in user
- if ( $this->isIP( $this->getName() ) ) {
- $ip = $this->getName();
+ # We only need to worry about passing the IP address to the Block generator if the
+ # user is not immune to autoblocks/hardblocks, and they are the current user so we
+ # know which IP address they're actually coming from
+ if ( !$this->isAllowed( 'ipblock-exempt' ) && $this->getID() == $wgUser->getID() ) {
+ $ip = wfGetIP();
} else {
- # Check if we are looking at the current user
- # If we don't, and the user is logged in, we don't know about
- # his IP / autoblock status, so ignore autoblock of current user's IP
- if ( $this->getID() != $wgUser->getID() ) {
- $ip = '';
- } else {
- # Get IP of current user
- $ip = wfGetIP();
- }
- }
-
- if ( $this->isAllowed( 'ipblock-exempt' ) ) {
- # Exempt from all types of IP-block
- $ip = '';
+ $ip = null;
}
# User/IP blocking
- $this->mBlock = new Block();
- $this->mBlock->fromMaster( !$bFromSlave );
- if ( $this->mBlock->load( $ip , $this->mId ) ) {
+ $this->mBlock = Block::newFromTarget( $this->getName(), $ip, !$bFromSlave );
+ if ( $this->mBlock instanceof Block ) {
wfDebug( __METHOD__ . ": Found block.\n" );
- $this->mBlockedby = $this->mBlock->mBy;
- if( $this->mBlockedby == 0 )
- $this->mBlockedby = $this->mBlock->mByName;
+ $this->mBlockedby = $this->mBlock->getBlocker()->getName();
$this->mBlockreason = $this->mBlock->mReason;
$this->mHideName = $this->mBlock->mHideName;
- $this->mAllowUsertalk = $this->mBlock->mAllowUsertalk;
+ $this->mAllowUsertalk = !$this->mBlock->prevents( 'editownusertalk' );
if ( $this->isLoggedIn() && $wgUser->getID() == $this->getID() ) {
$this->spreadBlock();
}
- } else {
- // Bug 13611: don't remove mBlock here, to allow account creation blocks to
- // apply to users. Note that the existence of $this->mBlock is not used to
- // check for edit blocks, $this->mBlockedby is instead.
}
# Proxy blocking
*/
function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
$this->getBlockedStatus( $bFromSlave );
- return $this->mBlockedby !== 0;
+ return $this->mBlock instanceof Block && $this->mBlock->prevents( 'edit' );
}
/**
*/
function getBlockId() {
$this->getBlockedStatus();
- return ( $this->mBlock ? $this->mBlock->mId : false );
+ return ( $this->mBlock ? $this->mBlock->getId() : false );
}
/**
* @return Int The user's ID; 0 if the user is anonymous or nonexistent
*/
function getId() {
- if( $this->mId === null and $this->mName !== null
- and User::isIP( $this->mName ) ) {
+ if( $this->mId === null && $this->mName !== null
+ && User::isIP( $this->mName ) ) {
// Special case, we know the user is anonymous
return 0;
} elseif( $this->mId === null ) {
if( !$this->isValidPassword( $str ) ) {
global $wgMinimalPasswordLength;
$valid = $this->getPasswordValidity( $str );
- throw new PasswordError( wfMsgExt( $valid, array( 'parsemag' ),
- $wgMinimalPasswordLength ) );
+ if ( is_array( $valid ) ) {
+ $message = array_shift( $valid );
+ $params = $valid;
+ } else {
+ $message = $valid;
+ $params = array( $wgMinimalPasswordLength );
+ }
+ throw new PasswordError( wfMsgExt( $message, array( 'parsemag' ), $params ) );
}
}
*
* @param $oname String The option to check
* @param $defaultOverride String A default value returned if the option does not exist
+ * @param $ignoreHidden Bool = whether to ignore the effects of $wgHiddenPrefs
* @return String User's current value for the option
* @see getBoolOption()
* @see getIntOption()
*/
- function getOption( $oname, $defaultOverride = null ) {
+ function getOption( $oname, $defaultOverride = null, $ignoreHidden = false ) {
+ global $wgHiddenPrefs;
$this->loadOptions();
if ( is_null( $this->mOptions ) ) {
$this->mOptions = User::getDefaultOptions();
}
+ # We want 'disabled' preferences to always behave as the default value for
+ # users, even if they have set the option explicitly in their settings (ie they
+ # set it, and then it was disabled removing their ability to change it). But
+ # we don't want to erase the preferences in the database in case the preference
+ # is re-enabled again. So don't touch $mOptions, just override the returned value
+ if( in_array( $oname, $wgHiddenPrefs ) && !$ignoreHidden ){
+ return self::getDefaultOption( $oname );
+ }
+
if ( array_key_exists( $oname, $this->mOptions ) ) {
return $this->mOptions[$oname];
} else {
* @return array
*/
public function getOptions() {
+ global $wgHiddenPrefs;
$this->loadOptions();
- return $this->mOptions;
+ $options = $this->mOptions;
+
+ # We want 'disabled' preferences to always behave as the default value for
+ # users, even if they have set the option explicitly in their settings (ie they
+ # set it, and then it was disabled removing their ability to change it). But
+ # we don't want to erase the preferences in the database in case the preference
+ # is re-enabled again. So don't touch $mOptions, just override the returned value
+ foreach( $wgHiddenPrefs as $pref ){
+ $default = self::getDefaultOption( $pref );
+ if( $default !== null ){
+ $options[$pref] = $default;
+ }
+ }
+
+ return $options;
}
/**
* Reset all options to the site defaults
*/
function resetOptions() {
- $this->mOptions = User::getDefaultOptions();
+ $this->mOptions = self::getDefaultOptions();
}
/**
* @param $group String Name of the group to add
*/
function addGroup( $group ) {
- $dbw = wfGetDB( DB_MASTER );
- if( $this->getId() ) {
- $dbw->insert( 'user_groups',
- array(
- 'ug_user' => $this->getID(),
- 'ug_group' => $group,
- ),
- __METHOD__,
- array( 'IGNORE' ) );
+ if( wfRunHooks( 'UserAddGroup', array( &$this, &$group ) ) ) {
+ $dbw = wfGetDB( DB_MASTER );
+ if( $this->getId() ) {
+ $dbw->insert( 'user_groups',
+ array(
+ 'ug_user' => $this->getID(),
+ 'ug_group' => $group,
+ ),
+ __METHOD__,
+ array( 'IGNORE' ) );
+ }
}
-
$this->loadGroups();
$this->mGroups[] = $group;
$this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
*/
function removeGroup( $group ) {
$this->load();
- $dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'user_groups',
- array(
- 'ug_user' => $this->getID(),
- 'ug_group' => $group,
- ), __METHOD__ );
-
+ if( wfRunHooks( 'UserRemoveGroup', array( &$this, &$group ) ) ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'user_groups',
+ array(
+ 'ug_user' => $this->getID(),
+ 'ug_group' => $group,
+ ), __METHOD__ );
+ }
$this->loadGroups();
$this->mGroups = array_diff( $this->mGroups, array( $group ) );
$this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
/**
* Check if user is allowed to access a feature / make an action
- * @param $action String action to be checked
- * @return Boolean: True if action is allowed, else false
+ * @param varargs String permissions to test
+ * @return Boolean: True if user is allowed to perform *any* of the given actions
+ */
+ public function isAllowedAny( /*...*/ ){
+ $permissions = func_get_args();
+ foreach( $permissions as $permission ){
+ if( $this->isAllowed( $permission ) ){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param varargs String
+ * @return bool True if the user is allowed to perform *all* of the given actions
+ */
+ public function isAllowedAll( /*...*/ ){
+ $permissions = func_get_args();
+ foreach( $permissions as $permission ){
+ if( !$this->isAllowed( $permission ) ){
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Internal mechanics of testing a permission
+ * @param $action String
+ * @return bool
*/
- function isAllowed( $action = '' ) {
+ public function isAllowed( $action = '' ) {
if ( $action === '' ) {
return true; // In the spirit of DWIM
}
*/
public function useRCPatrol() {
global $wgUseRCPatrol;
- return( $wgUseRCPatrol && ( $this->isAllowed( 'patrol' ) || $this->isAllowed( 'patrolmarks' ) ) );
+ return $wgUseRCPatrol && $this->isAllowedAny( 'patrol', 'patrolmarks' );
}
/**
*/
public function useNPPatrol() {
global $wgUseRCPatrol, $wgUseNPPatrol;
- return( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowed( 'patrol' ) || $this->isAllowed( 'patrolmarks' ) ) );
+ return( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) ) );
}
/**
* @todo: FIXME : need to check the old failback system [AV]
*/
function getSkin( $t = null ) {
- if ( $t ) {
+ if( !$this->mSkin ) {
+ global $wgOut;
+ $this->mSkin = $this->createSkinObject();
+ $this->mSkin->setTitle( $wgOut->getTitle() );
+ }
+ if ( $t && ( !$this->mSkin->getTitle() || !$t->equals( $this->mSkin->getTitle() ) ) ) {
$skin = $this->createSkinObject();
$skin->setTitle( $t );
return $skin;
} else {
- if ( !$this->mSkin ) {
- $this->mSkin = $this->createSkinObject();
- }
-
- if ( !$this->mSkin->getTitle() ) {
- global $wgOut;
- $t = $wgOut->getTitle();
- $this->mSkin->setTitle($t);
- }
-
return $this->mSkin;
}
}
/**
* Set the default cookies for this session on the user's client.
+ *
+ * @param $request WebRequest object to use; $wgRequest will be used if null
+ * is passed.
*/
- function setCookies() {
+ function setCookies( $request = null ) {
+ if ( $request === null ) {
+ global $wgRequest;
+ $request = $wgRequest;
+ }
+
$this->load();
if ( 0 == $this->mId ) return;
$session = array(
}
wfRunHooks( 'UserSetCookies', array( $this, &$session, &$cookies ) );
- #check for null, since the hook could cause a null value
- if ( !is_null( $session ) && isset( $_SESSION ) ){
- $_SESSION = $session + $_SESSION;
+
+ foreach ( $session as $name => $value ) {
+ $request->setSessionData( $name, $value );
}
foreach ( $cookies as $name => $value ) {
if ( $value === false ) {
* @see logout()
*/
function doLogout() {
+ global $wgRequest;
+
$this->clearInstanceCache( 'defaults' );
- $_SESSION['wsUserID'] = 0;
+ $wgRequest->setSessionData( 'wsUserID', 0 );
$this->clearCookie( 'UserID' );
$this->clearCookie( 'Token' );
return;
}
- $userblock = Block::newFromDB( '', $this->mId );
+ $userblock = Block::newFromTarget( $this->getName() );
if ( !$userblock ) {
return;
}
* which will give them a chance to modify this key based on their own
* settings.
*
- * @deprecated @since 1.17 use the ParserOptions object to get the relevant options
+ * @deprecated since 1.17 use the ParserOptions object to get the relevant options
* @return String Page rendering hash
*/
function getPageRenderingHash() {
/**
* Get whether the user is explicitly blocked from account creation.
- * @return Bool
+ * @return Bool|Block
*/
function isBlockedFromCreateAccount() {
$this->getBlockedStatus();
- return $this->mBlock && $this->mBlock->mCreateAccount;
+ if( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ){
+ return $this->mBlock;
+ }
+
+ # bug 13611: if the IP address the user is trying to create an account from is
+ # blocked with createaccount disabled, prevent new account creation there even
+ # when the user is logged in
+ static $accBlock = false;
+ if( $accBlock === false ){
+ $accBlock = Block::newFromTarget( null, wfGetIP() );
+ }
+ return $accBlock instanceof Block && $accBlock->prevents( 'createaccount' )
+ ? $accBlock
+ : false;
}
/**
*/
function isBlockedFromEmailuser() {
$this->getBlockedStatus();
- return $this->mBlock && $this->mBlock->mBlockEmail;
+ return $this->mBlock && $this->mBlock->prevents( 'sendemail' );
}
/**
* @return Boolean: True if the given password is correct, otherwise False.
*/
function checkPassword( $password ) {
- global $wgAuth;
+ global $wgAuth, $wgLegacyEncoding;
$this->load();
// Even though we stop people from creating passwords that
}
if ( self::comparePasswords( $this->mPassword, $password, $this->mId ) ) {
return true;
- } elseif ( function_exists( 'iconv' ) ) {
+ } elseif ( $wgLegacyEncoding ) {
# Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
# Check for this with iconv
$cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
- if ( self::comparePasswords( $this->mPassword, $cp1252Password, $this->mId ) ) {
+ if ( $cp1252Password != $password &&
+ self::comparePasswords( $this->mPassword, $cp1252Password, $this->mId ) )
+ {
return true;
}
}
* submission.
*
* @param $salt String|Array of Strings Optional function-specific data for hashing
+ * @param $request WebRequest object to use or null to use $wgRequest
* @return String The new edit token
*/
- function editToken( $salt = '' ) {
+ function editToken( $salt = '', $request = null ) {
+ if ( $request == null ) {
+ global $wgRequest;
+ $request = $wgRequest;
+ }
+
if ( $this->isAnon() ) {
return EDIT_TOKEN_SUFFIX;
} else {
- if( !isset( $_SESSION['wsEditToken'] ) ) {
+ $token = $request->getSessionData( 'wsEditToken' );
+ if ( $token === null ) {
$token = self::generateToken();
- $_SESSION['wsEditToken'] = $token;
- } else {
- $token = $_SESSION['wsEditToken'];
+ $request->setSessionData( 'wsEditToken', $token );
}
if( is_array( $salt ) ) {
$salt = implode( '|', $salt );
*
* @param $val String Input value to compare
* @param $salt String Optional function-specific data for hashing
+ * @param $request WebRequest object to use or null to use $wgRequest
* @return Boolean: Whether the token matches
*/
- function matchEditToken( $val, $salt = '' ) {
- $sessionToken = $this->editToken( $salt );
+ function matchEditToken( $val, $salt = '', $request = null ) {
+ $sessionToken = $this->editToken( $salt, $request );
if ( $val != $sessionToken ) {
wfDebug( "User::matchEditToken: broken session data\n" );
}
*
* @param $val String Input value to compare
* @param $salt String Optional function-specific data for hashing
+ * @param $request WebRequest object to use or null to use $wgRequest
* @return Boolean: Whether the token matches
*/
- function matchEditTokenNoSuffix( $val, $salt = '' ) {
- $sessionToken = $this->editToken( $salt );
+ function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
+ $sessionToken = $this->editToken( $salt, $request );
return substr( $sessionToken, 0, 32 ) == substr( $val, 0, 32 );
}
* Generate a new e-mail confirmation token and send a confirmation/invalidation
* mail to the user's given address.
*
- * @param $changed Boolean: whether the adress changed
+ * @param $type String: message to send, either "created", "changed" or "set"
* @return Status object
*/
- function sendConfirmationMail( $changed = false ) {
+ function sendConfirmationMail( $type = 'created' ) {
global $wgLang;
$expiration = null; // gets passed-by-ref and defined in next line.
$token = $this->confirmationToken( $expiration );
$invalidateURL = $this->invalidationTokenUrl( $token );
$this->saveSettings();
- $message = $changed ? 'confirmemail_body_changed' : 'confirmemail_body';
+ if ( $type == 'created' || $type === false ) {
+ $message = 'confirmemail_body';
+ } elseif ( $type === true ) {
+ $message = 'confirmemail_body_changed';
+ } else {
+ $message = 'confirmemail_body_' . $type;
+ }
+
return $this->sendMail( wfMsg( 'confirmemail_subject' ),
wfMsg( $message,
wfGetIP(),
* @private
*/
function confirmationToken( &$expiration ) {
+ global $wgUserEmailConfirmationTokenExpiry;
$now = time();
- $expires = $now + 7 * 24 * 60 * 60;
+ $expires = $now + $wgUserEmailConfirmationTokenExpiry;
$expiration = wfTimestamp( TS_MW, $expires );
$token = self::generateToken( $this->mId . $this->mEmail . $expires );
$hash = md5( $token );
* @return String Localized descriptive group name
*/
static function getGroupName( $group ) {
- $key = "group-$group";
- $name = wfMsg( $key );
- return $name == '' || wfEmptyMsg( $key, $name )
- ? $group
- : $name;
+ $msg = wfMessage( "group-$group" );
+ return $msg->isBlank() ? $group : $msg->text();
}
/**
* @return String Localized name for group member
*/
static function getGroupMember( $group ) {
- $key = "group-$group-member";
- $name = wfMsg( $key );
- return $name == '' || wfEmptyMsg( $key, $name )
- ? $group
- : $name;
+ $msg = wfMessage( "group-$group-member" );
+ return $msg->isBlank() ? $group : $msg->text();
}
/**
* @return Title|Bool Title of the page if it exists, false otherwise
*/
static function getGroupPage( $group ) {
- $page = wfMsgForContent( 'grouppage-' . $group );
- if( !wfEmptyMsg( 'grouppage-' . $group, $page ) ) {
- $title = Title::newFromText( $page );
+ $msg = wfMessage( 'grouppage-' . $group )->inContentLanguage();
+ if( $msg->exists() ) {
+ $title = Title::newFromText( $msg->text() );
if( is_object( $title ) )
return $title;
}
static function getRightDescription( $right ) {
$key = "right-$right";
$name = wfMsg( $key );
- return $name == '' || wfEmptyMsg( $key, $name )
+ return $name == '' || wfEmptyMsg( $key )
? $right
: $name;
}
return $ret;
}
-
- /**
- * Format the user message using a hook, a template, or, failing these, a static format.
- * @param $subject String the subject of the message
- * @param $text String the content of the message
- * @param $signature String the signature, if provided.
- */
- static protected function formatUserMessage( $subject, $text, $signature ) {
- if ( wfRunHooks( 'FormatUserMessage',
- array( $subject, &$text, $signature ) ) ) {
-
- $signature = empty($signature) ? "~~~~~" : "{$signature} ~~~~~";
-
- $template = Title::newFromText( wfMsgForContent( 'usermessage-template' ) );
- if ( !$template
- || $template->getNamespace() !== NS_TEMPLATE
- || !$template->exists() ) {
- $text = "\n== $subject ==\n\n$text\n\n-- $signature";
- } else {
- $text = '{{'. $template->getText()
- . " | subject=$subject | body=$text | signature=$signature }}";
- }
- }
-
- return $text;
- }
-
- /**
- * Leave a user a message
- * @param $subject String the subject of the message
- * @param $text String the message to leave
- * @param $signature String Text to leave in the signature
- * @param $summary String the summary for this change, defaults to
- * "Leave system message."
- * @param $editor User The user leaving the message, defaults to
- * "{{MediaWiki:usermessage-editor}}"
- * @param $flags Int default edit flags
- *
- * @return boolean true if it was successful
- */
- public function leaveUserMessage( $subject, $text, $signature = "",
- $summary = null, $editor = null, $flags = 0 ) {
- if ( !isset( $summary ) ) {
- $summary = wfMsgForContent( 'usermessage-summary' );
- }
-
- if ( !isset( $editor ) ) {
- $editor = User::newFromName( wfMsgForContent( 'usermessage-editor' ) );
- if ( !$editor->isLoggedIn() ) {
- $editor->addToDatabase();
- }
- }
-
- $article = new Article( $this->getTalkPage() );
- wfRunHooks( 'SetupUserMessageArticle',
- array( $this, &$article, $subject, $text, $signature, $summary, $editor ) );
-
-
- $text = self::formatUserMessage( $subject, $text, $signature );
- $flags = $article->checkFlags( $flags );
-
- if ( $flags & EDIT_UPDATE ) {
- $text = $article->getContent() . $text;
- }
-
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
-
- try {
- $status = $article->doEdit( $text, $summary, $flags, false, $editor );
- } catch ( DBQueryError $e ) {
- $status = Status::newFatal("DB Error");
- }
-
- if ( $status->isGood() ) {
- // Set newtalk with the right user ID
- $this->setNewtalk( true );
- wfRunHooks( 'AfterUserMessage',
- array( $this, $article, $summary, $text, $signature, $summary, $editor ) );
- $dbw->commit();
- } else {
- // The article was concurrently created
- wfDebug( __METHOD__ . ": Error ".$status->getWikiText() );
- $dbw->rollback();
- }
-
- return $status->isGood();
- }
}