extract djvu text (bug 18046); escape possible script with htmlspecialchars instead...
[lhc/web/wiklou.git] / includes / Preferences.php
index 64e71bc..2040bb5 100644 (file)
@@ -14,7 +14,71 @@ class Preferences {
                global $wgLang, $wgRCMaxAge;
                
                $defaultPreferences = array();
+
+               self::profilePreferences( $user, $defaultPreferences );
+               self::skinPreferences( $user, $defaultPreferences );
+               self::filesPreferences( $user, $defaultPreferences );
+               self::mathPreferences( $user, $defaultPreferences );
+               self::datetimePreferences( $user, $defaultPreferences );
+               self::renderingPreferences( $user, $defaultPreferences );
+               self::editingPreferences( $user, $defaultPreferences );
+               self::rcPreferences( $user, $defaultPreferences );
+               self::watchlistPreferences( $user, $defaultPreferences );
+               self::searchPreferences( $user, $defaultPreferences );
+               self::miscPreferences( $user, $defaultPreferences );
+                               
+               wfRunHooks( 'GetPreferences', array( $user, &$defaultPreferences ) );
+                               
+               ## 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]
+                                                               : null;
+                       
+                       // If it validates, set it as the default
+                       if ( isset($info['default']) ) {
+                               // Already set, no problem
+                               continue;
+                       } elseif ( !is_null( $prefFromUser ) && // Make sure we're not just pulling nothing
+                                       $field->validate( $prefFromUser, $user->mOptions ) ) {
+                               $info['default'] = $prefFromUser;
+                       } elseif( $field->validate( $globalDefault, $user->mOptions ) ) {
+                               $info['default'] = $globalDefault;
+                       }
+               }
+               
+               self::$defaultPreferences = $defaultPreferences;
+               
+               return $defaultPreferences;
+       }
+       
+       // Pull option from a user account. Handles stuff like array-type preferences.
+       static function getOptionFromUser( $name, $info, $user ) {
+               $val = $user->getOption( $name );
                
+               // Handling for array-type preferences
+               if ( ( isset($info['type']) && $info['type'] == 'multiselect' ) ||
+                               ( isset($info['class']) && $info['class'] == 'HTMLMultiSelectField' ) ) {
+
+                       $options = HTMLFormField::flattenOptions($info['options']);
+                       $prefix = isset($info['prefix']) ? $info['prefix'] : $name;
+                       $val = array();
+                       
+                       foreach( $options as $label => $value ) {
+                               if ($user->getOption( "$prefix$value" ) ) {
+                                       $val[] = $value;
+                               }
+                       }
+               }
+       
+               return $val;
+       }
+       
+       static function profilePreferences( $user, &$defaultPreferences ) {
+               global $wgLang;
                ## User info #####################################
                // Information panel
                $defaultPreferences['username'] =
@@ -22,7 +86,7 @@ class Preferences {
                                        'type' => 'info',
                                        'label-message' => 'username',
                                        'default' => $user->getName(),
-                                       'section' => 'personal',
+                                       'section' => 'personal/info',
                                );
                
                $defaultPreferences['userid'] =
@@ -30,7 +94,7 @@ class Preferences {
                                        'type' => 'info',
                                        'label-message' => 'uid',
                                        'default' => $user->getId(),
-                                       'section' => 'personal',
+                                       'section' => 'personal/info',
                                );
                
                # Get groups to which the user belongs
@@ -52,7 +116,7 @@ class Preferences {
                                                                count($userEffectiveGroupsArray) ),
                                        'default' => $wgLang->commaList( $userEffectiveGroupsArray ),
                                        'raw' => true,
-                                       'section' => 'personal',
+                                       'section' => 'personal/info',
                                );
                
                $defaultPreferences['editcount'] =
@@ -60,7 +124,7 @@ class Preferences {
                                        'type' => 'info',
                                        'label-message' => 'prefs-edits',
                                        'default' => $user->getEditCount(),
-                                       'section' => 'personal',
+                                       'section' => 'personal/info',
                                );
                
                if ($user->getRegistration()) {
@@ -69,7 +133,7 @@ class Preferences {
                                                'type' => 'info',
                                                'label-message' => 'prefs-registration',
                                                'default' => $wgLang->timeanddate( $user->getRegistration() ),
-                                               'section' => 'personal',
+                                               'section' => 'personal/info',
                                        );
                }
                                
