blob: 891b008293ef8bb029cd2b95d313e635c07e0722 [file] [log] [blame]
<?php
// /home/username/foo/public_html/bar
$dir = dirname(__FILE__)."/../..";
// http://example.com/bar (or relative url, or semi absolute)
$url = '';
$include = '/\.(php|shtml|html|htm|shtm|cgi|txt|doc|pdf|rtf|xls|csv)$/';
$exclude = '';
$dirinclude = '';
$direxclude = '/(^|\/)[._]|htmlarea/'; // Exclude the htmlarea tree by default
// New backend config data passing
// if data was passed using xinha_pass_to_backend() we extract and use it
// as the items above
require_once(realpath(dirname(__FILE__) . '/../../contrib/php-xinha.php'));
if($passed_data = xinha_read_passed_data())
{
extract($passed_data);
}
// Old deprecated backend config data passing
// not described because you shouldn't use it.
//------------------------------------------------------------------------
$hash = '';
foreach(explode(',', 'dir,include,exclude,dirinclude,direxclude') as $k)
{
if(isset($_REQUEST[$k]))
{
if(get_magic_quotes_gpc())
{
$_REQUEST[$k] = stripslashes($_REQUEST[$k]);
}
$hash .= $k . '=' . $_REQUEST[$k];
$$k = $_REQUEST[$k];
}
}
if($hash)
{
session_start();
if(!isset($_SESSION[sha1($hash)]))
{
?>
[ ];
<?php
exit;
}
}
//------------------------------------------------------------------------
// Neither dir nor url should have trailing slash
$dir = preg_replace('/\/$/', '', $dir);
$url = preg_replace('/\/$/', '', $url);
function scan($dir, $durl = '')
{
global $include, $exclude, $dirinclude, $direxclude;
static $seen = array();
$files = array();
$dir = realpath($dir);
if(isset($seen[$dir]))
{
return $files;
}
$seen[$dir] = TRUE;
$dh = @opendir($dir);
while($dh && ($file = readdir($dh)))
{
if($file[0] !== '.')
{
$path = realpath($dir . '/' . $file);
$url = $durl . '/' . $file;
if(($dirinclude && !preg_match($dirinclude, $url)) || ($direxclude && preg_match($direxclude, $url))) continue;
if(is_dir($path))
{
if($subdir = scan($path, $url))
{
$files[] = array('url'=>$url, 'children'=>$subdir);
}
}
elseif(is_file($path))
{
if(($include && !preg_match($include, $url)) || ($exclude && preg_match($exclude, $url))) continue;
$files[] = array('url'=>$url);
}
}
}
@closedir($dh);
return dirsort($files);
}
function dirsort($files)
{
usort($files, 'dircomp');
return $files;
}
function dircomp($a, $b)
{
if(isset($a['children']) && !isset($b['children'])) return -1;
if(isset($b['children']) && !isset($a['children'])) return 1;
return strcmp(strtolower($a['url']), strtolower($b['url']));
}
echo xinha_to_js(scan($dir,$url));
?>