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

Documentation generated on Tue, 30 Jun 2015 04:21:30 +0200 by phpDocumentor 1.4.3