wfRunHooks( 'GetPreferences', array( $user, &$defaultPreferences ) );
+ ## Remove preferences that wikis don't want to use
+ global $wgHiddenPrefs;
+ foreach ( $wgHiddenPrefs as $pref ) {
+ if ( isset( $defaultPreferences[$pref] ) ) {
+ unset( $defaultPreferences[ $pref ] );
+ }
+ }
+
## Prod in defaults from the user
global $wgDefaultUserOptions;
foreach( $defaultPreferences as $name => &$info ) {
$prefFromUser = self::getOptionFromUser( $name, $info, $user );
$field = HTMLForm::loadInputFromParameters( $info ); // For validation
- $globalDefault = isset($wgDefaultUserOptions[$name])
- ? $wgDefaultUserOptions[$name]
+ $defaultOptions = User::getDefaultOptions();
+ $globalDefault = isset($defaultOptions[$name])
+ ? $defaultOptions[$name]
: null;
// If it validates, set it as the default
// Already set, no problem
continue;
} elseif ( !is_null( $prefFromUser ) && // Make sure we're not just pulling nothing
- $field->validate( $prefFromUser, $user->mOptions ) ) {
+ $field->validate( $prefFromUser, $user->mOptions ) === true ) {
$info['default'] = $prefFromUser;
- } elseif( $field->validate( $globalDefault, $user->mOptions ) ) {
+ } elseif( $field->validate( $globalDefault, $user->mOptions ) === true ) {
$info['default'] = $globalDefault;
+ } else {
+ throw new MWException( "Global default $globalDefault is invalid for field $name" );
}
}
}
// Actually changeable stuff
- global $wgAllowRealName, $wgAuth;
- if ($wgAllowRealName) {
- $defaultPreferences['realname'] =
- array(
- 'type' => $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
- 'default' => $user->getRealName(),
- 'section' => 'personal/info',
- 'label-message' => 'yourrealname',
- 'help-message' => 'prefs-help-realname',
- );
- }
-
-
+ global $wgAuth;
+ $defaultPreferences['realname'] =
+ array(
+ 'type' => $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
+ 'default' => $user->getRealName(),
+ 'section' => 'personal/info',
+ 'label-message' => 'yourrealname',
+ 'help-message' => 'prefs-help-realname',
+ );
+
$defaultPreferences['gender'] =
array(
'type' => 'select',
if ($wgAuth->allowPasswordChange()) {
global $wgUser; // For skin.
- $link = $wgUser->getSkin()->link( SpecialPage::getTitleFor( 'ResetPass' ),
+ $link = $wgUser->getSkin()->link( SpecialPage::getTitleFor( 'Resetpass' ),
wfMsgHtml( 'prefs-resetpass' ), array() ,
array('returnto' => SpecialPage::getTitleFor( 'Preferences') ) );
$time = $wgLang->timeAndDate( $user->getEmailAuthenticationTimestamp(), true );
$d = $wgLang->date( $user->getEmailAuthenticationTimestamp(), true );
$t = $wgLang->time( $user->getEmailAuthenticationTimestamp(), true );
- $emailauthenticated = wfMsg('emailauthenticated', $time, $d, $t ).'<br />';
+ $emailauthenticated = htmlspecialchars(wfMsg('emailauthenticated', $time, $d, $t )).'<br />';
$disableEmailPrefs = false;
} else {
$disableEmailPrefs = true;
global $wgUser; // wgUser is okay here, it's for display
$skin = $wgUser->getSkin();
- $emailauthenticated = wfMsg('emailnotauthenticated').'<br />' .
- $skin->makeKnownLinkObj( SpecialPage::getTitleFor( 'Confirmemail' ),
- wfMsg( 'emailconfirmlink' ) ) . '<br />';
+ $emailauthenticated = wfMsgHtml('emailnotauthenticated').'<br />' .
+ $skin->link(
+ SpecialPage::getTitleFor( 'Confirmemail' ),
+ wfMsg( 'emailconfirmlink' ),
+ array(),
+ array(),
+ array( 'known', 'noclasses' )
+ ) . '<br />';
}
} else {
$disableEmailPrefs = true;
- $emailauthenticated = wfMsg( 'noemailprefs' );
+ $emailauthenticated = wfMsgHtml( 'noemailprefs' );
}
$defaultPreferences['emailauthentication'] =
static function skinPreferences( $user, &$defaultPreferences ) {
## Skin #####################################
- global $wgAllowUserSkin, $wgLang;
-
- if ($wgAllowUserSkin) {
- $defaultPreferences['skin'] =
- array(
- 'type' => 'radio',
- 'options' => self::generateSkinOptions( $user ),
- 'label' => ' ',
- 'section' => 'rendering/skin',
- );
- }
+ $defaultPreferences['skin'] =
+ array(
+ 'type' => 'radio',
+ 'options' => self::generateSkinOptions( $user ),
+ 'label' => ' ',
+ 'section' => 'rendering/skin',
+ );
$selectedSkin = $user->getOption( 'skin' );
if ( in_array( $selectedSkin, array( 'cologneblue', 'standard' ) ) ) {
+ global $wgLang;
$settings = array_flip($wgLang->getQuickbarSettings());
$defaultPreferences['quickbar'] =
array(
'type' => 'radio',
'options' => $settings,
- 'section' => 'skin',
+ 'section' => 'rendering/skin',
'label-message' => 'qbsettings',
);
}
array(
'type' => 'radio',
'options' =>
- array_flip( array_map( 'wfMsg', $wgLang->getMathNames() ) ),
+ array_flip( array_map( 'wfMsgHtml', $wgLang->getMathNames() ) ),
'label' => ' ',
'section' => 'rendering/math',
);
array(
'type' => 'radio',
'options' => $dateOptions,
- 'label-message' => 'dateformat',
- 'section' => 'datetime',
+ 'label' => ' ',
+ 'section' => 'datetime/dateformat',
);
}
'raw' => 1,
'label-message' => 'servertime',
'default' => $nowserver,
- 'section' => 'datetime',
+ 'section' => 'datetime/timeoffset',
);
$defaultPreferences['nowlocal'] =
'raw' => 1,
'label-message' => 'localtime',
'default' => $nowlocal,
- 'section' => 'datetime',
+ 'section' => 'datetime/timeoffset',
);
// Grab existing pref.
$tzSetting = $tzOffset;
if (count($tz) > 1 && $tz[0] == 'Offset') {
$minDiff = $tz[1];
- $tzSetting = sprintf( '%+03d:%02d', floor($minDiff/60), abs($minDiff)%60 );;
+ $tzSetting = sprintf( '%+03d:%02d', floor($minDiff/60), abs($minDiff)%60 );
}
$defaultPreferences['timecorrection'] =
'label-message' => 'timezonelegend',
'options' => self::getTimezoneOptions(),
'default' => $tzSetting,
- 'section' => 'datetime',
+ 'section' => 'datetime/timeoffset',
);
}
wfMsg( 'underline-default' ) => 2,
),
'label-message' => 'tog-underline',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
);
$stubThresholdValues = array( 0, 50, 100, 500, 1000, 2000, 5000, 10000 );
$defaultPreferences['stubthreshold'] =
array(
'type' => 'selectorother',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
'options' => $stubThresholdOptions,
'label' => wfMsg('stub-threshold'), // Raw HTML message. Yay?
);
$defaultPreferences['highlightbroken'] =
array(
'type' => 'toggle',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
'label' => wfMsg('tog-highlightbroken'), // Raw HTML
);
$defaultPreferences['showtoc'] =
array(
'type' => 'toggle',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
'label-message' => 'tog-showtoc',
);
$defaultPreferences['nocache'] =
array(
'type' => 'toggle',
'label-message' => 'tog-nocache',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
);
$defaultPreferences['showhiddencats'] =
array(
'type' => 'toggle',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
'label-message' => 'tog-showhiddencats'
);
$defaultPreferences['showjumplinks'] =
array(
'type' => 'toggle',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
'label-message' => 'tog-showjumplinks',
);
$defaultPreferences['justify'] =
array(
'type' => 'toggle',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
'label-message' => 'tog-justify',
);
$defaultPreferences['numberheadings'] =
array(
'type' => 'toggle',
- 'section' => 'rendering',
+ 'section' => 'rendering/advancedrendering',
'label-message' => 'tog-numberheadings',
);
}
static function editingPreferences( $user, &$defaultPreferences ) {
+ global $wgUseExternalEditor, $wgLivePreview;
+
## Editing #####################################
$defaultPreferences['cols'] =
array(
$defaultPreferences['previewontop'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-previewontop',
);
$defaultPreferences['previewonfirst'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-previewonfirst',
);
$defaultPreferences['editsection'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-editsection',
);
$defaultPreferences['editsectiononrightclick'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-editsectiononrightclick',
);
$defaultPreferences['editondblclick'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-editondblclick',
);
$defaultPreferences['editwidth'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-editwidth',
);
$defaultPreferences['showtoolbar'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-showtoolbar',
);
$defaultPreferences['minordefault'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-minordefault',
);
- $defaultPreferences['externaleditor'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing',
- 'label-message' => 'tog-externaleditor',
- );
- $defaultPreferences['externaldiff'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing',
- 'label-message' => 'tog-externaldiff',
- );
+
+ if ( $wgUseExternalEditor ) {
+ $defaultPreferences['externaleditor'] =
+ array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-externaleditor',
+ );
+ $defaultPreferences['externaldiff'] =
+ array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-externaldiff',
+ );
+ }
+
$defaultPreferences['forceeditsummary'] =
array(
'type' => 'toggle',
- 'section' => 'editing',
+ 'section' => 'editing/advancedediting',
'label-message' => 'tog-forceeditsummary',
);
- $defaultPreferences['uselivepreview'] =
- array(
- 'type' => 'toggle',
- 'section' => 'editing',
- 'label-message' => 'tog-uselivepreview',
- );
+ if ( $wgLivePreview ) {
+ $defaultPreferences['uselivepreview'] =
+ array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-uselivepreview',
+ );
+ }
}
static function rcPreferences( $user, &$defaultPreferences ) {
array(
'type' => 'int',
'label-message' => 'recentchangesdays',
- 'section' => 'rc',
+ 'section' => 'rc/display',
'min' => 1,
'max' => ceil($wgRCMaxAge / (3600*24)),
);
array(
'type' => 'int',
'label-message' => 'recentchangescount',
- 'section' => 'rc',
+ 'help-message' => 'prefs-help-recentchangescount',
+ 'section' => 'rc/display',
);
$defaultPreferences['usenewrc'] =
array(
'type' => 'toggle',
'label-message' => 'tog-usenewrc',
- 'section' => 'rc',
+ 'section' => 'rc/advancedrc',
);
$defaultPreferences['hideminor'] =
array(
'type' => 'toggle',
'label-message' => 'tog-hideminor',
- 'section' => 'rc',
+ 'section' => 'rc/advancedrc',
);
global $wgUseRCPatrol;
$defaultPreferences['hidepatrolled'] =
array(
'type' => 'toggle',
- 'section' => 'rc',
+ 'section' => 'rc/advancedrc',
'label-message' => 'tog-hidepatrolled',
);
$defaultPreferences['newpageshidepatrolled'] =
array(
'type' => 'toggle',
- 'section' => 'rc',
+ 'section' => 'rc/advancedrc',
'label-message' => 'tog-newpageshidepatrolled',
);
}
$defaultPreferences['shownumberswatching'] =
array(
'type' => 'toggle',
- 'section' => 'rc',
+ 'section' => 'rc/advancedrc',
'label-message' => 'tog-shownumberswatching',
);
}
static function watchlistPreferences( $user, &$defaultPreferences ) {
global $wgUseRCPatrol;
## Watchlist #####################################
- $defaultPreferences['wllimit'] =
+ $defaultPreferences['watchlistdays'] =
array(
'type' => 'int',
'min' => 0,
- 'max' => 1000,
- 'label-message' => 'prefs-watchlist-edits',
- 'section' => 'watchlist'
+ 'max' => 7,
+ 'section' => 'watchlist/display',
+ 'label-message' => 'prefs-watchlist-days',
);
- $defaultPreferences['watchlistdays'] =
+ $defaultPreferences['wllimit'] =
array(
'type' => 'int',
'min' => 0,
- 'max' => 7,
- 'section' => 'watchlist',
- 'label-message' => 'prefs-watchlist-days',
+ 'max' => 1000,
+ 'label-message' => 'prefs-watchlist-edits',
+ 'section' => 'watchlist/display'
);
$defaultPreferences['extendwatchlist'] =
array(
'type' => 'toggle',
- 'section' => 'watchlist',
+ 'section' => 'watchlist/advancedwatchlist',
'label-message' => 'tog-extendwatchlist',
);
$defaultPreferences['watchlisthideminor'] =
array(
'type' => 'toggle',
- 'section' => 'watchlist',
+ 'section' => 'watchlist/advancedwatchlist',
'label-message' => 'tog-watchlisthideminor',
);
$defaultPreferences['watchlisthidebots'] =
array(
'type' => 'toggle',
- 'section' => 'watchlist',
+ 'section' => 'watchlist/advancedwatchlist',
'label-message' => 'tog-watchlisthidebots',
);
$defaultPreferences['watchlisthideown'] =
array(
'type' => 'toggle',
- 'section' => 'watchlist',
+ 'section' => 'watchlist/advancedwatchlist',
'label-message' => 'tog-watchlisthideown',
);
$defaultPreferences['watchlisthideanons'] =
array(
'type' => 'toggle',
- 'section' => 'watchlist',
+ 'section' => 'watchlist/advancedwatchlist',
'label-message' => 'tog-watchlisthideanons',
);
$defaultPreferences['watchlisthideliu'] =
array(
'type' => 'toggle',
- 'section' => 'watchlist',
+ 'section' => 'watchlist/advancedwatchlist',
'label-message' => 'tog-watchlisthideliu',
);
$defaultPreferences['watchlisthidepatrolled'] =
array(
'type' => 'toggle',
- 'section' => 'watchlist',
+ 'section' => 'watchlist/advancedwatchlist',
'label-message' => 'tog-watchlisthidepatrolled',
);
}
if ( $user->isAllowed( $action ) ) {
$defaultPreferences[$pref] = array(
'type' => 'toggle',
- 'section' => 'watchlist',
+ 'section' => 'watchlist/advancedwatchlist',
'label-message' => "tog-$pref",
);
}
array(
'type' => 'int',
'label-message' => 'resultsperpage',
- 'section' => 'searchoptions',
+ 'section' => 'searchoptions/display',
'min' => 0,
);
$defaultPreferences['contextlines'] =
array(
'type' => 'int',
'label-message' => 'contextlines',
- 'section' => 'searchoptions',
+ 'section' => 'searchoptions/display',
'min' => 0,
);
$defaultPreferences['contextchars'] =
array(
'type' => 'int',
'label-message' => 'contextchars',
- 'section' => 'searchoptions',
+ 'section' => 'searchoptions/display',
'min' => 0,
);
global $wgEnableMWSuggest;
array(
'type' => 'toggle',
'label-message' => 'mwsuggest-disable',
- 'section' => 'searchoptions',
+ 'section' => 'searchoptions/display',
);
- }
+ }
+
+ $defaultPreferences['searcheverything'] =
+ array(
+ 'type' => 'toggle',
+ 'label-message' => 'searcheverything-enable',
+ 'section' => 'searchoptions/advancedsearchoptions',
+ );
// Searchable namespaces back-compat with old format
$searchableNamespaces = SearchEngine::searchableNamespaces();
if (!$displayNs) $displayNs = wfMsg( 'blanknamespace' );
+ $displayNs = htmlspecialchars( $displayNs );
$nsOptions[$displayNs] = $ns;
}
'type' => 'multiselect',
'label-message' => 'defaultns',
'options' => $nsOptions,
- 'section' => 'searchoptions',
+ 'section' => 'searchoptions/advancedsearchoptions',
'prefix' => 'searchNs',
);
+
+
+
}
static function miscPreferences( $user, &$defaultPreferences ) {
$defaultPreferences['diffonly'] =
array(
'type' => 'toggle',
- 'section' => 'misc',
+ 'section' => 'misc/diffs',
'label-message' => 'tog-diffonly',
);
$defaultPreferences['norollbackdiff'] =
array(
'type' => 'toggle',
- 'section' => 'misc',
+ 'section' => 'misc/diffs',
'label-message' => 'tog-norollbackdiff',
);
+
+ // Stuff from Language::getExtraUserToggles()
+ global $wgContLang;
+
+ $toggles = $wgContLang->getExtraUserToggles();
+
+ foreach( $toggles as $toggle ) {
+ $defaultPreferences[$toggle] =
+ array(
+ 'type' => 'toggle',
+ 'section' => 'personal/i18n',
+ 'label-message' => "tog-$toggle",
+ );
+ }
}
static function generateSkinOptions( $user ) {
$ret = array();
$mptitle = Title::newMainPage();
- $previewtext = wfMsg( 'skin-preview' );
+ $previewtext = wfMsgHtml( 'skin-preview' );
# Only show members of Skin::getSkinNames() rather than
# $skinNames (skins is all skin names from Language.php)
$validSkinNames = Skin::getUsableSkins();
$msgName = "skinname-{$skinkey}";
$localisedSkinName = wfMsg( $msgName );
if ( !wfEmptyMsg( $msgName, $localisedSkinName ) ) {
- $skinname = $localisedSkinName;
+ $skinname = htmlspecialchars($localisedSkinName);
}
}
asort($validSkinNames);
global $wgAllowUserCss, $wgAllowUserJs;
if( $wgAllowUserCss ) {
$cssPage = Title::makeTitleSafe( NS_USER, $user->getName().'/'.$skinkey.'.css' );
- $customCSS = $sk->link( $cssPage, wfMsgExt( 'prefs-custom-css', array() ) );
+ $customCSS = $sk->link( $cssPage, wfMsgHtml( 'prefs-custom-css' ) );
$extraLinks .= " ($customCSS)";
}
if( $wgAllowUserJs ) {
$extraLinks .= " ($customJS)";
}
if( $skinkey == $wgDefaultSkin )
- $sn .= ' (' . wfMsg( 'default' ) . ')';
+ $sn .= ' (' . wfMsgHtml( 'default' ) . ')';
$display = "$sn $previewlink{$extraLinks}";
$ret[$display] = $skinkey;
}
$ret = array();
if ($dateopts) {
+ if ( !in_array( 'default', $dateopts ) ) {
+ $dateopts[] = 'default'; // Make sure default is always valid
+ // Bug 19237
+ }
+
$idCnt = 0;
$epoch = '20010115161234'; # Wikipedia day
foreach( $dateopts as $key ) {
if( $key == 'default' ) {
- $formatted = wfMsg( 'datedefault' );
+ $formatted = wfMsgHtml( 'datedefault' );
} else {
- $formatted = $wgLang->timeanddate( $epoch, false, $key );
+ $formatted = htmlspecialchars($wgLang->timeanddate( $epoch, false, $key ));
}
$ret[$formatted] = $key;
}
}
// Fortunately, the realname field is MUCH simpler
- global $wgAllowRealName;
- if ($wgAllowRealName) {
+ global $wgHiddenPrefs;
+ if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
$realName = $formData['realname'];
$wgUser->setRealName( $realName );
}
$sk = $wgUser->getSkin();
$t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
- $html .= "\n" . $sk->link( $t, wfMsg( 'restoreprefs' ) );
+ $html .= "\n" . $sk->link( $t, wfMsgHtml( 'restoreprefs' ) );
$html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );