<?php
/*
* Copyright (C) 2007 Peter Hoskin
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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,
* - download it from http://codemonkey.criten.org/LICENSE.txt
* - download it from http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
* - write to
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Created on Nov 29, 2007
*/
require_once('../include/apache.php');
require_once('../include/smarty.php');
if (array_key_exists('file',$_GET) && $_GET['file']) {
$url = htmlspecialchars($_GET['file'], ENT_QUOTES);
$file = $_SERVER['DOCUMENT_ROOT'].$url;
} else {
$url = '/';
$file = $_SERVER['DOCUMENT_ROOT'];
}
$legal_dirs = array (
'viewsource' => 1,
'include' => 1,
'include/smarty' => 1,
'include/smarty/templates' => 1,
'include/smarty/templates/apache' => 1,
'include/smarty/templates/viewsource' => 1,
'include/smarty/templates/codemonkey' => 1,
'openid' => 1,
'tvguide/html' => 1,
'.' => 1,
'/' => 1,
);
if ($url != '/') {
$path = '/'.$url;
} else {
$path = $url;
}
if (!file_exists($file)) {
// Spoof Apache's 404 Page
$apache = new apache();
$apache->path = $path;
$apache->e404();
die;
}
if (!array_key_exists(dirname($url),$legal_dirs)) {
// Spoof Apache's 403 Page
$apache = new apache();
$apache->path = $path;
$apache->e403();
die();
}
if (!is_dir($file)) {
$smarty = smarty_setup();
$smarty->caching = true;
$smarty->cache_lifetime = 3600;
$smarty->cache_modified_check = true;
if ((time() - filemtime($file)) < 3600) {
$smarty->clear_cache('viewsource/viewsource.tpl',$_SERVER['REQUEST_URI']);
}
//echo time() - filemtime($file);
if (!$smarty->is_cached('viewsource/viewsource.tpl',$_SERVER['REQUEST_URI'])) {
$source = file_get_contents($file);
$source = highlight_string($source,true);
$smarty->assign('path',$path);
$smarty->assign('source',$source);
$smarty->assign('serversig',$_SERVER['SERVER_SIGNATURE']);
}
$smarty->display('viewsource/viewsource.tpl',$_SERVER['REQUEST_URI']);
} else {
// Redirect to true location for directories
if ($url != '/' && substr($file,(strlen($file) - 1),strlen($file)) != '/') {
header("Location: ".$_SERVER['REQUEST_URI'].'/');
die();
}
$apache = new apache();
$apache->func = 'directorylist';
$apache->cache = 0;
$apache->cachetime = 3600;
//if (!$apache->is_cached()) {
// Spoof Apache's Directory List
$scandir = scandir($file);
$i = 0;
foreach ($scandir as $f) {
if ($f != '.' && $f != '..') {
if (is_dir($file.$f)) {
$list[$i] = array('icon'=>'folder','path'=>$f,'date'=>filemtime($file.$f));
if ($file.$f == $_SERVER['DOCUMENT_ROOT'].'index.php') {
$list[$i]['name'] = 'index.php';
$list[$i]['path'] = 'index.php?file=/index.php';
}
} else {
$list[$i] = array('icon'=>'f','path'=>$f,'size'=>filesize($file.$f),'date'=>filemtime($file.$f));
}
$i++;
}
}
$apache->list = $list;
//}
$apache->path = $path;
$apache->directorylist();
}
//
// Contents of apache.php:
//
<?php
/*
* Copyright (C) 2007 Peter Hoskin
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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,
* - download it from http://codemonkey.criten.org/LICENSE.txt
* - download it from http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
* - write to
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Created on Nov 28, 2007
*/
require_once('smarty.php');
require_once('filesystem.php');
/*
* Apache Class
*
*
* Functions:
* - clearcache - Clears cache entries
* - directorylist - Spoofs a directory listing page
* - e403 - Spoofs a 403 page
* - e404 - Spoofs a 404 page
* - is_cached - Checks if a page is cached
*
* $apache->directorylist();
* Used to spoof the default directory listing page from Apache, with your
* own list from an array.
*
* Example:
* $apache = new apache();
* $apache->list = array();
* $apache->path = $_SERVER['REQUEST_URI'];
* $apache->directorylist();
*
* $apache->list Syntax:
* Array (
* [0] => Array (
* [path] => 'filename.html'
* [date] => seconds since epoch, if null the present time is assumed
* [name] => optional name spoof, will use name for readable text and path for the link
* [icon] => which apache icon should we use? .gif extention is assumed. if icon is unset, f is assumed
* )
* [1] => Array (
* [path] => 'index.php'
* [date] =>
* [icon] => 'script'
* )
* )
*
* Caching:
* Caching is provided with this class, presently with the directorylist
* function only. There really seems no need to cache the 403 and 404 pages
* considering they are rather simplistic.
* It is assumed your PHP code uses mod_rewrite in some form, to redirect
* all requests to your PHP script. Because of this, cache objects are
* identified internally by $_SERVER['REQUEST_URI']
*
* Caching Example:
* $apache = new apache();
* $apache->cachetime = expiry time in seconds
* $apache->cache = 1;
* $apache->func = 'directorylist';
* if (!$apache->is_cached()) {
* do complex stuff to generate a list
* $apache->list = array();
* }
* $apache->directorylist();
*/
class apache {
public $path = NULL;
public $list = NULL;
public $cache = 0;
public $cachetime = 86400;
public $func = NULL;
// Global setup function
function setvars() {
if ($this->path == NULL) {
$this->path = $_SERVER['REQUEST_URI'];
}
}
// Generate a 404 Page
function e404() {
$this->setvars();
$smarty = smarty_setup();
$smarty->assign('path',$this->path);
$smarty->assign('serversig',$_SERVER['SERVER_SIGNATURE']);
header("HTTP/1.0 404 Not Found");
$smarty->display('apache/404.tpl');
}
// Generate a 403 Page
function e403() {
$this->setvars();
$smarty = smarty_setup();
$smarty->assign('path',$this->path);
$smarty->assign('serversig',$_SERVER['SERVER_SIGNATURE']);
header("HTTP/1.0 403 Forbidden");
$smarty->display('apache/403.tpl');
}
// Generate a Directory List
function directorylist() {
$this->setvars();
$smarty = smarty_setup();
// Caching enabled?
if ($this->cache == 1) {
$smarty->cache_lifetime = $this->cachetime;
$smarty->caching = true;
} else {
$smarty->caching = false;
}
/* Page cached?
*
* Utilizing caching here avoids some looping and is a performance benefit
*/
//if (!$smarty->is_cached('apache/directorylist.tpl',$_SERVER['REQUEST_URI'])) {
if (is_array($this->list)) {
// Convert sizes into readable values
// This is a bit of performance bog, perhaps the OPTION
// to do this outside the class and disable this function?
// This really does need to exist tho, as 'off the shelf'
// PHP has no human readable format and most use of this class
// will use filesize()
foreach ($this->list as $key => $row) {
if (array_key_exists('size',$row)) {
$this->list[$key]['size'] = size_readable($row['size']);
}
}
$smarty->assign('list',$this->list);
}
$smarty->assign('path',$this->path);
// TODO: fix parent link
$data = split("/",$this->path);
$parent = print_r($data,true);
$smarty->assign('parent',$parent);
$smarty->assign('serversig',$_SERVER['SERVER_SIGNATURE']);
//}
// Fetch page
$smarty->display('apache/directorylist.tpl',$_SERVER['REQUEST_URI']);
}
function is_cached() {
if ($this->func == NULL) {
echo "<b>Error:</b> class apache->is_cached called, but apache->func is null<br><br>";
return 0;
die();
}
$smarty = smarty_setup();
$smarty->cache_lifetime = $this->cachetime;
if ($smarty->is_cached('apache/'.$this->func.'.tpl',$_SERVER['REQUEST_URI'])) {
return 1;
} else {
return 0;
}
}
}
//
// Contents of smarty.php
//
<?php
/*
* Copyright (C) 2007 Peter Hoskin
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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,
* - download it from http://codemonkey.criten.org/LICENSE.txt
* - download it from http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
* - write to
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Created on Nov 28, 2007
*/
require_once('config.php');
require_once(SMARTY_PATH);
function smarty_setup() {
$smarty = new Smarty();
$smarty->template_dir = SMARTY_TEMPLATEDIR;
$smarty->compile_dir = SMARTY_COMPILEDIR;
$smarty->cache_dir = SMARTY_CACHEDIR;
$smarty->config_dir = SMARTY_CONFIGDIR;
return $smarty;
}
?>
//
// Contents of filesystem.php
//
<?php
/*
* Copyright (C) 2007 Peter Hoskin
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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,
* - download it from http://codemonkey.criten.org/LICENSE.txt
* - download it from http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
* - write to
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Created on Nov 29, 2007
*/
/*
* size_readable($size, $retstring)
*
* Returns filesize in human readable format
*
* Modified and relicensed from:
* http://aidanlister.com/repos/v/function.size_readable.php
*/
function size_readable ($size, $retstring = null) {
$sizes = array('B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y');
if ($retstring === null) { $retstring = '%01.2f%s'; }
$lastsizestring = end($sizes);
foreach ($sizes as $sizestring) {
if ($size < 1024) { break; }
if ($sizestring != $lastsizestring) { $size /= 1024; }
}
if ($sizestring == $sizes[0]) { $retstring = '%01d'; }
return sprintf($retstring, $size, $sizestring);
}
?>