@@ -80,26 +144,26 @@ class Preferences {
                                        array(
                                                'type' => 'text',
                                                'default' => $user->getRealName(),
-                                               'section' => 'personal',
+                                               'section' => 'personal/info',
                                                'label-message' => 'yourrealname',
                                                'help-message' => 'prefs-help-realname',
                                        );
                }
-                               
-               global $wgEmailConfirmToEdit;
                
-               $defaultPreferences['emailaddress'] =
+               
+               $defaultPreferences['gender'] =
                                array(
-                                       'type' => 'text',
-                                       'default' => $user->getEmail(),
-                                       'section' => 'personal',
-                                       'label-message' => 'youremail',
-                                       'help-message' => $wgEmailConfirmToEdit
-                                                                               ? 'prefs-help-email-required'
-                                                                               : 'prefs-help-email',
-                                       'validation-callback' => array( 'Preferences', 'validateEmail' ),
+                                       'type' => 'select',
+                                       'section' => 'personal/info',
+                                       'options' => array(
+                                               wfMsg('gender-male') => 'male',
+                                               wfMsg('gender-female') => 'female',
+                                               wfMsg('gender-unknown') => 'unknown',
+                                       ),
+                                       'label-message' => 'yourgender',
+                                       'help-message' => 'prefs-help-gender',
                                );
-               
+
                global $wgAuth;
                if ($wgAuth->allowPasswordChange()) {
                        global $wgUser; // For skin.
@@ -113,21 +177,15 @@ class Preferences {
                                                'raw' => true,
                                                'default' => $link,
                                                'label-message' => 'yourpassword',
-                                               'section' => 'personal',
+                                               'section' => 'personal/info',
                                        );
                }
                
-               $defaultPreferences['gender'] =
+               $defaultPreferences['rememberpassword'] =
                                array(
-                                       'type' => 'select',
-                                       'section' => 'personal',
-                                       'options' => array(
-                                               wfMsg('gender-male') => 'male',
-                                               wfMsg('gender-female') => 'female',
-                                               wfMsg('gender-unknown') => 'unknown',
-                                       ),
-                                       'label-message' => 'yourgender',
-                                       'help-message' => 'prefs-help-gender',
+                                       'type' => 'toggle',
+                                       'label-message' => 'tog-rememberpassword',
+                                       'section' => 'personal/info',
                                );
                                
                // Language
@@ -146,7 +204,7 @@ class Preferences {
                $defaultPreferences['language'] =
                                array(
                                        'type' => 'select',
-                                       'section' => 'personal',
+                                       'section' => 'personal/i18n',
                                        'options' => $options,
                                        'label-message' => 'yourlanguage',
                                );
@@ -178,7 +236,7 @@ class Preferences {
                                                'label-message' => 'yourvariant',
                                                'type' => 'select',
                                                'options' => $options,
-                                               'section' => 'personal',
+                                               'section' => 'personal/i18n',
                                        );
                        }
                }
@@ -187,7 +245,7 @@ class Preferences {
                        $defaultPreferences['noconvertlink'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'misc',
+                                               'section' => 'personal/i18n',
                                                'label-message' => 'tog-noconvertlink',
                                        );
                }
@@ -200,28 +258,36 @@ class Preferences {
                                        'label-message' => 'yournick',
                                        'validation-callback' =>
                                                array( 'Preferences', 'validateSignature' ),
-                                       'section' => 'personal',
+                                       'section' => 'personal/signature',
                                        'filter-callback' => array( 'Preferences', 'cleanSignature' ),
                                );
                $defaultPreferences['fancysig'] =
                                array(
                                        'type' => 'toggle',
                                        'label-message' => 'tog-fancysig',
-                                       'section' => 'personal'
+                                       'section' => 'personal/signature'
                                );
                                
