* of the database.
*/
class User {
-
/**
- * \type{\arrayof{\string}} A list of default user toggles, i.e., boolean user
- * preferences that are displayed by Special:Preferences as checkboxes.
- * This list can be extended via the UserToggles hook or by
- * $wgContLang::getExtraUserToggles().
- * @showinitializer
+ * Global constants made accessable as class constants so that autoloader
+ * magic can be used.
*/
- public static $mToggles = array(
- 'highlightbroken',
- 'justify',
- 'hideminor',
- 'extendwatchlist',
- 'usenewrc',
- 'numberheadings',
- 'showtoolbar',
- 'editondblclick',
- 'editsection',
- 'editsectiononrightclick',
- 'showtoc',
- 'rememberpassword',
- 'watchcreations',
- 'watchdefault',
- 'watchmoves',
- 'watchdeletion',
- 'previewontop',
- 'previewonfirst',
- 'nocache',
- 'enotifwatchlistpages',
- 'enotifusertalkpages',
- 'enotifminoredits',
- 'enotifrevealaddr',
- 'shownumberswatching',
- 'fancysig',
- 'externaleditor',
- 'externaldiff',
- 'showjumplinks',
- 'uselivepreview',
- 'forceeditsummary',
- 'watchlisthideminor',
- 'watchlisthidebots',
- 'watchlisthideown',
- 'watchlisthideanons',
- 'watchlisthideliu',
- 'ccmeonemails',
- 'diffonly',
- 'showhiddencats',
- 'noconvertlink',
- 'norollbackdiff',
- );
+ const USER_TOKEN_LENGTH = USER_TOKEN_LENGTH;
+ const MW_USER_VERSION = MW_USER_VERSION;
+ const EDIT_TOKEN_SUFFIX = EDIT_TOKEN_SUFFIX;
/**
* \type{\arrayof{\string}} List of member variables which are saved to the
* @see newFromSession()
* @see newFromRow()
*/
- function User() {
+ function __construct() {
$this->clearInstanceCache( 'defaults' );
}
function loadDefaults( $name = false ) {
wfProfileIn( __METHOD__ );
- global $wgCookiePrefix;
+ global $wgRequest;
$this->mId = 0;
$this->mName = $name;
$this->mOptionOverrides = null;
$this->mOptionsLoaded = false;
- if ( isset( $_COOKIE[$wgCookiePrefix.'LoggedOut'] ) ) {
- $this->mTouched = wfTimestamp( TS_MW, $_COOKIE[$wgCookiePrefix.'LoggedOut'] );
+ if( $wgRequest->getCookie( 'LoggedOut' ) !== null ) {
+ $this->mTouched = wfTimestamp( TS_MW, $wgRequest->getCookie( 'LoggedOut' ) );
} else {
$this->mTouched = '0'; # Allow any pages to be cached
}
* @return \bool True if the user is logged in, false otherwise.
*/
private function loadFromSession() {
- global $wgMemc, $wgCookiePrefix, $wgExternalAuthType, $wgAutocreatePolicy;
+ global $wgRequest, $wgExternalAuthType, $wgAutocreatePolicy;
$result = null;
wfRunHooks( 'UserLoadFromSession', array( $this, &$result ) );
}
}
- if ( isset( $_COOKIE["{$wgCookiePrefix}UserID"] ) ) {
- $sId = intval( $_COOKIE["{$wgCookiePrefix}UserID"] );
+ if ( $wgRequest->getCookie( 'UserID' ) !== null ) {
+ $sId = intval( $wgRequest->getCookie( 'UserID' ) );
if( isset( $_SESSION['wsUserID'] ) && $sId != $_SESSION['wsUserID'] ) {
$this->loadDefaults(); // Possible collision!
wfDebugLog( 'loginSessions', "Session user ID ({$_SESSION['wsUserID']}) and
if ( isset( $_SESSION['wsUserName'] ) ) {
$sName = $_SESSION['wsUserName'];
- } else if ( isset( $_COOKIE["{$wgCookiePrefix}UserName"] ) ) {
- $sName = $_COOKIE["{$wgCookiePrefix}UserName"];
+ } else if ( $wgRequest->getCookie('UserName') !== null ) {
+ $sName = $wgRequest->getCookie('UserName');
$_SESSION['wsUserName'] = $sName;
} else {
$this->loadDefaults();
if ( isset( $_SESSION['wsToken'] ) ) {
$passwordCorrect = $_SESSION['wsToken'] == $this->mToken;
$from = 'session';
- } else if ( isset( $_COOKIE["{$wgCookiePrefix}Token"] ) ) {
- $passwordCorrect = $this->mToken == $_COOKIE["{$wgCookiePrefix}Token"];
+ } else if ( $wgRequest->getCookie( 'Token' ) !== null ) {
+ $passwordCorrect = $this->mToken == $wgRequest->getCookie( 'Token' );
$from = 'cookie';
} else {
# No session or persistent login cookie
}
}
- /**
- * Get a list of user toggle names
- * @return \type{\arrayof{\string}} Array of user toggle names
- */
- static function getToggles() {
- global $wgContLang, $wgUseRCPatrol;
- $extraToggles = array();
- wfRunHooks( 'UserToggles', array( &$extraToggles ) );
- if( $wgUseRCPatrol ) {
- $extraToggles[] = 'hidepatrolled';
- $extraToggles[] = 'newpageshidepatrolled';
- $extraToggles[] = 'watchlisthidepatrolled';
- }
- return array_merge( self::$mToggles, $extraToggles, $wgContLang->getExtraUserToggles() );
- }
-
/**
* Get blocking information
// Deprecated, but kept for backwards-compatibility config
return false;
}
- if( in_array( wfGetIP(), $wgRateLimitsExcludedIPs ) ) {
+
+ wfDebug( "Checking the list of IP addresses excluded from rate limit..\n" );
+
+ // Read list of IP addresses from MediaWiki namespace
+ $message = wfMsgForContentNoTrans( 'ratelimit-excluded-ips' );
+ $lines = explode( "\n", $message );
+ foreach( $lines as $line ) {
+ // Remove comment lines
+ $comment = substr( trim( $line ), 0, 1 );
+ if ( $comment == '#' || $comment == '' ) {
+ continue;
+ }
+ // Remove additional comments after an IP address
+ $comment = strpos( $line, '#' );
+ if ( $comment > 0 ) {
+ $line = trim( substr( $line, 0, $comment-1 ) );
+ if ( IP::isValid( $line ) ) {
+ $wgRateLimitsExcludedIPs[] = IP::sanitizeIP( $line );
+ }
+ }
+ }
+
+ $ip = IP::sanitizeIP( wfGetIP() );
+ if( in_array( $ip, $wgRateLimitsExcludedIPs ) ) {
// No other good way currently to disable rate limits
// for specific IPs. :P
// But this is a crappy hack and should die.
+ wfDebug( "IP $ip matches the list of rate limit excluded IPs\n" );
return false;
}
return !$this->isAllowed('noratelimit');
if ( $oname == 'skin' ) {
# Clear cached skin, so the new one displays immediately in Special:Preferences
- unset( $this->mSkin );
+ $this->mSkin = null;
}
// Explicitly NULL values should refer to defaults
return $this->mDatePreference;
}
+ /**
+ * Get the user preferred stub threshold
+ */
+ function getStubThreshold() {
+ global $wgMaxArticleSize; # Maximum article size, in Kb
+ $threshold = intval( $this->getOption( 'stubthreshold' ) );
+ if ( $threshold > $wgMaxArticleSize * 1024 ) {
+ # If they have set an impossible value, disable the preference
+ # so we can use the parser cache again.
+ $threshold = 0;
+ }
+ return $threshold;
+ }
+
/**
* Get the permissions this user has.
* @return \type{\arrayof{\string}} Array of permission names
* @return Skin The current skin
* @todo FIXME : need to check the old failback system [AV]
*/
- function &getSkin( $t = null ) {
- if ( !isset( $this->mSkin ) ) {
- wfProfileIn( __METHOD__ );
-
- global $wgHiddenPrefs;
- if( !in_array( 'skin', $wgHiddenPrefs ) ) {
- # get the user skin
- global $wgRequest;
- $userSkin = $this->getOption( 'skin' );
- $userSkin = $wgRequest->getVal( 'useskin', $userSkin );
- } else {
- # if we're not allowing users to override, then use the default
- global $wgDefaultSkin;
- $userSkin = $wgDefaultSkin;
+ function getSkin( $t = null ) {
+ if ( $t ) {
+ $skin = $this->createSkinObject();
+ $skin->setTitle( $t );
+ return $skin;
+ } else {
+ if ( ! $this->mSkin ) {
+ $this->mSkin = $this->createSkinObject();
}
-
- $this->mSkin =& Skin::newFromKey( $userSkin );
- wfProfileOut( __METHOD__ );
- }
- if( $t || !$this->mSkin->getTitle() ) {
- if ( !$t ) {
+
+ if ( ! $this->mSkin->getTitle() ) {
global $wgOut;
$t = $wgOut->getTitle();
+ $this->mSkin->setTitle($t);
}
- $this->mSkin->setTitle( $t );
+
+ return $this->mSkin;
+ }
+ }
+
+ // Creates a Skin object, for getSkin()
+ private function createSkinObject() {
+ wfProfileIn( __METHOD__ );
+
+ global $wgHiddenPrefs;
+ if( !in_array( 'skin', $wgHiddenPrefs ) ) {
+ # get the user skin
+ global $wgRequest;
+ $userSkin = $this->getOption( 'skin' );
+ $userSkin = $wgRequest->getVal( 'useskin', $userSkin );
+ } else {
+ # if we're not allowing users to override, then use the default
+ global $wgDefaultSkin;
+ $userSkin = $wgDefaultSkin;
}
- return $this->mSkin;
+
+ $skin = Skin::newFromKey( $userSkin );
+ wfProfileOut( __METHOD__ );
+
+ return $skin;
}
/**
}
// stubthreshold is only included below for completeness,
- // it will always be 0 when this function is called by parsercache.
+ // since it disables the parser cache, its value will always
+ // be 0 when this function is called by parsercache.
$confstr = $this->getOption( 'math' );
- $confstr .= '!' . $this->getOption( 'stubthreshold' );
- if ( $wgUseDynamicDates ) {
+ $confstr .= '!' . $this->getStubThreshold();
+ if ( $wgUseDynamicDates ) { # This is wrong (bug 24714)
$confstr .= '!' . $this->getDatePreference();
}
$confstr .= '!' . ( $this->getOption( 'numberheadings' ) ? '1' : '' );
$extra = $wgContLang->getExtraHashOptions();
$confstr .= $extra;
+ // Since the skin could be overloading link(), it should be
+ // included here but in practice, none of our skins do that.
+
$confstr .= $wgRenderHashAppend;
// Give a chance for extensions to modify the hash, if they have
function getMaxID() {
static $res; // cache
- if ( isset( $res ) )
+ if ( isset( $res ) ) {
return $res;
- else {
+ } else {
$dbr = wfGetDB( DB_SLAVE );
return $res = $dbr->selectField( 'user', 'max(user_id)', false, __METHOD__ );
}
* @return \string Localized descriptive group name
*/
static function getGroupName( $group ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
$key = "group-$group";
$name = wfMsg( $key );
return $name == '' || wfEmptyMsg( $key, $name )
* @return \string Localized name for group member
*/
static function getGroupMember( $group ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
$key = "group-$group-member";
$name = wfMsg( $key );
return $name == '' || wfEmptyMsg( $key, $name )
* @return \types{\type{Title},\bool} Title of the page if it exists, false otherwise
*/
static function getGroupPage( $group ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
$page = wfMsgForContent( 'grouppage-' . $group );
if( !wfEmptyMsg( 'grouppage-' . $group, $page ) ) {
$title = Title::newFromText( $page );
* @return \string Localized description of the right
*/
static function getRightDescription( $right ) {
- global $wgMessageCache;
- $wgMessageCache->loadAllMessages();
$key = "right-$right";
$name = wfMsg( $key );
return $name == '' || wfEmptyMsg( $key, $name )
/**
* Add a newuser log entry for this user
+ *
* @param $byEmail Boolean: account made by email?
+ * @param $reason String: user supplied reason
*/
- public function addNewUserLogEntry( $byEmail = false ) {
- global $wgUser, $wgNewUserLog;
+ public function addNewUserLogEntry( $byEmail = false, $reason = '' ) {
+ global $wgUser, $wgContLang, $wgNewUserLog;
if( empty( $wgNewUserLog ) ) {
return true; // disabled
}
if( $this->getName() == $wgUser->getName() ) {
$action = 'create';
- $message = '';
} else {
$action = 'create2';
- $message = $byEmail
- ? wfMsgForContent( 'newuserlog-byemail' )
- : '';
+ if ( $byEmail ) {
+ if ( $reason === '' ) {
+ $reason = wfMsgForContent( 'newuserlog-byemail' );
+ } else {
+ $reason = $wgContLang->commaList( array(
+ $reason, wfMsgForContent( 'newuserlog-byemail' ) ) );
+ }
+ }
}
$log = new LogPage( 'newusers' );
$log->addEntry(
$action,
$this->getUserPage(),
- $message,
+ $reason,
array( $this->getId() )
);
return true;
if ( !$template
|| $template->getNamespace() !== NS_TEMPLATE
|| !$template->exists() ) {
- $text = "== $subject ==\n\n$text\n\n-- $signature";
+ $text = "\n== $subject ==\n\n$text\n\n-- $signature";
} else {
$text = '{{'. $template->getText()
. " | subject=$subject | body=$text | signature=$signature }}";
$flags = $article->checkFlags( $flags );
if ( $flags & EDIT_UPDATE ) {
- $text .= $article->getContent();
+ $text = $article->getContent() . $text;
}
$dbw = wfGetDB( DB_MASTER );