View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0000497 | XMB1 | Bugs | public | 2013-01-16 13:56 | 2018-01-18 06:09 |
| Reporter | miqrogroove | Assigned To | miqrogroove | ||
| Priority | normal | Severity | minor | Reproducibility | have not tried |
| Status | closed | Resolution | fixed | ||
| Product Version | 1.9.8 SP2 | ||||
| Target Version | 1.9.11.15 | Fixed in Version | 1.9.11.15 | ||
| Summary | 0000497: HTTP Header Elements Should Be Comma Separated | ||||
| Description | In files.php, the Cache-Control header contains a semi-colon, which appears to be a syntax error. | ||||
| Tags | No tags attached. | ||||
| MySQL Version | |||||
| PHP Version | |||||
| Web Server | |||||
| Browser | |||||
| Flags | |||||
| Original Reporter | |||||
| SVN Revision | 2715 | ||||
| Git Commit | |||||
|
|
changed: header("Cache-Control: public; max-age=604800"); to: header("Cache-Control: max-age=604800, public"); this will be included in 1.9.12.5.BETA package. files.php (6,592 bytes)
<?php
/**
* eXtreme Message Board
* XMB 1.9.12.5.BETA
*
* Developed And Maintained By The XMB Group
* Copyright (c) 2001-2017, The XMB Group
* http://www.xmbforum2.com/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
**/
define('X_SCRIPT', 'files.php');
require 'header.php';
header('X-Robots-Tag: nofollow');
loadtemplates('');
eval('$css = "'.template('css').'";');
$aid = 0;
$pid = 0;
$filename = '';
// Parse "Pretty" URLs
switch(intval($SETTINGS['file_url_format'])) {
case 1:
// $url = "{$virtual_path}files.php?pid=$pid&aid=$aid";
$aid = getInt('aid');
$pid = getInt('pid');
break;
case 2:
// $url = "{$virtual_path}files/$pid/$aid/";
$result = explode('/', $url);
if ($result[count($result) - 4] == 'files') { // Remember count() is 1-based
$pid = intval($result[count($result) - 3]);
$aid = intval($result[count($result) - 2]);
}
break;
case 3:
// $url = "{$virtual_path}files/$aid/".rawurlencode($filename);
$result = explode('/', $url);
if ($result[count($result) - 3] == 'files') {
$aid = intval($result[count($result) - 2]);
$filename = urldecode($result[count($result) - 1]);
}
break;
case 4:
// $url = "{$virtual_path}/$pid/$aid/";
$result = explode('/', $url);
$pid = intval($result[count($result) - 3]);
$aid = intval($result[count($result) - 2]);
break;
case 5:
// $url = "{$virtual_path}/$aid/".rawurlencode($filename);
$result = explode('/', $url);
$aid = intval($result[count($result) - 2]);
$filename = urldecode($result[count($result) - 1]);
break;
default:
$aid = getInt('aid');
$pid = getInt('pid');
break;
}
// Sanity Checks
if ($aid <= 0 Or $pid < 0 Or ($pid == 0 And $filename == '' And $self['uid'] == 0)) {
fileError();
}
// Retrieve attachment metadata
if ($filename == '') {
$where = "WHERE a.aid=$aid AND a.pid=$pid";
if ($pid == 0 And !X_ADMIN) {
$where .= " AND a.uid={$self['uid']}"; // Allow preview of own attachments when URL format requires a PID.
}
} else {
$db->escape_fast($filename);
$where = "WHERE a.aid=$aid AND a.filename='$filename'";
}
$query = $db->query("SELECT a.*, UNIX_TIMESTAMP(a.updatetime) AS updatestamp, p.fid FROM ".X_PREFIX."attachments AS a LEFT JOIN ".X_PREFIX."posts AS p USING (pid) $where");
if ($db->num_rows($query) != 1) {
fileError();
}
$file = $db->fetch_array($query);
$db->free_result($query);
if ($pid > 0 Or $file['fid'] != '') {
$forum = getForum($file['fid']);
if (($forum['type'] != 'forum' && $forum['type'] != 'sub') || $forum['status'] != 'on' || ($forum['attachstatus'] != 'on' And !X_ADMIN)) {
fileError();
}
// Check attachment permissions
$perms = checkForumPermissions($forum);
if (!$perms[X_PERMS_VIEW]) {
if (X_GUEST) {
redirect("{$full_url}misc.php?action=login", 0);
exit;
} else {
error($lang['privforummsg']);
}
} else if (!$perms[X_PERMS_PASSWORD]) {
handlePasswordDialog($forum['fid']);
}
$fup = array();
if ($forum['type'] == 'sub') {
$fup = getForum($forum['fup']);
// prevent access to subforum when upper forum can't be viewed.
$fupPerms = checkForumPermissions($fup);
if (!$fupPerms[X_PERMS_VIEW]) {
if (X_GUEST) {
redirect("{$full_url}misc.php?action=login", 0);
exit;
} else {
error($lang['privforummsg']);
}
} else if (!$fupPerms[X_PERMS_PASSWORD]) {
handlePasswordDialog($fup['fid']);
}
unset($fup);
}
}
// Verify file is available
$path = '';
$size = 0;
if ($file['subdir'] == '') {
$size = strlen($file['attachment']);
} else {
$path = $SETTINGS['files_storage_path'];
if (substr($path, -1) != '/') {
$path .= '/';
}
$path = $path.$file['subdir'].'/'.$file['aid'];
if (!is_file($path)) {
header('HTTP/1.0 500 Internal Server Error');
error($lang['filecorrupt']);
}
$size = intval(filesize($path));
}
if ($size != $file['filesize']) {
header('HTTP/1.0 500 Internal Server Error');
error($lang['filecorrupt']);
}
// Verify output stream is empty
assertEmptyOutputStream('files.php');
// Do not issue any errors below this line
// Check If-Modified-Since request header
// "If the requested variant has not been modified since the time specified in this field,
// an entity will not be returned from the server; instead, a 304 (not modified) response
// will be returned without any message-body."
if ($_SERVER['REQUEST_METHOD'] == 'GET' And isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
if (function_exists('date_default_timezone_set')) {
date_default_timezone_set('UTC'); // Workaround for stupid PHP 5 problems.
}
if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $file['updatestamp']) {
header('HTTP/1.0 304 Not Modified');
exit;
}
}
// Increment hit counter
$db->query("UPDATE ".X_PREFIX."attachments SET downloads=downloads+1 WHERE aid=$aid");
// Set response headers
if ($file['img_size'] == '') {
$type = 'application/binary';
$dispositionType = 'attachment';
} else {
$type = strtolower($file['filetype']);
$dispositionType = 'inline';
}
header("Content-type: $type");
header("Content-length: $size");
header("Content-Disposition: {$dispositionType}; filename=\"{$file['filename']}\"");
header("Content-Description: XMB Attachment");
header("Cache-Control: max-age=604800, public");
header("Expires: ".gmdate('D, d M Y H:i:s', time() + 604800)." GMT");
header("Last-Modified: ".gmdate('D, d M Y H:i:s', $file['updatestamp'])." GMT");
// Send the response entity
if ($file['subdir'] == '') {
echo $file['attachment'];
} else {
readfile($path);
}
exit();
function fileError() {
global $lang;
header('HTTP/1.0 404 Not Found');
error($lang['textnothread']);
}
?>
|
|
|
Xian, I could not find any reference to this in the 1.9.11.14 packages. I'm changing the semicolon to a comma and marking this as fixed in trunk. Unless the tokens need to appear in a specific order, this should be adequate. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2013-01-16 13:56 | miqrogroove | New Issue | |
| 2017-09-16 21:22 | Xian | File Added: files.php | |
| 2017-09-16 21:22 | Xian | Note Added: 0000338 | |
| 2017-12-20 07:10 | miqrogroove | Target Version | 1.9.11.14 => 1.9.11.15 |
| 2017-12-21 08:15 | miqrogroove | Assigned To | => miqrogroove |
| 2017-12-21 08:15 | miqrogroove | Status | new => assigned |
| 2017-12-21 08:21 | miqrogroove | Product Version | => 1.9.8 SP2 |
| 2017-12-21 08:24 | miqrogroove | Status | assigned => resolved |
| 2017-12-21 08:24 | miqrogroove | Resolution | open => fixed |
| 2017-12-21 08:24 | miqrogroove | Fixed in Version | => 1.9.11.15 |
| 2017-12-21 08:24 | miqrogroove | SVN Revision | => 2715 |
| 2017-12-21 08:24 | miqrogroove | Note Added: 0000350 | |
| 2018-01-18 06:09 | miqrogroove | Status | resolved => closed |