findAddress() can return FALSE as well as zero
[squirrelmail.git] / src / options.php
index 88ca5a6533de3749544172a44176eb908929b9d4..2a3fd2a42e76f7496cf0ea5b710c1ceb6d1a72ce 100644 (file)
@@ -6,7 +6,7 @@
  * Displays the options page. Pulls from proper user preference files
  * and config.php. Displays preferences as selected and other options.
  *
- * @copyright © 1999-2007 The SquirrelMail Project Team
+ * @copyright 1999-2012 The SquirrelMail Project Team
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
@@ -39,10 +39,24 @@ define('SMOPT_PAGE_MAIN', 'main');
 define('SMOPT_PAGE_PERSONAL', 'personal');
 define('SMOPT_PAGE_DISPLAY', 'display');
 define('SMOPT_PAGE_COMPOSE', 'compose');
+define('SMOPT_PAGE_ACCESSIBILITY', 'accessibility');
 define('SMOPT_PAGE_HIGHLIGHT', 'highlight');
 define('SMOPT_PAGE_FOLDER', 'folder');
 define('SMOPT_PAGE_ORDER', 'order');
 
+/**
+  * Save submitted options and calculate the most 
+  * we need to refresh the page
+  *
+  * @param string $optpage      The name of the page being submitted
+  * @param array  $optpage_data An array of all the submitted options
+  *
+  * @return int The highest level of screen refresh needed per
+  *             the options that were changed.  This value will
+  *             correspond to the SMOPT_REFRESH_* constants found
+  *             in functions/options.php.
+  *
+  */
 function process_optionmode_submit($optpage, $optpage_data) {
     /* Initialize the maximum option refresh level. */
     $max_refresh = SMOPT_REFRESH_NONE;
@@ -89,8 +103,9 @@ function process_optionmode_link($optpage) {
 
 /* get the globals that we may need */
 sqgetGlobalVar('optpage',     $optpage);
-sqgetGlobalVar('optmode',     $optmode,      SQ_FORM);
-sqgetGlobalVar('optpage_data',$optpage_data, SQ_POST);
+sqgetGlobalVar('optmode',     $optmode,         SQ_FORM);
+sqgetGlobalVar('optpage_data',$optpage_data,    SQ_POST);
+sqgetGlobalVar('smtoken',     $submitted_token, SQ_FORM, '');
 /* end of getting globals */
 
 /* Make sure we have an Option Page set. Default to main. */
@@ -136,6 +151,12 @@ switch ($optpage) {
         $optpage_loader = 'load_optpage_data_compose';
         $optpage_loadhook = 'optpage_loadhook_compose';
         break;
+    case SMOPT_PAGE_ACCESSIBILITY:
+        $optpage_name   = _("Accessibility Preferences");
+        $optpage_file   = SM_PATH . 'include/options/accessibility.php';
+        $optpage_loader = 'load_optpage_data_accessibility';
+        $optpage_loadhook = 'optpage_loadhook_accessibility';
+        break;
     case SMOPT_PAGE_HIGHLIGHT:
         $optpage_name   = _("Message Highlighting");
         $optpage_file   = SM_PATH . 'include/options/highlight.php';
@@ -179,6 +200,12 @@ if ( !@is_file( $optpage_file ) ) {
 /*** Next, process anything that needs to be processed. ***/
 /***********************************************************/
 
+// security check before saving anything...
+//FIXME: what about SMOPT_MODE_LINK??
+if ($optmode == SMOPT_MODE_SUBMIT) {
+   sm_validate_security_token($submitted_token, 3600, TRUE);
+}
+
 $optpage_save_error=array();
 
 if ( isset( $optpage_data ) ) {
@@ -201,6 +228,7 @@ if (isset($optpage_name) && ($optpage_name != '')) {
 /* DO OLD SAVING OF SUBMITTED OPTIONS. THIS WILL BE REMOVED LATER. */
 /*******************************************************************/
 
+//FIXME: let's remove these finally in 1.5.2..... but first, are there any plugins using them?
 /* If in submit mode, select a save hook name and run it. */
 if ($optmode == SMOPT_MODE_SUBMIT) {
     /* Select a save hook name. */
@@ -214,6 +242,9 @@ if ($optmode == SMOPT_MODE_SUBMIT) {
         case SMOPT_PAGE_COMPOSE:
             $save_hook_name = 'options_compose_save';
             break;
+        case SMOPT_PAGE_ACCESSIBILITY:
+            $save_hook_name = 'options_accessibility_save';
+            break;
         case SMOPT_PAGE_FOLDER:
             $save_hook_name = 'options_folder_save';
             break;
@@ -235,6 +266,7 @@ if ($optmode == SMOPT_MODE_SUBMIT) {
 
 if ($optmode == SMOPT_MODE_SUBMIT) {
     $optpage = SMOPT_PAGE_MAIN;
+    $optpage_title = _("Options");
 }
 
 /***************************************************************/
@@ -266,7 +298,8 @@ if ($optpage == SMOPT_PAGE_MAIN) {
             $notice.= "</ul>\n" . _("Some of your preference changes were not applied.") . "\n";
         } else {
             /* Display a message indicating a successful save. */
-            $notice = _("Successfully Saved Options") . ": $optpage_name</b><br />\n";
+            // i18n: The %s represents the name of the option page saving the options
+            $notice = sprintf(_("Successfully Saved Options: %s"), $optpage_name) . "<br />\n";
         }
 
         /* If $max_refresh != SMOPT_REFRESH_NONE, provide a refresh link. */
@@ -298,52 +331,73 @@ if ($optpage == SMOPT_PAGE_MAIN) {
     /******************************************/
     $optpage_blocks = array();
 
+    // access keys...
+    global $accesskey_options_personal, $accesskey_options_display,
+           $accesskey_options_highlighting, $accesskey_options_folders,
+           $accesskey_options_index_order, $accesskey_options_compose,
+           $accesskey_options_accessibility;
+
     /* Build a section for Personal Options. */
     $optpage_blocks[] = array(
-        'name' => _("Personal Information"),
-        'url'  => 'options.php?optpage=' . SMOPT_PAGE_PERSONAL,
-        'desc' => _("This contains personal information about yourself such as your name, your email address, etc."),
-        'js'   => false
+        'name'      => _("Personal Information"),
+        'url'       => 'options.php?optpage=' . SMOPT_PAGE_PERSONAL,
+        'desc'      => _("This contains personal information about yourself such as your name, your email address, etc."),
+        'js'        => false,
+        'accesskey' => $accesskey_options_personal,
     );
 
     /* Build a section for Display Options. */
     $optpage_blocks[] = array(
-        'name' => _("Display Preferences"),
-        'url'  => 'options.php?optpage=' . SMOPT_PAGE_DISPLAY,
-        'desc' => _("You can change the way that SquirrelMail looks and displays information to you, such as the colors, the language, and other settings."),
-        'js'   => false
+        'name'      => _("Display Preferences"),
+        'url'       => 'options.php?optpage=' . SMOPT_PAGE_DISPLAY,
+        'desc'      => _("You can change the way that SquirrelMail looks and displays information to you, such as the colors, the language, and other settings."),
+        'js'        => false,
+        'accesskey' => $accesskey_options_display,
     );
 
     /* Build a section for Message Highlighting Options. */
     $optpage_blocks[] = array(
-        'name' =>_("Message Highlighting"),
-        'url'  => 'options_highlight.php',
-        'desc' =>_("Based upon given criteria, incoming messages can have different background colors in the message list. This helps to easily distinguish who the messages are from, especially for mailing lists."),
-        'js'   => false
+        'name'      =>_("Message Highlighting"),
+        'url'       => 'options_highlight.php',
+        'desc'      =>_("Based upon given criteria, incoming messages can have different background colors in the message list. This helps to easily distinguish who the messages are from, especially for mailing lists."),
+        'js'        => false,
+        'accesskey' => $accesskey_options_highlighting,
     );
 
     /* Build a section for Folder Options. */
     $optpage_blocks[] = array(
-        'name' => _("Folder Preferences"),
-        'url'  => 'options.php?optpage=' . SMOPT_PAGE_FOLDER,
-        'desc' => _("These settings change the way your folders are displayed and manipulated."),
-        'js'   => false
+        'name'      => _("Folder Preferences"),
+        'url'       => 'options.php?optpage=' . SMOPT_PAGE_FOLDER,
+        'desc'      => _("These settings change the way your folders are displayed and manipulated."),
+        'js'        => false,
+        'accesskey' => $accesskey_options_folders,
     );
 
     /* Build a section for Index Order Options. */
     $optpage_blocks[] = array(
-        'name' => _("Index Order"),
-        'url'  => 'options_order.php',
-        'desc' => _("The order of the message index can be rearranged and changed to contain the headers in any order you want."),
-        'js'   => false
+        'name'      => _("Index Order"),
+        'url'       => 'options_order.php',
+        'desc'      => _("The order of the message index can be rearranged and changed to contain the headers in any order you want."),
+        'js'        => false,
+        'accesskey' => $accesskey_options_index_order,
     );
 
     /* Build a section for Compose Options. */
     $optpage_blocks[] = array(
-        'name' => _("Compose Preferences"),
-        'url'  => 'options.php?optpage=' . SMOPT_PAGE_COMPOSE,
-        'desc' => _("Control the behaviour and layout of writing new mail messages, replying to and forwarding messages."),
-        'js'   => false
+        'name'      => _("Compose Preferences"),
+        'url'       => 'options.php?optpage=' . SMOPT_PAGE_COMPOSE,
+        'desc'      => _("Control the behaviour and layout of writing new mail messages, replying to and forwarding messages."),
+        'js'        => false,
+        'accesskey' => $accesskey_options_compose,
+    );
+
+    /* Build a section for Accessibility Options. */
+    $optpage_blocks[] = array(
+        'name'      => _("Accessibility Preferences"),
+        'url'       => 'options.php?optpage=' . SMOPT_PAGE_ACCESSIBILITY,
+        'desc'      => _("You can configure features that improve interface usability."),
+        'js'        => false,
+        'accesskey' => $accesskey_options_accessibility,
     );
 
     /* Build a section for plugins wanting to register an optionpage. */
@@ -355,6 +409,9 @@ if ($optpage == SMOPT_PAGE_MAIN) {
     $js_optpage_blocks = array();
     $reg_optpage_blocks = array();
     foreach ($optpage_blocks as $cur_optpage) {
+        if (!isset($cur_optpage['accesskey'])) {
+            $cur_optpage['accesskey'] = 'NONE';
+        }
         if (!isset($cur_optpage['js']) || !$cur_optpage['js']) {
             $reg_optpage_blocks[] = $cur_optpage;
         } else if (checkForJavascript()) {
@@ -378,58 +435,48 @@ if ($optpage == SMOPT_PAGE_MAIN) {
 /* If we are not looking at the main option page, display the page here. */
 /*************************************************************************/
 } else {
-    /* Set the inside_hook_name and submit_name. */
+    /* Set the bottom_hook_name and submit_name. */
     switch ($optpage) {
         case SMOPT_PAGE_PERSONAL:
-            $inside_hook_name = 'options_personal_inside';
             $bottom_hook_name = 'options_personal_bottom';
             $submit_name = 'submit_personal';
             break;
         case SMOPT_PAGE_DISPLAY:
-            $inside_hook_name = 'options_display_inside';
             $bottom_hook_name = 'options_display_bottom';
             $submit_name = 'submit_display';
             break;
         case SMOPT_PAGE_COMPOSE:
-            $inside_hook_name = 'options_compose_inside';
             $bottom_hook_name = 'options_compose_bottom';
             $submit_name = 'submit_compose';
             break;
+        case SMOPT_PAGE_ACCESSIBILITY:
+            $bottom_hook_name = 'options_accessibility_bottom';
+            $submit_name = 'submit_accessibility';
+            break;
         case SMOPT_PAGE_HIGHLIGHT:
-            $inside_hook_name = 'options_highlight_inside';
             $bottom_hook_name = 'options_highlight_bottom';
             $submit_name = 'submit_highlight';
             break;
         case SMOPT_PAGE_FOLDER:
-            $inside_hook_name = 'options_folder_inside';
             $bottom_hook_name = 'options_folder_bottom';
             $submit_name = 'submit_folder';
             break;
         case SMOPT_PAGE_ORDER:
-            $inside_hook_name = 'options_order_inside';
             $bottom_hook_name = 'options_order_bottom';
             $submit_name = 'submit_order';
             break;
         default:
-            $inside_hook_name = '';
             $bottom_hook_name = '';
             $submit_name = 'submit';
     }
 
     // Begin output form
-    echo addForm('options.php', 'post', 'f')
+    echo addForm('options.php', 'post', 'option_form', '', '', array(), TRUE)
        . create_optpage_element($optpage)
        . create_optmode_element(SMOPT_MODE_SUBMIT);
 
-    // Wrap the template in a table to keep from breaking the hooks below
-    $oTemplate->assign('attributes', array('cellspacing' => 0, 'class' => 'table_blank'));
-    $oTemplate->display('table.tpl');
-    $oTemplate->display('table_row.tpl');
-    $oTemplate->assign('attributes', array('colspan' => 2));
-    $oTemplate->display('table_data.tpl');
-
     // This is the only variable that is needed by *just* the template.
-    $oTemplate->assign('options', $optpage_data['options']);
+    $oTemplate->assign('option_groups', $optpage_data['options']);
     
     global $ask_user_info, $org_name;
     if ( $optpage == SMOPT_PAGE_PERSONAL && $ask_user_info
@@ -438,35 +485,20 @@ if ($optpage == SMOPT_PAGE_MAIN) {
             sprintf(_("Welcome to %s. Please supply your full name and email address."), $org_name) );
     }
     
-    /**
-     * The variables below should not be needed by the template since all plugin
-     * hooks are called here, not in the template.  If we find otherwise, these
-     * variables can be passed to the template.  Commenting out for now.
-     */
-/*
+    // These variables are not specifically needed by the template,
+    // but they are relevant to the page being built, so we'll add
+    // them in case some plugin is modifying the page, etc....
+    //
     $oTemplate->assign('max_refresh', isset($max_refresh) ? $max_refresh : NULL);
     $oTemplate->assign('page_title', $optpage_title);
-    $oTemplate->assign('optpage',$optpage);
-    $oTemplate->assign('optpage_name',$optpage_name);
-    $oTemplate->assign('optmode',$optmode);
-    $oTemplate->assign('optpage_data',$optpage_data);
-*/
-    /**
-     * END comment block
-     */    
+    $oTemplate->assign('optpage', $optpage);
+    $oTemplate->assign('optpage_name', $optpage_name);
+    $oTemplate->assign('optmode', $optmode);
+    $oTemplate->assign('optpage_data', $optpage_data);
      
     $oTemplate->assign('submit_name', $submit_name);
     $oTemplate->display('options.tpl');
 
-    $oTemplate->display('table_data_close.tpl');
-    $oTemplate->display('table_row_close.tpl');
-
-    /* If it is not empty, trigger the inside hook. */
-    if ($inside_hook_name != '') {
-        do_hook($inside_hook_name, $null);
-    }
-
-    $oTemplate->display('table_close.tpl');
     $oTemplate->display('form_close.tpl');
 
     /* If it is not empty, trigger the bottom hook. */