Source for file download.php

Documentation is available at download.php

  1. <?php
  2.  
  3. /**
  4.  * download.php
  5.  *
  6.  * Handles attachment downloads to the users computer.
  7.  * Also allows displaying of attachments when possible.
  8.  *
  9.  * @copyright 1999-2020 The SquirrelMail Project Team
  10.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  11.  * @version $Id: download.php 14845 2020-01-07 08:09:34Z pdontthink $
  12.  * @package squirrelmail
  13.  */
  14.  
  15. /** This is the download page */
  16. define('PAGE_NAME''download');
  17.  
  18. /**
  19.  * Include the SquirrelMail initialization file.
  20.  */
  21. require('../include/init.php');
  22.  
  23. /* SquirrelMail required files. */
  24. require(SM_PATH 'functions/imap_general.php');
  25. require(SM_PATH 'functions/mailbox_display.php');
  26. require(SM_PATH 'functions/mime.php');
  27.  
  28. /**
  29.  * If a message is viewed from the search page, $aMailbox[$passed_id]['MESSAGE_OBJECT']
  30.  * is not initialized, which makes this page error out on line 65 with an
  31.  * undefined function.  We need to include some additional files in case the
  32.  * object has not been initialized.
  33.  * 
  34.  * TODO: Determine why the object in question is not initialized when coming from
  35.  *       a search page and correct.  Once that is done, we can remove these
  36.  *       includes.
  37.  */
  38. require(SM_PATH 'functions/imap_messages.php');
  39. require(SM_PATH 'functions/date.php');
  40.  
  41. header('Pragma: ');
  42. header('Cache-Control: cache');
  43.  
  44. /* globals */
  45. sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
  46. sqgetGlobalVar('messages',   $messages,     SQ_SESSION);
  47. sqgetGlobalVar('mailbox',    $mailbox,      SQ_GET);
  48. sqgetGlobalVar('ent_id',     $ent_id,       SQ_GET);
  49. sqgetGlobalVar('absolute_dl',$absolute_dl,  SQ_GET);
  50. sqgetGlobalVar('force_crlf'$force_crlf,   SQ_GET);
  51. sqgetGlobalVar('passed_id'$passed_idSQ_GETNULLSQ_TYPE_BIGINT);
  52. if (!sqgetGlobalVar('account'$accountSQ_GET) ) {
  53.     $account 0;
  54. }
  55.  
  56. global $default_charset;
  57.  
  58. /* end globals */
  59.  
  60. global $imap_stream_options// in case not defined in config
  61. $imapConnection sqimap_login($usernamefalse$imapServerAddress$imapPort0$imap_stream_options);
  62. $aMailbox sqm_api_mailbox_select($imapConnection$account$mailbox,array(),array());
  63.  
  64. if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT']&&
  65.     is_object($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT']) ) {
  66.     $message $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
  67. else {
  68.     $message sqimap_get_message($imapConnection$passed_id$mailbox);
  69.     $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'$message;
  70. }
  71.  
  72. $subject $message->rfc822_header->subject;
  73. if ($ent_id{
  74.     // replace message with message part, if message part is requested.
  75.     $message $message->getEntity($ent_id);
  76.     $header $message->header;
  77.  
  78.     if ($message->rfc822_header{
  79.        $subject $message->rfc822_header->subject;
  80.     else {
  81.        $header $message->header;
  82.     }
  83.     $type0 $header->type0;
  84.     $type1 $header->type1;
  85.     $encoding strtolower($header->encoding);
  86. else {
  87.     /* raw message */
  88.     $type0 'message';
  89.     $type1 'rfc822';
  90.     $encoding '7bit';
  91.     $header $message->header;
  92. }
  93.  
  94. /*
  95.  * lets redefine message as this particular entity that we wish to display.
  96.  * it should hold only the header for this entity.  We need to fetch the body
  97.  * yet before we can display anything.
  98.  */
  99.  
  100. if (isset($override_type0)) {
  101.     $type0 $override_type0;
  102. }
  103. if (isset($override_type1)) {
  104.     $type1 $override_type1;
  105. }
  106. $filename '';
  107. if (is_object($message->header->disposition)) {
  108.     $filename $header->disposition->getProperty('filename');
  109.     if (!$filename{
  110.         $filename $header->disposition->getProperty('name');
  111.     }
  112.     if (!$filename{
  113.         $filename $header->getParameter('name');
  114.     }
  115. else {
  116.     $filename $header->getParameter('name');
  117. }
  118.  
  119. $filename decodeHeader($filename,true,false);
  120. $filename charset_encode($filename,$default_charset,false);
  121.  
  122. // If name is not set, use subject of email
  123. if (strlen($filename1{
  124.     $filename decodeHeader($subjecttruetrue);
  125.     $filename charset_encode($filename,$default_charset,false);
  126.     if ($type1 == 'plain' && $type0 == 'text')
  127.         $suffix 'txt';
  128.     else if ($type1 == 'richtext' && $type0 == 'text')
  129.         $suffix 'rtf';
  130.     else if ($type1 == 'postscript' && $type0 == 'application')
  131.         $suffix 'ps';
  132.     else if ($type1 == 'rfc822' && $type0 == 'message')
  133.         $suffix 'eml';
  134.     else
  135.         $suffix $type1;
  136.  
  137.     if ($filename == '')
  138.         $filename 'untitled' strip_tags($ent_id);
  139.     $filename $filename '.' $suffix;
  140. }
  141.  
  142. /**
  143.  * Update mailbox_cache and close session in order to prevent
  144.  * script locking on larger downloads. SendDownloadHeaders() and
  145.  * mime_print_body_lines() don't write information to session.
  146.  * mime_print_body_lines() call duration depends on size of
  147.  * attachment and script can cause interface lockups, if session
  148.  * is not closed.
  149.  */
  150. $mailbox_cache[$aMailbox['NAME']] $aMailbox;
  151. sqsession_register($mailbox_cache,'mailbox_cache');
  152.  
  153. /*
  154.  * Note:
  155.  *    The following sections display the attachment in different
  156.  *    ways depending on how they choose.  The first way will download
  157.  *    under any circumstance.  This sets the Content-type to be
  158.  *    applicatin/octet-stream, which should be interpreted by the
  159.  *    browser as "download me".
  160.  *      The second method (view) is used for images or other formats
  161.  *    that should be able to be handled by the browser.  It will
  162.  *    most likely display the attachment inline inside the browser.
  163.  *      And finally, the third one will be used by default.  If it
  164.  *    is displayable (text or html), it will load them up in a text
  165.  *    viewer (built in to SquirrelMail).  Otherwise, it sets the
  166.  *    content-type as application/octet-stream
  167.  */
  168. if (isset($absolute_dl&& $absolute_dl{
  169.     SendDownloadHeaders($type0$type1$filename1);
  170. else {
  171.     SendDownloadHeaders($type0$type1$filename0);
  172. }
  173. /* be aware that any warning caused by download.php will corrupt the
  174.  * attachment in case of ERROR reporting = E_ALL and the output is the screen */
  175. mime_print_body_lines ($imapConnection$passed_id$ent_id$encoding'php://stdout'$force_crlf);

Documentation generated on Mon, 13 Jan 2020 04:22:25 +0100 by phpDocumentor 1.4.3