-               $defaultPreferences['rememberpassword'] =
+               ## Email stuff
+               
+               global $wgEmailConfirmToEdit;
+               
+               $defaultPreferences['emailaddress'] =
                                array(
-                                       'type' => 'toggle',
-                                       'label-message' => 'tog-rememberpassword',
-                                       'section' => 'personal',
+                                       'type' => 'text',
+                                       'default' => $user->getEmail(),
+                                       'section' => 'personal/email',
+                                       'label-message' => 'youremail',
+                                       'help-message' => $wgEmailConfirmToEdit
+                                                                               ? 'prefs-help-email-required'
+                                                                               : 'prefs-help-email',
+                                       'validation-callback' => array( 'Preferences', 'validateEmail' ),
                                );
-
-
-               ## Email #######################################
-               ## Email stuff
+                               
                global $wgEnableEmail, $wgEnableUserEmail, $wgEmailAuthentication;
                
+               $disableEmailPrefs = false;
+               
                if ( $wgEmailAuthentication ) {
                        if ( $user->getEmail() ) {
                                if( $user->getEmailAuthenticationTimestamp() ) {
@@ -235,12 +301,14 @@ class Preferences {
                                        $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 />';
                                }
                        } else {
+                               $disableEmailPrefs = true;
                                $emailauthenticated = wfMsg( 'noemailprefs' );
                        }
                        
@@ -248,7 +316,7 @@ class Preferences {
                                        array(
                                                'type' => 'info',
                                                'raw' => true,
-                                               'section' => 'email',
+                                               'section' => 'personal/email',
                                                'label-message' => 'prefs-emailconfirm-label',
                                                'default' => $emailauthenticated,
                                        );
@@ -261,45 +329,53 @@ class Preferences {
                                                array(
                                                        'type' => 'toggle',
                                                        'invert' => true,
-                                                       'section' => 'email',
+                                                       'section' => 'personal/email',
                                                        'label-message' => 'allowemail',
+                                                       'disabled' => $disableEmailPrefs,
                                                );
                                $defaultPreferences['ccmeonemails'] =
                                                array(
                                                        'type' => 'toggle',
-                                                       'section' => 'email',
+                                                       'section' => 'personal/email',
                                                        'label-message' => 'tog-ccmeonemails',
+                                                       'disabled' => $disableEmailPrefs,
                                                );
                        }
                        
                        $defaultPreferences['enotifwatchlistpages'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'email',
+                                               'section' => 'personal/email',
                                                'label-message' => 'tog-enotifwatchlistpages',
+                                               'disabled' => $disableEmailPrefs,
                                        );
                        $defaultPreferences['enotifusertalkpages'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'email',
+                                               'section' => 'personal/email',
                                                'label-message' => 'tog-enotifusertalkpages',
+                                               'disabled' => $disableEmailPrefs,
                                        );
                        $defaultPreferences['enotifminoredits'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'email',
+                                               'section' => 'personal/email',
                                                'label-message' => 'tog-enotifminoredits',
+                                               'disabled' => $disableEmailPrefs,
                                        );
                        $defaultPreferences['enotifrevealaddr'] =
                                        array(
                                                'type' => 'toggle',
-                                               'section' => 'email',
-                                               'label-message' => 'tog-enotifrevealaddr'
+                                               'section' => 'personal/email',
+                                               'label-message' => 'tog-enotifrevealaddr',
+                                               'disabled' => $disableEmailPrefs,
                                        );
                }
-               
+       }
+       
+       static function skinPreferences( $user, &$defaultPreferences ) {
                ## Skin #####################################
-               global $wgAllowUserSkin;
+               global $wgAllowUserSkin, $wgLang;
                
                if ($wgAllowUserSkin) {
                        $defaultPreferences['skin'] =
@@ -307,7 +383,7 @@ class Preferences {
                                                'type' => 'radio',
                                                'options' => self::generateSkinOptions( $user ),
                                                'label' => '&nbsp;',
-                                               'section' => 'skin',
+                                               'section' => 'rendering/skin',
                                        );
                }
                
@@ -323,9 +399,11 @@ class Preferences {
                                        'label-message' => 'qbsettings',
                                );
                }
-                               
+       }
+       
+       static function mathPreferences( $user, &$defaultPreferences ) {
                ## Math #####################################
-               global $wgUseTeX;
+               global $wgUseTeX, $wgLang;
                if ($wgUseTeX) {
                        $defaultPreferences['math'] =
                                        array(
@@ -333,25 +411,31 @@ class Preferences {
                                                'options' =>
                                                        array_flip( array_map( 'wfMsg', $wgLang->getMathNames() ) ),
                                                'label' => '&nbsp;',
-                                               'section' => 'math',
+                                               'section' => 'rendering/math',
                                        );
                }
-               
+       }
+       
+       static function filesPreferences( $user, &$defaultPreferences ) {
                ## Files #####################################
                $defaultPreferences['imagesize'] =
                                array(
                                        'type' => 'select',
                                        'options' => self::getImageSizes(),
                                        'label-message' => 'imagemaxsize',
-                                       'section' => 'files',
+                                       'section' => 'rendering/files',
                                );
                $defaultPreferences['thumbsize'] =
                                array(
                                        'type' => 'select',
                                        'options' => self::getThumbSizes(),
                                        'label-message' => 'thumbsize',
-                                       'section' => 'files',
+                                       'section' => 'rendering/files',
                                );
+       }
+       
+       static function datetimePreferences( $user, &$defaultPreferences ) {
+               global $wgLang;
                
                ## Date and time #####################################
                $dateOptions = self::getDateOptions();
@@ -407,7 +491,9 @@ class Preferences {
                                        'default' => $tzSetting,
                                        'section' => 'datetime',
                                );
-                               
+       }
+       
+       static function renderingPreferences( $user, &$defaultPreferences ) {
                ## Page Rendering ##############################
                $defaultPreferences['underline'] =
                                array(
@@ -476,13 +562,15 @@ class Preferences {
                                        'section' => 'rendering',
                                        'label-message' => 'tog-numberheadings',
                                );
-               
+       }
+       
+       static function editingPreferences( $user, &$defaultPreferences ) {
                ## Editing #####################################
                $defaultPreferences['cols'] =
                                array(
                                        'type' => 'int',
                                        'label-message' => 'columns',
-                                       'section' => 'editing',
+                                       'section' => 'editing/textboxsize',
                                        'min' => 4,
                                        'max' => 1000,
                                );
@@ -490,7 +578,7 @@ class Preferences {
                                array(
                                        'type' => 'int',
                                        'label-message' => 'rows',
-                                       'section' => 'editing',
+                                       'section' => 'editing/textboxsize',
                                        'min' => 4,
                                        'max' => 1000,
                                );
@@ -566,7 +654,10 @@ class Preferences {
                                        'section' => 'editing',
                                        'label-message' => 'tog-uselivepreview',
                                );
-                               
+       }
+       
+       static function rcPreferences( $user, &$defaultPreferences ) {
+               global $wgRCMaxAge, $wgUseRCPatrol;
                ## RecentChanges #####################################
                $defaultPreferences['rcdays'] =
                                array(
@@ -620,7 +711,10 @@ class Preferences {
                                                'label-message' => 'tog-shownumberswatching',
                                        );
                }
-                               
+       }
+       
+       static function watchlistPreferences( $user, &$defaultPreferences ) {
+               global $wgUseRCPatrol;
                ## Watchlist #####################################
                $defaultPreferences['wllimit'] =
                                array(
@@ -702,6 +796,10 @@ class Preferences {
                                );
                        }
                }
+       }
+       
+       static function searchPreferences( $user, &$defaultPreferences ) {
+               global $wgContLang;
                
                ## Search #####################################
                $defaultPreferences['searchlimit'] =
@@ -724,7 +822,16 @@ class Preferences {
                                        'label-message' => 'contextchars',
                                        'section' => 'searchoptions',
                                        'min' => 0,
-                               );
+                               );              
+               global $wgEnableMWSuggest;
+               if ($wgEnableMWSuggest) {
+                       $defaultPreferences['disablesuggest'] =
+                                       array(
+                                               'type' => 'toggle',
+                                               'label-message' => 'mwsuggest-disable',
+                                               'section' => 'searchoptions',
+                                       );
+               }               
                
                // Searchable namespaces back-compat with old format
                $searchableNamespaces = SearchEngine::searchableNamespaces();
@@ -747,17 +854,9 @@ class Preferences {
                                        'section' => 'searchoptions',
                                        'prefix' => 'searchNs',
                                );
-                               
-               global $wgEnableMWSuggest;
-               if ($wgEnableMWSuggest) {
-                       $defaultPreferences['disablesuggest'] =
-                                       array(
-                                               'type' => 'toggle',
-                                               'label-message' => 'mwsuggest-disable',
-                                               'section' => 'searchoptions',
-                                       );
-               }
-               
+       }
+       
+       static function miscPreferences( $user, &$defaultPreferences ) {
                ## Misc #####################################
                $defaultPreferences['diffonly'] =
                                array(
@@ -771,55 +870,6 @@ class Preferences {
                                        'section' => 'misc',
                                        'label-message' => 'tog-norollbackdiff',
                                );
-                               
-               wfRunHooks( 'GetPreferences', array( $user, &$defaultPreferences ) );
-                               
-               ## 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]
-                                                               : null;
-                       
-                       // If it validates, set it as the default
-                       if ( isset($info['default']) ) {
-                               // Already set, no problem
-                               continue;
-                       } elseif ( !is_null( $prefFromUser ) && // Make sure we're not just pulling nothing
-                                       $field->validate( $prefFromUser, $user->mOptions ) ) {
-                               $info['default'] = $prefFromUser;
-                       } elseif( $field->validate( $globalDefault, $user->mOptions ) ) {
-                               $info['default'] = $globalDefault;
-                       }
-               }
-               
-               self::$defaultPreferences = $defaultPreferences;
-               
-               return $defaultPreferences;
-       }
-       
-       // Pull option from a user account. Handles stuff like array-type preferences.
-       static function getOptionFromUser( $name, $info, $user ) {
-               $val = $user->getOption( $name );
-               
-               // Handling for array-type preferences
-               if ( ( isset($info['type']) && $info['type'] == 'multiselect' ) ||
-                               ( isset($info['class']) && $info['class'] == 'HTMLMultiSelectField' ) ) {
-
-                       $options = HTMLFormField::flattenOptions($info['options']);
-                       $prefix = isset($info['prefix']) ? $info['prefix'] : $name;
-                       $val = array();
-                       
-                       foreach( $options as $label => $value ) {
-                               if ($user->getOption( "$prefix$value" ) ) {
-                                       $val[] = $value;
-                               }
-                       }
-               }
-       
-               return $val;
        }
        
        static function generateSkinOptions( $user ) {
@@ -1050,9 +1100,11 @@ class Preferences {
                }
        }
        
-       static function tryFormSubmit( $formData ) {
+       static function tryFormSubmit( $formData, $entryPoint = 'internal' ) {
                global $wgUser, $wgEmailAuthentication, $wgEnableEmail;
                
+               $result = true;
+               
                // Filter input
                foreach( array_keys($formData) as $name ) {
                        if ( isset(self::$saveFilters[$name]) ) {
@@ -1082,9 +1134,8 @@ class Preferences {
                                        $result = $wgUser->sendConfirmationMail();
                                        if( WikiError::isError( $result ) ) {
                                                return wfMsg( 'mailerror', htmlspecialchars( $result->getMessage() ) );
-                                       } else {
-                                               // TODO return this somehow
-#                                              wfMsg( 'eauthentsent', $wgUser->getName() );
+                                       } elseif ($entryPoint == 'ui') {
+                                               $result = 'eauth';
                                        }
                                }
                        } else {
@@ -1115,9 +1166,23 @@ class Preferences {
                
                $wgUser->saveSettings();
                
-               // Done
-               global $wgOut;
-               $wgOut->redirect( SpecialPage::getTitleFor( 'Preferences' )->getFullURL( 'success' ) );
+               return $result;
+       }
+       
+       public static function tryUISubmit( $formData ) {
+               $res = self::tryFormSubmit( $formData, 'ui' );
+               
+               if ($res) {
+                       $urlOptions = array( 'success' );
+                       if ($res === 'eauth')
+                               $urlOptions[] = 'eauth';
+                       
+                       $queryString = implode( '&', $urlOptions );
+                       
+                       $url = SpecialPage::getTitleFor( 'Preferences' )->getFullURL( $queryString );
+                       global $wgOut;
+                       $wgOut->redirect( $url );
+               }
                
                return true;
        }
@@ -1156,6 +1221,8 @@ class PreferencesForm extends HTMLForm {
                
                $html .= "\n" . $sk->link( $t, wfMsg( 'restoreprefs' ) );
                
+               $html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
+               
                return $html;
        }