(2010-) * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * @package WebFTP * */ define('AREA', 'login'); /** * Include our init.php, which manages Sessions, Language etc. */ require './lib/init.php'; // Configuration // Server to connect to: $server = 'localhost'; // Connect to the FTP - server via SSL or not $useSsl = false; // Temporary directory on the server (need write permissions) $downloadDir = "/tmp/"; // Which file extensions indicate files allowed to be edited // Either simple extension or regex $editFileExtensions = array("php[345]?$","sh$","txt$","[ps]?htm[l]?$","tpl$","pl","cgi","^ht[acespwd]+$"); // Are files without extension allowed to be edited? $editFileNoExtension = true; // Which FTP - mode should be used by default? $default_mode = "FTP_BINARY"; // Max. uploadsize (0 = unlimited) - read from php.ini $_mfs = ini_get('upload_max_filesize'); if ($_mfs === false || is_numeric($_mfs) == false) { $MAX_FILE_SIZE = 1907300; } else { $MAX_FILE_SIZE = $_mfs; } // The color of a marked row $marked_color = '#FFC2CA'; if (!function_exists("ftp_connect")) { die('Please compile PHP with FTP support'); } if (!function_exists("bindtextdomain")) { die('Please compile PHP with gettext support'); } // Initialize Smarty include(FROXLOR_INSTALL_DIR.'/lib/classes/Smarty/Smarty.class.php'); $smarty = new Smarty; $smarty->template_dir = './templates/' . Settings::Get('panel.default_theme') . '/'; $smarty->compile_dir = './templates_c/'; $smarty->cache_dir = './cache/'; // Set the language require(FROXLOR_INSTALL_DIR.'/lib/classes/output/class.languageSelect.php'); $language = new languageSelect(); $language->useBrowser = true; $language->setLanguage(); // Activate gettext for smarty; define('HAVE_GETTEXT', true); require (FROXLOR_INSTALL_DIR.'/lib/functions/smarty_plugins/gettext-prefilter.php'); // global Theme-variable $theme = Settings::Get('panel.default_theme'); if (file_exists($hl_path.'/logo_custom.png')) { $header_logo = $hl_path.'/logo_custom.png'; } $smarty->assign('header_logo', $header_logo); $smarty->assign('theme', $theme); $smarty->assign('no_robots', Settings::Get('panel.no_robots')); $smarty->assign('show_version_login', Settings::Get('admin.show_version_login')); $smarty->assign('show_version_footer', Settings::Get('admin.show_version_footer')); $smarty->assign('version', Settings::Get('panel.version')); $smarty->assign('branding', $branding); $smarty->assign('loggedin', 0); $smarty->assign('current_year', date('Y')); $smarty->assign('title', 'WebFTP - '); // Let's start the program session_start(); $s = session_id(); if (isset($_GET['logoff']) || isset($_POST['logoff'])) { unset($_SESSION['server'],$_SESSION['user'],$_SESSION['password']); session_destroy(); $smarty->assign('successmessage', _('Successfully logged out')); $body = $smarty->fetch('login/login_ftp.tpl'); } elseif ((!empty($_POST['loginname']) && !empty($_POST['password'])) || (!empty($_SESSION['user']) && !empty($_SESSION['password']) && !empty($_SESSION['server']))) { if (empty($_SESSION['server'])) { $_SESSION['server'] = $server; } if (isset($_POST['loginname'])) { $_SESSION['user'] = $_POST['loginname']; } if (isset($_POST['password'])) { $_SESSION['password'] = $_POST['password']; } if ($useSsl) { $connection = @ftp_ssl_connect($_SESSION['server']); } else { $connection = @ftp_connect($_SESSION['server']); } $loggedOn = @ftp_login($connection, $_SESSION['user'], $_SESSION['password']); $systype = @ftp_systype($connection); $pasv = @ftp_pasv($connection, false); // Mode setzen if (isset($_POST['mode'])) { $mode = $_POST['mode']; $_SESSION['mode'] = $mode; } elseif (isset($_GET['mode'])) { $mode = $_GET['mode']; $_SESSION['mode'] = $mode; } elseif (isset($_SESSION['mode'])) { $mode = $_SESSION['mode']; } else { $mode = $default_mode; $_SESSION['mode'] = $default_mode; } $smarty->assign('mode', $mode); if (isset($_POST['file']) && is_array($_POST['file'])) { $file = $_POST['file']; if (get_magic_quotes_gpc()) { foreach ($_POST['file'] as $key => $val) { $_POST['file'][$key] = stripslashes($val); } foreach ($_POST as $key => $val) { $_POST[$key] = stripslashes($val); } foreach ($_GET as $key => $val) { $_GET[$key] = stripslashes($val); } } } else { if (get_magic_quotes_gpc()) { foreach ($_POST as $key => $val) { $_POST[$key] = stripslashes($val); } foreach ($_GET as $key => $val) { $_GET[$key] = stripslashes($val); } } if (isset($_POST['file'])) { $file = $_POST['file']; $smarty->assign('file', $file); } elseif (isset($_GET['file'])) { $file = $_GET['file']; $smarty->assign('file', $file); } //$file = htmlentities($file); } if (isset($_POST['action'])) { $action = $_POST['action']; } elseif (isset($_GET['action'])) { $action = $_GET['action']; } else { $action = ''; } if ($loggedOn) { $smarty->assign('loggedin', true); if (isset($_POST['currentDir'])) { if (!@ftp_chdir($connection, html_entity_decode($_POST['currentDir']))) { $smarty->assign('errormessage', sprintf(_('Directory change to \'%1$s\' failed!'), $file)); } } elseif (isset($_GET['currentDir'])) { if (!@ftp_chdir($connection, html_entity_decode($_GET['currentDir']))) { $smarty->assign('errormessage', sprintf(_('Directory change to \'%1$s\' failed!'), $file)); } } $currentDir = htmlentities(str_replace("\"\"","\"", ftp_pwd($connection))); $smarty->assign('currentDir', $currentDir); $smarty->assign('curdir', sprintf(_('current folder = [%1$s]'), $currentDir)); // was soll gemacht werden $errormessage = ''; $successmessage = ''; switch ($action) { case "cd": // Ordner wechseln //First try : normal directory if (@ftp_chdir($connection, html_entity_decode($currentDir) . "/" . html_entity_decode($file))) { $currentDir = htmlentities(str_replace("\"\"","\"", @ftp_pwd($connection))); $smarty->assign('curdir', sprintf(_('current folder = [%1$s]'), $currentDir)); $smarty->assign('currentDir', $currentDir); } elseif (@ftp_chdir($connection, html_entity_decode($file))) { // symbolischer Link $currentDir = htmlentities(str_replace("\"\"","\"", @ftp_pwd($connection))); $smarty->assign('curdir', sprintf(_('current folder = [%1$s]'), $currentDir)); $smarty->assign('currentDir', $currentDir); } else { // link zu einer Datei, abrufen... header("Content-disposition: filename=$file"); header("Content-type: application/octetstream"); header("Pragma: no-cache"); header("Expires: 0"); // original Dateiname $filearray = explode("/",$file); $file = $filearray[sizeof($filearray)-1]; $msg = $file; // Datei vom FTP temporär speichern $fp = fopen($downloadDir . killslashes(html_entity_decode($file))."_".$s, "w"); if ($mode == "FTP_ASCII") { $downloadStatus = @ftp_fget($connection,$fp, html_entity_decode($file),FTP_ASCII); } elseif ($mode == "FTP_BINARY") { $downloadStatus = @ftp_fget($connection,$fp, html_entity_decode($file),FTP_BINARY); } if (!$downloadStatus) { fclose($fp); exit; } fclose($fp); // temporäre Datei lesen und ausgeben $data = file($downloadDir . killslashes(html_entity_decode($file))."_".$s); foreach ($data as $outData) { echo $outData; } unlink($downloadDir . killslashes(html_entity_decode($file))."_".$s); exit; } break; case "cddirect": if (@ftp_chdir($connection, $file)) { $currentDir = htmlentities(str_replace("\"\"","\"",@ftp_pwd($connection))); $smarty->assign('curdir', sprintf(_('current folder = [%1$s]'), $currentDir)); } else { $errormessage = sprintf(_('Directory change to \'%1$s\' failed!') . "\n", $file); } break; case "get": // Datei dwonload header("Content-disposition: filename=".killslashes(html_entity_decode($file))); header("Content-type: application/octetstream"); header("Pragma: no-cache"); header("Expires: 0"); // Datei vom FTP temporär speichern $fp = fopen($downloadDir . killslashes(html_entity_decode($file))."_".$s, "w"); if ($mode == "FTP_ASCII") { $downloadStatus = ftp_fget($connection,$fp, html_entity_decode($file),FTP_ASCII); } elseif ($mode == "FTP_BINARY") { $downloadStatus = ftp_fget($connection,$fp, html_entity_decode($file),FTP_BINARY); } fclose($fp); // temporäre Datei lesen und ausgeben $data = file($downloadDir . killslashes(html_entity_decode($file))."_".$s); //print_r($data); /*$i=0; while ($data[$i] != "") { echo $data[$i]; $i++; }*/ foreach ($data as $outData) { echo $outData; } unlink($downloadDir . killslashes(html_entity_decode($file))."_".$s); exit; break; case "put": // Datei hochladen foreach ($_FILES as $myFile => $dummyvar) { if (file_exists($_FILES[$myFile]['tmp_name']) && ($_FILES[$myFile]['size'] > $MAX_FILE_SIZE && $MAX_FILE_SIZE!=0)) { $errormessage .= sprintf(_('File \'%1$s\' is to big! (max. %2$u bytes)') . "\n", $_FILES[$myFile]['name'], $MAX_FILE_SIZE); } elseif (file_exists($_FILES[$myFile]['tmp_name'])) { if ($mode == "FTP_ASCII") { $uploadStatus = ftp_put($connection, html_entity_decode($currentDir) . "/" . $_FILES[$myFile]['name'], $_FILES[$myFile]['tmp_name'], FTP_ASCII); } elseif ($mode == "FTP_BINARY") { $uploadStatus = ftp_put($connection, html_entity_decode($currentDir) . "/" . $_FILES[$myFile]['name'], $_FILES[$myFile]['tmp_name'], FTP_BINARY); } if (!$uploadStatus) { $errormessage .= sprintf(_('File \'%1$s\' couldn\'t be uploaded!') . "\n", $_FILES[$myFile]['name']); } else { $successmessage .= sprintf(_('File \'%1$s\' was successfully uploaded!') . "\n", $_FILES[$myFile]['name']); } unlink($_FILES[$myFile]['tmp_name']); } } break; case "deldir": // Ordner löschen if (ftp_rmdir($connection, html_entity_decode($file))) { $successmessage = sprintf(_('Directory \'%1$s\' deleted!') . "\n", $file); } else { $errormessage = sprintf(_('Directory \'%1$s\' couldn\'t be deleted!') . "\n", $file); } break; case "delfile": // Datei löschen if (@ftp_delete($connection, $file)) { $successmessage = sprintf(_('\'%1$s\' deleted!') . "\n", $file); } else { $errormessage = sprintf(_('\'%1$s\' couldn\'t be deleted!') . "\n", $file); } break; case "rename": // Datei umbennenen if ($_POST['op']=="do") { if (@ftp_rename($connection, $file, $_POST['file2'])) { $successmessage = sprintf(_('\'%1$s\' renamed to \'%2$s\'') . "\n", $file, $_POST['file2']); } else { $errormessage = sprintf(_('\'%1$s\' couldn\'t be renamed to \'%2$s\'!') . "\n", $file, $_POST['file2']); } } elseif ($_GET['op']=="show") { $smarty->assign('rename_text', sprintf(_('File \'%1$s\' rename/move to') . "\n", $file)); } break; case "createdir": // neuen Ordner erstellen if (@ftp_mkdir($connection, $file)) { $successmessage = sprintf(_('Directory \'%1$s\' created') . "\n", $file); } else { $errormessage = sprintf(_('Directory \'%1$s\' couldn\'t be created!') . "\n", $file); } break; case "chmod": // Berechtigungen setzen $wrongchmod = false; $split = preg_split('//', $_POST['file2'], -1, PREG_SPLIT_NO_EMPTY); foreach ($split as $char) { if ($char < 0 || $char > 7) { $wrongchmod = true; } } if ($wrongchmod || strlen($_POST['chmod']) > 3) { $errormessage = sprintf(_('The permission \'%1$s\' you entered is not valid!') . "\n", $_POST['file2']); } else { $command = "chmod {$_POST['file2']} {$_POST['file']}"; if (!$wrongchmod && ftp_site($connection,$command)) { $successmessage = sprintf(_('The permission of \'%1$s\' is set to \'%2$s\'!') . "\n", $file, $_POST['file2']); } else { $errormessage = sprintf(_('The permission of \'%1$s\' couldn\'t be set to \'%2$s\'!') . "\n", $file, $_POST['file2']); } } break; case "multiple": // merhfachaktionen if (isset($_POST['yes']) && $_POST['yes']!="" && !isset($_POST['no'])) { if ($_POST['op']=="chmod") { $wrongchmod = false; $split = preg_split('//', $_POST['chmod'], -1, PREG_SPLIT_NO_EMPTY); foreach ($split as $char) { if ($char<0||$char>7) { $wrongchmod = true; } } if ($wrongchmod || strlen($_POST['chmod'])>3) { $errormessage .= sprintf(_('The permission \'%1$s\' you entered is not valid!') . "\n", $_POST['file2']); } else { if (is_array($file)) { foreach ($file as $myID => $myName) { $command = "chmod $_POST[chmod] ".$myName; if (ftp_site($connection,$command)) { $successmessage .= sprintf(_('The permission of \'%1$s\' is set to \'%2$s\'!') . "\n", $myName, $_POST['chmod']); } else { $errormessage .= sprintf(_('The permission of \'%1$s\' couldn\'t be set to \'%2$s\'!') . "\n", $myName, $_POST['chmod']); } } } } } elseif ($_POST['op']=="delete") { if (is_array($file)) { foreach ($file as $myID => $myName) { if (ftp_chdir($connection, $myName)) { ftp_chdir($connection, html_entity_decode($currentDir)); $del_status = ftp_rmdir($connection, html_entity_decode($myName)); } else { ftp_chdir($connection, html_entity_decode($currentDir)); $del_status = ftp_delete($connection, $myName); } if ($del_status) { $successmessage .= sprintf(_('\'%1$s\' deleted!') . "\n", $myName); } else { $errormessage .= sprintf(_('\'%1$s\' couldn\'t be deleted!') . "\n", $myName); } } } } elseif ($_POST['op']=="move") { if (ftp_chdir($connection, $_POST['move_to'])) { ftp_chdir($connection, html_entity_decode($currentDir)); if (substr($_POST['move_to'],-1)!="/") { $_POST['move_to'] .= "/"; } if (is_array($file)) { foreach ($file as $myID => $myName) { if (ftp_rename($connection, $myName,$_POST['move_to'].$myName)) { $successmessage .= sprintf(_('File \'%1$s\' moved') . "\n", $myName); } else { $errormessage .= sprintf(_('File \'%1$s\' couldn\'t be moved') . "\n", $myName); } } } } else { $errormessage = sprintf(_('The directory \'%1$s\' doesn\'t exist') . "\n", $_POST['move_to']); } } } break; case "edit": $extarray = explode(".", $file); $extension = $extarray[sizeof($extarray)-1]; $editAble = false; foreach ($editFileExtensions as $regex) { if (preg_match("/$regex/i", $extension)) { $editAble = true; break; } } if ($extension == $file && $editFileNoExtension) { $editAble = true; } if ($editAble) { if ((isset($_GET['op']) && $_GET['op'] == "open") || (isset($_POST['op']) && $_POST['op'] == "open")) {//datei auslesen und im Browser anzeigen // original Dateiname $filearray = explode("/",$file); $file = $filearray[sizeof($filearray)-1]; // Datei vom FTP temporär speichern $fp = fopen($downloadDir . killslashes(html_entity_decode($file)) . "_" . $s, "w"); if ($mode == "FTP_BINARY") { $downloadStatus = ftp_fget($connection, $fp, html_entity_decode($file),FTP_BINARY); } else { $downloadStatus = ftp_fget($connection, $fp, html_entity_decode($file),FTP_ASCII); } if (!$downloadStatus) { fclose($fp); $errormessage = sprintf(_('File \'%1$s\' couldn\'t be downloaded!') . "\n", $file); $myFileContent = ''; } else { fclose($fp); // temporäre Datei lesen und ausgeben $myFileContent = implode("",file($downloadDir . killslashes(html_entity_decode($file))."_".$s)); } $smarty->assign('myFileContent', $myFileContent); unlink($downloadDir . killslashes(html_entity_decode($file))."_".$s); } elseif ((isset($_GET['op']) && $_GET['op'] == "save") || (isset($_POST['op']) && $_POST['op'] == "save")) {// datei speichern $fp = fopen($downloadDir . killslashes(html_entity_decode($file))."_".$s, "w"); if ((isset($_GET['op']) && $_GET['op'] != "new") && (isset($_POST['op']) && $_POST['op'] != "new")) { fputs($fp, $_POST['fileContent'], strlen($_POST['fileContent'])); } else { fputs($fp, html_entity_decode($_POST['fileContent']), strlen(html_entity_decode($_POST['fileContent']))); } fclose($fp); $uploadStatus = false; if ($mode == "FTP_BINARY") { $uploadStatus = ftp_put($connection, html_entity_decode($currentDir). "/" . html_entity_decode($file), $downloadDir . killslashes(html_entity_decode($file))."_".$s, FTP_BINARY); } else { $uploadStatus = ftp_put($connection, html_entity_decode($currentDir). "/" . html_entity_decode($file), $downloadDir . killslashes(html_entity_decode($file))."_".$s, FTP_ASCII); } if (!$uploadStatus) { $errormessage = sprintf(_('File \'%1$s\' couldn\'t be saved!') . "\n", $file); } else { $successmessage = sprintf(_('File \'%1$s\' was saved succesfully!') . "\n", $file); } unlink($downloadDir . killslashes(html_entity_decode($file))."_".$s); } } else { $errormessage = sprintf(_('Files with this extension can\'t be created/edited!') . "\n", $file); } if ((isset($_GET['op']) && $_GET['op'] != "new") && (isset($_POST['op']) && $_POST['op'] != "new")) { if ($file == "") { $editAble = false; $errormessage = _('Please enter a filename!') . "\n"; } } break; case "mode": if ($_GET['mode'] == "FTP_BINARY") { $mode = "FTP_BINARY"; $_SESSION['mode'] = "FTP_BINARY"; } else { $mode = "FTP_ASCII"; $_SESSION['mode'] = "FTP_ASCII"; } $smarty->assign('mode', $mode); break; } if (strlen($errormessage) > 0) { $smarty->assign('errormessage', $errormessage); } if (strlen($successmessage) > 0) { $smarty->assign('successmessage', $successmessage); } if ($action == "edit" && ((isset($_GET['op']) && $_GET['op'] == "open") || (isset($_POST['op']) && $_POST['op'] == "open"))) { $file = htmlentities($file); $smarty->assign('file', $file); $body = $smarty->fetch('webftp/webftp_edit.tpl'); } elseif ($action == "edit" && ((isset($_GET['op']) && $_GET['op'] == "new") || (isset($_POST['op']) && $_POST['op'] == "new"))) { $file = htmlentities($file); $smarty->assign('file', $file); $body = $smarty->fetch('webftp/webftp_edit_new.tpl'); } else { $list = array(); $list = ftp_rawlist($connection, "-a ./"); $countArray = array("dir" => 0, "dirsize" => 0, "file" => 0, "filesize" => 0, "link" => 0); $list = parse_ftp_rawlist($list, $systype); if (!isset($file)) { $file = ""; } // initialize output-variables $output_dir = ''; $output_link = ''; $output_file = ''; if (is_array($list)) { // Ordner foreach ($list as $myDir) { if ($myDir["is_dir"] == 1) { $countArray['dir']++; $countArray['dirsize'] += $myDir['size']; $fileAction = "cd"; $fileName = $myDir["name"]; if (is_array($file) && in_array($fileName, $file)) { $smarty->assign('checked', 'checked'); $smarty->assign('checked_color', "bgcolor=\"".$marked_color."\""); } else { $smarty->assign('checked', ""); $smarty->assign('checked_color', ""); } $smarty->assign('myDir', $myDir); $output_dir .= $smarty->fetch('webftp/webftp_main_dir_row.tpl'); } } // Links foreach ($list as $myDir) { if ($myDir["is_link"] == 1) { $countArray['link']++; $fileAction = "cd"; $fileName = $myDir["target"]; if (is_array($file) && in_array($fileName, $file)) { $smarty->assign('checked', 'checked'); $smarty->assign('checked_color', "bgcolor=\"".$marked_color."\""); } else { $smarty->assign('checked', ""); $smarty->assign('checked_color', ""); } $smarty->assign('myDir', $myDir); $output_link .= $smarty->fetch('webftp/webftp_main_link_row.tpl'); } } // Dateien foreach ($list as $myDir) { if ($myDir["is_link"] != 1 && $myDir["is_dir"] != 1) { $countArray['file']++; $countArray['filesize'] += $myDir['size']; $fileAction = "get"; $fileName = $myDir["name"]; if (is_array($file) && in_array($fileName, $file)) { $smarty->assign('checked', 'checked'); $smarty->assign('checked_color', "bgcolor=\"".$marked_color."\""); } else { $smarty->assign('checked', ""); $smarty->assign('checked_color', ""); } // prüfen ob die datei bearbeitbar ist $extarray = explode(".",$fileName); $extension = $extarray[sizeof($extarray)-1]; $smarty->assign('editable', false); foreach ($editFileExtensions as $regex) { if (preg_match("/$regex/i", $extension)) { $smarty->assign('editable', true); break; } } if ($extension == $fileName && $editFileNoExtension) { $smarty->assign('editable', true); } $smarty->assign('myDir', $myDir); $output_file .= $smarty->fetch('webftp/webftp_main_file_row.tpl'); } } } if (!is_array($file)) { $file = htmlentities($file); $smarty->assign('file', $file); } $smarty->assign('connected_to', sprintf(_('Connected to %1$s'), $_SESSION['server'])); $body = $smarty->fetch('webftp/webftp_main_header.tpl'); $body .= $smarty->fetch('webftp/webftp_main_additional.tpl'); if ($action == "rename" && $_GET['op']=="show") { $body .= $smarty->fetch('webftp/webftp_main_rename.tpl'); } $smarty->assign('output_dir', $output_dir); $smarty->assign('output_link', $output_link); $smarty->assign('output_file', $output_file); $smarty->assign('countArray', $countArray); $body .= $smarty->fetch('webftp/webftp_main.tpl'); if ($action == "multiple" && (!isset($_POST['yes']) || $_POST['yes']=="") && (!isset($_POST['no']) || $_POST['no']=="")) { if ($_POST['op']=="delete") { $smarty->assign('action_text', _('Do you really want to delete the selected files?') . "\n"); } elseif ($_POST['op']=="move") { $smarty->assign('action_text', sprintf(_('Do you really want to move the selected files to \'%1$s\'?') . "\n", $_POST['move_to'])); $smarty->assign('move_to', $_POST['move_to']); } elseif ($_POST['op']=="chmod") { $smarty->assign('action_text', sprintf(_('Do you really want to set the permission of the selected files to \'%1$s\'?') . "\n", $_POST['chmod'])); $smarty->assign('chmod', $_POST['chmod']); } $smarty->assign('op', $_POST['op']); $body .= $smarty->fetch('webftp/webftp_main_prompt.tpl'); } else { $body .= $smarty->fetch('webftp/webftp_main_multiple.tpl'); } } $smarty->assign('completeLink', '' . _('Logout') . ''); $navlinks = $smarty->fetch('navigation_link.tpl'); $smarty->assign('completeLink', '' . _('Switch to BINARY mode') . ''); $navlinks .= $smarty->fetch('navigation_link.tpl'); $smarty->assign('completeLink', '' . _('Switch to ASCII mode') . ''); $navlinks .= $smarty->fetch('navigation_link.tpl'); $smarty->assign('completeLink', _('Main')); $smarty->assign('navigation_links', $navlinks); $smarty->assign('navigation', $smarty->fetch('navigation_element.tpl')); } else { $smarty->assign('errormessage', _('Login failed, please try again') . "\n"); session_destroy(); $body = $smarty->fetch('login/login_ftp.tpl'); } } else { $body = $smarty->fetch('login/login_ftp.tpl'); } $smarty->assign('body', $body); $smarty->display('index.tpl'); /** * Functions * This should all be checked if still necessary */ function killslashes($input) { return str_replace("\\","",str_replace('\'','',str_replace("\"","",$input))); } function parse_ftp_rawlist($list, $type = "UNIX") { // initialize files-array $files = array(); if ($type == "UNIX") { $regexp = "/([-ldrswx]{10})[ ]+([0-9]+)[ ]+([-A-Z0-9_@\.]+)[ ]+([-A-Z0-9_@\.]+)[ ]+([0-9]+)[ ]+([A-Z]{3}[ ]+[0-9]{1,2}[ ]+[0-9:]{4,5})[ ]+(.*)/i"; $i = 0; foreach ($list as $line) { $is_dir = $is_link = FALSE; if (preg_match($regexp, $line, $regs)) { if (!preg_match("/^[\.]{2}/i", $regs[7]) && $regs[7]!=".") { $i++; if (preg_match("/^[d]/i", $regs[1])) { $is_dir = TRUE; } elseif (preg_match("/^[l]/i", $regs[1])) { $is_link = TRUE; list($regs[7], $target) = explode(" -> ", $regs[7]); } $files[$i] = array ( "is_dir" => $is_dir, "name" => htmlentities($regs[7]), "perms" => $regs[1], "num" => $regs[2], "user" => $regs[3], "group" => $regs[4], "size" => $regs[5], "date" => $regs[6], "is_link" => $is_link, ); if (isset($target)) { $files[$i]['target'] = $target; unset ($target); } } } } } else { $regexp = "/([0-9\-]{8})[ ]+([0-9:]{5}[APM]{2})[ ]+([0-9|