specialpreferences.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 939 行 · 第 1/3 页

PHP
939
字号
<?php/** * Hold things related to displaying and saving user preferences. * @package MediaWiki * @subpackage SpecialPage *//** * Entry point that create the "Preferences" object */function wfSpecialPreferences() {	global $wgRequest;	$form = new PreferencesForm( $wgRequest );	$form->execute();}/** * Preferences form handling * This object will show the preferences form and can save it as well. * @package MediaWiki * @subpackage SpecialPage */class PreferencesForm {	var $mQuickbar, $mOldpass, $mNewpass, $mRetypePass, $mStubs;	var $mRows, $mCols, $mSkin, $mMath, $mDate, $mUserEmail, $mEmailFlag, $mNick;	var $mUserLanguage, $mUserVariant;	var $mSearch, $mRecent, $mHourDiff, $mSearchLines, $mSearchChars, $mAction;	var $mReset, $mPosted, $mToggles, $mSearchNs, $mRealName, $mImageSize;	var $mUnderline, $mWatchlistEdits;	/**	 * Constructor	 * Load some values	 */	function PreferencesForm( &$request ) {		global $wgLang, $wgContLang, $wgUser, $wgAllowRealName;		$this->mQuickbar = $request->getVal( 'wpQuickbar' );		$this->mOldpass = $request->getVal( 'wpOldpass' );		$this->mNewpass = $request->getVal( 'wpNewpass' );		$this->mRetypePass =$request->getVal( 'wpRetypePass' );		$this->mStubs = $request->getVal( 'wpStubs' );		$this->mRows = $request->getVal( 'wpRows' );		$this->mCols = $request->getVal( 'wpCols' );		$this->mSkin = $request->getVal( 'wpSkin' );		$this->mMath = $request->getVal( 'wpMath' );		$this->mDate = $request->getVal( 'wpDate' );		$this->mUserEmail = $request->getVal( 'wpUserEmail' );		$this->mRealName = $wgAllowRealName ? $request->getVal( 'wpRealName' ) : '';		$this->mEmailFlag = $request->getCheck( 'wpEmailFlag' ) ? 0 : 1;		$this->mNick = $request->getVal( 'wpNick' );		$this->mUserLanguage = $request->getVal( 'wpUserLanguage' );		$this->mUserVariant = $request->getVal( 'wpUserVariant' );		$this->mSearch = $request->getVal( 'wpSearch' );		$this->mRecent = $request->getVal( 'wpRecent' );		$this->mHourDiff = $request->getVal( 'wpHourDiff' );		$this->mSearchLines = $request->getVal( 'wpSearchLines' );		$this->mSearchChars = $request->getVal( 'wpSearchChars' );		$this->mImageSize = $request->getVal( 'wpImageSize' );		$this->mThumbSize = $request->getInt( 'wpThumbSize' );		$this->mUnderline = $request->getInt( 'wpOpunderline' );		$this->mAction = $request->getVal( 'action' );		$this->mReset = $request->getCheck( 'wpReset' );		$this->mPosted = $request->wasPosted();		$this->mSuccess = $request->getCheck( 'success' );		$this->mWatchlistDays = $request->getVal( 'wpWatchlistDays' );		$this->mWatchlistEdits = $request->getVal( 'wpWatchlistEdits' );		$this->mSaveprefs = $request->getCheck( 'wpSaveprefs' ) &&			$this->mPosted &&			$wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) );		# User toggles  (the big ugly unsorted list of checkboxes)		$this->mToggles = array();		if ( $this->mPosted ) {			$togs = $wgLang->getUserToggles();			foreach ( $togs as $tname ) {				$this->mToggles[$tname] = $request->getCheck( "wpOp$tname" ) ? 1 : 0;			}		}		$this->mUsedToggles = array();		# Search namespace options		# Note: namespaces don't necessarily have consecutive keys		$this->mSearchNs = array();		if ( $this->mPosted ) {			$namespaces = $wgContLang->getNamespaces();			foreach ( $namespaces as $i => $namespace ) {				if ( $i >= 0 ) {					$this->mSearchNs[$i] = $request->getCheck( "wpNs$i" ) ? 1 : 0;				}			}		}		# Validate language		if ( !preg_match( '/^[a-z\-]*$/', $this->mUserLanguage ) ) {			$this->mUserLanguage = 'nolanguage';		}	}	function execute() {		global $wgUser, $wgOut;		if ( $wgUser->isAnon() ) {			$wgOut->showErrorPage( 'prefsnologin', 'prefsnologintext' );			return;		}		if ( wfReadOnly() ) {			$wgOut->readOnlyPage();			return;		}		if ( $this->mReset ) {			$this->resetPrefs();			$this->mainPrefsForm( 'reset', wfMsg( 'prefsreset' ) );		} else if ( $this->mSaveprefs ) {			$this->savePreferences();		} else {			$this->resetPrefs();			$this->mainPrefsForm( '' );		}	}	/**	 * @access private	 */	function validateInt( &$val, $min=0, $max=0x7fffffff ) {		$val = intval($val);		$val = min($val, $max);		$val = max($val, $min);		return $val;	}	/**	 * @access private	 */	function validateFloat( &$val, $min, $max=0x7fffffff ) {		$val = floatval( $val );		$val = min( $val, $max );		$val = max( $val, $min );		return( $val );	}	/**	 * @access private	 */	function validateIntOrNull( &$val, $min=0, $max=0x7fffffff ) {		$val = trim($val);		if($val === '') {			return $val;		} else {			return $this->validateInt( $val, $min, $max );		}	}	/**	 * @access private	 */	function validateDate( &$val, $min = 0, $max=0x7fffffff ) {		if ( ( sprintf('%d', $val) === $val && $val >= $min && $val <= $max ) || $val == 'ISO 8601' )			return $val;		else			return 0;	}	/**	 * Used to validate the user inputed timezone before saving it as	 * 'timeciorrection', will return '00:00' if fed bogus data.	 * Note: It's not a 100% correct implementation timezone-wise, it will	 * accept stuff like '14:30',	 * @access private	 * @param string $s the user input	 * @return string	 */	function validateTimeZone( $s ) {		if ( $s !== '' ) {			if ( strpos( $s, ':' ) ) {				# HH:MM				$array = explode( ':' , $s );				$hour = intval( $array[0] );				$minute = intval( $array[1] );			} else {				$minute = intval( $s * 60 );				$hour = intval( $minute / 60 );				$minute = abs( $minute ) % 60;			}			# Max is +14:00 and min is -12:00, see:			# http://en.wikipedia.org/wiki/Timezone			$hour = min( $hour, 14 );			$hour = max( $hour, -12 );			$minute = min( $minute, 59 );			$minute = max( $minute, 0 );			$s = sprintf( "%02d:%02d", $hour, $minute );		}		return $s;	}	/**	 * @access private	 */	function savePreferences() {		global $wgUser, $wgOut, $wgParser;		global $wgEnableUserEmail, $wgEnableEmail;		global $wgEmailAuthentication, $wgMinimalPasswordLength;		global $wgAuth;		if ( '' != $this->mNewpass && $wgAuth->allowPasswordChange() ) {			if ( $this->mNewpass != $this->mRetypePass ) {				$this->mainPrefsForm( 'error', wfMsg( 'badretype' ) );				return;			}			if ( strlen( $this->mNewpass ) < $wgMinimalPasswordLength ) {				$this->mainPrefsForm( 'error', wfMsg( 'passwordtooshort', $wgMinimalPasswordLength ) );				return;			}			if (!$wgUser->checkPassword( $this->mOldpass )) {				$this->mainPrefsForm( 'error', wfMsg( 'wrongpassword' ) );				return;			}			if (!$wgAuth->setPassword( $wgUser, $this->mNewpass )) {				$this->mainPrefsForm( 'error', wfMsg( 'externaldberror' ) );				return;			}			$wgUser->setPassword( $this->mNewpass );			$this->mNewpass = $this->mOldpass = $this->mRetypePass = '';		}		$wgUser->setRealName( $this->mRealName );		if( $wgUser->getOption( 'language' ) !== $this->mUserLanguage ) {			$needRedirect = true;		} else {			$needRedirect = false;		}		# Validate the signature and clean it up as needed		if( $this->mToggles['fancysig'] ) {			if( Parser::validateSig( $this->mNick ) !== false ) {				$this->mNick = $wgParser->cleanSig( $this->mNick );			} else {				$this->mainPrefsForm( 'error', wfMsg( 'badsig' ) );			}		} else {			// When no fancy sig used, make sure ~{3,5} get removed.			$this->mNick = $wgParser->cleanSigInSig( $this->mNick );		}		$wgUser->setOption( 'language', $this->mUserLanguage );		$wgUser->setOption( 'variant', $this->mUserVariant );		$wgUser->setOption( 'nickname', $this->mNick );		$wgUser->setOption( 'quickbar', $this->mQuickbar );		$wgUser->setOption( 'skin', $this->mSkin );		global $wgUseTeX;		if( $wgUseTeX ) {			$wgUser->setOption( 'math', $this->mMath );		}		$wgUser->setOption( 'date', $this->validateDate( $this->mDate, 0, 20 ) );		$wgUser->setOption( 'searchlimit', $this->validateIntOrNull( $this->mSearch ) );		$wgUser->setOption( 'contextlines', $this->validateIntOrNull( $this->mSearchLines ) );		$wgUser->setOption( 'contextchars', $this->validateIntOrNull( $this->mSearchChars ) );		$wgUser->setOption( 'rclimit', $this->validateIntOrNull( $this->mRecent ) );		$wgUser->setOption( 'wllimit', $this->validateIntOrNull( $this->mWatchlistEdits, 0, 1000 ) );		$wgUser->setOption( 'rows', $this->validateInt( $this->mRows, 4, 1000 ) );		$wgUser->setOption( 'cols', $this->validateInt( $this->mCols, 4, 1000 ) );		$wgUser->setOption( 'stubthreshold', $this->validateIntOrNull( $this->mStubs ) );		$wgUser->setOption( 'timecorrection', $this->validateTimeZone( $this->mHourDiff, -12, 14 ) );		$wgUser->setOption( 'imagesize', $this->mImageSize );		$wgUser->setOption( 'thumbsize', $this->mThumbSize );		$wgUser->setOption( 'underline', $this->validateInt($this->mUnderline, 0, 2) );		$wgUser->setOption( 'watchlistdays', $this->validateFloat( $this->mWatchlistDays, 0, 7 ) );		# Set search namespace options		foreach( $this->mSearchNs as $i => $value ) {			$wgUser->setOption( "searchNs{$i}", $value );		}		if( $wgEnableEmail && $wgEnableUserEmail ) {			$wgUser->setOption( 'disablemail', $this->mEmailFlag );		}		# Set user toggles		foreach ( $this->mToggles as $tname => $tvalue ) {			$wgUser->setOption( $tname, $tvalue );		}		if (!$wgAuth->updateExternalDB($wgUser)) {			$this->mainPrefsForm( wfMsg( 'externaldberror' ) );			return;		}		$wgUser->setCookies();		$wgUser->saveSettings();		$error = false;		if( $wgEnableEmail ) {			$newadr = $this->mUserEmail;			$oldadr = $wgUser->getEmail();			if( ($newadr != '') && ($newadr != $oldadr) ) {				# the user has supplied a new email address on the login page				if( $wgUser->isValidEmailAddr( $newadr ) ) {					$wgUser->mEmail = $newadr; # new behaviour: set this new emailaddr from login-page into user database record					$wgUser->mEmailAuthenticated = null; # but flag as "dirty" = unauthenticated					$wgUser->saveSettings();					if ($wgEmailAuthentication) {						# Mail a temporary password to the dirty address.						# User can come back through the confirmation URL to re-enable email.						$result = $wgUser->sendConfirmationMail();						if( WikiError::isError( $result ) ) {							$error = wfMsg( 'mailerror', htmlspecialchars( $result->getMessage() ) );						} else {							$error = wfMsg( 'eauthentsent', $wgUser->getName() );						}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?