Source for file page_header.php

Documentation is available at page_header.php

  1. <?php
  2.  
  3. /**
  4.  * page_header.php
  5.  *
  6.  * Prints the page header (duh)
  7.  *
  8.  * @copyright 1999-2014 The SquirrelMail Project Team
  9.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  10.  * @version $Id: page_header.php 14422 2014-01-01 20:59:43Z pdontthink $
  11.  * @package squirrelmail
  12.  */
  13.  
  14. /** Include required files from SM */
  15. require_once(SM_PATH 'functions/strings.php');
  16. require_once(SM_PATH 'functions/html.php');
  17. require_once(SM_PATH 'functions/imap_mailbox.php');
  18. require_once(SM_PATH 'functions/global.php');
  19.  
  20. /* Always set up the language before calling these functions */
  21. /**
  22.  * @param array $script_libs_param A list of strings, which each point to
  23.  *                                  a script to be added to the <head> of
  24.  *                                  the page being built. Each string can
  25.  *                                  be:
  26.  *                                   - One of the pre-defined SM_SCRIPT_LIB_XXX
  27.  *                                     constants (see functions/constants.php)
  28.  *                                     that correspond to libraries that come
  29.  *                                     with SquirrelMail
  30.  *                                   - A path to a custom script (say, in a
  31.  *                                     plugin directory) (detected by the
  32.  *                                     existence of at least one path separator
  33.  *                                     in the string) - the script is assumed
  34.  *                                     to be and is included as JavaScript
  35.  *                                   - A full tag ("<script>", "<style>" or
  36.  *                                     other) that will be placed verbatim in
  37.  *                                     the page header (detected by the presence
  38.  *                                     of a "<" character at the beginning of
  39.  *                                     the string). NOTE that $xtra provides the
  40.  *                                     same function, without needing the string
  41.  *                                     to start with "<"
  42.  */
  43. function displayHtmlHeader($title='SquirrelMail'$xtra_param=''$do_hook=TRUE$script_libs_param=array()) {
  44.     global $squirrelmail_language$xtra$script_libs;
  45.  
  46.     // $script_libs and $xtra are globalized to allow plugins to
  47.     // modify them on the generic_header hook, but we also want to
  48.     // respect the values passed in from the function args, thus:
  49.     $xtra $xtra_param;
  50.     $script_libs $script_libs_param;
  51.     if (!is_array($script_libs))
  52.         $script_libs array($script_libs);
  53.  
  54.     if !sqgetGlobalVar('base_uri'$base_uriSQ_SESSION) ) {
  55.         global $base_uri;
  56.     }
  57.     global $theme_css$custom_css$pageheader_sent$browser_rendering_mode;
  58.  
  59.     // prevent clickjack attempts
  60. // FIXME: should we use DENY instead?  We can also make this a configurable value, including giving the admin the option of removing this entirely in case they WANT to be framed by an external domain
  61.     header('X-Frame-Options: SAMEORIGIN');
  62.  
  63.     echo ($browser_rendering_mode === 'standards'
  64.        ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'
  65.        : ($browser_rendering_mode === 'almost'
  66.          ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'
  67.          : /* "quirks" */ '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">')) .
  68.          "\n\n" html_tag'html' ,'' '''''' "\n<head>\n" .
  69.          "<meta name=\"robots\" content=\"noindex,nofollow\">\n" .
  70.          "<meta http-equiv=\"x-dns-prefetch-control\" content=\"off\">\n";
  71.  
  72.     // prevent clickjack attempts using JavaScript for browsers that
  73.     // don't support the X-Frame-Options header...
  74.     // we check to see if we are *not* the top page, and if not, check
  75.     // whether or not the top page is in the same domain as we are...
  76.     // if not, log out immediately -- this is an attempt to do the same
  77.     // thing that the X-Frame-Options does using JavaScript (never a good
  78.     // idea to rely on JavaScript-based solutions, though)
  79.     echo '<script type="text/javascript" language="JavaScript">'
  80.        . "\n<!--\n"
  81.        . 'if (self != top) { try { if (document.domain != top.document.domain) {'
  82.        . ' throw "Clickjacking security violation! Please log out immediately!"; /* this code should never execute - exception should already have been thrown since it\'s a security violation in this case to even try to access top.document.domain (but it\'s left here just to be extra safe) */ } } catch (e) { self.location = "'
  83.        . sqm_baseuri('src/signout.php"; top.location = "'
  84.        . sqm_baseuri('src/signout.php" } }'
  85.        . "\n// -->\n</script>\n";
  86.  
  87.     if !isset$custom_css || $custom_css == 'none' {
  88.         if ($theme_css != ''{
  89.             echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"$theme_css\">";
  90.         }
  91.     else {
  92.         echo '<link rel="stylesheet" type="text/css" href="' .
  93.              $base_uri 'themes/css/'.$custom_css.'">';
  94.     }
  95.  
  96.     if ($squirrelmail_language == 'ja_JP'{
  97.         // Why is it added here? Header ('Content-Type:..) is used in i18n.php
  98.         echo "<!-- \xfd\xfe -->\n";
  99.         echo '<meta http-equiv="Content-type" content="text/html; charset=euc-jp">' "\n";
  100.     }
  101.  
  102.     if ($do_hook{
  103.         do_hook('generic_header');
  104.     }
  105.  
  106.     echo "\n<title>$title</title>$xtra\n";
  107.  
  108.     // output <script> tags as needed (use array_unique so
  109.     // more than one plugin can ask for the same library)
  110.     // 
  111.     // usage of $script_libs is discussed in the docs for this function above
  112.     // 
  113.     foreach (array_unique($script_libsas $item{
  114.         if ($item{0=== '<')
  115.             echo $item "\n";
  116.         else if (strpos($item'/'!== FALSE || strpos($item'\\'!== FALSE)
  117.             echo '<script language="JavaScript" type="text/javascript" src="' $item '"></script>' "\n";
  118.         else
  119.             echo '<script language="JavaScript" type="text/javascript" src="' $base_uri 'scripts/' $item '"></script>' "\n";
  120.     }
  121.  
  122.     /* work around IE6's scrollbar bug */
  123.     echo <<<ECHO
  124. <!--[if IE 6]>
  125. <style type="text/css">
  126. /* avoid stupid IE6 bug with frames and scrollbars */
  127. body {
  128.     width: expression(document.documentElement.clientWidth - 30);
  129. }
  130. </style>
  131. <![endif]-->
  132.  
  133. ECHO;
  134.  
  135.     echo "\n</head>\n\n";
  136.  
  137.     /* this is used to check elsewhere whether we should call this function */
  138.     $pageheader_sent TRUE;
  139. }
  140.  
  141. function makeInternalLink($path$text$target=''{
  142.     sqgetGlobalVar('base_uri'$base_uriSQ_SESSION);
  143.     if ($target != ''{
  144.         $target " target=\"$target\"";
  145.     }
  146.     return '<a href="'.$base_uri.$path.'"'.$target.'>'.$text.'</a>';
  147. }
  148.  
  149. function displayInternalLink($path$text$target=''{
  150.     echo makeInternalLink($path$text$target);
  151. }
  152.  
  153. function displayPageHeader($color$mailbox$xtra=''$session=false{
  154.  
  155.            $compose_new_win$compose_width$compose_height,
  156.            $attachemessages$provider_name$provider_uri,
  157.            $javascript_on$default_use_mdn$mdn_user_support,
  158.            $startMessage$org_title;
  159.  
  160.     sqgetGlobalVar('base_uri'$base_uriSQ_SESSION );
  161.     sqgetGlobalVar('delimiter'$delimiterSQ_SESSION );
  162.     if (!isset($frame_top)) {
  163.         $frame_top '_top';
  164.     }
  165.  
  166.     if ($session{
  167.         $compose_uri $base_uri.'src/compose.php?mailbox='.urlencode($mailbox).'&amp;session='."$session";
  168.     else {
  169.         $compose_uri $base_uri.'src/compose.php?newmessage=1';
  170.         $session 0;
  171.     }
  172.  
  173.     // only output JavaScript if actually turned on
  174.     if($javascript_on || strpos($xtra'new_js_autodetect_results.value') ) {
  175.         if !defined('PAGE_NAME') ) define('PAGE_NAME'NULL);
  176.         switch PAGE_NAME {
  177.         case 'read_body':
  178.             $js ='';
  179.  
  180.             // compose in new window code
  181.             if ($compose_new_win == '1'{
  182.                 if (!preg_match("/^[0-9]{3,4}$/"$compose_width)) {
  183.                     $compose_width '640';
  184.                 }
  185.                 if (!preg_match("/^[0-9]{3,4}$/"$compose_height)) {
  186.                     $compose_height '550';
  187.                 }
  188.                 $js .= "function comp_in_new(comp_uri) {\n".
  189.                      "       if (!comp_uri) {\n".
  190.                      '           comp_uri = "'.$compose_uri."\";\n".
  191.                      '       }'"\n".
  192.                      '    var newwin = window.open(comp_uri' .
  193.                      ', "_blank",'.
  194.                      '"width='.$compose_width',height='.$compose_height.
  195.                      ',scrollbars=yes,resizable=yes,status=yes");'."\n".
  196.                      "}\n\n";
  197.             }
  198.  
  199.             // javascript for sending read receipts
  200.             if($default_use_mdn && $mdn_user_support{
  201.                 $js .= "function sendMDN() {\n".
  202.                          "    mdnuri=window.location+'&sendreceipt=1';\n" .
  203.                          "    window.location = mdnuri;\n" .
  204.                        "\n}\n\n";
  205.             }
  206.  
  207.             // if any of the above passes, add the JS tags too.
  208.             if($js{
  209.                 $js "\n".'<script language="JavaScript" type="text/javascript">' .
  210.                       "\n<!--\n" $js "// -->\n</script>\n";
  211.             }
  212.  
  213.             displayHtmlHeader($org_title$js);
  214.             $onload $xtra;
  215.           break;
  216.         case 'compose':
  217.             $js '<script language="JavaScript" type="text/javascript">' .
  218.              "\n<!--\n" .
  219.              "var alreadyFocused = false;\n" .
  220.              "function checkForm() {\n" .
  221.              "\n    if (alreadyFocused) return;\n";
  222.  
  223.             global $action$reply_focus;
  224.             if (strpos($action'reply'!== FALSE && $reply_focus)
  225.             {
  226.                 if ($reply_focus == 'select'$js .= "document.forms['compose'].body.select();}\n";
  227.                 else if ($reply_focus == 'focus'$js .= "document.forms['compose'].body.focus();}\n";
  228.                 else if ($reply_focus == 'none'$js .= "}\n";
  229.             }
  230.             // no reply focus also applies to composing new messages
  231.             else if ($reply_focus == 'none')
  232.             {
  233.                 $js .= "}\n";
  234.             }
  235.             else
  236.                 $js .= "    var f = document.forms.length;\n".
  237.                 "    var i = 0;\n".
  238.                 "    var pos = -1;\n".
  239.                 "    while( pos == -1 && i < f ) {\n".
  240.                 "        var e = document.forms[i].elements.length;\n".
  241.                 "        var j = 0;\n".
  242.                 "        while( pos == -1 && j < e ) {\n".
  243.                 "            if ( document.forms[i].elements[j].type == 'text' ) {\n".
  244.                 "                pos = j;\n".
  245.                 "            }\n".
  246.                 "            j++;\n".
  247.                 "        }\n".
  248.                 "        i++;\n".
  249.                 "    }\n".
  250.                 "    if( pos >= 0 ) {\n".
  251.                 "        document.forms[i-1].elements[pos].focus();\n".
  252.                 "    }\n".
  253.                 "}\n";
  254.  
  255.             $js .= "// -->\n".
  256.                  "</script>\n";
  257.             $onload 'onload="checkForm();"';
  258.             displayHtmlHeader($org_title$js);
  259.             break;
  260.  
  261.         default:
  262.             $js '<script language="JavaScript" type="text/javascript">' .
  263.              "\n<!--\n" .
  264.              "function checkForm() {\n".
  265.              "   var f = document.forms.length;\n".
  266.              "   var i = 0;\n".
  267.              "   var pos = -1;\n".
  268.              "   while( pos == -1 && i < f ) {\n".
  269.              "       var e = document.forms[i].elements.length;\n".
  270.              "       var j = 0;\n".
  271.              "       while( pos == -1 && j < e ) {\n".
  272.              "           if ( document.forms[i].elements[j].type == 'text' " .
  273.              "           || document.forms[i].elements[j].type == 'password' ) {\n".
  274.              "               pos = j;\n".
  275.              "           }\n".
  276.              "           j++;\n".
  277.              "       }\n".
  278.              "   i++;\n".
  279.              "   }\n".
  280.              "   if( pos >= 0 ) {\n".
  281.              "       document.forms[i-1].elements[pos].focus();\n".
  282.              "   }\n".
  283.              "   $xtra\n".
  284.              "}\n";
  285.  
  286.             if ($compose_new_win == '1'{
  287.                 if (!preg_match("/^[0-9]{3,4}$/"$compose_width)) {
  288.                     $compose_width '640';
  289.                 }
  290.                 if (!preg_match("/^[0-9]{3,4}$/"$compose_height)) {
  291.                     $compose_height '550';
  292.                 }
  293.                 $js .= "function comp_in_new(comp_uri) {\n".
  294.                      "       if (!comp_uri) {\n".
  295.                      '           comp_uri = "'.$compose_uri."\";\n".
  296.                      '       }'"\n".
  297.                      '    var newwin = window.open(comp_uri' .
  298.                      ', "_blank",'.
  299.                      '"width='.$compose_width',height='.$compose_height.
  300.                      ',scrollbars=yes,resizable=yes,status=yes");'."\n".
  301.                      "}\n\n";
  302.  
  303.             }
  304.         $js .= "// -->\n""</script>\n";
  305.  
  306.  
  307.         $onload 'onload="checkForm();"';
  308.         displayHtmlHeader($org_title$js);
  309.       // end switch module
  310.     else {
  311.         // JavaScript off
  312.         displayHtmlHeader($org_title);
  313.         $onload '';
  314.     }
  315.  
  316.     echo "<body text=\"$color[8]\" bgcolor=\"$color[4]\" link=\"$color[7]\" vlink=\"$color[7]\" alink=\"$color[7]\" $onload>\n\n";
  317.     /** Here is the header and wrapping table **/
  318.                       readShortMailboxName($mailbox$delimiter)));
  319.     if $shortBoxName == 'INBOX' {
  320.         $shortBoxName _("INBOX");
  321.     }
  322.     echo "<a name=\"pagetop\"></a>\n"
  323.         . html_tag'table'''''$color[4]'border="0" width="100%" cellspacing="0" cellpadding="2"' ."\n"
  324.         . html_tag'tr'''''$color[9."\n"
  325.         . html_tag'td''''left' ."\n";
  326.     if $shortBoxName <> '' && strtolower$shortBoxName <> 'none' {
  327.         echo '         ' _("Current Folder"": <b>$shortBoxName&nbsp;</b>\n";
  328.     else {
  329.         echo '&nbsp;';
  330.     }
  331.     echo  "      </td>\n"
  332.         . html_tag'td''''right' ."<b>\n";
  333.     displayInternalLink ('src/signout.php'_("Sign Out")$frame_top);
  334.     echo "</b></td>\n"
  335.         . "   </tr>\n"
  336.         . html_tag'tr'''''$color[4."\n"
  337.         . ($hide_sm_attributions html_tag'td''''left''''colspan="2"' )
  338.                                  : html_tag'td''''left' ) )
  339.         . "\n";
  340.     $urlMailbox urlencode($mailbox);
  341.     $startMessage = (int)$startMessage;
  342.     echo makeComposeLink('src/compose.php?mailbox='.$urlMailbox.'&amp;startMessage='.$startMessage);
  343.     echo "&nbsp;&nbsp;\n";
  344.     displayInternalLink ('src/addressbook.php'_("Addresses"));
  345.     echo "&nbsp;&nbsp;\n";
  346.     displayInternalLink ('src/folders.php'_("Folders"));
  347.     echo "&nbsp;&nbsp;\n";
  348.     displayInternalLink ('src/options.php'_("Options"));
  349.     echo "&nbsp;&nbsp;\n";
  350.     displayInternalLink ("src/search.php?mailbox=$urlMailbox"_("Search"));
  351.     echo "&nbsp;&nbsp;\n";
  352.     displayInternalLink ('src/help.php'_("Help"));
  353.     echo "&nbsp;&nbsp;\n";
  354.  
  355.     do_hook('menuline');
  356.  
  357.     echo "      </td>\n";
  358.  
  359.     if (!$hide_sm_attributions)
  360.     {
  361.         echo html_tag'td''''right' ."\n";
  362.         if (!isset($provider_uri)) $provider_uri'http://squirrelmail.org/';
  363.         if (!isset($provider_name)) $provider_name'SquirrelMail';
  364.         echo '<a href="'.$provider_uri.'" target="_blank">'.$provider_name.'</a>';
  365.         echo "</td>\n";
  366.     }
  367.     echo "   </tr>\n".
  368.         "</table><br>\n\n";
  369. }
  370.  
  371. /* blatently copied/truncated/modified from the above function */
  372. function compose_Header($color$mailbox{
  373.  
  374.     global $delimiter$hide_sm_attributions$base_uri,
  375.            $data_dir$username$frame_top$compose_new_win;
  376.  
  377.  
  378.     if (!isset($frame_top)) {
  379.         $frame_top '_top';
  380.     }
  381.  
  382.     /*
  383.         Locate the first displayable form element
  384.     */
  385.     if !defined('PAGE_NAME') ) define('PAGE_NAME'NULL);
  386.     switch PAGE_NAME {
  387.     case 'search':
  388.         $pos getPref($data_dir$username'search_pos'1;
  389.         $onload "onload=\"document.forms[$pos].elements[2].focus();\"";
  390.         displayHtmlHeader (_("Compose"));
  391.         break;
  392.     default:
  393.         $js '<script language="JavaScript" type="text/javascript">' .
  394.              "\n<!--\n" .
  395.              "var alreadyFocused = false;\n" .
  396.              "function checkForm() {\n" .
  397.              "\n    if (alreadyFocused) return;\n";
  398.  
  399.             global $action$reply_focus;
  400.             if (strpos($action'reply'!== FALSE && $reply_focus)
  401.             {
  402.                 if ($reply_focus == 'select'$js .= "document.forms['compose'].body.select();}\n";
  403.                 else if ($reply_focus == 'focus'$js .= "document.forms['compose'].body.focus();}\n";
  404.                 else if ($reply_focus == 'none'$js .= "}\n";
  405.             }
  406.             // no reply focus also applies to composing new messages
  407.             else if ($reply_focus == 'none')
  408.             {
  409.                 $js .= "}\n";
  410.             }
  411.             else
  412.                 $js .= "var f = document.forms.length;\n".
  413.                 "var i = 0;\n".
  414.                 "var pos = -1;\n".
  415.                 "while( pos == -1 && i < f ) {\n".
  416.                     "var e = document.forms[i].elements.length;\n".
  417.                     "var j = 0;\n".
  418.                     "while( pos == -1 && j < e ) {\n".
  419.                         "if ( document.forms[i].elements[j].type == 'text' ) {\n".
  420.                             "pos = j;\n".
  421.                         "}\n".
  422.                         "j++;\n".
  423.                     "}\n".
  424.                 "i++;\n".
  425.                 "}\n".
  426.                 "if( pos >= 0 ) {\n".
  427.                     "document.forms[i-1].elements[pos].focus();\n".
  428.                 "}\n".
  429.             "}\n";
  430.         $js .= "// -->\n".
  431.                  "</script>\n";
  432.         $onload 'onload="checkForm();"';
  433.         displayHtmlHeader (_("Compose")$js);
  434.         break;
  435.  
  436.     }
  437.  
  438.     echo "<body text=\"$color[8]\" bgcolor=\"$color[4]\" link=\"$color[7]\" vlink=\"$color[7]\" alink=\"$color[7]\" $onload>\n\n";
  439. }

Documentation generated on Fri, 24 Oct 2014 04:21:39 +0200 by phpDocumentor 1.4.3