* Copyright (c) 2001-2005 Platon Group, http://platon.sk/
* All rights reserved.
*
* See README file for more information about this software.
* See COPYING file for license information.
*
* Download the latest version from
* http://platon.sk/projects/phpWebFileManager/
*/
/* $Platon: phpWebFileManager/index.php,v 1.54 2005-12-18 09:50:52 nepto Exp $ */
/*
* phpWebFileManager initialization
*
* Config file is read from init.inc.php file.
*/
$fm_init_file = dirname(__FILE__)
. (strlen(dirname(__FILE__)) > 0 ? '/' : '')
. 'init.inc.php';
if (! @file_exists($fm_init_file)) {
exit;
}
require_once $fm_init_file;
/*
* Libraries function inclusion
*/
require_once $PN_PathPrefix . 'functions.inc.php';
if (! function_exists('fm_header')) {
function fm_header($var_ar) /* {{{ */
{
extract($var_ar);
$message = htmlspecialchars(join("\n", $fm_action_message));
if (defined('LOADED_AS_MODULE')) {
OpenTable();
echo '',_FM_FILE_MANAGER,
(strlen($fm_dir) > 0 ? ": $fm_dir_he" : ''),
'
', $message;
CloseTable();
OpenTable();
} else {
echo '';
echo '| ', _FM_DIR, ': /', @$fm_dir_he2, ' | ';
echo '', $message, ' | ';
echo ' ', "\n";
echo ' ', "\n";
}
} /* }}} */
}
if (! function_exists('fm_footer')) {
function fm_footer($var_ar) /* {{{ */
{
global $fm_cfg;
extract($var_ar);
if (defined('LOADED_AS_MODULE')) {
CloseTable();
OpenTable();
} else {
echo ' ',"\n";
echo '';
echo '| ', _FM_DIR, ': /', @$fm_dir_he2, ' | ';
echo '';
}
if ($fm_cfg['perm']['dir']['create']) {
echo ''
. _FM_DIR_CREATE.'';
} else {
echo _FM_DIR_CREATE;
}
echo ' | ';
if ($fm_cfg['perm']['file']['create']) {
echo ''
. _FM_FILE_CREATE.'';
} else {
echo _FM_FILE_CREATE;
}
echo ' | ';
if ($fm_cfg['perm']['file']['upload']) {
echo ''
. _FM_FILE_UPLOAD.'';
} else {
echo _FM_FILE_UPLOAD;
}
if (defined('LOADED_AS_MODULE')) {
CloseTable();
include 'footer.php';
} else {
echo "\n", ' | ', "\n";
}
} /* }}} */
}
/*
* Main phpWebFileManager function
*/
function fm_main() /* {{{ */
{
global $fm_cfg;
/* Hidden parameters */
$fm_origvars = fm_append_slash($fm_cfg['origvars'], '&');
$fm_cfg['dir']['root'] = fm_append_slash($fm_cfg['dir']['root']);
$fm_cfg['url']['root'] = fm_append_slash($fm_cfg['url']['root']);
$fm_cfg['url']['icons'] = fm_append_slash($fm_cfg['url']['icons']);
if (strlen($fm_cfg['format']['date']) <= 0) {
$fm_cfg['format']['date'] = _FM_DATE_FORMAT;
}
/*
* Getting CGI variables
*/
$fm_action = fm_get_cgi_var($fm_cfg['cgi'].'action', '');
$fm_submit = fm_get_cgi_var($fm_cfg['cgi'].'submit', '');
$fm_dir = fm_get_cgi_var($fm_cfg['cgi'].'dir', '');
$fm_filename = fm_get_cgi_var($fm_cfg['cgi'].'filename', '');
$fm_new_filename = fm_get_cgi_var($fm_cfg['cgi'].'new_filename', '');
$fm_file_data = fm_get_cgi_var($fm_cfg['cgi'].'file_data', '');
$PHP_SELF = @$_SERVER['PHP_SELF'];
$PHP_SELF_origvars_ue = htmlspecialchars("$PHP_SELF?$fm_origvars");
/*
* Debugging CGI varaibles
*/
if (0) {
echo '
';
foreach (array('fm_action', 'fm_submit', 'fm_dir', 'fm_filename', 'fm_new_filename', 'fm_file_data') as $var_name) {
echo htmlspecialchars(str_pad($var_name, 15).' = '.$$var_name)."\n";
}
echo ' ';
}
/*
* Symlink detection (must be before directory modifying)
*/
if (! $fm_cfg['perm']['dir']['follow_symlinks']) {
$fm_test_symlink = $fm_dir;
while ($fm_test_symlink != '') {
if ((@file_exists($fm_test_symlink) && @is_link($fm_test_symlink))
|| (@file_exists($fm_test_symlink) && @is_link("$fm_test_symlink/"))) {
$fm_dir = $fm_cfg['dir']['start'];
break;
}
$fm_test_symlink = substr($fm_test_symlink,
0, intval(strrpos($fm_test_symlink, '/')));
}
}
if (! isset($fm_dir) || ! $fm_cfg['perm']['dir']['enter']) {
$fm_dir = $fm_cfg['dir']['start'];
}
/*
* Directory modifying. Dirty, but safe.
*/
$fm_dir = preg_replace('{//+}','/', "$fm_dir/");
$fm_dir = preg_replace('{^(|.*/)\.\./([^/\.]|[^\./][^\./]|[^/][^\./]|[^/][^\./]|[^/]{3,})/(.*)$}', '\\1\\3', $fm_dir);
$fm_dir = preg_replace('{^(|.*/)([^/\.]|[^/\.][^\./]|[^/][^\./]|[^/][^\./]|[^/]{3,})/\.\./(.*)$}', '\\1\\3', $fm_dir);
while (preg_match('{^(|.*/)\.\./(.*)$}', $fm_dir)) {
$fm_dir = preg_replace('{^(|.*/)\.\./(.*)$}', '\\1\\2', $fm_dir);
}
while (preg_match('{^(|.*/)\./(.*)$}', $fm_dir)) {
$fm_dir = preg_replace('{^(|.*/)\./(.*)$}', '\\1\\2', $fm_dir);
}
while (strlen($fm_dir) > 0 && $fm_dir[0] == '/') {
$fm_dir = substr($fm_dir, 1, strlen($fm_dir));
}
/*
* Change to root directory
*/
/* Store the starting working directory. */
$fm_orig_dir = getcwd();
if (@is_dir($fm_cfg['dir']['root'])) {
chdir($fm_cfg['dir']['root']);
}
$fm_root_dir = getcwd();
if (@file_exists($fm_dir) && @is_dir($fm_dir)) {
chdir($fm_dir);
/* On some *BSD systems with PHP version <= 4.0.6
function chdir() is removing last '/' character
in $fm_dir variable, so we must improve it. */
$fm_dir = fm_append_slash($fm_dir);
} else {
$fm_dir = '';
}
/*
* Prepare URL & HTML encode of some variables.
*/
$fm_filename_he = htmlspecialchars($fm_filename);
$fm_filename_he2 = str_replace(' ', ' ', $fm_filename_he);
//$fm_filename_ue = htmlspecialchars(rawurlencode($fm_filename));
$fm_dir_he = htmlspecialchars($fm_dir);
$fm_dir_he2 = str_replace(' ', ' ', $fm_dir_he);
$fm_dir_ue = htmlspecialchars(rawurlencode($fm_dir));
/*
* ACTIONS
*/
$action_message = array();
/*
* save action
*/
if ($fm_action == 'save_file' && $fm_cfg['perm']['file']['save']) { /* {{{ */
if ($fm_submit == _FM_FILE_SAVE) {
if($fp = @fopen($fm_filename, 'w')) {
flock($fp, 2);
fwrite($fp, $fm_file_data, strlen($fm_file_data));
flock($fp, 3);
fclose($fp);
$action_message[] = _FM_FILE_SAVE_OK;
} else {
$action_message[] = _FM_FILE_SAVE_ERR;
}
} else {
$action_message[] = _FM_CANCELED;
}
} /* }}} */
/*
* delete action
*/
if ($fm_action == 'delete_file' && $fm_cfg['perm']['file']['delete']) { /* {{{ */
if ($fm_submit == _FM_FILE_DELETE) {
if (@unlink($fm_filename) == false) {
$action_message[] = _FM_FILE_DELETE_ERR;
} else {
$action_message[] = _FM_FILE_DELETE_OK;
}
} else {
$action_message[] = _FM_CANCELED;
}
} /* }}} */
/*
* remove direcotry
*/
if ($fm_action == 'remove_directory' && $fm_cfg['perm']['dir']['remove']) { /* {{{ */
if ($fm_submit == _FM_DIR_REMOVE) {
if (@rmdir($fm_filename) == 0) {
$action_message[] = _FM_DIR_REMOVE_ERR;
} else {
$action_message[] = _FM_DIR_REMOVE_OK;
}
} else {
$action_message[] = _FM_CANCELED;
}
} /* }}} */
/*
* rename action
*/
if (($fm_action == 'rename_directory' && $fm_cfg['perm']['dir']['rename']) /* {{{ */
|| ($fm_action == 'rename_file' && $fm_cfg['perm']['file']['rename'])) {
if ($fm_new_filename != '' &&
(($fm_submit == _FM_DIR_RENAME && $fm_action == "rename_directory")
|| ($fm_submit == _FM_FILE_RENAME && $fm_action == 'rename_file')
)) {
if (@rename($fm_filename, $fm_new_filename) == false) {
$action_message[] = _FM_RENAME_ERR;
} else {
$action_message[] = _FM_RENAME_OK;
}
} else {
$action_message[] = _FM_CANCELED;
}
} /* }}} */
/*
* create directory and create file actions
*/
if (($fm_action == 'create_directory' && $fm_cfg['perm']['dir']['create']) /* {{{ */
|| ($fm_action == 'create_file' && $fm_cfg['perm']['file']['create'])) {
if ($fm_new_filename != '' &&
(($fm_submit == _FM_DIR_CREATE && $fm_action == 'create_directory')
|| ($fm_submit == _FM_FILE_CREATE && $fm_action == 'create_file'))
) {
if ($fm_action == 'create_directory') {
if (@mkdir($fm_new_filename, $fm_cfg['mode']['dir']) == false) {
$action_message[] = _FM_DIR_CREATE_ERR;
} else {
$action_message[] = _FM_DIR_CREATE_OK;
}
} else {
if (file_exists($fm_new_filename))
$action_message[] = _FM_FILE_CREATE_ERR1;
else {
if (($fh = @fopen($fm_new_filename, 'w')) == false) {
$action_message[] = _FM_FILE_CREATE_ERR2;
} else {
fclose($fh);
$action_message[] = _FM_FILE_CREATE_OK;
if ($fm_cfg['mode']['file'] != 0) {
if (@chmod($fm_new_filename, $fm_cfg['mode']['file']) == false) {
$action_message[] = ' '. _FM_CHMOD_ERR;
} else {
$action_message[] = ' '. _FM_CHMOD_OK;
}
}
}
}
}
} else {
$action_message[] = _FM_CANCELED;
}
} /* }}} */
/*
* file upload action
*/
if ($fm_action == 'upload_file' && $fm_cfg['perm']['file']['upload']) { /* {{{ */
for ($j = 0; $j < $fm_cfg['perm']['file']['upload']; $j++) {
$fm_userfile = @$_FILES[$fm_cfg['cgi'].'userfile']['tmp_name'][$j];
$fm_userfile_name = @$_FILES[$fm_cfg['cgi'].'userfile']['name'][$j];
if ($fm_submit == _FM_FILE_UPLOAD && $fm_userfile_name != '') {
$tmp_target_filename = $target_filename = $fm_userfile_name;
for ($i = 2; file_exists($tmp_target_filename); $i++) {
if ($i == 2) {
$action_message[] = _FM_FILENAME_CHANGED;
}
$tmp_target_filename = $target_filename . '-' . $i;
}
$target_filename = $tmp_target_filename;
if (@copy($fm_userfile, $target_filename)) {
$action_message[] = _FM_FILE_UPLOAD_OK;
if ($fm_cfg['mode']['file'] != 0) {
if (@chmod($target_filename, $fm_cfg['mode']['file']) == false) {
$action_message[] = ' '._FM_CHMOD_ERR;
} else {
$action_message[] = ' '._FM_CHMOD_OK;
}
}
} else {
$action_message[] = _FM_FILE_UPLOAD_ERR;
}
} else {
$action_message[] = _FM_CANCELED;
}
}
} /* }}} */
/*
* file edit action
*/
if (in_array($fm_action, array('confirm_edit_file', 'edit_file')) /* {{{ */
&& $fm_cfg['perm']['file']['edit']) {
if (is_readable($fm_filename) && is_writeable($fm_filename)) {
if ($fm_action == 'confirm_edit_file' || $fm_submit == _FM_FILE_EDIT) {
// will display edit dialog
} else {
$action_message[] = _FM_CANCELED;
}
} else {
$action_message[] = _FM_FILE_EDIT_ERR;
}
} /* }}} */
/*
* Variable array
*/
$var_ar = array(
'fm_filename' => $fm_filename_he,
'fm_filename_he' => $fm_filename_he,
'fm_filename_he2' => $fm_filename_he2,
'fm_dir' => $fm_dir,
'fm_dir_he' => $fm_dir_he,
'fm_dir_he2' => $fm_dir_he2,
'fm_dir_ue' => $fm_dir_ue,
'fm_action_message' => array_unique($action_message),
'PHP_SELF' => $PHP_SELF,
'PHP_SELF_origvars_ue' => $PHP_SELF_origvars_ue,
);
/*
* Title writting with current working direcotry information.
*/
fm_header($var_ar);
/*
* Form
*/
echo '',"\n";
fm_footer($var_ar);
} /* }}} */
/*
* Main function call
*/
fm_main();
/* vim: set tabstop=4 shiftwidth=4:
* vim600: fdm=marker fdl=0 fdc=0
*/
?>
|