home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 April / PCWorld_2005-04_cd.bin / akce / web / phpbb2plus / phpBB2_plus_1.52.exe / phpBB2 / download.php < prev    next >
PHP Script  |  2004-12-24  |  12KB  |  454 lines

  1. <?php
  2. /***************************************************************************
  3.  *                                download.php
  4.  *                            -------------------
  5.  *   begin                : Monday, Apr 1, 2002
  6.  *   copyright            : (C) 2002 Meik Sievertsen
  7.  *   email                : acyd.burn@gmx.de
  8.  *
  9.  *   $Id: download.php,v 1.39 2004/12/09 20:12:12 acydburn Exp $
  10.  *
  11.  *
  12.  ***************************************************************************/
  13.  
  14. /***************************************************************************
  15.  *
  16.  *   This program is free software; you can redistribute it and/or modify
  17.  *   it under the terms of the GNU General Public License as published by
  18.  *   the Free Software Foundation; either version 2 of the License, or
  19.  *   (at your option) any later version.
  20.  *
  21.  ***************************************************************************/
  22.  
  23. if ( defined('IN_PHPBB') )
  24. {
  25.     die('Hacking attempt');
  26.     exit;
  27. }
  28.  
  29. define('IN_PHPBB', true);
  30. $phpbb_root_path = './';
  31. include($phpbb_root_path . 'extension.inc');
  32. include($phpbb_root_path . 'common.'.$phpEx);
  33.  
  34. //
  35. // Delete the / * to uncomment the block, and edit the values (read the comments) to
  36. // enable additional security to your board (preventing third site linkage)
  37. //
  38. /*
  39. define('ALLOWED_DENIED', 0);
  40. define('DENIED_ALLOWED', 1);
  41.  
  42. //
  43. // From this line on you are able to edit the stuff
  44. //
  45.  
  46. // Possible Values:
  47. // ALLOWED_DENIED <- First allow the listed sites, and then deny all others
  48. // DENIED_ALLOWED <- First deny the listed sites, and then allow all others
  49. $allow_deny_order = ALLOWED_DENIED;
  50.  
  51. //
  52. // Allowed Syntax:
  53. // Full Domain Name -> www.opentools.de
  54. // Partial Domain Names -> opentools.de
  55. //
  56. $sites = array(
  57.     $board_config['server_name'],    // This is your domain
  58.     'opentools.de',
  59.     'phpbb.com',
  60.     'phpbbhacks.com',
  61.     'phpbb.de'
  62. );
  63.  
  64. // This is the message displayed, if someone links to this site...
  65. $lang['Denied_Message'] = 'You are not authorized to view, download or link to this Site.';
  66.  
  67. // End of editable area
  68.  
  69. //
  70. // Parse the order and evaluate the array
  71. //
  72.  
  73. $site = explode('?', $HTTP_SERVER_VARS['HTTP_REFERER']);
  74. $url = trim($site[0]);
  75. //$url = $HTTP_HOST;
  76.  
  77. if ($url != '')
  78. {
  79.     $allowed = ($allow_deny_order == ALLOWED_DENIED) ? FALSE : TRUE;
  80.     
  81.     for ($i = 0; $i < count($sites); $i++)
  82.     {
  83.         if (strstr($url, $sites[$i]))
  84.         {
  85.             $allowed = ($allow_deny_order == ALLOWED_DENIED) ? TRUE : FALSE;
  86.             break;
  87.         }
  88.     }
  89. }
  90. else
  91. {
  92.     $allowed = TRUE;
  93. }
  94.  
  95. if ($allowed == FALSE)
  96. {
  97.     message_die(GENERAL_MESSAGE, $lang['Denied_Message']);
  98. }
  99.  
  100. // Delete the following line, to uncomment this block
  101. */
  102.  
  103. $download_id = get_var('id', 0);
  104. $thumbnail = get_var('thumb', 0);
  105.  
  106. // Send file to browser
  107. function send_file_to_browser($attachment, $upload_dir)
  108. {
  109.     global $_SERVER, $HTTP_USER_AGENT, $HTTP_SERVER_VARS, $lang, $db, $attach_config;
  110.  
  111.     $filename = ($upload_dir == '') ? $attachment['physical_filename'] : $upload_dir . '/' . $attachment['physical_filename'];
  112.  
  113.     $gotit = FALSE;
  114.  
  115.     if (!intval($attach_config['allow_ftp_upload']))
  116.     {
  117.         if (@!file_exists(@amod_realpath($filename)))
  118.         {
  119.             message_die(GENERAL_ERROR, $lang['Error_no_attachment'] . "<br /><br /><b>404 File Not Found:</b> The File <i>" . $filename . "</i> does not exist.");
  120.         }
  121.         else
  122.         {
  123.             $gotit = TRUE;
  124.         }
  125.     }
  126.  
  127.     //
  128.     // Determine the Browser the User is using, because of some nasty incompatibilities.
  129.     // Most of the methods used in this function are from phpMyAdmin. :)
  130.     //
  131.     if (!empty($_SERVER['HTTP_USER_AGENT'])) 
  132.     {
  133.         $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
  134.     } 
  135.     else if (!empty($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) 
  136.     {
  137.         $HTTP_USER_AGENT = $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
  138.     }
  139.     else if (!isset($HTTP_USER_AGENT))
  140.     {
  141.         $HTTP_USER_AGENT = '';
  142.     }
  143.  
  144.     if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
  145.     {
  146.         $browser_version = $log_version[2];
  147.         $browser_agent = 'opera';
  148.     } 
  149.     else if (ereg('MSIE ([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
  150.     {
  151.         $browser_version = $log_version[1];
  152.         $browser_agent = 'ie';
  153.     } 
  154.     else if (ereg('OmniWeb/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
  155.     {
  156.         $browser_version = $log_version[1];
  157.         $browser_agent = 'omniweb';
  158.     } 
  159.     else if (ereg('Netscape([0-9]{1})', $HTTP_USER_AGENT, $log_version)) 
  160.     {
  161.         $browser_version = $log_version[1];
  162.         $browser_agent = 'netscape';
  163.     } 
  164.     else if (ereg('Mozilla/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
  165.     {
  166.         $browser_version = $log_version[1];
  167.         $browser_agent = 'mozilla';
  168.     } 
  169.     else if (ereg('Konqueror/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version)) 
  170.     {
  171.         $browser_version = $log_version[1];
  172.         $browser_agent = 'konqueror';
  173.     } 
  174.     else 
  175.     {
  176.         $browser_version = 0;
  177.         $browser_agent = 'other';
  178.     }
  179.  
  180.     // Correct the mime type - we force application/octetstream for all files, except images
  181.     // Please do not change this, it is a security precaution
  182.     if (!strstr($attachment['mimetype'], 'image'))
  183.     {
  184.         $attachment['mimetype'] = ($browser_agent == 'ie' || $browser_agent == 'opera') ? 'application/octetstream' : 'application/octet-stream';
  185.     }
  186.  
  187.     // Now the tricky part... let's dance
  188. //    @ob_end_clean();
  189. //    @ini_set('zlib.output_compression', 'Off');
  190.     header('Pragma: public');
  191. //    header('Content-Transfer-Encoding: none');
  192.  
  193.     // Send out the Headers
  194.     header('Content-Type: ' . $attachment['mimetype'] . '; name="' . $attachment['real_filename'] . '"');
  195.     header('Content-Disposition: inline; filename="' . $attachment['real_filename'] . '"');
  196.  
  197.     //
  198.     // Now send the File Contents to the Browser
  199.     //
  200.     if ($gotit)
  201.     {
  202.         $size = @filesize($filename);
  203.         if ($size)
  204.         {
  205.             header("Content-length: $size");
  206.         }
  207.         readfile($filename);
  208.     }
  209.     else if (!$gotit && intval($attach_config['allow_ftp_upload']))
  210.     {
  211.         $conn_id = attach_init_ftp();
  212.  
  213.         $ini_val = ( @phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var';
  214.  
  215.         $tmp_path = ( !@$ini_val('safe_mode') ) ? '/tmp' : $upload_dir . '/tmp';
  216.         $tmp_filename = @tempnam($tmp_path, 't0000');
  217.  
  218.         @unlink($tmp_filename);
  219.  
  220.         $mode = FTP_BINARY;
  221.         if ( (preg_match("/text/i", $attachment['mimetype'])) || (preg_match("/html/i", $attachment['mimetype'])) )
  222.         {
  223.             $mode = FTP_ASCII;
  224.         }
  225.  
  226.         $result = @ftp_get($conn_id, $tmp_filename, $filename, $mode);
  227.  
  228.         if (!$result) 
  229.         {
  230.             message_die(GENERAL_ERROR, $lang['Error_no_attachment'] . "<br /><br /><b>404 File Not Found:</b> The File <i>" . $filename . "</i> does not exist.");
  231.         } 
  232.     
  233.         @ftp_quit($conn_id);
  234.  
  235.         $size = @filesize($tmp_filename);
  236.         if ($size)
  237.         {
  238.             header("Content-length: $size");
  239.         }
  240.         readfile($tmp_filename);
  241.         @unlink($tmp_filename);
  242.     }
  243.     else
  244.     {
  245.         message_die(GENERAL_ERROR, $lang['Error_no_attachment'] . "<br /><br /><b>404 File Not Found:</b> The File <i>" . $filename . "</i> does not exist.");
  246.     }
  247.  
  248.     exit;
  249. }
  250. //
  251. // End Functions
  252. //
  253.  
  254. //
  255. // Start Session Management
  256. //
  257. $userdata = session_pagestart($user_ip, PAGE_INDEX);
  258. init_userprefs($userdata);
  259.  
  260. if (!$download_id)
  261. {
  262.     message_die(GENERAL_ERROR, $lang['No_attachment_selected']);
  263. }
  264.  
  265. if ($attach_config['disable_mod'] && $userdata['user_level'] != ADMIN)
  266. {
  267.     message_die(GENERAL_MESSAGE, $lang['Attachment_feature_disabled']);
  268. }
  269.     
  270. $sql = 'SELECT *
  271.     FROM ' . ATTACHMENTS_DESC_TABLE . "
  272.     WHERE attach_id = $download_id";
  273.  
  274. if (!($result = $db->sql_query($sql)))
  275. {
  276.     message_die(GENERAL_ERROR, 'Could not query attachment informations', '', __LINE__, __FILE__, $sql);
  277. }
  278.  
  279. if (!($attachment = $db->sql_fetchrow($result)))
  280. {
  281.     message_die(GENERAL_MESSAGE, $lang['Error_no_attachment']);
  282. }
  283.  
  284. $attachment['physical_filename'] = basename($attachment['physical_filename']);
  285.  
  286. $db->sql_freeresult($result);
  287.  
  288. // get forum_id for attachment authorization or private message authorization
  289. $authorised = false;
  290.  
  291. $sql = 'SELECT *
  292.     FROM ' . ATTACHMENTS_TABLE . '
  293.     WHERE attach_id = ' . $attachment['attach_id'];
  294.  
  295. if (!($result = $db->sql_query($sql)))
  296. {
  297.     message_die(GENERAL_ERROR, 'Could not query attachment informations', '', __LINE__, __FILE__, $sql);
  298. }
  299.  
  300. $auth_pages = $db->sql_fetchrowset($result);
  301. $num_auth_pages = $db->sql_numrows($result);
  302.  
  303. for ($i = 0; $i < $num_auth_pages && $authorised == false; $i++)
  304. {
  305.     if (intval($auth_pages[$i]['post_id']) != 0)
  306.     {
  307.         $sql = 'SELECT forum_id
  308.             FROM ' . POSTS_TABLE . '
  309.             WHERE post_id = ' . $auth_pages[$i]['post_id'];
  310.  
  311.         if ( !($result = $db->sql_query($sql)) )
  312.         {
  313.             message_die(GENERAL_ERROR, 'Could not query post information', '', __LINE__, __FILE__, $sql);
  314.         }
  315.  
  316.         $row = $db->sql_fetchrow($result);
  317.  
  318.         $forum_id = $row['forum_id'];
  319.  
  320.         $is_auth = array();
  321.         $is_auth = auth(AUTH_ALL, $forum_id, $userdata); 
  322.  
  323.         if ($is_auth['auth_download'])
  324.         {
  325.             $authorised = TRUE;
  326.         }
  327.     }
  328.     else
  329.     {
  330.         if ( (intval($attach_config['allow_pm_attach'])) && ( ($userdata['user_id'] == $auth_pages[$i]['user_id_2']) || ($userdata['user_id'] == $auth_pages[$i]['user_id_1']) ) || ($userdata['user_level'] == ADMIN) )
  331.         {
  332.             $authorised = TRUE;
  333.         }
  334.     }
  335. }
  336.  
  337.  
  338. if (!$authorised)
  339. {
  340.     message_die(GENERAL_MESSAGE, $lang['Sorry_auth_view_attach']);
  341. }
  342.  
  343. //
  344. // Get Information on currently allowed Extensions
  345. //
  346. $sql = "SELECT e.extension, g.download_mode
  347.     FROM " . EXTENSION_GROUPS_TABLE . " g, " . EXTENSIONS_TABLE . " e
  348.     WHERE (g.allow_group = 1) AND (g.group_id = e.group_id)";
  349.  
  350. if ( !($result = $db->sql_query($sql)) )
  351. {
  352.     message_die(GENERAL_ERROR, 'Could not query Allowed Extensions.', '', __LINE__, __FILE__, $sql);
  353. }
  354.  
  355. $rows = $db->sql_fetchrowset($result);
  356. $num_rows = $db->sql_numrows($result);
  357.  
  358. for ($i = 0; $i < $num_rows; $i++)
  359. {
  360.     $extension = strtolower(trim($rows[$i]['extension']));
  361.     $allowed_extensions[] = $extension;
  362.     $download_mode[$extension] = $rows[$i]['download_mode'];
  363. }
  364.  
  365. //
  366. // disallowed ?
  367. //
  368. if ( (!in_array($attachment['extension'], $allowed_extensions)) && ($userdata['user_level'] != ADMIN) )
  369. {
  370.     message_die(GENERAL_MESSAGE, sprintf($lang['Extension_disabled_after_posting'], $attachment['extension']));
  371.  
  372. $download_mode = intval($download_mode[$attachment['extension']]);
  373.  
  374. if ($thumbnail)
  375. {
  376.     $attachment['physical_filename'] = THUMB_DIR . '/t_' . $attachment['physical_filename'];
  377. }
  378.  
  379. //
  380. // Update download count
  381. //
  382. if (!$thumbnail)
  383. {
  384.     $sql = 'UPDATE ' . ATTACHMENTS_DESC_TABLE . ' 
  385.     SET download_count = download_count + 1 
  386.     WHERE attach_id = ' . $attachment['attach_id'];
  387.     
  388.     if (!$db->sql_query($sql))
  389.     {
  390.         message_die(GENERAL_ERROR, 'Couldn\'t update attachment download count', '', __LINE__, __FILE__, $sql);
  391.     }
  392. }
  393.  
  394. //
  395. // Determine the 'presenting'-method
  396. //
  397. if ($download_mode == PHYSICAL_LINK)
  398. {
  399.     $server_protocol = ($board_config['cookie_secure']) ? 'https://' : 'http://';
  400.     $server_name = preg_replace('/^\/?(.*?)\/?$/', '\1', trim($board_config['server_name']));
  401.     $server_port = ($board_config['server_port'] <> 80) ? ':' . trim($board_config['server_port']) : '';
  402.     $script_name = preg_replace('/^\/?(.*?)\/?$/', '/\1', trim($board_config['script_path']));
  403.  
  404.     if ($script_name[strlen($script_name)] != '/')
  405.     {
  406.         $script_name .= '/';
  407.     }
  408.  
  409.     if (intval($attach_config['allow_ftp_upload']))
  410.     {
  411.         if (trim($attach_config['download_path']) == '')
  412.         {
  413.             message_die(GENERAL_ERROR, 'Physical Download not possible with the current Attachment Setting');
  414.         }
  415.         
  416.         $url = trim($attach_config['download_path']) . '/' . $attachment['physical_filename'];
  417.         $redirect_path = $url;
  418.     }
  419.     else
  420.     {
  421.         $url = $upload_dir . '/' . $attachment['physical_filename'];
  422. //        $url = preg_replace('/^\/?(.*?\/)?$/', '\1', trim($url));
  423.         $redirect_path = $server_protocol . $server_name . $server_port . $script_name . $url;
  424.     }
  425.  
  426.     // Redirect via an HTML form for PITA webservers
  427.     if (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE')))
  428.     {
  429.         header('Refresh: 0; URL=' . $redirect_path);
  430.         echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><meta http-equiv="refresh" content="0; url=' . $redirect_path . '"><title>Redirect</title></head><body><div align="center">If your browser does not support meta redirection please click <a href="' . $redirect_path . '">HERE</a> to be redirected</div></body></html>';
  431.         exit;
  432.     }
  433.  
  434.     // Behave as per HTTP/1.1 spec for others
  435.     header('Location: ' . $redirect_path);
  436.     exit;
  437. }
  438. else
  439. {
  440.     if (intval($attach_config['allow_ftp_upload']))
  441.     {
  442.         // We do not need a download path, we are not downloading physically
  443.         send_file_to_browser($attachment, '');
  444.         exit;
  445.     }
  446.     else
  447.     {
  448.         send_file_to_browser($attachment, $upload_dir);
  449.         exit;
  450.     }
  451. }
  452.  
  453. ?>